diff --git a/.codescene/code-health-rules.json b/.codescene/code-health-rules.json new file mode 100644 index 000000000000..bafdb1188efb --- /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 96ea1708dad4..e1fbda381332 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,11 +11,11 @@ storybook-static **/gulpfile.js apps/browser/config/config.js +apps/browser/src/auth/scripts/duo.js apps/browser/src/autofill/content/autofill.js -apps/browser/src/scripts/duo.js apps/desktop/desktop_native -apps/desktop/src/scripts/duo.js +apps/desktop/src/auth/scripts/duo.js apps/web/config.js apps/web/scripts/*.js @@ -27,3 +27,5 @@ apps/cli/config/config.js tailwind.config.js libs/components/tailwind.config.base.js libs/components/tailwind.config.js + +scripts/*.js diff --git a/.eslintrc.json b/.eslintrc.json index 8bbf78df51c9..5662ac52810f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -20,7 +20,8 @@ "plugin:import/recommended", "plugin:import/typescript", "prettier", - "plugin:rxjs/recommended" + "plugin:rxjs/recommended", + "plugin:storybook/recommended" ], "settings": { "import/parsers": { @@ -33,20 +34,14 @@ } }, "rules": { - "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled - "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], "@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-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": [ @@ -90,22 +85,39 @@ "error", { "zones": [ - // Do not allow angular/node code to be imported into common { + // avoid specific frameworks or large dependencies in common "target": "./libs/common/**/*", - "from": "./libs/angular/**/*" + "from": [ + // Angular + "./libs/angular/**/*", + "./node_modules/@angular*/**/*", + + // Node + "./libs/node/**/*", + + // Import/export + "./libs/importer/**/*", + "./libs/exporter/**/*" + ] }, { - "target": "./libs/common/**/*", - "from": "./libs/node/**/*" + // 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/**/*"] }] } }, { @@ -127,6 +139,18 @@ "tailwindcss/no-contradicting-classname": "error" } }, + { + "files": ["libs/angular/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] + } + }, + { + "files": ["libs/auth/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/auth/*", "src/**/*"] }] + } + }, { "files": ["libs/common/src/**/*.ts"], "rules": { @@ -136,13 +160,22 @@ { "files": ["libs/components/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/components/*", "src/**/*"] }] + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/components/*", "src/**/*", "@bitwarden/angular/*"] } + ] } }, { - "files": ["libs/angular/src/**/*.ts"], + "files": ["libs/exporter/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] + } + }, + { + "files": ["libs/importer/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/importer/*", "src/**/*"] }] } }, { @@ -150,6 +183,35 @@ "rules": { "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "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']" + } + ] + } } ] } diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 9dd7b5c2e6f5..c0d1e0eb8abd 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 48a87a943610..38eb90b1b073 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,106 @@ -# 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 -bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/pod-sm-dev +## Secrets Manager team files ## +bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/team-secrets-manager-dev + +## Auth team files ## +apps/browser/src/auth @bitwarden/team-auth-dev +apps/cli/src/auth @bitwarden/team-auth-dev +apps/desktop/src/auth @bitwarden/team-auth-dev +apps/web/src/app/auth @bitwarden/team-auth-dev +libs/auth @bitwarden/team-auth-dev +# web connectors used for auth +apps/web/src/connectors @bitwarden/team-auth-dev +bitwarden_license/bit-web/src/app/auth @bitwarden/team-auth-dev +libs/angular/src/auth @bitwarden/team-auth-dev +libs/common/src/auth @bitwarden/team-auth-dev + +## Tools team files ## +apps/browser/src/tools @bitwarden/team-tools-dev +apps/cli/src/tools @bitwarden/team-tools-dev +apps/desktop/src/app/tools @bitwarden/team-tools-dev +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 + +## 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 +apps/cli/src/vault @bitwarden/team-vault-dev +apps/desktop/src/vault @bitwarden/team-vault-dev +apps/web/src/app/vault @bitwarden/team-vault-dev +libs/angular/src/vault @bitwarden/team-vault-dev +libs/common/src/vault @bitwarden/team-vault-dev +libs/vault @bitwarden/team-vault-dev + +## Admin Console team files ## +apps/browser/src/admin-console @bitwarden/team-admin-console-dev +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 +libs/angular/src/admin-console @bitwarden/team-admin-console-dev +libs/common/src/admin-console @bitwarden/team-admin-console-dev + +## Billing team files ## +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 + +## Platform team files ## +apps/browser/src/platform @bitwarden/team-platform-dev +apps/cli/src/platform @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 +# Node-specifc platform files +libs/node @bitwarden/team-platform-dev +# Web utils used across app and connectors +apps/web/src/utils/ @bitwarden/team-platform-dev +# Web core and shared files +apps/web/src/app/core @bitwarden/team-platform-dev +apps/web/src/app/shared @bitwarden/team-platform-dev +apps/web/src/translation-constants.ts @bitwarden/team-platform-dev + +## Autofill team files ## +apps/browser/src/autofill @bitwarden/team-autofill-dev + +## Component Library ## +.storybook @bitwarden/team-component-library +libs/components @bitwarden/team-component-library + +## Desktop native module ## +apps/desktop/desktop_native @bitwarden/team-platform-dev + +## DevOps team files ## +/.github/workflows @bitwarden/dept-devops + +# DevOps for Docker changes. +**/Dockerfile @bitwarden/dept-devops +**/*.Dockerfile @bitwarden/dept-devops +**/.dockerignore @bitwarden/dept-devops +**/entrypoint.sh @bitwarden/dept-devops + +## 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 diff --git a/.github/DISCUSSION_TEMPLATE/password-manager.yml b/.github/DISCUSSION_TEMPLATE/password-manager.yml new file mode 100644 index 000000000000..bf2d0900db99 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/password-manager.yml @@ -0,0 +1,11 @@ +body: + - type: markdown + attributes: + value: | + If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. For feature requests and community discussion, please visit https://community.bitwarden.com/ + - type: textarea + attributes: + label: Code Contribution Proposal + description: "Please include a description of the code contribution you would like to contribute, including any relevant screenshots, and links to any existing [feature requests](https://community.bitwarden.com/c/feature-requests/5/none). This helps get feedback from the community and Bitwarden team members before you start writing code" + validations: + required: true diff --git a/.github/DISCUSSION_TEMPLATE/secrets-manager.yml b/.github/DISCUSSION_TEMPLATE/secrets-manager.yml new file mode 100644 index 000000000000..bf2d0900db99 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/secrets-manager.yml @@ -0,0 +1,11 @@ +body: + - type: markdown + attributes: + value: | + If you would like to contribute code to the Bitwarden codebase for consideration, please review [https://contributing.bitwarden.com/](https://contributing.bitwarden.com/) before posting. To keep discussion on topic, posts that do not include a proposal for a code contribution you wish to develop will be removed. For feature requests and community discussion, please visit https://community.bitwarden.com/ + - type: textarea + attributes: + label: Code Contribution Proposal + description: "Please include a description of the code contribution you would like to contribute, including any relevant screenshots, and links to any existing [feature requests](https://community.bitwarden.com/c/feature-requests/5/none). This helps get feedback from the community and Bitwarden team members before you start writing code" + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fdd6b70a9a1f..a2ff0baf25fc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -30,3 +30,4 @@ - 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/) diff --git a/.github/renovate.json b/.github/renovate.json index dae887b3d026..220c97f79d23 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,27 +2,274 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base", - "schedule:monthly", - ":maintainLockFilesMonthly", - ":preserveSemverRanges", + ":combinePatchMinorReleases", + ":dependencyDashboard", + ":maintainLockFilesWeekly", + ":pinAllExceptPeerDependencies", + ":prConcurrentLimit10", ":rebaseStalePrs", - ":disableMajorUpdates" + ":separateMajorReleases", + "group:monorepos", + "schedule:weekends" ], - "enabledManagers": ["npm"], + "enabledManagers": ["cargo", "github-actions", "npm"], + "commitMessagePrefix": "[deps]:", + "commitMessageTopic": "{{depName}}", "packageRules": [ { - "matchPackagePatterns": ["typescript"], + "groupName": "gh minor", + "matchManagers": ["github-actions"], + "matchUpdateTypes": ["minor", "patch"] + }, + { + "matchManagers": ["github-actions"], + "commitMessagePrefix": "[deps] DevOps:" + }, + { + "matchManagers": ["cargo"], + "commitMessagePrefix": "[deps] Platform:" + }, + { + "matchPackageNames": ["typescript", "zone.js"], + "matchUpdateTypes": ["major", "minor"], + "description": "Determined by Angular", "enabled": false }, { - "matchManagers": ["npm"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "npm" + "matchPackageNames": ["typescript", "zone.js"], + "matchUpdateTypes": "patch" + }, + { + "groupName": "jest", + "matchPackageNames": ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], + "matchUpdateTypes": "major" + }, + { + "matchPackageNames": [ + "@ngtools/webpack", + "base64-loader", + "buffer", + "bufferutil", + "clean-webpack-plugin", + "copy-webpack-plugin", + "core-js", + "css-loader", + "html-loader", + "html-webpack-injector", + "html-webpack-plugin", + "mini-css-extract-plugin", + "ngx-infinite-scroll", + "postcss", + "postcss-loader", + "process", + "sass", + "sass-loader", + "style-loader", + "ts-loader", + "tsconfig-paths-webpack-plugin", + "url", + "util", + "webpack", + "webpack-cli", + "webpack-dev-server", + "webpack-node-externals" + ], + "description": "Admin Console owned dependencies", + "commitMessagePrefix": "[deps] AC:", + "reviewers": ["team:team-admin-console-dev"] + }, + { + "matchPackageNames": [ + "@types/duo_web_sdk", + "@types/node-ipc", + "duo_web_sdk", + "node-ipc", + "qrious", + "regedit" + ], + "description": "Auth owned dependencies", + "commitMessagePrefix": "[deps] Auth:", + "reviewers": ["team:team-auth-dev"] + }, + { + "matchPackageNames": [ + "@webcomponents/custom-elements", + "concurrently", + "cross-env", + "del", + "gulp", + "gulp-filter", + "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": [ + "@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", + "@types/argon2-browser", + "@types/chrome", + "@types/firefox-webext-browser", + "@types/jquery", + "@types/node", + "@types/node-forge", + "argon2", + "argon2-browser", + "big-integer", + "bootstrap", + "jquery", + "node-forge", + "popper.js", + "rxjs", + "type-fest", + "typescript", + "zone.js" + ], + "description": "Platform owned dependencies", + "commitMessagePrefix": "[deps] Platform:", + "reviewers": ["team:team-platform-dev"] + }, + { + "matchPackageNames": [ + "@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", + "chromatic", + "ngx-toastr", + "react", + "react-dom", + "remark-gfm", + "storybook", + "tailwindcss" + ], + "description": "Component library owned dependencies", + "commitMessagePrefix": "[deps] Platform (CL):", + "reviewers": ["team:team-platform-dev"] + }, + { + "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": [ + "@electron/notarize", + "@electron/rebuild", + "@microsoft/signalr-protocol-msgpack", + "@microsoft/signalr", + "@types/jsdom", + "@types/papaparse", + "@types/zxcvbn", + "electron-builder", + "electron-log", + "electron-reload", + "electron-store", + "electron-updater", + "electron", + "jsdom", + "jszip", + "oidc-client-ts", + "papaparse", + "utf-8-validate", + "zxcvbn" + ], + "description": "Tools owned dependencies", + "commitMessagePrefix": "[deps] Tools:", + "reviewers": ["team:team-tools-dev"] }, { - "packageNames": ["typescript"], - "updateTypes": "patch" + "matchPackageNames": [ + "@koa/multer", + "@koa/router", + "@types/inquirer", + "@types/koa", + "@types/koa__multer", + "@types/koa__router", + "@types/koa-bodyparser", + "@types/koa-json", + "@types/lowdb", + "@types/lunr", + "@types/node-fetch", + "@types/proper-lockfile", + "@types/retry", + "chalk", + "commander", + "form-data", + "https-proxy-agent", + "inquirer", + "koa", + "koa-bodyparser", + "koa-json", + "lowdb", + "lunr", + "multer", + "node-fetch", + "open", + "pkg", + "proper-lockfile" + ], + "description": "Vault owned dependencies", + "commitMessagePrefix": "[deps] Vault:", + "reviewers": ["team:team-vault-dev"] } ], - "ignoreDeps": ["bootstrap", "electron-builder", "node-ipc", "regedit"] + "ignoreDeps": ["@types/koa-bodyparser", "bootstrap", "node-ipc", "node", "npm", "regedit"] } diff --git a/.github/secrets/appstore-app-cert.p12.gpg b/.github/secrets/appstore-app-cert.p12.gpg index ef81792f3d3b..284add80d507 100644 Binary files a/.github/secrets/appstore-app-cert.p12.gpg and b/.github/secrets/appstore-app-cert.p12.gpg differ diff --git a/.github/secrets/appstore-installer-cert.p12.gpg b/.github/secrets/appstore-installer-cert.p12.gpg index 09652a3a1ba4..cd1f58eca16e 100644 Binary files a/.github/secrets/appstore-installer-cert.p12.gpg and b/.github/secrets/appstore-installer-cert.p12.gpg differ diff --git a/.github/secrets/bitwarden-desktop-key.p12.gpg b/.github/secrets/bitwarden-desktop-key.p12.gpg index 84c7f00e2d3e..76ee0cbb5e45 100644 Binary files a/.github/secrets/bitwarden-desktop-key.p12.gpg and b/.github/secrets/bitwarden-desktop-key.p12.gpg differ diff --git a/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg b/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg index 32e2f79f2c24..d55f40551700 100644 Binary files a/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg and b/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg differ diff --git a/.github/secrets/macdev-cert.p12.gpg b/.github/secrets/macdev-cert.p12.gpg index 4b8e0ef474b4..f89cfb82a117 100644 Binary files a/.github/secrets/macdev-cert.p12.gpg and b/.github/secrets/macdev-cert.p12.gpg differ diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index b100c980f03a..ef2ff29ed8d2 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -2,17 +2,8 @@ ./apps/browser/src/safari/desktop/Assets.xcassets/AccentColor.colorset ./apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset ./apps/browser/src/safari/desktop/Base.lproj -./apps/browser/src/services/vaultTimeout ./apps/browser/store/windows/Assets -./libs/common/spec/misc/logInStrategies -./libs/common/src/abstractions/fileDownload -./libs/common/src/abstractions/userVerification -./libs/common/src/abstractions/vaultTimeout -./libs/common/src/misc/logInStrategies -./libs/common/src/services/userVerification -./libs/common/src/services/vaultTimeout ./bitwarden_license/README.md -./bitwarden_license/bit-web/src/app/providers/services/webProvider.service.ts ./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 @@ -24,121 +15,9 @@ ./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/components/captchaProtected.component.ts -./libs/angular/src/validators/inputsFieldMatch.validator.ts -./libs/angular/src/validators/notAllowedValueAsync.validator.ts -./libs/angular/src/services/theming/themeBuilder.ts -./libs/angular/src/interfaces/selectOptions.ts -./libs/components/src/stories/Introduction.stories.mdx -./libs/common/spec/misc/logInStrategies/logIn.strategy.spec.ts -./libs/common/spec/misc/logInStrategies/passwordLogIn.strategy.spec.ts -./libs/common/spec/misc/logInStrategies/ssoLogIn.strategy.spec.ts -./libs/common/spec/web/services/webCryptoFunction.service.spec.ts -./libs/common/spec/shared/interceptConsole.ts -./libs/common/spec/models/domain/encString.spec.ts -./libs/common/spec/models/domain/symmetricCryptoKey.spec.ts -./libs/common/spec/models/domain/encArrayBuffer.spec.ts -./libs/common/spec/models/domain/sendAccess.spec.ts -./libs/common/spec/models/domain/sendFile.spec.ts -./libs/common/spec/models/domain/sendText.spec.ts -./libs/common/spec/matchers/toEqualBuffer.spec.ts -./libs/common/spec/matchers/toEqualBuffer.ts -./libs/common/spec/services/stateMigration.service.spec.ts -./libs/common/spec/services/consoleLog.service.spec.ts -./libs/common/src/misc/logInStrategies/ssoLogin.strategy.ts -./libs/common/src/misc/logInStrategies/passwordLogin.strategy.ts -./libs/common/src/misc/logInStrategies/passwordlessLogin.strategy.ts -./libs/common/src/misc/logInStrategies/logIn.strategy.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/types/twoFactorResponse.ts -./libs/common/src/types/authResponse.ts -./libs/common/src/enums/kdfType.ts -./libs/common/src/enums/fileUploadType.ts -./libs/common/src/enums/twoFactorProviderType.ts -./libs/common/src/enums/clientType.ts -./libs/common/src/enums/encryptedExportType.ts -./libs/common/src/enums/linkedIdType.ts -./libs/common/src/enums/sendType.ts -./libs/common/src/enums/importOptions.ts -./libs/common/src/enums/policyType.ts -./libs/common/src/enums/planSponsorshipType.ts -./libs/common/src/enums/encryptionType.ts -./libs/common/src/enums/htmlStorageLocation.ts -./libs/common/src/enums/providerUserType.ts -./libs/common/src/enums/organizationUserStatusType.ts -./libs/common/src/enums/verificationType.ts -./libs/common/src/enums/notificationType.ts -./libs/common/src/enums/keySuffixOptions.ts -./libs/common/src/enums/productType.ts -./libs/common/src/enums/scimProviderType.ts -./libs/common/src/enums/eventType.ts -./libs/common/src/enums/organizationApiKeyType.ts -./libs/common/src/enums/hashPurpose.ts -./libs/common/src/enums/uriMatchType.ts -./libs/common/src/enums/deviceType.ts -./libs/common/src/enums/organizationConnectionType.ts -./libs/common/src/enums/secureNoteType.ts -./libs/common/src/enums/transactionType.ts -./libs/common/src/enums/providerUserStatusType.ts -./libs/common/src/enums/storageLocation.ts -./libs/common/src/enums/authenticationType.ts -./libs/common/src/enums/emergencyAccessType.ts -./libs/common/src/enums/themeType.ts -./libs/common/src/enums/logLevelType.ts -./libs/common/src/enums/planType.ts -./libs/common/src/enums/stateVersion.ts -./libs/common/src/enums/authenticationStatus.ts -./libs/common/src/enums/fieldType.ts -./libs/common/src/enums/paymentMethodType.ts -./libs/common/src/enums/ssoEnums.ts -./libs/common/src/enums/authRequestType.ts -./libs/common/src/enums/emergencyAccessStatusType.ts -./libs/common/src/enums/nativeMessagingVersion.ts -./libs/common/src/enums/organizationUserType.ts -./libs/common/src/factories/accountFactory.ts -./libs/common/src/factories/globalStateFactory.ts -./libs/common/src/factories/stateFactory.ts -./libs/common/src/abstractions/userVerification/userVerification.service.abstraction.ts -./libs/common/src/abstractions/userVerification/userVerification-api.service.abstraction.ts -./libs/common/src/abstractions/platformUtils.service.ts -./libs/common/src/abstractions/stateMigration.service.ts -./libs/common/src/abstractions/fileDownload/fileDownloadBuilder.ts -./libs/common/src/abstractions/fileDownload/fileDownload.service.ts -./libs/common/src/abstractions/fileDownload/fileDownloadRequest.ts -./libs/common/src/abstractions/passwordGeneration.service.ts -./libs/common/src/abstractions/formValidationErrors.service.ts -./libs/common/src/abstractions/vaultTimeout/vaultTimeoutSettings.service.ts -./libs/common/src/abstractions/vaultTimeout/vaultTimeout.service.ts -./libs/common/src/abstractions/fileUpload.service.ts -./libs/common/src/abstractions/cryptoFunction.service.ts -./libs/common/src/abstractions/keyConnector.service.ts -./libs/common/src/abstractions/anonymousHub.service.ts -./libs/common/src/abstractions/appId.service.ts -./libs/common/src/abstractions/usernameGeneration.service.ts -./libs/common/src/abstractions/twoFactor.service.ts -./libs/common/src/services/userVerification/userVerification-api.service.ts -./libs/common/src/services/userVerification/userVerification.service.ts -./libs/common/src/services/azureFileUpload.service.ts -./libs/common/src/services/stateMigration.service.ts -./libs/common/src/services/passwordGeneration.service.ts -./libs/common/src/services/consoleLog.service.ts -./libs/common/src/services/formValidationErrors.service.ts -./libs/common/src/services/vaultTimeout/vaultTimeoutSettings.service.ts -./libs/common/src/services/vaultTimeout/vaultTimeout.service.ts -./libs/common/src/services/fileUpload.service.ts -./libs/common/src/services/keyConnector.service.ts -./libs/common/src/services/anonymousHub.service.ts -./libs/common/src/services/appId.service.ts -./libs/common/src/services/usernameGeneration.service.ts -./libs/common/src/services/noopMessaging.service.ts -./libs/common/src/services/twoFactor.service.ts -./libs/common/src/services/memoryStorage.service.ts -./libs/common/src/services/bitwardenFileUpload.service.ts -./libs/common/src/services/webCryptoFunction.service.ts -./libs/common/src/interfaces/IEncrypted.ts +./libs/auth/README.md +./libs/tools/README.md +./libs/vault/README.md ./README.md ./LICENSE_BITWARDEN.txt ./CONTRIBUTING.md @@ -161,21 +40,11 @@ ./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 ./apps/browser/src/models/biometricErrors.ts ./apps/browser/src/browser/safariApp.ts -./apps/browser/src/browser/browserApi.ts ./apps/browser/src/safari/desktop/ViewController.swift ./apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/Contents.json ./apps/browser/src/safari/desktop/Assets.xcassets/AccentColor.colorset/Contents.json @@ -186,22 +55,4 @@ ./apps/browser/src/safari/safari/SafariWebExtensionHandler.swift ./apps/browser/src/safari/safari/Info.plist ./apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist -./apps/browser/src/listeners/onCommandListener.ts -./apps/browser/src/listeners/onInstallListener.ts -./apps/browser/src/services/browserFileDownloadService.ts -./apps/browser/src/services/localBackedSessionStorage.service.spec.ts -./apps/browser/src/services/browserMessagingPrivateModeBackground.service.ts -./apps/browser/src/services/browserPlatformUtils.service.spec.ts -./apps/browser/src/services/browserMemoryStorage.service.ts -./apps/browser/src/services/vaultTimeout/vaultTimeout.service.ts -./apps/browser/src/services/browserCrypto.service.ts -./apps/browser/src/services/browserPlatformUtils.service.ts -./apps/browser/src/services/autofillConstants.ts -./apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts -./apps/browser/src/services/browserLocalStorage.service.ts -./apps/browser/src/services/localBackedSessionStorage.service.ts -./apps/browser/src/services/browserMessagingPrivateModePopup.service.ts -./apps/browser/src/services/browserMessaging.service.ts -./apps/browser/src/services/keyGeneration.service.ts -./apps/browser/src/services/abstractChromeStorageApi.service.ts ./SECURITY.md diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml new file mode 100644 index 000000000000..fee2ad958f2e --- /dev/null +++ b/.github/workflows/auto-branch-updater.yml @@ -0,0 +1,42 @@ +--- +name: Auto Update Branch + +on: + push: + branches: + - 'master' + - 'rc' + paths: + - 'apps/web/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + - '.github/workflows/build-web.yml' + workflow_dispatch: + inputs: {} + +jobs: + update: + name: Update Branch + runs-on: ubuntu-22.04 + env: + _BOT_EMAIL: 106330231+bitwarden-devops-bot@users.noreply.github.com + _BOT_NAME: bitwarden-devops-bot + steps: + - name: Setup + id: setup + run: echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT + + - name: Checkout repo + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + ref: 'eu-web-${{ steps.setup.outputs.branch }}' + fetch-depth: 0 + + - name: Merge ${{ steps.setup.outputs.branch }} + run: | + git config --local user.email "${{ env._BOT_EMAIL }}" + git config --local user.name "${{ env._BOT_NAME }}" + git merge origin/${{ steps.setup.outputs.branch }} + git push diff --git a/.github/workflows/automatic-issue-responses.yml b/.github/workflows/automatic-issue-responses.yml index badc10d3342c..90d561c92217 100644 --- a/.github/workflows/automatic-issue-responses.yml +++ b/.github/workflows/automatic-issue-responses.yml @@ -14,7 +14,7 @@ jobs: # Feature request - if: github.event.label.name == 'feature-request' name: Feature request - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | We use GitHub issues as a place to track bugs and other development related issues. The [Bitwarden Community Forums](https://community.bitwarden.com/) has a [Feature Requests](https://community.bitwarden.com/c/feature-requests) section for submitting, voting for, and discussing requests like this one. @@ -25,7 +25,7 @@ jobs: # Intended behavior - if: github.event.label.name == 'intended-behavior' name: Intended behaviour - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | Your issue appears to be describing the intended behavior of the software. If you want this to be changed, it would be a feature request. @@ -38,7 +38,7 @@ jobs: # Customer support request - if: github.event.label.name == 'customer-support' name: Customer Support request - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | We use GitHub issues as a place to track bugs and other development related issues. Your issue appears to be a support request, or would otherwise be better handled by our dedicated Customer Success team. @@ -49,14 +49,14 @@ jobs: # Resolved - if: github.event.label.name == 'resolved' name: Resolved - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | We’ve closed this issue, as it appears the original problem has been resolved. If this happens again or continues to be a problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis. # Stale - if: github.event.label.name == 'stale' name: Stale - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | As we haven’t heard from you about this problem in some time, this issue will now be closed. diff --git a/.github/workflows/automatic-pull-request-responses.yml b/.github/workflows/automatic-pull-request-responses.yml index e994c2f59b88..261cd5c25557 100644 --- a/.github/workflows/automatic-pull-request-responses.yml +++ b/.github/workflows/automatic-pull-request-responses.yml @@ -14,11 +14,11 @@ jobs: # Translation PR / Crowdin - if: github.event.label.name == 'translation-pr' name: Translation-PR - uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1 with: comment: | We really appreciate you taking the time to improve our translations. - + However we use a translation tool called [Crowdin](https://crowdin.com/) to help manage our localization efforts across many different languages. Our translations can only be updated using Crowdin, so we'll have to close this PR, but would really appreciate if you'd consider joining our awesome translation community over at Crowdin. - + More information can be found in the [localization section](https://contributing.bitwarden.com/contributing/#localization-l10n) of our [Contribution Guidelines](https://contributing.bitwarden.com/contributing/) diff --git a/.github/workflows/brew-bump-cli.yml b/.github/workflows/brew-bump-cli.yml index 88a8cdefe508..c2e88a6840ae 100644 --- a/.github/workflows/brew-bump-cli.yml +++ b/.github/workflows/brew-bump-cli.yml @@ -17,26 +17,25 @@ jobs: runs-on: macos-11 steps: - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "brew-bump-workflow-pat" - name: Update Homebrew formula - uses: dawidd6/action-homebrew-bump-formula@dd221ff435f42fa8102b5871bb1929af9d76476c + 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 - cask: bitwarden-cli + formula: bitwarden-cli tag: ${{ github.ref }} revision: ${{ github.sha }} - force: false - dryrun: true + force: true diff --git a/.github/workflows/brew-bump-desktop.yml b/.github/workflows/brew-bump-desktop.yml index 249c5a57d482..2953a1355565 100644 --- a/.github/workflows/brew-bump-desktop.yml +++ b/.github/workflows/brew-bump-desktop.yml @@ -17,19 +17,19 @@ jobs: runs-on: macos-11 steps: - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "brew-bump-workflow-pat" - name: Update Homebrew cask - uses: macauley/action-homebrew-bump-cask@445c42390d790569d938f9068d01af39ca030feb + uses: macauley/action-homebrew-bump-cask@445c42390d790569d938f9068d01af39ca030feb # v1.0.0 with: # Required, custom GitHub access token with the 'public_repo' and 'workflow' scopes token: ${{ steps.retrieve-secrets.outputs.brew-bump-workflow-pat }} @@ -38,5 +38,5 @@ jobs: cask: bitwarden tag: ${{ github.ref }} revision: ${{ github.sha }} - force: false + force: true dryrun: true diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index e54dc936eb4f..f16021570a92 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -36,10 +36,10 @@ defaults: jobs: cloc: name: CLOC - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -52,11 +52,15 @@ jobs: setup: name: Setup - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 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: Checkout repo + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Get Package Version id: gen_vars run: | @@ -66,10 +70,18 @@ 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 - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - setup defaults: @@ -77,7 +89,7 @@ jobs: working-directory: apps/browser steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Testing locales - extName length run: | @@ -106,121 +118,123 @@ jobs: build: name: Build - runs-on: windows-2019 + runs-on: ubuntu-22.04 needs: - setup - locales-test env: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} - defaults: - run: - working-directory: apps/browser + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # v3.3.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' - - - 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 + - name: Build sources for reviewers + run: | + # Include hidden files in glob copy + shopt -s dotglob + + # Remove ".git" directory + rm -r .git + + # Copy root level files to source directory + mkdir browser-source + FILES=$(find . -maxdepth 1 -type f) + for FILE in $FILES; do cp "$FILE" browser-source/; done + + # Copy patches to the Browser source directory + mkdir -p browser-source/patches + cp -r patches/* browser-source/patches + + # Copy apps/browser to the Browser source directory + mkdir -p browser-source/apps/browser + cp -r apps/browser/* browser-source/apps/browser + + # Copy libs to Browser source directory + mkdir browser-source/libs + cp -r libs/* browser-source/libs + + zip -r browser-source.zip browser-source + - name: NPM setup run: npm ci - working-directory: ./ + 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 + # - name: Build Manifest v3 + # run: npm run dist:mv3 + # working-directory: browser-source/apps/browser - name: Gulp run: gulp ci - - - name: Build sources for reviewers - shell: cmd - run: | - REM Remove ".git" directory - rmdir /S /Q ".git" - - REM Copy root level files to source directory - mkdir browser-source - copy * browser-source - - REM Copy apps\browser to Browser source directory - mkdir browser-source\apps\browser - xcopy apps\browser\* browser-source\apps\browser /E - - REM Copy libs to Browser source directory - mkdir browser-source\libs - xcopy libs\* browser-source\libs /E - - call 7z a browser-source.zip "browser-source\*" - working-directory: ./ + working-directory: browser-source/apps/browser - name: Upload Opera artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: dist-opera-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-opera.zip + path: browser-source/apps/browser/dist/dist-opera.zip if-no-files-found: error - - name: Upload Opera MV3 artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 - with: - name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-opera-mv3.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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: dist-chrome-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-chrome.zip + path: browser-source/apps/browser/dist/dist-chrome.zip if-no-files-found: error - - name: Upload Chrome MV3 artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 - with: - name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-chrome-mv3.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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: dist-firefox-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-firefox.zip + path: browser-source/apps/browser/dist/dist-firefox.zip if-no-files-found: error - name: Upload Edge artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: dist-edge-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-edge.zip + path: browser-source/apps/browser/dist/dist-edge.zip if-no-files-found: error - - name: Upload Edge MV3 artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 - with: - name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-edge-mv3.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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: browser-source-${{ env._BUILD_NUMBER }}.zip path: browser-source.zip @@ -228,10 +242,10 @@ jobs: - name: Upload coverage artifact if: false - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: coverage-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/coverage/coverage-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/coverage/coverage-${{ env._BUILD_NUMBER }}.zip if-no-files-found: error build-safari: @@ -242,16 +256,17 @@ 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@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # v3.3.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + node-version: ${{ env._NODE_VERSION }} - name: Print environment run: | @@ -328,7 +343,7 @@ jobs: ls -la - name: Upload Safari artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: dist-safari-${{ env._BUILD_NUMBER }}.zip path: apps/browser/dist/dist-safari.zip @@ -337,28 +352,28 @@ jobs: crowdin-push: name: Crowdin Push if: github.ref == 'refs/heads/master' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - build - build-safari steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -372,7 +387,7 @@ jobs: check-failures: name: Check for failures if: always() - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - cloc - setup @@ -406,21 +421,21 @@ jobs: fi - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 if: failure() with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.0 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.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 44b77afe36d3..e5e2aeaa88f2 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -35,10 +35,10 @@ defaults: jobs: cloc: name: CLOC - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -51,65 +51,131 @@ jobs: setup: name: Setup - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 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@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - 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 + name: Build CLI ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, windows-2019, macos-11] + os: [ubuntu-22.04, macos-11] runs-on: ${{ matrix.os }} needs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} - _WIN_PKG_FETCH_VERSION: 16.16.0 + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + _WIN_PKG_FETCH_VERSION: 18.5.0 _WIN_PKG_VERSION: 3.4 steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Unix Vars - if: runner.os != 'Windows' run: | echo "LOWER_RUNNER_OS=$(echo $RUNNER_OS | awk '{print tolower($0)}')" >> $GITHUB_ENV echo "SHORT_RUNNER_OS=$(echo $RUNNER_OS | awk '{print substr($0, 1, 3)}' | \ awk '{print tolower($0)}')" >> $GITHUB_ENV + - name: Set up Node + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + with: + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + node-version: ${{ env._NODE_VERSION }} + + - name: Install + run: npm ci + working-directory: ./ + + - name: Build & Package Unix + run: npm run dist:${{ 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 + + - name: Version Test + run: | + unzip "./dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" + testVersion=$(./test/bw -v) + echo "version: $_PACKAGE_VERSION" + echo "testVersion: $testVersion" + if [[ $testVersion != $_PACKAGE_VERSION ]]; then + echo "Version test failed." + exit 1 + fi + + - 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 + + - name: Upload unix zip asset + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip + path: apps/cli/dist/bw-${{ 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 + 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 + if-no-files-found: error + + cli-windows: + name: Build CLI Windows + runs-on: windows-2019 + needs: + - setup + env: + _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + _WIN_PKG_FETCH_VERSION: 18.5.0 + _WIN_PKG_VERSION: 3.4 + steps: + - name: Checkout repo + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Setup Windows builder - if: runner.os == 'Windows' run: | choco install checksum --no-progress choco install reshack --no-progress choco install nasm --no-progress - name: Set up Node - uses: actions/setup-node@17f8bd926464a1afa4c6a11669539e9c1ba77048 # v3.2.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' - - - 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 - if: runner.os == 'Windows' 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" @@ -120,7 +186,6 @@ jobs: - name: Setup Version Info shell: pwsh - if: runner.os == 'Windows' run: | $major,$minor,$patch = $env:_PACKAGE_VERSION.split('.') $versionInfo = @" @@ -155,7 +220,6 @@ jobs: - name: Resource Hacker shell: cmd - if: runner.os == 'Windows' run: | set PATH=%PATH%;C:\Program Files (x86)\Resource Hacker set WIN_PKG=C:\Users\runneradmin\.pkg-cache\v%_WIN_PKG_VERSION%\fetched-v%_WIN_PKG_FETCH_VERSION%-win-x64 @@ -170,16 +234,10 @@ jobs: working-directory: ./ - name: Build & Package Windows - if: runner.os == 'Windows' run: npm run dist:win --quiet - - name: Build & Package Unix - if: runner.os != 'Windows' - run: npm run dist:${{ env.SHORT_RUNNER_OS }} --quiet - - name: Package Chocolatey shell: pwsh - if: runner.os == 'Windows' run: | Copy-Item -Path stores/chocolatey -Destination dist/chocolatey -Recurse Copy-Item dist/windows/bw.exe -Destination dist/chocolatey/tools @@ -188,17 +246,9 @@ jobs: - name: Zip Windows shell: cmd - if: runner.os == 'Windows' run: 7z a ./dist/bw-windows-%_PACKAGE_VERSION%.zip ./dist/windows/bw.exe - - name: Zip Unix - if: runner.os != 'Windows' - run: | - cd ./dist/${{ env.LOWER_RUNNER_OS }} - zip ../bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip ./bw - - name: Version Test - if: runner.os == 'Windows' run: | dir ./dist/ Expand-Archive -Path "./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/windows" @@ -210,61 +260,33 @@ jobs: } - name: Create checksums Windows - if: runner.os == '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 - - name: Create checksums Unix - if: runner.os != 'Windows' - run: | - cd ./dist - sha256sum 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 - - name: Upload windows zip asset - if: runner.os == 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: bw-windows-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/bw-windows-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload windows checksum asset - if: runner.os == 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt if-no-files-found: error - - name: Upload unix zip asset - if: runner.os != 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 - with: - name: bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip - path: apps/cli/dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip - if-no-files-found: error - - - name: Upload unix checksum asset - if: runner.os != 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 - 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 - if-no-files-found: error - - name: Upload Chocolatey asset - if: runner.os == 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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: Upload NPM Build Directory asset - if: runner.os == 'Windows' - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip path: apps/cli/build @@ -272,13 +294,13 @@ jobs: snap: name: Build Snap - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: [setup, cli] env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Print environment run: | @@ -288,7 +310,7 @@ jobs: echo "BW Package Version: $_PACKAGE_VERSION" - name: Get bw linux cli - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: name: bw-linux-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/snap @@ -301,7 +323,7 @@ jobs: ls -alth - name: Build snap - uses: snapcore/action-build@ea14cdeb353272f75977040488ca191880509a8c # v1.1.0 + uses: snapcore/action-build@2ee46bc29d163c9c836f2820cc46b39664bf0de2 # v1.1.3 with: path: apps/cli/dist/snap @@ -330,14 +352,14 @@ jobs: run: sudo snap remove bw - name: Upload snap asset - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt @@ -347,11 +369,12 @@ jobs: check-failures: name: Check for failures if: always() - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - cloc - setup - cli + - cli-windows - snap steps: - name: Check if any job failed @@ -374,21 +397,21 @@ jobs: fi - name: Login to Azure - Prod Subscription - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 if: failure() with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.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 f92ae8a71e4f..b75e8457ea9c 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -53,7 +53,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Verify run: | @@ -76,12 +76,13 @@ jobs: 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@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get Package Version id: retrieve-version @@ -128,6 +129,13 @@ 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 @@ -136,28 +144,24 @@ jobs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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 environment run: | sudo apt-get update @@ -178,7 +182,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: | @@ -202,42 +206,42 @@ jobs: run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release_channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml @@ -255,27 +259,23 @@ jobs: working-directory: apps/desktop env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + node-version: ${{ env._NODE_VERSION }} - 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) - - name: Install AST - uses: bitwarden/gh-actions/install-ast@471ae4aec27405f16c5b796e288f54262c406e5d + run: dotnet tool install --global AzureSignTool --version 4.0.1 - name: Set up environmentF run: choco install checksum --no-progress @@ -294,15 +294,15 @@ jobs: rustup show - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, code-signing-client-id, code-signing-tenant-id, @@ -314,7 +314,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: apps/desktop/desktop_native/*.node @@ -367,91 +367,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release_channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml @@ -465,28 +465,24 @@ jobs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Rust shell: pwsh run: rustup target install aarch64-apple-darwin @@ -501,14 +497,14 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -586,7 +582,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: apps/desktop/desktop_native/*.node @@ -617,28 +613,24 @@ jobs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Rust shell: pwsh run: rustup target install aarch64-apple-darwin @@ -653,14 +645,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -738,7 +730,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: apps/desktop/desktop_native/*.node @@ -754,7 +746,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -773,31 +765,32 @@ jobs: env: APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + CSC_FOR_PULL_REQUEST: true run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release_channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml @@ -813,28 +806,24 @@ jobs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Rust shell: pwsh run: rustup target install aarch64-apple-darwin @@ -849,14 +838,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -934,7 +923,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: apps/desktop/desktop_native/*.node @@ -950,7 +939,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -970,9 +959,10 @@ jobs: env: APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + CSC_FOR_PULL_REQUEST: true - name: Upload .pkg artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg @@ -1001,28 +991,24 @@ jobs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Print environment run: | node --version @@ -1032,14 +1018,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -1117,7 +1103,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: cache with: path: apps/desktop/desktop_native/*.node @@ -1133,7 +1119,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -1159,7 +1145,7 @@ jobs: run: zip -r Bitwarden-${{ env.PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app - name: Upload masdev artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip @@ -1177,22 +1163,22 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -1257,21 +1243,21 @@ jobs: fi - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 if: failure() with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.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 798f748bd602..b6681c0dac8e 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -31,13 +31,16 @@ on: description: "Custom image tag extension" required: false +env: + _AZ_REGISTRY: bitwardenprod.azurecr.io + jobs: cloc: name: CLOC runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -54,21 +57,29 @@ jobs: runs-on: ubuntu-22.04 outputs: version: ${{ steps.version.outputs.value }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - 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: @@ -80,21 +91,23 @@ jobs: npm_command: "dist:bit:selfhost" - name: "cloud-QA" npm_command: "build:bit:qa" - - name: "cloud-POC" - npm_command: "build:bit:poc" - name: "ee" npm_command: "build:bit:ee" + - name: "cloud-euprd" + npm_command: "build:bit:euprd" + - name: "cloud-euqa" + npm_command: "build:bit:euqa" steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node - uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # v3.4.1 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: "16" + node-version: ${{ env._NODE_VERSION }} - name: Print environment run: | @@ -126,128 +139,15 @@ jobs: run: zip -r web-${{ env._VERSION }}-${{ matrix.name }}.zip build - name: Upload ${{ matrix.name }} artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: web-${{ env._VERSION }}-${{ matrix.name }}.zip path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip if-no-files-found: error - build-commercial-selfhost-image: - name: Build self-host docker image - runs-on: ubuntu-22.04 - needs: - - setup - - build-artifacts - env: - _VERSION: ${{ needs.setup.outputs.version }} - - steps: - - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - - - name: Setup DCT - if: github.ref == 'refs/heads/master' || - github.ref == 'refs/heads/rc' || - github.ref == 'refs/heads/hotfix-rc-web' - id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff - with: - azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - azure-keyvault-name: "bitwarden-prod-kv" - - - name: Download selfhosted-COMMERCIAL artifact - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 - with: - name: web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip - path: apps/web - - - name: Extract artifact - working-directory: apps/web - run: unzip web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip - - - name: Build Docker image - working-directory: apps/web - run: docker build -t bitwarden/web . - - - name: Tag rc branch - if: github.ref == 'refs/heads/rc' - run: docker tag bitwarden/web bitwarden/web:rc - - - name: Tag dev - if: github.ref == 'refs/heads/master' - run: docker tag bitwarden/web bitwarden/web:dev - - - name: Tag hotfix branch - if: github.ref == 'refs/heads/hotfix-rc-web' - run: docker tag bitwarden/web bitwarden/web:hotfix-rc-web - - - name: List Docker images - if: github.ref == 'refs/heads/master' || - github.ref == 'refs/heads/rc' || - github.ref == 'refs/heads/hotfix-rc-web' - run: docker images - - - name: Push rc image - if: github.ref == 'refs/heads/rc' - run: docker push bitwarden/web:rc - env: - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - - - name: Push dev image - if: github.ref == 'refs/heads/master' - run: docker push bitwarden/web:dev - env: - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - - - name: Push hotfix image - if: github.ref == 'refs/heads/hotfix-rc-web' - run: docker push bitwarden/web:hotfix-rc-web - env: - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - - - name: Log out of Docker - if: github.ref == 'refs/heads/master' || - github.ref == 'refs/heads/rc' || - github.ref == 'refs/heads/hotfix-rc-web' - run: | - docker logout - echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV - - - name: Login to Azure - QA Subscription - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 - with: - creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }} - - - name: Login to Azure ACR - run: az acr login -n bitwardenqa - - - name: Tag and Push to Azure QA ACR - env: - REGISTRY: bitwardenqa.azurecr.io - run: | - if [[ $(grep "pull" <<< "${GITHUB_REF}") ]]; then - IMAGE_TAG=$(echo "${GITHUB_HEAD_REF}" | sed "s#/#-#g") - else - IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") - fi - - if [[ "$IMAGE_TAG" == "master" ]]; then - IMAGE_TAG=dev - fi - - docker tag bitwarden/web \ - $REGISTRY/web-sh:$IMAGE_TAG - - docker push $REGISTRY/web-sh:$IMAGE_TAG - - - name: Log out of Docker - run: docker logout build-containers: - name: Build Docker images for bitwardenqa + name: Build Docker images runs-on: ubuntu-22.04 needs: - setup @@ -257,41 +157,60 @@ jobs: matrix: include: - artifact_name: cloud-QA - image_name: web + image_name: web-qa-cloud - artifact_name: ee image_name: web-ee + - artifact_name: selfhosted-COMMERCIAL + image_name: web env: _VERSION: ${{ needs.setup.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 + - name: Check Branch to Publish + env: + PUBLISH_BRANCHES: "master,rc,hotfix-rc-web" + id: publish-branch-check + run: | + IFS="," read -a publish_branches <<< $PUBLISH_BRANCHES + + if [[ " ${publish_branches[*]} " =~ " ${GITHUB_REF:11} " ]]; then + echo "is_publish_branch=true" >> $GITHUB_ENV + else + echo "is_publish_branch=false" >> $GITHUB_ENV + fi + + ########## ACRs ########## + - name: Login to Prod Azure + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Log into Prod container registry + run: az acr login -n bitwardenprod + + - name: Login to Azure - CI Subscription + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - name: Log into container registry - run: az acr login -n bitwardenqa + - 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: Download ${{ matrix.artifact_name }} artifact - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip path: apps/web - - name: Extract artifact - working-directory: apps/web - run: unzip web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - - - name: Build Docker image - working-directory: apps/web - run: | - docker --version - docker build -t bitwardenqa.azurecr.io/${{ matrix.image_name }} . - - - name: Get image tag - id: image-tag + ########## Generate image tag and build Docker image ########## + - name: Generate Docker image tag + id: tag run: | if [[ $(grep "pull" <<< "${GITHUB_REF}") ]]; then IMAGE_TAG=$(echo "${GITHUB_HEAD_REF}" | sed "s#/#-#g") @@ -299,65 +218,68 @@ jobs: IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") fi + if [[ "$IMAGE_TAG" == "master" ]]; then + IMAGE_TAG=dev + fi + TAG_EXTENSION=${{ github.event.inputs.custom_tag_extension }} if [[ $TAG_EXTENSION ]]; then IMAGE_TAG=$IMAGE_TAG-$TAG_EXTENSION fi - echo "value=$IMAGE_TAG" >> $GITHUB_OUTPUT - - - name: Tag image - env: - IMAGE_TAG: ${{ steps.image-tag.outputs.value }} - IMAGE_NAME: ${{ matrix.image_name }} - run: docker tag bitwardenqa.azurecr.io/$IMAGE_NAME "bitwardenqa.azurecr.io/$IMAGE_NAME:$IMAGE_TAG" + echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT - - name: Tag dev - if: github.ref == 'refs/heads/master' - env: - IMAGE_NAME: ${{ matrix.image_name }} - run: docker tag bitwardenqa.azurecr.io/$IMAGE_NAME "bitwardenqa.azurecr.io/$IMAGE_NAME:dev" + ########## Build Image ########## + - name: Extract artifact + working-directory: apps/web + run: unzip web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - - name: Push image + - name: Generate image full name + id: image-name env: - IMAGE_TAG: ${{ steps.image-tag.outputs.value }} - IMAGE_NAME: ${{ matrix.image_name }} - run: docker push "bitwardenqa.azurecr.io/$IMAGE_NAME:$IMAGE_TAG" + IMAGE_TAG: ${{ steps.tag.outputs.image_tag }} + PROJECT_NAME: ${{ matrix.image_name }} + run: echo "name=$_AZ_REGISTRY/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - - name: Push dev images - if: github.ref == 'refs/heads/master' - env: - IMAGE_NAME: ${{ matrix.image_name }} - run: docker push "bitwardenqa.azurecr.io/$IMAGE_NAME:dev" + - name: Build Docker image + uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 + with: + context: apps/web + file: apps/web/Dockerfile + platforms: linux/amd64 + push: true + tags: ${{ steps.image-name.outputs.name }} + secrets: | + "GH_PAT=${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }}" - name: Log out of Docker run: docker logout + crowdin-push: name: Crowdin Push if: github.ref == 'refs/heads/master' - needs: - - build-artifacts + needs: build-artifacts runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 # v2.3.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -377,7 +299,6 @@ jobs: - cloc - setup - build-artifacts - - build-commercial-selfhost-image - build-containers - crowdin-push steps: @@ -387,7 +308,6 @@ jobs: CLOC_STATUS: ${{ needs.cloc.result }} SETUP_STATUS: ${{ needs.setup.result }} ARTIFACT_STATUS: ${{ needs.build-artifacts.result }} - BUILD_SELFHOST_STATUS: ${{ needs.build-commercial-selfhost-image.result }} BUILD_CONTAINERS_STATUS: ${{ needs.build-containers.result }} CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} run: | @@ -406,21 +326,21 @@ jobs: fi - name: Login to Azure - Prod Subscription - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 if: failure() with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.1 + uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.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 7da412367428..6eb00437ad51 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -12,19 +12,26 @@ jobs: runs-on: ubuntu-20.04 steps: - - name: Set up Node - uses: actions/setup-node@46071b5c7a2e0c34e49c3cb8a0e792e86e18d5ea # v2.1.5 - with: - node-version: "16" - - name: Checkout repo - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 + - 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 + with: + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} + - name: Cache npm id: npm-cache - uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "~/.npm" key: ${{ runner.os }}-npm-chromatic-${{ hashFiles('**/package-lock.json') }} @@ -32,11 +39,16 @@ jobs: - name: Install Node dependencies run: npm ci + # Manual build the storybook to resolve a chromatic/storybook bug related to TurboSnap + - name: Build Storybook + run: npm run build-storybook:ci + - name: Publish to Chromatic - uses: chromaui/action@c72f0b48c8887c0ef0abe18ad865a6c1e01e73c6 + uses: chromaui/action@2f12dc37555ffc9ed980d883e96b6d03724a2d6a # v10.0.0 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + storybookBuildDir: ./storybook-static exitOnceUploaded: true onlyChanged: true - externals: "[\"libs/components/**/*.scss\", \"libs/components/tailwind.config*.js\"]" + externals: "[\"libs/components/**/*.scss\", \"libs/components/**/*.css\", \"libs/components/tailwind.config*.js\"]" diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index acb660177f73..5ffedc267fe0 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -23,22 +23,22 @@ jobs: crowdin_project_id: "308189" steps: - name: Checkout repo - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" - name: Download translations - uses: bitwarden/gh-actions/crowdin@05052c5c575ceb09ceea397fe241879e199ed44b + uses: bitwarden/gh-actions/crowdin@main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/deploy-eu-prod-web.yml b/.github/workflows/deploy-eu-prod-web.yml new file mode 100644 index 000000000000..2c7835caef88 --- /dev/null +++ b/.github/workflows/deploy-eu-prod-web.yml @@ -0,0 +1,60 @@ +--- +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@main + with: + keyvault: webvault-westeurope-prod + secrets: "sa-bitwarden-web-vault-dev-key-temp" + + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@main + 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 new file mode 100644 index 000000000000..9fa50f3ba3ce --- /dev/null +++ b/.github/workflows/deploy-eu-qa-web.yml @@ -0,0 +1,91 @@ +--- +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: + notify-start: + name: Notify Slack with start message + runs-on: ubuntu-22.04 + if: always() + steps: + - uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + with: + project: Web + environment: EU QA Cloud + tag: ${{ github.ref_name }} + slack-channel: team-eng-qa-devops + event: 'start' + url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + 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@main + with: + keyvault: webvaulteu-westeurope-qa + secrets: "sa-bitwarden-web-vault-dev-key-temp" + + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@main + 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 + + notify: + name: Notify Slack with result + runs-on: ubuntu-22.04 + if: always() + needs: azure-deploy + steps: + - uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + with: + project: Web + environment: EU QA Cloud + tag: ${{ github.event.inputs.tag }} + slack-channel: team-eng-qa-devops + event: ${{ needs.azure-deploy.result }} + url: https://github.com/bitwarden/devops/actions/runs/${{ github.run_id }} + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} diff --git a/.github/workflows/deploy-non-prod-web.yml b/.github/workflows/deploy-non-prod-web.yml index cc9d7c8e5a0e..2a92a4d401e5 100644 --- a/.github/workflows/deploy-non-prod-web.yml +++ b/.github/workflows/deploy-non-prod-web.yml @@ -7,13 +7,19 @@ on: inputs: environment: description: 'Environment' - required: true default: 'QA' type: choice options: - QA - - POC + - EUQA + - USPROD + workflow_call: + inputs: + environment: + description: 'Environment' + default: 'QA' + type: string jobs: setup: @@ -25,6 +31,8 @@ jobs: environment-name: ${{ steps.config.outputs.environment-name }} environment-branch: ${{ steps.config.outputs.environment-branch }} 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 }} steps: - name: Configure id: config @@ -35,13 +43,85 @@ jobs: 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 + if [ ${{ inputs.environment }} == "QA" ]; then + 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 + elif [ ${{ inputs.environment }} == "EUQA" ]; then + 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 + elif [ ${{ inputs.environment }} == "USPROD" ]; then + 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 + fi + + notify-start: + name: Notify Slack with start message + runs-on: ubuntu-22.04 + if: always() + steps: + - uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + with: + project: Web + environment: US ${{ inputs.environment }} Cloud + tag: ${{ github.ref_name }} + slack-channel: team-eng-qa-devops + event: 'start' + url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + artifact-check: + name: Check if Web artifact is present + runs-on: ubuntu-22.04 + needs: setup + env: + _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} + steps: + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@main + id: download-artifacts + continue-on-error: true + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ github.ref_name }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + - name: Login to Azure + if: ${{ steps.download-artifacts.outcome == 'failure' }} + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets for Build trigger + if: ${{ steps.download-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: Build server missing branch + if: ${{ steps.download-artifacts.outcome == 'failure' }} + uses: convictional/trigger-workflow-and-wait@f69fa9eedd3c62a599220f4d5745230e237904be # v1.6.5 + 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: ${{ github.ref_name }} + wait_interval: 100 cfpages-deploy: name: Deploy Web Vault to ${{ inputs.environment }} CloudFlare Pages branch - needs: setup - runs-on: ubuntu-20.04 + if : ${{ inputs.environment == 'QA' }} + needs: + - setup + - artifact-check + runs-on: ubuntu-22.04 env: _ENVIRONMENT: ${{ needs.setup.outputs.environment }} _ENVIRONMENT_URL: ${{ needs.setup.outputs.environment-url }} @@ -50,7 +130,7 @@ jobs: _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} steps: - name: Create GitHub deployment - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -60,10 +140,10 @@ jobs: description: 'Deployment from branch ${{ github.ref_name }}' - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml path: apps/web @@ -76,7 +156,7 @@ jobs: run: unzip ${{ env._ENVIRONMENT_ARTIFACT }} - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ env._ENVIRONMENT_BRANCH }} path: deployment @@ -107,7 +187,7 @@ jobs: - name: Update deployment status to Success if: ${{ success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' environment-url: ${{ env._ENVIRONMENT_URL }} @@ -116,9 +196,78 @@ jobs: - name: Update deployment status to Failure if: ${{ failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + 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 }} + + azure-deploy: + name: Deploy Web Vault to ${{ inputs.environment }} Storage Account + needs: + - setup + - artifact-check + runs-on: ubuntu-22.04 + env: + _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} + steps: + - name: Login to Azure + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets[needs.setup.outputs.azure-login-creds] }} + + - name: Retrieve Storage Account connection string + id: retrieve-secrets + 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: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@main + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ github.event.inputs.tag }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: Unzip build asset + working-directory: apps/web + run: unzip ${{ env._ENVIRONMENT_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 + + notify: + name: Notify Slack with result + runs-on: ubuntu-22.04 + if: always() + needs: + - cfpages-deploy + - setup + steps: + - uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + with: + project: Web + environment: US ${{ inputs.environment }} Cloud + tag: ${{ github.ref_name }} + slack-channel: team-eng-qa-devops + event: ${{ needs.cfpages-deploy.result }} + url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} + 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 6528c94f1f82..73092bb2e0d9 100644 --- a/.github/workflows/enforce-labels.yml +++ b/.github/workflows/enforce-labels.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Enforce Label - uses: yogevbd/enforce-label-action@8d1e1709b1011e6d90400a0e6cf7c0b77aa5efeb # v2.1.0 + uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2 with: BANNED_LABELS: "hold,needs-qa" BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged" diff --git a/.github/workflows/label-issue-pull-request.yml b/.github/workflows/label-issue-pull-request.yml new file mode 100644 index 000000000000..d0aad2f2b25c --- /dev/null +++ b/.github/workflows/label-issue-pull-request.yml @@ -0,0 +1,24 @@ +# Runs creation of Pull Requests +# If the PR destination branch is master, add a needs-qa label unless created by renovate[bot] +--- +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 + if: ${{ github.actor != 'renovate[bot]' }} + 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 5e90e2aa054b..0e8de8f1962d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Lint filenames (no capital characters) run: | @@ -38,12 +38,19 @@ jobs: > 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@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - name: Run linter run: | diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index ae22876b4c8d..dd17bcbcec62 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -22,12 +22,12 @@ 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@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -41,7 +41,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6 + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -52,11 +52,11 @@ jobs: locales-test: name: Locales Test - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: setup steps: - name: Checkout repo - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Testing locales - extName length run: | @@ -86,13 +86,13 @@ jobs: release: name: Create GitHub Release - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - setup - locales-test steps: - name: Create GitHub deployment - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -103,7 +103,7 @@ jobs: - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success @@ -116,7 +116,7 @@ jobs: - name: Dry Run - Download latest master build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success @@ -139,7 +139,7 @@ jobs: - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@40bb172bd05f266cf9ba4ff965cb61e9ee5f6d01 + uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 with: artifacts: 'browser-source-${{ needs.setup.outputs.release-version }}.zip, dist-chrome-${{ needs.setup.outputs.release-version }}.zip, @@ -155,7 +155,7 @@ jobs: - name: Update deployment status to Success if: ${{ success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' @@ -163,7 +163,7 @@ jobs: - name: Update deployment status to Failure if: ${{ failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index c01f73677d28..194b802961f1 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -43,7 +43,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -57,7 +57,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6 + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -67,7 +67,7 @@ jobs: - name: Create GitHub deployment if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -78,7 +78,7 @@ jobs: - name: Download all Release artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli @@ -87,7 +87,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli @@ -96,7 +96,7 @@ jobs: - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0 + uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 env: PKG_VERSION: ${{ steps.version.outputs.version }} with: @@ -118,7 +118,7 @@ jobs: - name: Update deployment status to Success if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' @@ -126,7 +126,7 @@ jobs: - name: Update deployment status to Failure if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' @@ -141,28 +141,26 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" - name: Install Snap - uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 - with: - snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} + uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli @@ -172,7 +170,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli @@ -182,8 +180,10 @@ jobs: - 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 upload bw_${{ env._PKG_VERSION }}_amd64.snap --release stable snapcraft logout choco: @@ -195,18 +195,18 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" - name: Setup Chocolatey @@ -220,7 +220,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli/dist @@ -230,7 +230,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli/dist @@ -243,7 +243,7 @@ jobs: shell: pwsh run: | cd dist - choco push + choco push --source=https://push.chocolatey.org/ npm: name: Publish NPM @@ -254,23 +254,23 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "npm-api-key" - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli/build @@ -280,7 +280,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli/build diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index fb456de19510..fb9c710a5f8f 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -21,9 +21,10 @@ jobs: 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@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check run: | @@ -47,7 +48,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6 + uses: bitwarden/gh-actions/release-version-check@main with: release-type: 'Initial Release' project-type: ts @@ -104,36 +105,39 @@ 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 needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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 environment run: | sudo apt-get update @@ -157,42 +161,42 @@ jobs: run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release-channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-linux.yml @@ -209,29 +213,25 @@ jobs: working-directory: apps/desktop env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + node-version: ${{ env._NODE_VERSION }} - 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) - - name: Install AST - uses: bitwarden/gh-actions/install-ast@f135c42c8596cb535c5bcb7523c0b2eef89709ac + run: dotnet tool install --global AzureSignTool --version 4.0.1 - name: Set up environment run: choco install checksum --no-progress @@ -243,15 +243,15 @@ jobs: choco --version - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, code-signing-client-id, code-signing-tenant-id, @@ -304,91 +304,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release-channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release-channel }}.yml @@ -401,30 +401,26 @@ jobs: needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Print environment run: | node --version @@ -434,14 +430,14 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -530,30 +526,26 @@ jobs: - macos-build env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Print environment run: | node --version @@ -563,14 +555,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -653,7 +645,7 @@ jobs: - name: Download artifact from hotfix-rc if: github.ref == 'refs/heads/hotfix-rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -662,7 +654,7 @@ jobs: - name: Download artifact from rc if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -671,7 +663,7 @@ jobs: - name: Download artifact from master if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }} - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -696,28 +688,28 @@ jobs: run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 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@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ needs.setup.outputs.release-channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-mac.yml @@ -732,30 +724,26 @@ jobs: - macos-build env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + 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: Print environment run: | node --version @@ -765,14 +753,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -855,7 +843,7 @@ jobs: - name: Download artifact from hotfix-rc if: github.ref == 'refs/heads/hotfix-rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -864,7 +852,7 @@ jobs: - name: Download artifact from rc if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -873,7 +861,7 @@ jobs: - name: Download artifact from master if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }} - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 with: workflow: build-browser.yml workflow_conclusion: success @@ -898,7 +886,7 @@ jobs: APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - name: Upload .pkg artifact - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg @@ -916,7 +904,7 @@ jobs: - macos-package-mas steps: - name: Create GitHub deployment - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -926,15 +914,15 @@ jobs: task: release - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name, @@ -944,7 +932,7 @@ jobs: cf-prod-account" - name: Download all artifacts - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: path: apps/desktop/artifacts @@ -983,7 +971,7 @@ jobs: - name: Update deployment status to Success if: ${{ success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' @@ -991,7 +979,7 @@ jobs: - name: Update deployment status to Failure if: ${{ failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' @@ -1011,7 +999,7 @@ jobs: - release steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup git config run: | diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index f0fe2011734c..31008a678177 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -47,13 +47,13 @@ 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 }} steps: - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -67,9 +67,9 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6 + 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/desktop/src/package.json monorepo: true @@ -94,7 +94,7 @@ jobs: - name: Create GitHub deployment if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -104,15 +104,15 @@ jobs: task: release - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name, @@ -123,7 +123,7 @@ jobs: - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -132,7 +132,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -146,17 +146,17 @@ jobs: 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 }} + if: ${{ github.event.inputs.electron_publish == 'true' }} env: RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} - ROLLOUT_PCT: ${{ github.event.inputs.rollout_percentage }} + 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 }} + 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 }} @@ -170,7 +170,7 @@ jobs: --quiet - name: Publish artifacts to R2 - if: ${{ github.event.inputs.release_type != 'Dry Run' && github.event.inputs.electron_publish }} + 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 }} @@ -185,14 +185,14 @@ jobs: --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@8b6a560c8ad3b9dab81659ae6cd1e319d8771a91 + 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@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09 - if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' && github.event.inputs.github_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' }} env: PKG_VERSION: ${{ steps.version.outputs.version }} RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} @@ -231,7 +231,7 @@ jobs: - name: Update deployment status to Success if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' @@ -239,7 +239,7 @@ jobs: - name: Update deployment status to Failure if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' @@ -247,31 +247,29 @@ jobs: snap: name: Deploy Snap - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: setup - if: inputs.snap_publish + if: ${{ github.event.inputs.snap_publish == 'true' }} env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" - name: Install Snap - uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 - with: - snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} + uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 - name: Setup run: mkdir dist @@ -279,7 +277,7 @@ jobs: - name: Download Snap artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -289,7 +287,7 @@ jobs: - name: Dry Run - Download Snap artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -299,6 +297,8 @@ jobs: - 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: | snapcraft upload bitwarden_${{ env._PKG_VERSION }}_amd64.snap --release stable snapcraft logout @@ -308,12 +308,12 @@ jobs: name: Deploy Choco runs-on: windows-2019 needs: setup - if: inputs.choco_publish + if: ${{ github.event.inputs.choco_publish == 'true' }} env: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Print Environment run: | @@ -321,15 +321,15 @@ jobs: dotnet nuget --version - name: Login to Azure - uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" - name: Setup Chocolatey @@ -345,7 +345,7 @@ jobs: - name: Download choco artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -355,7 +355,7 @@ jobs: - name: Dry Run - Download choco artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -366,5 +366,5 @@ jobs: - name: Push to Chocolatey if: ${{ github.event.inputs.release_type != 'Dry Run' }} shell: pwsh - run: choco push + run: choco push --source=https://push.chocolatey.org/ working-directory: apps/desktop/dist diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml deleted file mode 100644 index dea34a2e6f0b..000000000000 --- a/.github/workflows/release-qa-web.yml +++ /dev/null @@ -1,84 +0,0 @@ ---- -name: QA - Web Release - -on: - workflow_dispatch: {} - -jobs: - cfpages-deploy: - name: Deploy Web Vault to QA CloudFlare Pages branch - runs-on: ubuntu-20.04 - steps: - - name: Create GitHub deployment - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment-url: http://vault.qa.bitwarden.pw - environment: 'Web Vault - QA' - description: 'Deployment from branch ${{ github.ref_name }}' - - - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - - - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a - with: - workflow: build-web.yml - path: apps/web - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: web-*-cloud-QA.zip - - - name: Unzip cloud asset - working-directory: apps/web - run: unzip web-*-cloud-QA.zip - - - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - with: - ref: cf-pages-qa - 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 cf-pages-qa - run: | - if [ -n "$(git status --porcelain)" ]; then - git add . - git commit -m "Deploy ${{ github.ref_name }} to QA Cloudflare pages" - git push -u origin cf-pages-qa - else - echo "No changes to commit!"; - fi - working-directory: deployment - - - name: Update deployment status to Success - if: ${{ success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.qa.bitwarden.pw - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.qa.bitwarden.pw - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 68727e774dd0..c946f1294ac6 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -15,16 +15,19 @@ on: - Redeploy - Dry Run +env: + _AZ_REGISTRY: bitwardenprod.azurecr.io + jobs: setup: name: Setup - runs-on: ubuntu-20.04 + 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@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -38,7 +41,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@8f055ef543c7433c967a1b9b04a0f230923233bb + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -46,10 +49,9 @@ jobs: monorepo: true monorepo-project: web - self-host: name: Release self-host docker - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: setup env: _BRANCH_NAME: ${{ github.ref_name }} @@ -65,170 +67,155 @@ jobs: echo "Github Release Option: $_RELEASE_OPTION" - name: Checkout repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - ########## DockerHub ########## - - name: Setup DCT - id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff + ########## ACR ########## + - name: Login to Azure - PROD Subscription + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - azure-keyvault-name: "bitwarden-prod-kv" + 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 bitwarden/web:latest + docker pull $_AZ_REGISTRY/web:latest else - docker pull bitwarden/web:$_BRANCH_NAME + docker pull $_AZ_REGISTRY/web:$_BRANCH_NAME fi - - name: Docker Tag version + - name: Tag version run: | if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker tag bitwarden/web:latest bitwarden/web:$_RELEASE_VERSION + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web:dryrun + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web-sh:dryrun else - docker tag bitwarden/web:$_BRANCH_NAME bitwarden/web:$_RELEASE_VERSION + 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: Docker Push version - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - run: docker push bitwarden/web:$_RELEASE_VERSION - - - name: Log out of Docker and disable Docker Notary - run: | - docker logout - echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV - - ########## ACR ########## - - name: Login to Azure - QA Subscription - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 - with: - creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }} - - - name: Login to Azure ACR - run: az acr login -n bitwardenqa - - - name: Tag version - env: - REGISTRY: bitwardenqa.azurecr.io + - name: Push version run: | if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker tag bitwarden/web:latest $REGISTRY/web:$_RELEASE_VERSION - - docker tag bitwarden/web:latest $REGISTRY/web-sh:$_RELEASE_VERSION + docker push $_AZ_REGISTRY/web:dryrun + docker push $_AZ_REGISTRY/web-sh:dryrun else - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web:$_RELEASE_VERSION - - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web-sh:$_RELEASE_VERSION + 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: Push version - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - REGISTRY: bitwardenqa.azurecr.io - run: | - docker push $REGISTRY/web:$_RELEASE_VERSION - - docker push $REGISTRY/web-sh:$_RELEASE_VERSION - - name: Log out of Docker run: docker logout - cfpages-deploy: - name: Deploy Web Vault to CloudFlare Pages branch - runs-on: ubuntu-20.04 - needs: - - setup - - self-host + 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.release_version }} + _TAG_VERSION: ${{ needs.setup.outputs.tag_version }} + _BRANCH: "v${{ needs.setup.outputs.release_version }}-deploy" steps: - - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + - 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@main + 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@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml - path: apps/web + 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@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml - path: apps/web + path: assets workflow_conclusion: success branch: master artifacts: web-*-cloud-COMMERCIAL.zip - name: Unzip build asset - working-directory: apps/web + working-directory: assets run: unzip web-*-cloud-COMMERCIAL.zip - - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - with: - ref: cf-pages - path: deployment - - - name: Setup git config + - name: Create new branch run: | - git config --global user.name = "GitHub Action Bot" - git config --global user.email = "<>" + 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: Deploy CloudFlare Pages + - name: Copy build files run: | - rm -rf ./* - cp -R ../apps/web/build/* . - working-directory: deployment + rm -rf ${{ github.workspace }}/ghpages-deployment/* + cp -Rf ${{ github.workspace }}/assets/build/* ghpages-deployment/ - - name: Create cf-pages-deploy branch + - name: Commit and push changes + working-directory: ghpages-deployment run: | - git switch -c cf-pages-deploy-$_TAG_VERSION git add . - git commit -m "Staging deploy ${{ needs.setup.outputs.release_version }}" - - if [[ "${{ github.event.inputs.release_type }}" != "Dry Run" ]]; then - git push -u origin cf-pages-deploy-$_TAG_VERSION - fi - working-directory: deployment + git commit -m "Deploy Web v${_RELEASE_VERSION} to GitHub Pages" + git push --set-upstream origin ${_BRANCH} --force - - name: Create CloudFlare Pages Deploy PR - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + - name: Create GitHub Pages Deploy PR + working-directory: ghpages-deployment env: - PR_BRANCH: cf-pages-deploy-${{ env._TAG_VERSION }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} run: | - gh pr create --title "Deploy $_RELEASE_VERSION to CloudFlare Pages" \ - --body "Deploying $_RELEASE_VERSION" \ - --base cf-pages \ - --head "$PR_BRANCH" - + 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-20.04 + runs-on: ubuntu-22.04 needs: - setup - self-host - - cfpages-deploy + - ghpages-deploy steps: - name: Create GitHub deployment if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 + uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -240,7 +227,7 @@ jobs: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml path: apps/web/artifacts @@ -251,7 +238,7 @@ jobs: - name: Dry Run - Download latest build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml path: apps/web/artifacts @@ -268,7 +255,7 @@ jobs: - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0 + uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 with: name: "Web v${{ needs.setup.outputs.release_version }}" commit: ${{ github.sha }} @@ -281,7 +268,7 @@ jobs: - name: Update deployment status to Success if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' environment-url: http://vault.bitwarden.com @@ -290,7 +277,7 @@ jobs: - name: Update deployment status to Failure if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 + uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 with: token: '${{ secrets.GITHUB_TOKEN }}' environment-url: http://vault.bitwarden.com diff --git a/.github/workflows/staged-rollout-desktop.yml b/.github/workflows/staged-rollout-desktop.yml index d2c842301a3a..f704fbee917e 100644 --- a/.github/workflows/staged-rollout-desktop.yml +++ b/.github/workflows/staged-rollout-desktop.yml @@ -20,15 +20,15 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name, @@ -106,7 +106,7 @@ jobs: 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 diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index 5cd154cf2835..98f3b9d1722c 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: 'Run stale action' - uses: actions/stale@3cc123766321e9f15a6676375c154ccffb12a358 # v5.0.0 + uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 with: stale-issue-label: 'needs-reply' stale-pr-label: 'needs-changes' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 44f5325ce022..59f52bd19645 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,17 +22,24 @@ defaults: jobs: test: name: Run tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - 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@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '16' + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - name: Print environment run: | @@ -46,17 +53,13 @@ jobs: # Tests in apps/ are typechecked when their app is built, so we just do it here for libs/ # See https://bitwarden.atlassian.net/browse/EC-497 - name: Run typechecking - run: | - for p in libs/**/tsconfig.spec.json; do - echo "Typechecking $p" - npx tsc --noEmit --project $p - done + run: npm run test:types - name: Run tests run: npm run test - name: Report test results - uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 + uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0 if: always() with: name: Test Results @@ -76,6 +79,9 @@ jobs: - windows-latest steps: + - name: Rust version check + run: rustup --version + - name: Install gnome-keyring if: ${{ matrix.os=='ubuntu-latest' }} run: | @@ -83,14 +89,7 @@ jobs: sudo apt-get install -y gnome-keyring dbus-x11 - name: Checkout repo - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - - - name: Install rust - uses: actions-rs/toolchain@88dc2356392166efad76775c878094f4e83ff746 - with: - toolchain: stable - profile: minimal - override: true + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Build working-directory: ./apps/desktop/desktop_native diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index 5060156114b6..7b1a787d946b 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -18,7 +18,7 @@ jobs: version_number: ${{ steps.version.outputs.new-version }} steps: - name: Checkout Branch - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Calculate bumped version id: version @@ -39,32 +39,10 @@ jobs: echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT trigger_version_bump: - name: "Trigger desktop version bump workflow" - runs-on: ubuntu-22.04 - needs: - - setup - steps: - - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 - with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af - with: - keyvault: "bitwarden-prod-kv" - secrets: "github-pat-bitwarden-devops-bot-repo-scope" - - - name: Call GitHub API to trigger workflow bump - env: - TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} - VERSION: ${{ needs.setup.outputs.version_number}} - run: | - JSON_STRING=$(printf '{"ref":"master", "inputs": { "client":"Desktop", "version_number":"%s"}}' "$VERSION") - curl \ - -X POST \ - -i -u bitwarden-devops-bot:$TOKEN \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/bitwarden/clients/actions/workflows/version-bump.yml/dispatches \ - -d $JSON_STRING + 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 diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index f7ba508c6c34..9a78f995e836 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -1,48 +1,81 @@ --- name: Version Bump +run-name: Version Bump - v${{ inputs.version_number }} on: workflow_dispatch: inputs: - client: - description: "Client Project" - required: true - type: choice - options: - - Browser - - CLI - - Desktop - - Web + bump_browser: + description: "Bump Browser?" + type: boolean + default: false + bump_cli: + description: "Bump CLI?" + type: boolean + default: false + bump_desktop: + description: "Bump Desktop?" + type: boolean + default: false + bump_web: + description: "Bump Web?" + type: boolean + default: false version_number: - description: "New Version" + description: "New version (example: '2024.1.0')" required: true -defaults: - run: - shell: bash + workflow_call: + inputs: + bump_browser: + description: "Bump Browser?" + type: boolean + default: false + bump_cli: + description: "Bump CLI?" + type: boolean + default: false + bump_desktop: + description: "Bump Desktop?" + type: boolean + default: false + bump_web: + description: "Bump Web?" + type: boolean + default: false + version_number: + description: "New version (example: '2024.1.0')" + required: true + type: string jobs: bump_version: - name: "Bump ${{ github.event.inputs.client }} Version" - runs-on: ubuntu-20.04 + name: "Bump Version to v${{ inputs.version_number }}" + runs-on: ubuntu-22.04 steps: - - name: Checkout Branch - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - - name: Login to Azure - Prod Subscription - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "github-gpg-private-key, + github-gpg-private-key-passphrase, + github-pat-bitwarden-devops-bot-repo-scope" + + - name: Checkout Branch + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 with: - keyvault: "bitwarden-prod-kv" - secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" + repository: bitwarden/clients + ref: master + token: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@c8bb57c57e8df1be8c73ff3d59deab1dbc00e0d1 + uses: crazy-max/ghaction-import-gpg@82a020f1f7f605c65dd2449b392a52c3fcfef7ef # v6.0.0 with: gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} @@ -50,75 +83,169 @@ jobs: git_commit_gpgsign: true - name: Create Version Branch - id: branch - env: - CLIENT_NAME: ${{ github.event.inputs.client }} - VERSION: ${{ github.event.inputs.version_number }} + id: create-branch run: | - CLIENT=$(python -c "print('$CLIENT_NAME'.lower())") - echo "client=$CLIENT" >> $GITHUB_OUTPUT + 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 - git switch -c ${CLIENT}_version_bump_${VERSION} + NAME=version_bump_${{ github.ref_name }}_${{ inputs.version_number }} + git switch -c $NAME + echo "name=$NAME" >> $GITHUB_OUTPUT ######################## # VERSION BUMP SECTION # ######################## ### Browser - - name: Bump Browser Version - if: ${{ github.event.inputs.client == 'Browser' }} + - name: Browser - Verify input version + if: ${{ inputs.bump_browser == true }} env: - VERSION: ${{ github.event.inputs.version_number }} - run: npm version --workspace=@bitwarden/browser ${VERSION} + 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." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/browser + + - name: Bump Browser Version + if: ${{ inputs.bump_browser == true }} + run: npm version --workspace=@bitwarden/browser ${{ inputs.version_number }} - name: Bump Browser Version - Manifest - if: ${{ github.event.inputs.client == 'Browser' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 + if: ${{ inputs.bump_browser == true }} + uses: bitwarden/gh-actions/version-bump@main with: - version: ${{ github.event.inputs.version_number }} + version: ${{ inputs.version_number }} file_path: "apps/browser/src/manifest.json" - name: Bump Browser Version - Manifest v3 - if: ${{ github.event.inputs.client == 'Browser' }} - uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 + if: ${{ inputs.bump_browser == true }} + uses: bitwarden/gh-actions/version-bump@main with: - version: ${{ github.event.inputs.version_number }} + version: ${{ inputs.version_number }} file_path: "apps/browser/src/manifest.v3.json" - name: Run Prettier after Browser Version Bump - if: ${{ github.event.inputs.client == 'Browser' }} + 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: Bump CLI Version - if: ${{ github.event.inputs.client == 'CLI' }} + - name: CLI - Verify input version + if: ${{ inputs.bump_cli == true }} env: - VERSION: ${{ github.event.inputs.version_number }} - run: npm version --workspace=@bitwarden/cli ${VERSION} + 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." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/cli + + - name: Bump CLI Version + if: ${{ inputs.bump_cli == true }} + run: npm version --workspace=@bitwarden/cli ${{ inputs.version_number }} ### Desktop - - name: Bump Desktop Version - Root - if: ${{ github.event.inputs.client == 'Desktop' }} + - name: Desktop - Verify input version + if: ${{ inputs.bump_desktop == true }} env: - VERSION: ${{ github.event.inputs.version_number }} - run: npm version --workspace=@bitwarden/desktop ${VERSION} + 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." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/desktop + + - name: Bump Desktop Version - Root + if: ${{ inputs.bump_desktop == true }} + run: npm version --workspace=@bitwarden/desktop ${{ inputs.version_number }} - name: Bump Desktop Version - App - if: ${{ github.event.inputs.client == 'Desktop' }} - env: - VERSION: ${{ github.event.inputs.version_number }} - run: npm version ${VERSION} + if: ${{ inputs.bump_desktop == true }} + run: npm version ${{ inputs.version_number }} working-directory: "apps/desktop/src" ### Web - - name: Bump Web Version - if: ${{ github.event.inputs.client == 'Web' }} + - name: Web - Verify input version + if: ${{ inputs.bump_web == true }} env: - VERSION: ${{ github.event.inputs.version_number }} - run: npm version --workspace=@bitwarden/web-vault ${VERSION} + 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." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/web + + - name: Bump Web Version + if: ${{ inputs.bump_web == true }} + run: npm version --workspace=@bitwarden/web-vault ${{ inputs.version_number }} ######################## @@ -140,27 +267,26 @@ jobs: - name: Commit files if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: - CLIENT: ${{ steps.branch.outputs.client }} - VERSION: ${{ github.event.inputs.version_number }} + CLIENT: ${{ steps.create-branch.outputs.client }} + VERSION: ${{ inputs.version_number }} run: git commit -m "Bumped ${CLIENT} version to ${VERSION}" -a - name: Push changes if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: - CLIENT: ${{ steps.branch.outputs.client }} - VERSION: ${{ github.event.inputs.version_number }} - run: git push -u origin ${CLIENT}_version_bump_${VERSION} + PR_BRANCH: ${{ steps.create-branch.outputs.name }} + run: git push -u origin $PR_BRANCH - - name: Create Bump Version PR + - name: Create Version PR if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + id: create-pr env: - PR_BRANCH: "${{ steps.branch.outputs.client }}_version_bump_${{ github.event.inputs.version_number }}" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - BASE_BRANCH: master - TITLE: "Bump ${{ github.event.inputs.client }} version to ${{ github.event.inputs.version_number }}" + GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + PR_BRANCH: ${{ steps.create-branch.outputs.name }} + TITLE: "Bump ${{ steps.create-branch.outputs.client }} version to ${{ inputs.version_number }}" run: | - gh pr create --title "$TITLE" \ - --base "$BASE" \ + PR_URL=$(gh pr create --title "$TITLE" \ + --base "master" \ --head "$PR_BRANCH" \ --label "version update" \ --label "automated pr" \ @@ -173,9 +299,17 @@ jobs: - [X] Other ## Objective - Automated ${{ github.event.inputs.client }} version bump to ${{ github.event.inputs.version_number }}" - enforce-labels: - name: Enforce Labels - needs: bump_version - uses: ./.github/workflows/enforce-labels.yml - secrets: inherit + Automated ${{ steps.create-branch.outputs.client }} version bump to ${{ inputs.version_number }}") + echo "pr_number=${PR_URL##*/}" >> $GITHUB_OUTPUT + + - name: Approve PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }} + run: gh pr review $PR_NUMBER --approve + + - name: Merge PR + env: + GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }} + run: gh pr merge $PR_NUMBER --squash --auto --delete-branch diff --git a/.github/workflows/workflow-linter.yml b/.github/workflows/workflow-linter.yml index 9fda2eee0a1c..fc1db4d39014 100644 --- a/.github/workflows/workflow-linter.yml +++ b/.github/workflows/workflow-linter.yml @@ -8,4 +8,4 @@ on: jobs: call-workflow: - uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@master + uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@main diff --git a/.gitignore b/.gitignore index 11a4d4c80ffd..6dea4b43f168 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ junit.xml documentation.json .eslintcache storybook-static + +# Local app configuration +apps/**/config/local.json diff --git a/.nvmrc b/.nvmrc index f0b10f153f86..3f430af82b3d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16.13.1 +v18 diff --git a/.prettierignore b/.prettierignore index 245cb91c21fd..986cadd3d593 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,14 +8,14 @@ storybook-static # External libraries / auto synced locales apps/browser/src/_locales -apps/browser/src/scripts/duo.js +apps/browser/src/auth/scripts/duo.js apps/browser/src/autofill/content/autofill.js apps/browser/src/safari apps/desktop/src/locales apps/desktop/dist-safari apps/desktop/desktop_native -apps/desktop/src/scripts/duo.js +apps/desktop/src/auth/scripts/duo.js apps/cli/src/locales apps/cli/.github diff --git a/.prettierrc.json b/.prettierrc.json index de753c537d23..29ca392ce1bd 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,3 +1,11 @@ { - "printWidth": 100 + "printWidth": 100, + "overrides": [ + { + "files": "*.mdx", + "options": { + "proseWrap": "always" + } + } + ] } diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 3db3964022ec..000000000000 --- a/.storybook/main.js +++ /dev/null @@ -1,33 +0,0 @@ -const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); - -module.exports = { - stories: [ - "../libs/components/src/**/*.stories.mdx", - "../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)", - "../apps/web/src/**/*.stories.mdx", - "../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)", - "../bitwarden_license/bit-web/src/**/*.stories.mdx", - "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", - ], - addons: [ - "@storybook/addon-links", - "@storybook/addon-essentials", - "@storybook/addon-a11y", - "storybook-addon-designs", - ], - framework: "@storybook/angular", - core: { - builder: "webpack5", - disableTelemetry: true, - }, - env: (config) => ({ - ...config, - FLAGS: JSON.stringify({ - secretsManager: true, - }), - }), - webpackFinal: async (config, { configType }) => { - config.resolve.plugins = [new TsconfigPathsPlugin()]; - return config; - }, -}; diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 000000000000..37339b7343c9 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,55 @@ +import { StorybookConfig } from "@storybook/angular"; +import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; +import remarkGfm from "remark-gfm"; + +const config: StorybookConfig = { + stories: [ + "../libs/auth/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)", + "../bitwarden_license/bit-web/src/**/*.mdx", + "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", + ], + addons: [ + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-a11y", + "@storybook/addon-designs", + { + name: "@storybook/addon-docs", + options: { + mdxPluginOptions: { + mdxCompileOptions: { + remarkPlugins: [remarkGfm], + }, + }, + }, + }, + ], + framework: { + name: "@storybook/angular", + options: {}, + }, + core: { + disableTelemetry: true, + }, + env: (config) => ({ + ...config, + FLAGS: JSON.stringify({ + secretsManager: true, + }), + }), + webpackFinal: async (config, { configType }) => { + if (config.resolve) { + config.resolve.plugins = [new TsconfigPathsPlugin()] as any; + } + return config; + }, + docs: { + autodocs: true, + }, +}; + +export default config; diff --git a/.storybook/manager.js b/.storybook/manager.js new file mode 100644 index 000000000000..89a69bf94213 --- /dev/null +++ b/.storybook/manager.js @@ -0,0 +1,63 @@ +import { addons } from "@storybook/addons"; +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.js b/.storybook/preview.js deleted file mode 100644 index 754e8d2b8841..000000000000 --- a/.storybook/preview.js +++ /dev/null @@ -1,38 +0,0 @@ -import { setCompodocJson } from "@storybook/addon-docs/angular"; -import { componentWrapperDecorator, addDecorator } from "@storybook/angular"; - -import docJson from "../documentation.json"; -setCompodocJson(docJson); - -export const parameters = { - actions: { argTypesRegex: "^on[A-Z].*" }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, - options: { - storySort: { - order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], - }, - }, - docs: { inlineStories: true }, -}; - -// ng-template is used to scope any template reference variables and isolate the previews -const decorator = componentWrapperDecorator( - (story) => ` - -
${story}
-
- -
${story}
-
- - - -` -); - -addDecorator(decorator); diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx new file mode 100644 index 000000000000..af20dcad74e9 --- /dev/null +++ b/.storybook/preview.tsx @@ -0,0 +1,112 @@ +import { setCompodocJson } from "@storybook/addon-docs/angular"; +import { componentWrapperDecorator } from "@storybook/angular"; +import type { Preview } from "@storybook/angular"; + +import docJson from "../documentation.json"; +setCompodocJson(docJson); + +const decorator = componentWrapperDecorator( + (story) => { + return ` + +
+ ${story} +
+
+ +
+ ${story} +
+
+ +
+ ${story} +
+
+ +
+ ${story} +
+
+ + + + + + `; + }, + ({ globals }) => { + return { theme: `${globals["theme"]}` }; + }, +); + +const preview: Preview = { + decorators: [decorator], + globalTypes: { + theme: { + description: "Global theme for components", + defaultValue: "both", + toolbar: { + title: "Theme", + icon: "circlehollow", + items: [ + { + title: "Light & Dark", + value: "both", + icon: "sidebyside", + }, + { + title: "Light", + value: "light", + icon: "sun", + }, + { + title: "Dark", + value: "dark", + icon: "moon", + }, + { + title: "Nord", + value: "nord", + left: "⛰", + }, + { + title: "Solarized", + value: "solarized", + left: "☯", + }, + ], + dynamicTitle: true, + }, + }, + }, + parameters: { + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + options: { + storySort: { + method: "alphabetical", + order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], + }, + }, + docs: { source: { type: "dynamic", excludeDecorators: true } }, + }, +}; + +export default preview; diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json index 397be6b000c6..113cc5bcde5b 100644 --- a/.storybook/tsconfig.json +++ b/.storybook/tsconfig.json @@ -7,6 +7,7 @@ "exclude": ["../src/test.setup.ts", "../apps/src/**/*.spec.ts", "../libs/**/*.spec.ts"], "files": [ "./typings.d.ts", + "./preview.tsx", "../libs/components/src/main.ts", "../libs/components/src/polyfills.ts" ] diff --git a/.vscode/settings.json b/.vscode/settings.json index fe586d49e990..27e3a9b293a1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,9 @@ { - "cSpell.words": ["Popout", "Reprompt", "takeuntil"] + "cSpell.words": ["Csprng", "decryptable", "Popout", "Reprompt", "takeuntil"], + "search.exclude": { + "**/locales/[^e]*/messages.json": true, + "**/locales/*[^n]/messages.json": true, + "**/_locales/[^e]*/messages.json": true, + "**/_locales/*[^n]/messages.json": true + } } diff --git a/README.md b/README.md index c04fbf660621..df1f22a09496 100644 --- a/README.md +++ b/README.md @@ -35,98 +35,10 @@ Please refer to the [Clients section](https://contributing.bitwarden.com/getting # We're Hiring! -Interested in contributing in a big way? Consider joining our team! We're hiring for many positions. Please take a look at our [Careers page](https://bitwarden.com/careers/) to see what opportunities are currently open as well as what it's like to work at Bitwarden. +Interested in contributing in a big way? Consider joining our team! We're hiring for many positions. Please take a look at our [Careers page](https://bitwarden.com/careers/) to see what opportunities are [currently open](https://bitwarden.com/careers/#open-positions) as well as what it's like to work at Bitwarden. # 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. 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. - -## Migrate PRs from old repositories - -We recently migrated from individual client repositories. And some PRs were unfortunately left behind in the old repositories. Luckily it's fairly straightforward to sync them up again. Please follow all the instructions below in order to avoid most merge conflicts. - -### Desktop - -``` -# Merge master -git merge master - -# Merge branch mono-repo-prep -git merge 28bc4113b9bbae4dba2b5af14d460764fce79acf - -# Verify files are placed in apps/desktop - -# Add remote -git remote add clients git@github.com:bitwarden/clients.git - -# Merge against clients master -git fetch clients -git merge clients/master - -# Push to clients or your own fork -``` - -### CLI - -``` -# Merge master -git merge master - -# Merge branch mono-repo-prep -git merge 980429f4bdcb178d8d92d8202cbdacfaa45c917e - -# Verify files are placed in apps/cli - -# Add remote -git remote add clients git@github.com:bitwarden/clients.git - -# Merge against clients master -git fetch clients -git merge clients/master - -# Push to clients or your own fork -``` - -### Web - -``` -# Merge master -git merge master - -# Merge branch mono-repo-prep -git merge 02fe7159034b04d763a61fcf0200869e3209fa33 - -# Verify files are placed in apps/web - -# Add remote -git remote add clients git@github.com:bitwarden/clients.git - -# Merge against clients master -git fetch clients -git merge clients/master - -# Push to clients or your own fork -``` - -### Jslib - -``` -# Merge master -git merge master - -# Merge branch mono-repo -git merge d7492e3cf320410e74ebd0e0675ab994e64bd01a - -# Verify files are placed in libs - -# Add remote -git remote add clients git@github.com:bitwarden/clients.git - -# Merge against clients master -git fetch clients -git merge clients/master - -# Push to clients or your own fork -``` diff --git a/angular.json b/angular.json index a2b82cc64e93..4b62c771cbf7 100644 --- a/angular.json +++ b/angular.json @@ -135,20 +135,25 @@ } }, "defaultConfiguration": "development" - } - } - }, - "storybook": { - "projectType": "application", - "root": "libs/components", - "sourceRoot": "libs/components/src", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", + }, + "storybook": { + "builder": "@storybook/angular:start-storybook", "options": { - "tsConfig": ".storybook/tsconfig.json", - "styles": ["libs/components/src/styles.scss", "libs/components/src/styles.css"], - "scripts": [] + "configDir": ".storybook", + "browserTarget": "components:build", + "compodoc": true, + "compodocArgs": ["-p", "./tsconfig.json", "-e", "json", "-d", "."], + "port": 6006 + } + }, + "build-storybook": { + "builder": "@storybook/angular:build-storybook", + "options": { + "configDir": ".storybook", + "browserTarget": "components:build", + "compodoc": true, + "compodocArgs": ["-e", "json", "-d", "."], + "outputDir": "storybook-static" } } } diff --git a/apps/browser/.gitignore b/apps/browser/.gitignore index 7a689bdb9f09..87b21b973082 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/config/base.json b/apps/browser/config/base.json index 6df6c2cfdb14..8a3ccc14d3c9 100644 --- a/apps/browser/config/base.json +++ b/apps/browser/config/base.json @@ -1,4 +1,8 @@ { "dev_flags": {}, - "flags": {} + "flags": { + "showPasswordless": true, + "enableCipherKeyEncryption": false, + "accountSwitching": false + } } diff --git a/apps/browser/config/development.json b/apps/browser/config/development.json index a97475823c76..1b628c173ced 100644 --- a/apps/browser/config/development.json +++ b/apps/browser/config/development.json @@ -5,5 +5,9 @@ "base": "https://localhost:8080" } }, - "flags": {} + "flags": { + "showPasswordless": true, + "enableCipherKeyEncryption": false, + "accountSwitching": true + } } diff --git a/apps/browser/config/production.json b/apps/browser/config/production.json index b04d1531a2f4..027003f6c75a 100644 --- a/apps/browser/config/production.json +++ b/apps/browser/config/production.json @@ -1,3 +1,6 @@ { - "flags": {} + "flags": { + "enableCipherKeyEncryption": false, + "accountSwitching": true + } } diff --git a/apps/browser/gulpfile.js b/apps/browser/gulpfile.js index 26935120ba7f..a8f55cdee804 100644 --- a/apps/browser/gulpfile.js +++ b/apps/browser/gulpfile.js @@ -1,13 +1,11 @@ const child = require("child_process"); const fs = require("fs"); -const del = require("del"); +const { rimraf } = require("rimraf"); 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"); @@ -47,7 +45,10 @@ function distFileName(browserName, ext) { return `dist-${browserName}${buildString()}.${ext}`; } -function dist(browserName, manifest) { +async function dist(browserName, manifest) { + const { default: zip } = await import("gulp-zip"); + const { default: filter } = await import("gulp-filter"); + return gulp .src(paths.build + "**/*") .pipe(filter(["**"].concat(filters.fonts).concat(filters.safari))) @@ -60,6 +61,7 @@ function dist(browserName, manifest) { function distFirefox() { return dist("firefox", (manifest) => { delete manifest.storage; + delete manifest.sandbox; return manifest; }); } @@ -122,14 +124,14 @@ function distSafariApp(cb, subBuildPath) { "--force", "--sign", subBuildPath === "mas" - ? "3rd Party Mac Developer Application: 8bit Solutions LLC" - : "6B287DD81FF922D86FD836128B0F62F358B38726", + ? "3rd Party Mac Developer Application: Bitwarden Inc" + : "E661AB6249AEB60B0F47ABBD7326B2877D2575B0", "--entitlements", entitlementsPath, ]; } - return del([buildPath + "**/*"]) + return rimraf([buildPath + "**/*"], { glob: true }) .then(() => safariCopyAssets(paths.safari + "**/*", buildPath)) .then(() => safariCopyBuild(paths.build + "**/*", buildPath + "safari/app")) .then(() => { @@ -143,7 +145,9 @@ function distSafariApp(cb, subBuildPath) { stdOutProc(proc); return new Promise((resolve) => proc.on("close", resolve)); }) - .then(() => { + .then(async () => { + const { default: filter } = await import("gulp-filter"); + const libs = fs .readdirSync(builtAppexFrameworkPath) .filter((p) => p.endsWith(".dylib")) @@ -167,7 +171,7 @@ function distSafariApp(cb, subBuildPath) { }, () => { return cb; - } + }, ); } @@ -178,7 +182,7 @@ function safariCopyAssets(source, dest) { .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)) + 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)) @@ -186,7 +190,9 @@ function safariCopyAssets(source, dest) { }); } -function safariCopyBuild(source, dest) { +async function safariCopyBuild(source, dest) { + const { default: filter } = await import("gulp-filter"); + return new Promise((resolve, reject) => { gulp .src(source) @@ -202,8 +208,8 @@ function safariCopyBuild(source, dest) { delete manifest.optional_permissions; manifest.permissions.push("nativeMessaging"); return manifest; - }) - ) + }), + ), ) .pipe(gulp.dest(dest)) .on("end", resolve); @@ -215,7 +221,10 @@ function stdOutProc(proc) { proc.stderr.on("data", (data) => console.error(data.toString())); } -function ciCoverage(cb) { +async function ciCoverage(cb) { + const { default: zip } = await import("gulp-zip"); + const { default: filter } = await import("gulp-filter"); + return gulp .src(paths.coverage + "**/*") .pipe(filter(["**", "!coverage/coverage*.zip"])) diff --git a/apps/browser/jest.config.js b/apps/browser/jest.config.js index 4f954afa9e2c..cde02cd9959b 100644 --- a/apps/browser/jest.config.js +++ b/apps/browser/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "jest-preset-angular", diff --git a/apps/browser/package.json b/apps/browser/package.json index d3f64632bc8f..dbb2aec9bf9e 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2023.1.0", + "version": "2023.12.0", "scripts": { "build": "webpack", "build:mv3": "cross-env MANIFEST_VERSION=3 webpack", @@ -18,6 +18,7 @@ "dist:safari:masdev": "npm run build:prod && gulp dist:safari:masdev", "dist:safari:dmg": "npm run build:prod && gulp dist:safari:dmg", "test": "jest", + "test:coverage": "jest --coverage --coverageDirectory=coverage", "test:watch": "jest --watch", "test:watch:all": "jest --watchAll" } diff --git a/apps/browser/postcss.config.js b/apps/browser/postcss.config.js new file mode 100644 index 000000000000..c4513687e890 --- /dev/null +++ b/apps/browser/postcss.config.js @@ -0,0 +1,4 @@ +/* eslint-disable no-undef */ +module.exports = { + plugins: [require("tailwindcss"), require("autoprefixer"), require("postcss-nested")], +}; diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 6ed587af2777..ed1a97a7fa5d 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "التعبئة التلقائية" }, + "autoFillLogin": { + "message": "تسجيل الدخول إلى الملء التلقائي" + }, + "autoFillCard": { + "message": "بطاقة الملء التلقائي" + }, + "autoFillIdentity": { + "message": "هوية التعبئة التلقائية" + }, "generatePasswordCopied": { "message": "إنشاء كلمة مرور (تم النسخ)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "لا توجد تسجيلات دخول مطابقة." }, + "noCards": { + "message": "لا توجد بطاقات" + }, + "noIdentities": { + "message": "لا توجد هويات" + }, + "addLoginMenu": { + "message": "إضافة تسجيل دخول جديد" + }, + "addCardMenu": { + "message": "إضافة بطاقة" + }, + "addIdentityMenu": { + "message": "إضافة هوية" + }, "unlockVaultMenu": { "message": "افتح خزنتك" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "المساعدة والتعليقات" }, + "helpCenter": { + "message": "مركز المساعدة Bitwarden" + }, + "communityForums": { + "message": "استكشاف منتديات مجتمع Bitwarden" + }, + "contactSupport": { + "message": "اتصل بالدعم Bitwarden" + }, "sync": { "message": "المزامنة" }, @@ -329,6 +362,12 @@ "other": { "message": "الأخرى" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "أعدنّ طريقة إلغاء القُفْل لتغيير إجراء مهلة المخزن الخاص بك." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "قيِّم هذه الإضافة" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "إقفل الآن" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "حالاً" }, @@ -430,7 +472,14 @@ "message": "مطلوب إعادة كتابة كلمة المرور الرئيسية." }, "masterPasswordMinlength": { - "message": "يجب أن يكون طول كلمة المرور الرئيسية 8 أحرف على الأقل." + "message": "كلمة المرور الرئيسية يجب أن تكون على الأقل $VALUE$ حرفاً.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "لا يتطابق تأكيد كلمة المرور مع كلمة المرور." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "اطلب إضافة عنصر إذا لم يُعثر عليه في خزنتك." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "أظهر البطاقات في صفحة التبويبات" }, @@ -608,18 +660,36 @@ "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؟" }, "notificationChangeSave": { "message": "تحديث" }, + "notificationUnlockDesc": { + "message": "افتح مخزن Bitwarden الخاص بك لإكمال طلب التعبئة التلقائية." + }, + "notificationUnlock": { + "message": "إلغاء القفل" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "تغيير سمة لون التطبيق." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "داكن", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "الميزة غير متوفرة" }, - "updateKey": { - "message": "لا يمكنك استخدام هذه المِيزة حتى تحديث مفتاح التشفير الخاص بك." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "العضوية المميزة" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات." }, - "ppremiumSignUpTwoStep": { - "message": "خيارات تسجيل الدخول الإضافية من خطوتين مثل YubiKey و FIDO U2F و Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "نظافة كلمة المرور، صحة الحساب، وتقارير خرق البيانات للحفاظ على سلامة خزنتك." @@ -953,74 +1026,99 @@ "environmentSaved": { "message": "روابط البيئة المحفوظة" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "ملء تلقائي عند تحميل الصفحة" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "إذا تم اكتشاف نموذج تسجيل الدخول، يتم التعبئة التلقائية عند تحميل صفحة الويب." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "مواقع المساومة أو غير الموثوق بها يمكن أن تستغل الملء التلقائي في تحميل الصفحة." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "تعرف على المزيد حول الملء التلقائي" }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "الإعداد الافتراضي للملء التلقائي لعناصر تسجيل الدخول" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "يمكنك إيقاف الملء التلقائي في تحميل الصفحة لعناصر تسجيل الدخول الفردية من عرض تحرير العنصر." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "ملء تلقائي عند تحميل الصفحة (إذا كان الإعداد في الخيارات)" }, "autoFillOnPageLoadUseDefault": { "message": "إستخدم الإعداد الإفتراضي" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "ملء تلقائي عند تحميل الصفحة" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "لا تملأ تلقائياً عند تحميل الصفحة" }, "commandOpenPopup": { - "message": "Open vault popup" + "message": "فتح منبثقات المخزن" }, "commandOpenSidebar": { - "message": "Open vault in sidebar" + "message": "فتح المخزن في الشريط الجانبي" }, "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "message": "ملء تلقائي لآخر تسجيل دخول مستخدم للموقع الحالي" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "إنشاء واستنساخ كلمة مرور عشوائية جديدة إلى الحافظة" }, "commandLockVaultDesc": { - "message": "Lock the vault" + "message": "قفل المخزن" }, "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." + "message": "دعم الوضع الخاص تجريبي وبعض الميزات محدودة." }, "customFields": { - "message": "Custom fields" + "message": "الحقول المخصصة" }, "copyValue": { - "message": "Copy value" + "message": "نسخ القيمة" }, "value": { - "message": "Value" + "message": "القيمة" }, "newCustomField": { - "message": "New custom field" + "message": "حقل مخصص جديد" }, "dragToSort": { - "message": "Drag to sort" + "message": "اسحب للفرز" }, "cfTypeText": { - "message": "Text" + "message": "نص" }, "cfTypeHidden": { - "message": "Hidden" + "message": "مخفي" }, "cfTypeBoolean": { "message": "قيمة منطقية" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "إظهار صورة قابلة للتعرف بجانب كل تسجيل دخول." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "إظهار عداد الشارات" }, @@ -1299,110 +1400,110 @@ "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." + "message": "لا توجد كلمات مرور للعرض." }, "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": { - "message": "Password updated", + "message": "تحديث كلمة المرور", "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": "هل أنت متأكد من أنك تريد استخدام خيار \"مطلقا\"؟ إعداد خيارات القفل إلى \"مطلقا\" يخزن مفتاح تشفير المستودع الخاص بك على جهازك. إذا كنت تستخدم هذا الخيار، يجب أن تتأكد من الحفاظ على حماية جهازك بشكل صحيح." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "أنت لا تنتمي إلى أي مؤسسة. تسمح لك المؤسسات بمشاركة العناصر بأمان مع مستخدمين آخرين." }, "noCollectionsInList": { - "message": "There are no collections to list." + "message": "لا توجد مجموعات لعرضها." }, "ownership": { - "message": "Ownership" + "message": "المالك" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "من يملك هذا العنصر؟" }, "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": { - "message": "Weak master password" + "message": "كلمة المرور الرئيسية ضعيفة" }, "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": "كلمة المرور الرئيسية التي اخترتها ضعيفة. يجب عليك استخدام كلمة مرور رئيسية قوية (أو عبارة مرور) لحماية حساب Bitwarden الخاص بك بشكل صحيح. هل أنت متأكد من أنك تريد استخدام كلمة المرور الرئيسية هذه؟" }, "pin": { - "message": "PIN", + "message": "رقم التعريف الشخصي", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "فتح باستخدام رمز 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." + "message": "تعيين رمز PIN الخاص بك لإلغاء قفل Bitwarden. سيتم إعادة تعيين إعدادات PIN الخاصة بك إذا قمت بتسجيل الخروج بالكامل من التطبيق." }, "pinRequired": { - "message": "PIN code is required." + "message": "رمز PIN مطلوب." }, "invalidPin": { - "message": "Invalid PIN code." + "message": "رمز PIN غير صالح." }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "فتح باستخدام القياسات الحيوية" }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "في انتظار التأكيد من سطح المكتب" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + "message": "يرجى التأكد من استخدام القياسات الحيوية في تطبيق سطح المكتب Bitwarden لإعداد القياسات الحيوية للمتصفح." }, "lockWithMasterPassOnRestart": { - "message": "Lock with master password on browser restart" + "message": "قفل مع كلمة المرور الرئيسية عند إعادة تشغيل المتصفح" }, "selectOneCollection": { - "message": "You must select at least one collection." + "message": "يجب عليك تحديد مجموعة واحدة على الأقل." }, "cloneItem": { - "message": "Clone item" + "message": "استنساخ العنصر" }, "clone": { - "message": "Clone" + "message": "استنساخ" }, "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." + "message": "واحدة أو أكثر من سياسات المؤسسة تؤثر على إعدادات المولدات الخاصة بك." }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "إجراء مهلة المخزن" }, "lock": { - "message": "Lock", + "message": "قفل", "description": "Verb form: to make secure or inaccesible by" }, "trash": { @@ -1410,7 +1511,7 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Search trash" + "message": "البحث عن سلة المهملات" }, "permanentlyDeleteItem": { "message": "حذف العنصر بشكل دائم" @@ -1419,40 +1520,64 @@ "message": "هل أنت متأكد من أنك تريد حذف هذا العنصر بشكل دائم؟" }, "permanentlyDeletedItem": { - "message": "Item permanently deleted" + "message": "تم حذف العنصر بشكل دائم" }, "restoreItem": { "message": "استعادة العنصر" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { - "message": "Item restored" + "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?" + "message": "سيؤدي تسجيل الخروج إلى إزالة جميع إمكانية الوصول إلى خزنتك ويتطلب المصادقة عبر الإنترنت بعد انتهاء المهلة. هل أنت متأكد من أنك تريد استخدام هذا الإعداد؟" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "تأكيد إجراء المهلة" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "التعبئة التلقائية والحفظ" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "تم تعبئة العنصر تلقائياً وحفظ عنوان URI" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "ملء العنصر تلقائياً " + }, + "insecurePageWarning": { + "message": "تحذير: هذه صفحة HTTP غير آمنة، وأي معلومات تقدمها يمكن رؤيتها وتغييرها من قبل الآخرين. تم حفظ تسجيل الدخول هذا في الأصل على صفحة آمنة (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "هل مازلت ترغب في ملء هذا الدخول؟" + }, + "autofillIframeWarning": { + "message": "يتم استضافة النموذج من قبل نطاق مختلف عن عنوان URI الخاص بتسجيل الدخول المحفوظ. اختر موافق للملء التلقائي على أي حال، أو ألغ للتوقف." + }, + "autofillIframeWarningTip": { + "message": "لمنع هذا التحذير في المستقبل، حفظ هذا الرابط، $HOSTNAME$ إلى عنصر تسجيل الدخول الخاص بك Bitwarden لهذا الموقع.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { - "message": "Set master password" + "message": "تعيين كلمة مرور رئيسية" + }, + "currentMasterPass": { + "message": "كلمة المرور الرئيسية الحالية" + }, + "newMasterPass": { + "message": "كلمة مرور رئيسية جديدة" + }, + "confirmNewMasterPass": { + "message": "تأكيد كلمة المرور الرئيسية الجديدة" }, "masterPasswordPolicyInEffect": { - "message": "One or more organization policies require your master password to meet the following requirements:" + "message": "1 - تتطلب سياسة واحدة أو أكثر من سياسات المؤسسة كلمة مرورك الرئيسية لتلبية المتطلبات التالية:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "الحد الأدنى لدرجة التعقيد $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1461,7 +1586,7 @@ } }, "policyInEffectMinLength": { - "message": "Minimum length of $LENGTH$", + "message": "الحد الأدنى لطول $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -1470,16 +1595,16 @@ } }, "policyInEffectUppercase": { - "message": "Contain one or more uppercase characters" + "message": "يحتوي على حرف كبير واحد أو أكثر" }, "policyInEffectLowercase": { - "message": "Contain one or more lowercase characters" + "message": "يحتوي على واحد أو أكثر من الأحرف الصغيرة" }, "policyInEffectNumbers": { - "message": "Contain one or more numbers" + "message": "يحتوي على رقم واحد أو أكثر" }, "policyInEffectSpecial": { - "message": "Contain one or more of the following special characters $CHARS$", + "message": "يحتوي على واحد أو أكثر من الأحرف الخاصة التالية $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -1491,7 +1616,7 @@ "message": "كلمة المرور الرئيسية الجديدة لا تفي بمتطلبات السياسة العامة." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "من خلال تحديد هذا المربع فإنك توافق على ما يلي:" }, "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,14 +1705,20 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "excludedDomains": { - "message": "Excluded domains" + "message": "النطاقات المستبعدة" }, "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 لن يطلب حفظ تفاصيل تسجيل الدخول لهذه النطاقات. يجب عليك تحديث الصفحة حتى تصبح التغييرات سارية المفعول." + }, + "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." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ نطاق غير صالح", "placeholders": { "domain": { "content": "$1", @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "تم تغيير كلمة المرور الرئيسية الخاصة بك مؤخرًا من قبل مسؤول في مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديثها الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. قد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة." }, + "updateWeakMasterPasswordWarning": { + "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, "resetPasswordPolicyAutoEnroll": { "message": "التسجيل التلقائي" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "من أجل إكمال تسجيل الدخول باستخدام SSO، يرجى تعيين كلمة المرور الرئيسية للوصول لخزنتك وحمايتها." + "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" }, "hours": { "message": "ساعات" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "مهلة خزنتك تتجاوز القيود التي تضعها مؤسستك." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "جاري تصدير الخزنة الشخصية" }, - "exportingPersonalVaultDescription": { - "message": "سيتم تصدير فقط عناصر الخزنة الشخصية المرتبطة بـ $EMAIL$. لن يتم إدراج عناصر خزنة المؤسسة.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "لا يمكن الوصول للعناصر في المؤسسات المعطلة. اتصل بمدير مؤسستك للحصول على المساعدة." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "جاري تسجيل الدخول إلى $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "إصدار الخادم" }, - "selfHosted": { - "message": "استضافة ذاتية" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 84237315f024..17ec5d4354df 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -38,7 +38,7 @@ "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, anbarınıza müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu geri qaytarmağın heç bir yolu yoxdur." }, "masterPassHintDesc": { "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatırlamağınıza kömək edir." @@ -47,7 +47,7 @@ "message": "Ana parolu yenidən yaz" }, "masterPassHint": { - "message": "Ana parol məsləhəti (ixtiyari)" + "message": "Ana parol ipucu (ixtiyari)" }, "tab": { "message": "Vərəq" @@ -65,7 +65,7 @@ "message": "Alətlər" }, "settings": { - "message": "Tənzimləmələr" + "message": "Ayarlar" }, "currentTab": { "message": "Hazırkı vərəq" @@ -74,7 +74,7 @@ "message": "Parolu kopyala" }, "copyNote": { - "message": "Qeydi kopyala" + "message": "Notu kopyala" }, "copyUri": { "message": "URI-ni kopyala" @@ -91,6 +91,15 @@ "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ı)" }, @@ -100,8 +109,23 @@ "noMatchingLogins": { "message": "Uyğun gələn hesab 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": "Anbarınızın kilidini açın" }, "loginToVaultMenu": { "message": "Anbarınıza giriş edin" @@ -116,19 +140,19 @@ "message": "Element əlavə et" }, "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,7 +161,7 @@ "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." @@ -157,7 +181,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "İki mərhələli giriş" + "message": "İki addımlı giriş" }, "logOut": { "message": "Çıxış" @@ -190,19 +214,28 @@ "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" + }, + "communityForums": { + "message": "Bitwarden cəmiyyət forumlarını kəşf et" + }, + "contactSupport": { + "message": "Bitwarden dəstəyi ilə əlaqə" }, "sync": { - "message": "Eyniləşdirmə" + "message": "Sinxr" }, "syncVaultNow": { - "message": "Anbarı indi eyniləşdir" + "message": "Anbarı indi sinxronlaşdır" }, "lastSync": { - "message": "Son eyniləşdirmə:" + "message": "Son sinxr:" }, "passGen": { "message": "Parol yaradıcı" @@ -218,7 +251,7 @@ "message": "Bitwarden veb anbarı" }, "importItems": { - "message": "Elementləri idxal et" + "message": "Elementləri daxilə köçür" }, "select": { "message": "Seçin" @@ -279,7 +312,7 @@ "message": "Bax" }, "noItemsInList": { - "message": "Siyahılanacaq heç bir element yoxdur." + "message": "Sadalanacaq heç bir element yoxdur." }, "itemInformation": { "message": "Element məlumatları" @@ -291,16 +324,16 @@ "message": "Parol" }, "passphrase": { - "message": "Uzun ifadə" + "message": "Parol ifadəsi" }, "favorite": { "message": "Sevimli" }, "notes": { - "message": "Qeydlər" + "message": "Notlar" }, "note": { - "message": "Qeyd" + "message": "Not" }, "editItem": { "message": "Elementə düzəliş et" @@ -329,8 +362,14 @@ "other": { "message": "Digər" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Anbar vaxt bitməsi əməliyyatınızı dəyişdirmək üçün bir kilid açma üsulu qurun." + }, + "unlockMethodNeeded": { + "message": "Ayarlarda bir kilid açma üsulu qurun" + }, "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!" @@ -339,10 +378,10 @@ "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": "Anbarınız kilidlənib. Davam etmək üçün kimliyinizi doğrulayın." }, "unlock": { "message": "Kilidi aç" @@ -369,6 +408,9 @@ "lockNow": { "message": "İndi kilidlə" }, + "lockAll": { + "message": "Hamısını kilidlə" + }, "immediately": { "message": "Dərhal" }, @@ -418,34 +460,41 @@ "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ı 8 simvol uzunluğunda olmalıdır." + "message": "Ana parol ən azı $VALUE$ simvol uzunluğunda olmalıdır.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { - "message": "Ana parol təsdiqləməsi uyğun gəlmir." + "message": "Ana parolun təsdiqi uyğun gəlmir." }, "newAccountCreated": { "message": "Yeni hesabınız yaradıldı! İndi giriş edə 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." }, "invalidVerificationCode": { - "message": "Yararsız təsdiqləmə kodu" + "message": "Yararsız doğrulama kodu" }, "valueCopied": { "message": "$VALUE$ kopyalandı", @@ -458,13 +507,13 @@ } }, "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." }, "loggedOut": { "message": "Çıxış edildi" }, "loginExpired": { - "message": "Seansın müddəti bitdi." + "message": "Giriş seansınızın müddəti bitdi." }, "logOutConfirmation": { "message": "Çıxış etmək istədiyinizə əminsiniz?" @@ -476,10 +525,10 @@ "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" @@ -491,10 +540,10 @@ "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 anbarında qurula bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" }, "editedFolder": { - "message": "Qovluğa düzəliş edildi" + "message": "Qovluğ saxlanıldı" }, "deleteFolderConfirmation": { "message": "Bu qovluğu silmək istədiyinizə əminsiniz?" @@ -506,13 +555,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ı" @@ -537,7 +586,7 @@ "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?" @@ -574,19 +623,22 @@ "message": "Giriş əlavə etmək üçün soruş" }, "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": "Anbarınızda tapılmayan bir elementin əlavə edilməsi soruşulsun." + }, + "addLoginNotificationDescAlt": { + "message": "Anbarınızda tapılmayan bir elementin əlavə edilməsi soruşulsun. Giriş etmiş bütün hesablara aiddir." }, "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." }, "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ə", @@ -600,13 +652,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 anbarınızda 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?" @@ -614,12 +675,21 @@ "notificationChangeSave": { "message": "Güncəllə" }, + "notificationUnlockDesc": { + "message": "Avto-doldurma tələblərini tamamlamaq üçün Bitwarden anbarınızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "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. " }, + "contextMenuItemDescAlt": { + "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. Giriş etmiş bütün hesablara aiddir." + }, "defaultUriMatchDetection": { "message": "İlkin URI uyğunluq aşkarlaması", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,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" @@ -646,7 +719,7 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Anbarı ixrac et" + "message": "Anbarı xaricə köçür" }, "fileFormat": { "message": "Fayl formatı" @@ -656,19 +729,19 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Anbarın ixracını təsdiqləyin" + "message": "Anbarın xaricə köçürülməsini 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": "Anbar datanızı xaricə köçürmək üçün ana parolunuzu daxil edin." }, "shared": { "message": "Paylaşılan" @@ -677,7 +750,7 @@ "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?" + "message": "Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verir. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?" }, "moveToOrganization": { "message": "Təşkilata daşı" @@ -686,7 +759,7 @@ "message": "Paylaş" }, "movedItemToOrg": { - "message": "$ITEMNAME$ $ORGNAME$ şirkətinə daşındı", + "message": "$ITEMNAME$, $ORGNAME$ şirkətinə daşındı", "placeholders": { "itemname": { "content": "$1", @@ -705,13 +778,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" @@ -738,7 +811,7 @@ "message": "Fayl" }, "selectFile": { - "message": "Fayl seçin." + "message": "Bir fayl seçin" }, "maxFileSize": { "message": "Maksimal fayl həcmi 500 MB-dır" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Özəllik əlçatmazdır" }, - "updateKey": { - "message": "Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." + "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 lütfən veb anbar üzərindən giriş edin." }, "premiumMembership": { "message": "Premium üzvlük" @@ -770,14 +843,14 @@ "ppremiumSignUpStorage": { "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi" }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey, FIDO U2F və Duo kimi iki mərhələli giriş seçimləri" + "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": "Anbarınızın güvənliyini təmin etmək üçü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": "Anbarınızdakı hesablar üçün TOTP doğrulama kodu (2FA) yaradıcısı." }, "ppremiumSignUpSupport": { "message": "Prioritet müştəri dəstəyi." @@ -813,10 +886,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" @@ -825,10 +898,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", @@ -837,7 +910,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", @@ -849,49 +922,49 @@ "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.", + "message": "Vaxt əsaslı doğrulama kodları yaratmaq üçün (Authy və ya Google Authenticator kimi) kimlik doğrulayıcı tətbiq istifadə edin.", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { @@ -901,24 +974,24 @@ "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.", + "message": "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." }, "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." + "message": "Doğrulama kodları e-poçt ünvanınıza göndəriləcək." }, "selfHostedEnvironment": { "message": "Öz-özünə sahiblik edən mühit" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Mühit URL-ləri saxlanıldı." }, + "showAutoFillMenuOnFormFields": { + "message": "Form sahələrində avto-doldurma menyusunu göstər", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Giriş etmiş bütün hesablara aiddir." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Bağlı", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Sahə seçiləndə (fokusda)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Avto-doldurma nişanı seçiləndə", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, "enableAutoFillOnPageLoad": { "message": "Səhifə yüklənəndə avto-doldurmanı fəallaşdır" }, @@ -960,22 +1058,22 @@ "message": "Giriş formu aşkarlananda, səhifə yüklənən zaman formu avto-doldurma icra edilsin." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "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." }, "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" @@ -984,7 +1082,7 @@ "message": "Səhifə yüklənəndə avto-doldurma" }, "commandOpenPopup": { - "message": "Anbar açılan pəncərədə aç" + "message": "Anbarı açılan pəncərədə aç" }, "commandOpenSidebar": { "message": "Anbar yan sətirdə aç" @@ -1014,7 +1112,7 @@ "message": "Yeni özəl sahə" }, "dragToSort": { - "message": "Sıralamaq üçün sürüşdürün" + "message": "Sıralamaq üçün sürüklə" }, "cfTypeText": { "message": "Mətn" @@ -1026,15 +1124,15 @@ "message": "Boolean" }, "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?" @@ -1045,6 +1143,9 @@ "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" }, @@ -1239,7 +1340,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.", @@ -1305,7 +1406,7 @@ "message": "Bütün elementlər" }, "noPasswordsInList": { - "message": "Siyahılanacaq heç bir parol yoxdur." + "message": "Sadalanacaq heç bir parol yoxdur." }, "remove": { "message": "Çıxart" @@ -1326,13 +1427,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\" seçimini istifadə etmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq ayarlasanız, 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." }, "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" @@ -1366,7 +1467,7 @@ "message": "PIN ilə kilidi açın" }, "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." }, "pinRequired": { "message": "PIN kod lazımdır." @@ -1375,13 +1476,13 @@ "message": "Yararsız PIN kod." }, "unlockWithBiometrics": { - "message": "Biometriklərlə kilidi açın" + "message": "Kilidi biometriklə açın" }, "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ə" @@ -1396,10 +1497,10 @@ "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." }, "vaultTimeoutAction": { - "message": "Anbara müraciət vaxtının bitmə əməliyyatı" + "message": "Anbar vaxtının bitmə əməliyyatı" }, "lock": { "message": "Kilidlə", @@ -1424,14 +1525,11 @@ "restoreItem": { "message": "Elementi bərpa et" }, - "restoreItemConfirmation": { - "message": "Elementi bərpa etmək istədiyinizə əminsiniz?" - }, "restoredItem": { "message": "Element bərpa edildi" }, "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ə anbarınıza 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" @@ -1445,8 +1543,35 @@ "autoFillSuccess": { "message": "Element avto-dolduruldu" }, + "insecurePageWarning": { + "message": "Xəbərdarlıq: Bu, güvənli olmayan bir HTTP səhifəsidir və göndərdiyiniz istənilən məlumat başqaları tərəfindən görünə və dəyişdirilə bilər. Bu Giriş, orijinal olaraq güvənli (HTTPS) bir səhifədə saxlanılmışdır." + }, + "insecurePageWarningFillPrompt": { + "message": "Hələ də bu girişi doldurmaq istəyirsiniz?" + }, + "autofillIframeWarning": { + "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ığı önləmək üçün, $HOSTNAME$ URI-nı bu sayt üçün Bitwarden giriş elementinizdə saxlayın.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { - "message": "Ana parolu tənzimlə" + "message": "Ana parolu ayarla" + }, + "currentMasterPass": { + "message": "Hazırkı ana parol" + }, + "newMasterPass": { + "message": "Yeni ana parol" + }, + "confirmNewMasterPass": { + "message": "Yeni ana parolu təsdiqlə" }, "masterPasswordPolicyInEffect": { "message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:" @@ -1503,52 +1628,52 @@ "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" }, "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" }, "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" @@ -1556,17 +1681,23 @@ "biometricsNotSupportedDesc": { "message": "Brauzer biometrikləri bu cihazda dəstəklənmir." }, + "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ə, 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ı kənar ç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." @@ -1574,14 +1705,20 @@ "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 anbarınıza köçürülməsini əngəllədi." + }, "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." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ etibarlı bir domen deyil", + "message": "$DOMAIN$ yararlı bir domen deyil", "placeholders": { "domain": { "content": "$1", @@ -1625,11 +1762,11 @@ "message": "Parolla qorunan" }, "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" @@ -1642,14 +1779,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", @@ -1685,7 +1822,7 @@ "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": { @@ -1707,7 +1844,7 @@ "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": { @@ -1715,15 +1852,15 @@ "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": { @@ -1737,14 +1874,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": { @@ -1756,17 +1893,17 @@ "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." }, "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ə) kənar ç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 kənar ç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." }, "sendFileCalloutHeader": { "message": "Başlamazdan əvvəl" @@ -1784,16 +1921,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." @@ -1811,13 +1948,13 @@ "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" }, "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 anbarında doğrulaya bilərsiniz." }, "updatedMasterPassword": { "message": "Güncəllənmiş ana parol" @@ -1826,19 +1963,27 @@ "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. Anbara müraciət üçün 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ış 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." }, "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." + "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" }, "hours": { "message": "Saat" @@ -1859,17 +2004,43 @@ } } }, + "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 ayarlandı.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Təşkilatınızın siyasətləri, anbar vaxt bitişi əməliyyatınızı $ACTION$ olaraq ayarladı.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "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": "Anbar vaxt bitişi, təşkilatınız tərəfindən ayarlanan məhdudiyyətləri aşır." }, "vaultExportDisabled": { - "message": "Anbar ixracı sıradan çıxarıldı" + "message": "Anbarın 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 anbarınızı 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ı." @@ -1902,13 +2073,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 anbarın xaricə köçürülməsi" }, - "exportingPersonalVaultDescription": { - "message": "Yalnız $EMAIL$ ilə əlaqəli şəxsi anbar elementləri ixrac ediləcək. Təşkilat anbar elementləri daxil edilmir.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1929,17 +2100,17 @@ "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" @@ -1982,13 +2153,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." - }, - "cardBrandMir": { - "message": "Mir" + "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", @@ -2000,25 +2168,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ı" }, - "selfHosted": { - "message": "Öz-özünə sahiblik edən" + "selfHostedServer": { + "message": "öz-özünə sahiblik edən" }, "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", @@ -2027,7 +2195,7 @@ } }, "lastSeenOn": { - "message": "son görünmə $DATE$", + "message": "son görünmə: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "E-poçtu xatırla" }, + "loginWithDevice": { + "message": "Cihazla giriş et" + }, + "loginWithDeviceEnabledInfo": { + "message": "Cihazla giriş, Bitwarden tətbiqinin ayarlarında qurulmalıdır. Başqa bir seçimə ehtiyacınız var?" + }, + "fingerprintPhraseHeader": { + "message": "Barmaq izi ifadəsi" + }, + "fingerprintMatchInfo": { + "message": "Lütfən anbarınızın kilidinin açıq olduğuna və Barmaq izi ifadəsinin digər cihazda uyğun gəldiyinə əmin olun." + }, + "resendNotification": { + "message": "Bildirişi təkrar göndər" + }, + "viewAllLoginOptions": { + "message": "Bütün giriş seçimlərinə bax" + }, + "notificationSentDevice": { + "message": "Cihazınıza bir bildiriş göndərildi." + }, + "loginInitiated": { + "message": "Giriş başladıldı" + }, "exposedMasterPassword": { "message": "İfşa olunmuş ana parol" }, @@ -2069,7 +2261,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", @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Təşkilatınızın siyasətləri, səhifə yüklənəndə avto-doldurmanı işə saldı." + }, + "howToAutofill": { + "message": "Avto-doldurma necə edilir" + }, + "autofillSelectInfoWithCommand": { + "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", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "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 ayarları" + }, + "autofillShortcut": { + "message": "Avto-doldurma klaviatura qısayolu" + }, + "autofillShortcutNotSet": { + "message": "Avto-doldurma qısayolu ayarlanmayıb. Bunu brauzerin ayarlarında dəyişdirin." + }, + "autofillShortcutText": { + "message": "Avto-doldurma qısayolu: $COMMAND$. Bunu brauzerin ayarlarında dəyişdirin.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "İlkin avto-doldurma qısayolu: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Giriş edilir" + }, + "opensInANewWindow": { + "message": "Yeni bir pəncərədə açılır" + }, + "deviceApprovalRequired": { + "message": "Cihaz təsdiqi tələb olunur. Aşağıdan bir təsdiq variantı seçin:" + }, + "rememberThisDevice": { + "message": "Bu cihazı xatırla" + }, + "uncheckIfPublicDevice": { + "message": "Hər kəsə açıq bir cihaz istifadə edirsinizsə işarəni götürün" + }, + "approveFromYourOtherDevice": { + "message": "Digər cihazınızdan təsdiqləyin" + }, + "requestAdminApproval": { + "message": "Admin təsdiqini tələb et" + }, + "approveWithMasterPassword": { + "message": "Ana parolla təsdiqlə" + }, + "ssoIdentifierRequired": { + "message": "Təşkilat SSO identifikatoru tələb olunur." + }, + "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." + }, + "general": { + "message": "Ümumi" + }, + "display": { + "message": "Ekran" + }, + "accountSuccessfullyCreated": { + "message": "Hesab uğurla yaradıldı!" + }, + "adminApprovalRequested": { + "message": "Admin təsdiqi tələb olunur" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Tələbiniz admininizə göndərildi." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Təsdiqləndikdən sonra məlumatlandırılacaqsınız." + }, + "troubleLoggingIn": { + "message": "Girişdə problem var?" + }, + "loginApproved": { + "message": "Giriş təsdiqləndi" + }, + "userEmailMissing": { + "message": "İstifadəçi e-poçtu əskikdir" + }, + "deviceTrusted": { + "message": "Cihaz güvənlidir" + }, + "inputRequired": { + "message": "Giriş lazımdır." + }, + "required": { + "message": "tələb olunur" + }, + "search": { + "message": "Axtar" + }, + "inputMinLength": { + "message": "Giriş, ən azı $COUNT$ simvol uzunluğunda olmalıdır.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Giriş uzunluğu $COUNT$ simvolu aşmamalıdır.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Aşağıdakı simvollara icazə verilmir: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Giriş dəyəri ən azı $MIN$ olmalıdır.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Giriş dəyəri $MAX$ dəyərini aşmamalıdır.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 və ya daha çox e-poçt yararsızdır" + }, + "inputTrimValidator": { + "message": "Giriş, yalnız boşluq ehtiva etməməlidir.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Giriş, bir e-poçt ünvanı deyil." + }, + "fieldsNeedAttention": { + "message": "Yuxarıdakı $COUNT$ sahənin diqqətinizə ehtiyacı var.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Seç --" + }, + "multiSelectPlaceholder": { + "message": "-- Filtrləmək üçün yazın --" + }, + "multiSelectLoading": { + "message": "Seçimlər alınır..." + }, + "multiSelectNotFound": { + "message": "Heç bir element tapılmadı" + }, + "multiSelectClearAll": { + "message": "Hamısını təmizlə" + }, + "plusNMore": { + "message": "daha $QUANTITY$ ədəd", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Alt menyu" + }, + "toggleCollapse": { + "message": "Yığcamlaşdırmanı aç/bağla", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Bu sahəyə 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." + }, + "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": "Uyğunlaş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." + }, + "unlockAccount": { + "message": "Hesabın kilidini aç", + "description": "Button text to display in overlay when the account is locked." + }, + "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 anbar elementi əlavə et", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "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" + } + } + }, + "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" + } + } + }, + "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ə uyğunlaşmır." + }, + "invalidFilePassword": { + "message": "Yararsız fayl parolu, lütfən xaricə köçürmə faylını yaradarkən daxil etdiyiniz parolu istifadə edin." + }, + "importDestination": { + "message": "Hədəfi daxilə köçür" + }, + "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": "Anbarın daxilə köçürülməsini təsdiqləyin" + }, + "confirmVaultImportDesc": { + "message": "Bu fayl parolla qorunur. Məlumatları daxilə köçürmək üçün fayl parolunu daxil edin." + }, + "confirmFilePassword": { + "message": "Fayl parolunu təsdiqlə" + }, + "typePasskey": { + "message": "Keçid açarı" + }, + "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." + }, + "logInWithPasskey": { + "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 uyğunlaşan bir giriş məlumatınız yoxdur." + }, + "confirm": { + "message": "Təsdiqlə" + }, + "savePasskey": { + "message": "Keçid açarını saxla" + }, + "savePasskeyNewLogin": { + "message": "Keçid açarını yeni bir giriş olaraq saxla" + }, + "choosePasskey": { + "message": "Bu keçid açarını saxlayacaq bir giriş 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." + }, + "useBrowserName": { + "message": "Brauzer istifadə et" + }, + "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" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 0bc2fdc0ed8d..029288a7dea5 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Аўтазапаўненне" }, + "autoFillLogin": { + "message": "Аўтазапаўненне лагіна" + }, + "autoFillCard": { + "message": "Аўтазапаўненне карткі" + }, + "autoFillIdentity": { + "message": "Аўтазапаўненне асабістых даных" + }, "generatePasswordCopied": { "message": "Генерыраваць пароль (з капіяваннем)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Няма адпаведных лагінаў." }, + "noCards": { + "message": "Няма картак" + }, + "noIdentities": { + "message": "Няма прыватных даных" + }, + "addLoginMenu": { + "message": "Дадаць лагін" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Разблакіраваць сховішча" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Даведка і зваротная сувязь" }, + "helpCenter": { + "message": "Даведачны цэнтр Bitwarden" + }, + "communityForums": { + "message": "Наведайце форумы супольнасці Bitwarden" + }, + "contactSupport": { + "message": "Звярніцеся ў службу падтрымкі Bitwarden" + }, "sync": { "message": "Сінхранізаваць" }, @@ -329,6 +362,12 @@ "other": { "message": "Iншае" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Ацаніць пашырэнне" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Заблакіраваць зараз" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Адразу" }, @@ -430,7 +472,14 @@ "message": "Неабходна паўторна ўвесці асноўны пароль." }, "masterPasswordMinlength": { - "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў." + "message": "Асноўны пароль павінен змяшчаць прынамсі $VALUE$ сімвалаў.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Пацвярджэнне асноўнага пароля не супадае." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Пытацца пра дадаванне элемента, калі ён адсутнічае ў вашым сховішчы." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Паказваць карткі на старонцы з укладкамі" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Абнавіць" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Разблакіраваць" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Змена каляровай тэмы праграмы." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Цёмная", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Функцыя недаступна" }, - "updateKey": { - "message": "Вы не зможаце выкарыстоўваць гэту функцыю, пакуль не абнавіце свой ключ шыфравання." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Прэміяльны статус" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашыфраванага сховішча для далучаных файлаў." }, - "ppremiumSignUpTwoStep": { - "message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "URL-адрас сервера асяроддзя захаваны." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Аўтазапаўненне пры загрузцы старонкі" }, @@ -960,10 +1058,10 @@ "message": "Калі выяўлена форма ўваходу, то будзе выканана яе аўтазапаўненне падчас загрузкі вэб-старонкі." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Скампраметаваныя або ненадзейныя вэб-сайты могуць задзейнічаць функцыю аўтазапаўнення падчас загрузкі старонкі." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Даведацца больш пра аўтазапаўненне" }, "defaultAutoFillOnPageLoad": { "message": "Прадвызначаная налада аўтазапаўнення для элементаў уваходу" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Паказваць распазнавальны відарыс побач з кожным лагінам." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Паказваць лічыльнік на значку" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Аднавіць элемент" }, - "restoreItemConfirmation": { - "message": "Вы сапраўды хочаце аднавіць гэты элемент?" - }, "restoredItem": { "message": "Элемент адноўлены" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Аўтазапоўнены элемент" }, + "insecurePageWarning": { + "message": "Папярэджанне: гэта старонка HTTP не абаронена. Любая інфармацыя, якую вы адпраўляеце тэарэтычна можа перахоплена і зменена любым карыстальнікам. Гэты лагін першапачаткова захаваны на абароненай старонцы (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Вы ўсё яшчэ хочаце запоўніць гэты лагін?" + }, + "autofillIframeWarning": { + "message": "Форма размешчана на іншым дамене, які адрозніваецца ад URI вашага захаванага лагіна. Націсніце \"Добра\", каб усё роўна запоўніць або \"Скасаваць\" для спынення." + }, + "autofillIframeWarningTip": { + "message": "Каб больш не атрымліваць гэта папярэджанне, захавайце гэты URI, $HOSTNAME$ у свае элементы ўваходу Bitwarden для гэтага сайта.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Прызначыць асноўны пароль" }, + "currentMasterPass": { + "message": "Бягучы асноўны пароль" + }, + "newMasterPass": { + "message": "Новы асноўны пароль" + }, + "confirmNewMasterPass": { + "message": "Пацвердзіць новы асноўны пароль" + }, "masterPasswordPolicyInEffect": { "message": "Адна або больш палітык арганізацыі патрабуе, каб ваш асноўны пароль адпавядаў наступным патрабаванням:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Біяметрыя ў браўзеры не падтрымліваецца на гэтай прыладзе." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Дазволы не прадастаўлены" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Палітыка арганізацыі ўплывае на вашы параметры ўласнасці." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ не з'яўляецца правільным даменам", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Ваш асноўны пароль нядаўна быў зменены адміністратарам арганізацыі. Для таго, каб атрымаць доступ да вашага сховішча, вы павінны абнавіць яго зараз. Гэта прывядзе да завяршэння бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны." }, + "updateWeakMasterPasswordWarning": { + "message": "Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны." + }, "resetPasswordPolicyAutoEnroll": { "message": "Аўтаматычная рэгістрацыя" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Выбраць папку..." }, - "ssoCompleteRegistration": { - "message": "Для завяршэння працэсу ўваходу з дапамогай SSO, прызначце асноўны пароль для доступу да вашага сховішча і яго абароны." + "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" }, "hours": { "message": "Гадзіны" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае гадзін: $HOURS$; хвілін: $MINUTES$. Для часу чакання вашага сховішча прызначана дзеянне $ACTION$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Палітыкай вашай арганізацыі прызначана дзеянне $ACTION$ для часу чакання вашага сховішча.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Экспартаванне асабістага сховішча" }, - "exportingPersonalVaultDescription": { - "message": "Будуць экспартаваны толькі асабістыя элементы сховішча, якія звязаны з $EMAIL$. Элементы сховішча арганізацыі не будуць уключаны.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Доступ да элементаў у адключаных арганізацыях немагчымы. Звяжыце з уладальнікам арганізацыі для атрымання дапамогі." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Увайсці ў $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Версія сервера" }, - "selfHosted": { - "message": "Уласнае размяшчэнне" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Іншы пастаўшчык" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Запомніць электронную пошту" }, + "loginWithDevice": { + "message": "Уваход з прыладай" + }, + "loginWithDeviceEnabledInfo": { + "message": "Неабходна наладзіць уваход з прыладай у наладах мабільнай праграмы Bitwarden. Патрабуецца іншы варыянт?" + }, + "fingerprintPhraseHeader": { + "message": "Фраза адбітка пальца" + }, + "fingerprintMatchInfo": { + "message": "Пераканайцеся, што ваша сховішча разблакіравана, а фраза адбітка пальца супадае з іншай прыладай." + }, + "resendNotification": { + "message": "Адправіць апавяшчэнне паўторна" + }, + "viewAllLoginOptions": { + "message": "Паглядзець усе варыянты ўваходу" + }, + "notificationSentDevice": { + "message": "Апавяшчэнне было адпраўлена на вашу прыладу." + }, + "loginInitiated": { + "message": "Ініцыяваны ўваход" + }, "exposedMasterPassword": { "message": "Скампраметаваны асноўны пароль" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Аўтазапаўненне пры загрузцы старонцы было ўключана палітыкамі вашай арганізацыі." + }, + "howToAutofill": { + "message": "Як аўтазапоўніць" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Зразумела" + }, + "autofillSettings": { + "message": "Налады аўтазапаўнення" + }, + "autofillShortcut": { + "message": "Спалучэнні клавіш аўтазапаўнення" + }, + "autofillShortcutNotSet": { + "message": "Спалучэнні клавіш аўтазапаўнення не зададзены. Змяніце гэта ў наладах браўзера." + }, + "autofillShortcutText": { + "message": "Спалучэнні клавіш аўтазапаўнення: $COMMAND$. Змяніце гэта ў наладах браўзера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Прадвызначаная спалучэнні клавіш аўтазапаўнення: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Адкрываць у новым акне" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "eu": { + "message": "ЕС", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ забаронены. У вас не дастаткова правоў для прагляду гэтай старонкі." + }, + "general": { + "message": "Асноўныя" + }, + "display": { + "message": "Адлюстраванне" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Праблемы з уваходам?" + }, + "loginApproved": { + "message": "Уваход ухвалены" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 або некалькі адрасоў электроннай пошты з'яўляюцца памылковымі" + }, + "inputTrimValidator": { + "message": "Уведзенае значэнне не павінна змяшчаць толькі прабелы.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Уведзеныя даныя не з'яўляюцца адрасам электроннай пошты." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Выбраць --" + }, + "multiSelectPlaceholder": { + "message": "- Увядзіце для фільтрацыі -" + }, + "multiSelectLoading": { + "message": "Атрыманне параметраў..." + }, + "multiSelectNotFound": { + "message": "Элементаў не знойдзена" + }, + "multiSelectClearAll": { + "message": "Ачысціць усё" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Падменю" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Мянушка дамена" + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "Апісанне" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Даведацца пра параметры імпартавання" + }, + "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": "Выбраць файл" + }, + "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": "Пацвердзіць пароль файла" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Пацвердзіць" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 599cdee17108..e2c0346dca47 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -14,7 +14,7 @@ "message": "Впишете се или създайте нов абонамент, за да достъпите защитен трезор." }, "createAccount": { - "message": "Създаване на абонамент" + "message": "Създаване на акаунт" }, "login": { "message": "Вписване" @@ -83,7 +83,7 @@ "message": "Копиране на потребителското име" }, "copyNumber": { - "message": "Копиране на номера" + "message": "Копиране на но̀мера" }, "copySecurityCode": { "message": "Копиране на кода за сигурност" @@ -91,6 +91,15 @@ "autoFill": { "message": "Автоматично дописване" }, + "autoFillLogin": { + "message": "Авт. попълване на данни за вход" + }, + "autoFillCard": { + "message": "Самопопълваща се карта" + }, + "autoFillIdentity": { + "message": "Самопопълваща се самоличност" + }, "generatePasswordCopied": { "message": "Генериране на парола (копирана)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Няма съвпадащи записи." }, + "noCards": { + "message": "Няма карти" + }, + "noIdentities": { + "message": "Няма самоличности" + }, + "addLoginMenu": { + "message": "Добавяне на запис за вход" + }, + "addCardMenu": { + "message": "Добавяне на карта" + }, + "addIdentityMenu": { + "message": "Добавяне на самоличност" + }, "unlockVaultMenu": { "message": "Отключете трезора си" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Помощ и обратна връзка" }, + "helpCenter": { + "message": "Помощен център на Битуорден" + }, + "communityForums": { + "message": "Разгледайте обществения форум на Битуорден" + }, + "contactSupport": { + "message": "Свържете се с поддръжката на Битуорден" + }, "sync": { "message": "Синхронизиране" }, @@ -224,7 +257,7 @@ "message": "Избор" }, "generatePassword": { - "message": "Генериране на парола" + "message": "Нова парола" }, "regeneratePassword": { "message": "Регенериране на паролата" @@ -329,6 +362,12 @@ "other": { "message": "Други" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Задайте метод за отключване, за да може да промените действието при изтичане на времето за достъп до трезора." + }, + "unlockMethodNeeded": { + "message": "Задайте метод за отключване в Настройките" + }, "rateExtension": { "message": "Оценяване на разширението" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Заключване сега" }, + "lockAll": { + "message": "Заключване на всички" + }, "immediately": { "message": "Незабавно" }, @@ -406,7 +448,7 @@ "message": "При заключване на системата" }, "onRestart": { - "message": "При повторно пускане на четеца" + "message": "При повторно пускане на браузъра" }, "never": { "message": "Никога" @@ -430,7 +472,14 @@ "message": "Повторното въвеждане на главната парола е задължително." }, "masterPasswordMinlength": { - "message": "Главната парола трябва да е дълга поне 8 знака." + "message": "Главната парола трябва да е дълга поне $VALUE$ знака.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Главната парола и потвърждението ѝ не съвпадат." @@ -448,7 +497,7 @@ "message": "Грешен код за потвърждаване" }, "valueCopied": { - "message": "$VALUE$ — копирано", + "message": "Копирано е $VALUE$", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -518,7 +567,7 @@ "message": "Копирана парола" }, "uri": { - "message": "Адрес" + "message": "Унифициран идентификатор на ресурс" }, "uriPosition": { "message": "Адрес $POSITION$", @@ -531,7 +580,7 @@ } }, "newUri": { - "message": "Нов адрес" + "message": "Нов унифициран идентификатор на ресурс" }, "addedItem": { "message": "Елементът е добавен" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Известията за запазване на регистрации автоматично ви подканят да запазите новите регистрации в трезора при първото ви вписване в тях." }, + "addLoginNotificationDescAlt": { + "message": "Питане за добавяне на елемент, ако такъв не бъде намерен в трезора. Прилага се за всички регистрации, в които сте вписан(а)." + }, "showCardsCurrentTab": { "message": "Показване на карти в страницата с разделите" }, @@ -608,11 +660,26 @@ "changedPasswordNotificationDesc": { "message": "Питане за обновяване на паролата към даден запис, когато бъде засечена промяна в съответния уеб сайт." }, + "changedPasswordNotificationDescAlt": { + "message": "Питане за обновяване на паролата за дадена регистрация, ако бъде засечена промяна в съответния уеб сайт. Прилага се за всички регистрации, в които сте вписан(а)." + }, + "enableUsePasskeys": { + "message": "Питане за запазване и ползване на секретни ключове" + }, + "usePasskeysDesc": { + "message": "Питане за запазване на нови секретни ключове или за вписване чрез секретни ключове, пазени в трезора. Прилага се за всички регистрации, в които сте вписан(а)." + }, "notificationChangeDesc": { "message": "Да се обнови ли паролата в Bitwarden?" }, "notificationChangeSave": { - "message": "Да, нека се обнови сега" + "message": "Осъвременяване" + }, + "notificationUnlockDesc": { + "message": "Отключете трезора си в Битуорден, за да завършите заявката за автоматично попълване." + }, + "notificationUnlock": { + "message": "Отключване" }, "enableContextMenuItem": { "message": "Показване на опции в контекстното меню" @@ -620,6 +687,9 @@ "contextMenuItemDesc": { "message": "Щракване с десния бутон на мишката дава достъп до генератора на пароли и съответстващите за уеб сайта записи. " }, + "contextMenuItemDescAlt": { + "message": "Щракване с десния бутон на мишката дава достъп до генератора на пароли и съответстващите за уеб сайта записи. Прилага се за всички регистрации, в които сте вписан(а)." + }, "defaultUriMatchDetection": { "message": "Стандартно засичане на адреси", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Промяна на цветовия облик на програмата." }, + "themeDescAlt": { + "message": "Промяна на цветовата тема на приложението. Прилага се за всички регистрации, в които сте вписан(а)." + }, "dark": { "message": "Тъмен", "description": "Dark color" @@ -659,7 +732,7 @@ "message": "Потвърждаване на изнасянето на трезора" }, "exportWarningDesc": { - "message": "Данните от трезора ви ще се изнесат в незащитен формат. Не го пращайте по незащитени канали като е-поща. Изтрийте файла незабавно след като свършите работата си с него." + "message": "Този износ съдържа данни на трезора ви в некриптиран формат. Не трябва да съхранявате или изпращате износния файл през незащитени канали (като имейл). Изтрийте файла моментално след като свършите работата си с него." }, "encExportKeyWarningDesc": { "message": "При изнасяне данните се шифрират с ключа ви. Ако го смените, ще трябва наново да ги изнесете, защото няма да може да дешифрирате настоящия файл." @@ -674,10 +747,10 @@ "message": "Споделено" }, "learnOrg": { - "message": "Разберете повече за организациите" + "message": "Научете за организациите" }, "learnOrgConfirmation": { - "message": "Битуорден позволява да споделяте части от трезора си чрез използването на организация. Искате ли да научите повече от сайта bitwarden.com?" + "message": "Битуорден позволява да споделяте елементи от трезора си а други, използвайки организация. Бихте ли посетили сайта bitwarden.com, за да научите повече?" }, "moveToOrganization": { "message": "Преместване в организация" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Функцията е недостъпна" }, - "updateKey": { - "message": "Трябва да обновите шифриращия си ключ, за да използвате тази възможност." + "encryptionKeyMigrationRequired": { + "message": "Необходима е промяна на шифриращия ключ. Впишете се в трезора си по уеб, за да обновите своя шифриращ ключ." }, "premiumMembership": { "message": "Платен абонамент" @@ -756,7 +829,7 @@ "message": "Управление на абонамента" }, "premiumManageAlert": { - "message": "Можете да управлявате абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?" + "message": "Може да управлявате членството си в мрежата на трезора в bitwarden.com. Искате ли да посетите уебсайта сега?" }, "premiumRefresh": { "message": "Опресняване на абонамента" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB пространство за файлове, които се шифрират." }, - "ppremiumSignUpTwoStep": { - "message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo." + "premiumSignUpTwoStepOptions": { + "message": "Частно двустепенно удостоверяване чрез YubiKey и Duo." }, "ppremiumSignUpReports": { "message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен." @@ -876,7 +949,7 @@ "message": "Регистрацията е защитена с двустепенно удостоверяване, но никой от настроените доставчици на удостоверяване не се поддържа от този браузър." }, "noTwoStepProviders2": { - "message": "Пробвайте с поддържан уеб браузър (като Chrome или Firefox) и други доставчици на удостоверяване, които се поддържат от браузърите (като специални програми за удостоверяване)." + "message": "Употребявайте поддържан браузър (като Chrome, Firefox) и/или добавете други доставчици на удостоверяване, които се поддържат по-добре от браузърите (като специални програми за удостоверяване)." }, "twoStepOptions": { "message": "Настройки на двустепенното удостоверяване" @@ -895,10 +968,10 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "Устройство YubiKey OTP" + "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.", @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Средата с адресите е запазена." }, + "showAutoFillMenuOnFormFields": { + "message": "Показване на меню за авт. попълване при полетата на формулярите", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Прилага се за всички регистрации, в които сте вписан(а)." + }, + "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": "Когато полето бъде избрано (на фокус)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "Включване на автоматичното попълване" }, @@ -960,7 +1058,7 @@ "message": "При засичане на формуляр за вписване при зареждането на уеб страницата автоматично да се попълват данните на съответстващата регистрация." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Компроментирани и измамни уеб сайтове могат да се възползват от автоматичното попълване при зареждане на страницата." }, "learnMoreAboutAutofill": { "message": "Научете повече относно автоматичното попълване" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Показване на разпознаваемо изображение до всеки запис." }, + "faviconDescAlt": { + "message": "Показване на разпознаваемо изображение до всеки елемент. Прилага се към всички акаунти, в които сте Вписан(а)." + }, "enableBadgeCounter": { "message": "Показване на брояч в значка" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Възстановяване на запис" }, - "restoreItemConfirmation": { - "message": "Сигурни ли сте, че искате да възстановите записа?" - }, "restoredItem": { "message": "Записът е възстановен" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Автоматично дописан запис" }, + "insecurePageWarning": { + "message": "Внимание: това е незащитена уеб страница (HTTP) и всяка изпратена информация би могла да бъде видяна и променена от някой недоброжелател. Този елемент за вход първоначално е бил записан към страница със защитена връзка (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Искате ли да попълните данните за вход въпреки това?" + }, + "autofillIframeWarning": { + "message": "Формулярът се предоставя от различен домейн от онзи, който е във Вашия запис. Натиснете „Добре“, за да бъдат попълнени данните автоматично, или „Отказ“, за да прекратите операцията." + }, + "autofillIframeWarningTip": { + "message": "Ако искате повече да не виждате това предупреждение, запазете този адрес – $HOSTNAME$ – към записа за този уеб сайт.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Задаване на главна парола" }, + "currentMasterPass": { + "message": "Текуща главна парола" + }, + "newMasterPass": { + "message": "Нова главна парола" + }, + "confirmNewMasterPass": { + "message": "Потвърждаване на новата главна парола" + }, "masterPasswordPolicyInEffect": { "message": "Поне една политика на организация има следните изисквания към главната ви парола:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Устройството не поддържа потвърждаване с биометрични данни." }, + "biometricsFailedTitle": { + "message": "Неуспешно удостоверяване чрез биометрични данни" + }, + "biometricsFailedDesc": { + "message": "Удостоверяването чрез биометрични данни не може да бъде завършено. Опитайте да използвате главната си парола или се отпишете. Ако този проблем продължи да се случва, свържете се с поддръжката на Битуорден." + }, "nativeMessaginPermissionErrorTitle": { "message": "Правото не е дадено" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Политика от някоя организация влияе на вариантите за собственост." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Политика на организацията забранява да внасяте елементи в личния си трезор." + }, "excludedDomains": { "message": "Изключени домейни" }, "excludedDomainsDesc": { "message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове. За да влезе правилото в сила, презаредете страницата." }, + "excludedDomainsDescAlt": { + "message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове за всички регистрации, в които сте вписан(а). За да влезе правилото в сила, презаредете страницата." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ не е валиден домейн", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Вашата главна парола наскоро е била сменена от администратор в организацията Ви. За да получите достъп до трезора, трябва първо да я промените. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час." }, + "updateWeakMasterPasswordWarning": { + "message": "Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час." + }, "resetPasswordPolicyAutoEnroll": { "message": "Автоматично включване" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Избиране на папка..." }, - "ssoCompleteRegistration": { - "message": "За да завършите настройките за еднократна идентификация, трябва да зададете главна парола за трезора." + "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" }, "hours": { "message": "Часа" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минута/и. Зададеното действие при изтичане на това време е $ACTION$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Настройките на организацията Ви задават следното действие при изтичане на времето за достъп до трезора: $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Изнасяне на личния трезор" }, - "exportingPersonalVaultDescription": { - "message": "Ще бъдат изнесени само записите от личния трезор свързан с $EMAIL$. Записите в трезора на организацията няма да бъдат включени.", + "exportingIndividualVaultDescription": { + "message": "Ще бъдат изнесени само отделните записи в трезора, които са свързани с $EMAIL$. Записите от трезора на организацията няма да бъдат включени. Ще бъде изнесена само информацията за записите от трезора, а свързаните прикачени елементи няма да бъдат включени.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Записите в изключени организации не са достъпни. Свържете се със собственика на организацията си за помощ." }, - "cardBrandMir": { - "message": "Мир" - }, "loggingInTo": { "message": "Вписване в $DOMAIN$", "placeholders": { @@ -2011,14 +2179,14 @@ "serverVersion": { "message": "Версия на сървъра" }, - "selfHosted": { - "message": "Собствен хостинг" + "selfHostedServer": { + "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", @@ -2050,17 +2218,41 @@ "rememberEmail": { "message": "Запомняне на е-пощата" }, + "loginWithDevice": { + "message": "Вписване с устройство" + }, + "loginWithDeviceEnabledInfo": { + "message": "Вписването с устройство трябва да е включено в настройките на приложението на Битуорден. Друга настройка ли търсите?" + }, + "fingerprintPhraseHeader": { + "message": "Уникална фраза" + }, + "fingerprintMatchInfo": { + "message": "Уверете се, че трезорът Ви е отключен и че Уникалната фраза съвпада с другото устройство." + }, + "resendNotification": { + "message": "Повторно изпращане на известието" + }, + "viewAllLoginOptions": { + "message": "Вижте всички възможности за вписване" + }, + "notificationSentDevice": { + "message": "Към устройството Ви е изпратено известие." + }, + "loginInitiated": { + "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": "Проверяване в известните случаи на изтекли данни за тази парола" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Автоматичното попълване при зареждане на страница е включено в съответствие с политиките на Вашата организация." + }, + "howToAutofill": { + "message": "Как се ползва автоматичното попълване" + }, + "autofillSelectInfoWithCommand": { + "message": "Изберете елемент на този екран, използвайте комбинацията $COMMAND$ или разгледайте други опции в настройките.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Изберете елемент на този екран или разгледайте други опции в настройките." + }, + "gotIt": { + "message": "Разбрано" + }, + "autofillSettings": { + "message": "Настройки за автоматичното попълване" + }, + "autofillShortcut": { + "message": "Клавишна комбинация за автоматично попълване" + }, + "autofillShortcutNotSet": { + "message": "Няма зададена клавишна комбинация за автоматичното попълване. Променете това в настройките на браузъра." + }, + "autofillShortcutText": { + "message": "Клавишната комбинация за автоматично попълване е: $COMMAND$. Може да я промените в настройките на браузъра.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Стандартна клавишна комбинация за автоматично попълване: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Вписване в" + }, + "opensInANewWindow": { + "message": "Отваря се в нов прозорец" + }, + "deviceApprovalRequired": { + "message": "Изисква се одобрение на устройството. Изберете начин за одобрение по-долу:" + }, + "rememberThisDevice": { + "message": "Запомняне на това устройство" + }, + "uncheckIfPublicDevice": { + "message": "Махнете отметката, ако използвате публично устройство" + }, + "approveFromYourOtherDevice": { + "message": "Одобряване с другото Ви устройство" + }, + "requestAdminApproval": { + "message": "Подаване на заявка за одобрение от администратор" + }, + "approveWithMasterPassword": { + "message": "Одобряване с главната парола" + }, + "ssoIdentifierRequired": { + "message": "Идентификаторът за еднократна идентификация на организация е задължителен." + }, + "eu": { + "message": "ЕС", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Отказан достъп. Нямате право за преглед на страницата." + }, + "general": { + "message": "Общи" + }, + "display": { + "message": "Външен вид" + }, + "accountSuccessfullyCreated": { + "message": "Регистрацията е създадена успешно!" + }, + "adminApprovalRequested": { + "message": "Заявено е одобрение от администратор" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Вашата заявка беше изпратена до администратора Ви." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Ще получите известие, когато тя бъде одобрена." + }, + "troubleLoggingIn": { + "message": "Имате проблем с вписването?" + }, + "loginApproved": { + "message": "Вписването е одобрено" + }, + "userEmailMissing": { + "message": "Липсва е-поща на потребителя" + }, + "deviceTrusted": { + "message": "Устройството е доверено" + }, + "inputRequired": { + "message": "Полето е задължително да бъде попълнено." + }, + "required": { + "message": "задължително" + }, + "search": { + "message": "Търсене" + }, + "inputMinLength": { + "message": "Въведеният в полето текст трябва да бъде с дължина поне $COUNT$ знака.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Полето не може да съдържа повече от $COUNT$ знака.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Следните знаци не са позволени: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Въведената стойност трябва да бъде поне $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Въведената стойност не трябва да бъде по-голяма от $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 или повече е-пощи са неправилни" + }, + "inputTrimValidator": { + "message": "Въведеното не може да съдържа само интервали.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Въведеният в полето текст не е адрес на е-поща." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поле(та) по-горе се нуждае/ят от вниманието Ви.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Изберете --" + }, + "multiSelectPlaceholder": { + "message": "-- Пишете тук за филтриране --" + }, + "multiSelectLoading": { + "message": "Зареждане на опциите…" + }, + "multiSelectNotFound": { + "message": "Няма намерени елементи" + }, + "multiSelectClearAll": { + "message": "Изчистване на всичко" + }, + "plusNMore": { + "message": "+ още $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Подменю" + }, + "toggleCollapse": { + "message": "Превключване на свиването", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Псевдонимен домейн" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Записите с включено изискване за повторно въвеждане на главната парола не могат да бъдат попълвани автоматично при зареждане на страницата. Автоматичното попълване при зареждане на страницата е изключено.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Автоматичното попълване при зареждане на страницата използва настройката си по подразбиране.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Отключване на регистрацията", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "Общо" + }, + "importWarning": { + "message": "Внасяте данни към организацията „$ORGANIZATION$“. Данните могат да бъдат споделени с членовете ѝ. Сигурни ли сте, че искате да продължите?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "Данните са в неправилен формат. Проверете файла за внасяне и пробвайте отново." + }, + "importNothingError": { + "message": "Нищо не бе внесено." + }, + "importEncKeyError": { + "message": "Грешка при дешифрирането на изнесения файл. Ключът за шифриране не отговаря на този, който е използван за изнасянето на данните." + }, + "invalidFilePassword": { + "message": "Неправилна парола за файла. Използвайте паролата, която сте въвели при създаването на изнесения файл." + }, + "importDestination": { + "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": "Потвърждаване на паролата на файла" + }, + "typePasskey": { + "message": "Секретен ключ" + }, + "passkeyNotCopied": { + "message": "Секретният ключ няма да бъде копиран" + }, + "passkeyNotCopiedAlert": { + "message": "Секретният ключ няма да бъде копиран в клонирания елемент. Искате ли да продължите с клонирането на елемента?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Изисква се проверка от иницииращия сайт. Тази функция все още не е внедрена за акаунти без главна парола." + }, + "logInWithPasskey": { + "message": "Вписване със секретен ключ?" + }, + "passkeyAlreadyExists": { + "message": "За това приложение вече съществува секретен ключ." + }, + "noPasskeysFoundForThisApplication": { + "message": "Няма намерени секретни ключове за това приложение." + }, + "noMatchingPasskeyLogin": { + "message": "Нямате елемент за вписване, подходящ за този уеб сайт." + }, + "confirm": { + "message": "Потвърждаване" + }, + "savePasskey": { + "message": "Запазване на секретния ключ" + }, + "savePasskeyNewLogin": { + "message": "Запазване на секретния ключ като нов елемент за вписване" + }, + "choosePasskey": { + "message": "Изберете елемент, в който да запазите този секретен ключ" + }, + "passkeyItem": { + "message": "Секретен ключ" + }, + "overwritePasskey": { + "message": "Да се замени ли секретният ключ?" + }, + "overwritePasskeyAlert": { + "message": "Този елемент вече съдържа секретен ключ. Наистина ли искате да замените текущия секретен ключ?" + }, + "featureNotSupported": { + "message": "Тази функционалност все още не се поддържа" + }, + "yourPasskeyIsLocked": { + "message": "За да се ползва секретният ключ, е необходимо удостоверяване. Потвърдете самоличността си, за да продължите." + }, + "useBrowserName": { + "message": "Използване на браузъра" + }, + "multifactorAuthenticationCancelled": { + "message": "Многостъпковото удостоверяване е отменено" + }, + "noLastPassDataFound": { + "message": "Няма намерени данни от LastPass" + }, + "incorrectUsernameOrPassword": { + "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": "Активиране на регистрацията" + }, + "accountLimitReached": { + "message": "Достигнато е ограничението на броя регистрации. Излезте от някоя, за да добавите друга." + }, + "active": { + "message": "активно" + }, + "locked": { + "message": "заключено" + }, + "unlocked": { + "message": "отключено" + }, + "server": { + "message": "сървър" + }, + "hostedAt": { + "message": "hosted at" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 6a77dba896c5..35e972a0edfa 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "স্বতঃপূরণ" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "পাসওয়ার্ড তৈরি করুন (অনুলিপিকৃত)" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "সহায়তা এবং প্রতিক্রিয়া" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "সিঙ্ক" }, @@ -329,6 +362,12 @@ "other": { "message": "অন্যান্য" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "এক্সটেনশনটি মূল্যায়ন করুন" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "এখনই লক করুন" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "সঙ্গে সঙ্গে" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "মূল পাসওয়ার্ড নিশ্চিতকরণ মেলেনি।" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "\"লগইন যোগ করুন বিজ্ঞপ্তি\" স্বয়ংক্রিয়ভাবে আপনই যখনই প্রথমবারের জন্য লগ ইন করেন তখন আপনার ভল্টে নতুন লগইনগুলি সংরক্ষণ করতে অনুরোধ জানায়।" }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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 এ হালনাগাদ করতে চান?" }, "notificationChangeSave": { "message": "হ্যাঁ, এখনই হালনাগাদ করুন" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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 মিল সনাক্তকরণ", @@ -633,6 +703,9 @@ "themeDesc": { "message": "অ্যাপ্লিকেশনটির রং থিম পরিবর্তন।" }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "অন্ধকার", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "বৈশিষ্ট্য অনুপলব্ধ" }, - "updateKey": { - "message": "আপনি আপনার এনক্রিপশন কী হালনাগাদ না করা পর্যন্ত এই বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না।" + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "প্রিমিয়াম সদস্য" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।" }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey, FIDO U2F, ও Duo এর মতো অতিরিক্ত দ্বি-পদক্ষেপ লগইন বিকল্পগুলি।" + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "আপনার ভল্টটি সুরক্ষিত রাখতে পাসওয়ার্ড স্বাস্থ্যকরন, অ্যাকাউন্ট স্বাস্থ্য এবং ডেটা লঙ্ঘনের প্রতিবেদন।" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "পরিবেশের URL গুলি সংরক্ষণ করা হয়েছে।" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "পৃষ্ঠা লোডে স্বতঃপূরণ সক্ষম করুন" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "বস্তু পুনরুদ্ধার" }, - "restoreItemConfirmation": { - "message": "আপনি কি নিশ্চিত যে আপনি এই বস্তুটি পুনরুদ্ধার করতে চান?" - }, "restoredItem": { "message": "বস্তু পুনরুদ্ধারকৃত" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "স্বতঃপূরণকৃত বস্তু" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "মূল পাসওয়ার্ড ধার্য করুন" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "এক বা একাধিক সংস্থার নীতিগুলির কারণে নিম্নলিখিত প্রয়োজনসমূহ মূল পাসওয়ার্ডের পূরণ করা প্রয়োজন:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "ব্রাউজার বায়োমেট্রিক্স এই ডিভাইসে সমর্থিত নয়।" }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "অনুমতি দেওয়া হয়নি" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "একটি প্রতিষ্ঠানের নীতি আপনার মালিকানা বিকল্পগুলিকে প্রভাবিত করছে।" }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index b8bc690d0820..6a6ccb9e0ee2 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Zapamti email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index d0e554f17184..aa242a632d99 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -91,6 +91,15 @@ "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 +109,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." }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Ajuda i comentaris" }, + "helpCenter": { + "message": "Centre d'ajuda de Bitwarden" + }, + "communityForums": { + "message": "Explora els fòrums de la comunitat de Bitwarden" + }, + "contactSupport": { + "message": "Contacta amb l'assistència de Bitwarden" + }, "sync": { "message": "Sincronització" }, @@ -329,6 +362,12 @@ "other": { "message": "Altres" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Configura un mètode de desbloqueig per canviar l'acció del temps d'espera de la caixa forta." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Valora aquesta extensió" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Bloqueja ara" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediatament" }, @@ -430,7 +472,14 @@ "message": "Cal tornar a escriure la contrasenya mestra." }, "masterPasswordMinlength": { - "message": "La contrasenya ha de contenir almenys 8 caràcters." + "message": "La contrasenya mestra ha de contenir almenys $VALUE$ caràcters.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "La confirmació de la contrasenya mestra no coincideix." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Mostra les targetes a la pàgina de pestanya" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Actualitza" }, + "notificationUnlockDesc": { + "message": "Desbloquegeu la vostra caixa forta de Bitwarden per completar la sol·licitud d'emplenament automàtic." + }, + "notificationUnlock": { + "message": "Desbloqueja" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Característica no disponible" }, - "updateKey": { - "message": "No podeu utilitzar aquesta característica fins que actualitzeu la vostra clau de xifratge." + "encryptionKeyMigrationRequired": { + "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" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts." }, - "ppremiumSignUpTwoStep": { - "message": "Opcions addicionals d'inici de sessió en dues passes com ara YubiKey, FIDO U2F i Duo." + "premiumSignUpTwoStepOptions": { + "message": "Opcions propietàries de doble factor com ara YubiKey i Duo." }, "ppremiumSignUpReports": { "message": "Requisits d'higiene de la contrasenya, salut del compte i informe d'infraccions de dades per mantenir la seguretat de la vostra caixa forta." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "S'aplica a tots els comptes connectats." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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" + }, "enableAutoFillOnPageLoad": { "message": "Habilita l'emplenament automàtic en carregar la pàgina" }, @@ -960,7 +1058,7 @@ "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." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Els llocs web compromesos o no fiables poden aprofitar-se de l'emplenament automàtic en carregar de la pàgina." }, "learnMoreAboutAutofill": { "message": "Obteniu més informació sobre l'emplenament automàtic" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Mostra una imatge reconeixible al costat de cada inici de sessió." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Mostra el comptador insígnia" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restaura l'element" }, - "restoreItemConfirmation": { - "message": "Esteu segur que voleu restaurar aquest element?" - }, "restoredItem": { "message": "Element restaurat" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Element emplenat automàticament " }, + "insecurePageWarning": { + "message": "Avís: aquesta és una pàgina HTTP no segura i altres persones poden veure i canviar qualsevol informació que envieu. Aquest inici de sessió es va guardar originalment en una pàgina segura (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Encara voleu omplir aquest inici de sessió?" + }, + "autofillIframeWarning": { + "message": "El formulari està allotjat en un domini diferent de l'URI de l'inici de sessió guardat. Trieu D'acord per omplir -lo automàticament de totes maneres o Cancel·la per aturar-ho." + }, + "autofillIframeWarningTip": { + "message": "Per evitar aquest avís en el futur, guardeu aquest URI, $HOSTNAME$, al vostre element d'inici de sessió de Bitwarden d'aquest lloc.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Estableix la contrasenya mestra" }, + "currentMasterPass": { + "message": "Contrasenya mestra actual" + }, + "newMasterPass": { + "message": "Contrasenya mestra nova" + }, + "confirmNewMasterPass": { + "message": "Confirma la contrasenya mestra nova" + }, "masterPasswordPolicyInEffect": { "message": "Una o més polítiques d’organització requereixen que la vostra contrasenya principal complisca els requisits següents:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "La biometria del navegador no és compatible amb aquest dispositiu." }, + "biometricsFailedTitle": { + "message": "La biometria ha fallat" + }, + "biometricsFailedDesc": { + "message": "La biometria no es pot completar, considereu utilitzar una contrasenya mestra o tancar la sessió. Si això continua, poseu-vos en contacte amb el servei d'assistència de Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "No s'ha proporcionat el permís" }, @@ -1574,12 +1705,18 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ no és un domini vàlid", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Un administrador de l'organització ha canviat recentment la contrasenya principal. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i heu de tornar a iniciar-la. És possible que les sessions obertes en altres dispositius continuen actives fins a una hora." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Inscripció automàtica" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hores" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Les polítiques de l'organització han establert l'acció de temps d'espera de la caixa forta a $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "S'està exportant la caixa forta personal" }, - "exportingPersonalVaultDescription": { - "message": "Només s'exportaran els elements personals de la caixa forta associats a $EMAIL$. Els elements de la caixa forta de l'organització no s'inclouran.", + "exportingIndividualVaultDescription": { + "message": "Només s'exportaran els elements de la caixa forta individuals associats a $EMAIL$. Els elements de la caixa de l'organització no s'inclouran. Només s'exportarà la informació de l'element de la caixa forta i no inclourà els fitxers adjunts associats.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "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." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Inici de sessió a $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Versió del servidor" }, - "selfHosted": { - "message": "Autoallotjat" + "selfHostedServer": { + "message": "autoallotjat" }, "thirdParty": { "message": "Tercers" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Recorda el correu electronic" }, + "loginWithDevice": { + "message": "Inici de sessió amb dispositiu" + }, + "loginWithDeviceEnabledInfo": { + "message": "L'inici de sessió amb el dispositiu ha d'estar activat a la configuració de l'aplicació Bitwarden. Necessiteu una altra opció?" + }, + "fingerprintPhraseHeader": { + "message": "Frase d'empremta digital" + }, + "fingerprintMatchInfo": { + "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca amb l'altre dispositiu." + }, + "resendNotification": { + "message": "Torna a enviar la notificació" + }, + "viewAllLoginOptions": { + "message": "Veure totes les opcions d'inici de sessió" + }, + "notificationSentDevice": { + "message": "S'ha enviat una notificació al vostre dispositiu." + }, + "loginInitiated": { + "message": "S'ha iniciat la sessió" + }, "exposedMasterPassword": { "message": "Contrasenya mestra exposada" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Les polítiques de l'organització han activat l'emplenament automàtic en carregar la pàgina." + }, + "howToAutofill": { + "message": "Com emplenar automàticament" + }, + "autofillSelectInfoWithCommand": { + "message": "Seleccioneu un element d'aquesta pantalla, utilitzeu la drecera $COMMAND$ o exploreu altres opcions a la configuració.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Seleccioneu un element d'aquesta pantalla, o exploreu altres opcions a la configuració." + }, + "gotIt": { + "message": "D'acord" + }, + "autofillSettings": { + "message": "Configuració d'emplenament automàtic" + }, + "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." + }, + "autofillShortcutText": { + "message": "La drecera d'emplenament automàtic és: $COMMAND$. Canvieu-ho a la configuració del navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Drecera d'emplenament automàtic per defecte: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Inici de sessió en" + }, + "opensInANewWindow": { + "message": "S'obri en una finestra nova" + }, + "deviceApprovalRequired": { + "message": "Cal l'aprovació del dispositiu. Seleccioneu una opció d'aprovació a continuació:" + }, + "rememberThisDevice": { + "message": "Recorda aquest dispositiu" + }, + "uncheckIfPublicDevice": { + "message": "Desmarqueu si utilitzeu un dispositiu públic" + }, + "approveFromYourOtherDevice": { + "message": "Aproveu des d'un altre dispositiu vostre" + }, + "requestAdminApproval": { + "message": "Sol·liciteu l'aprovació de l'administrador" + }, + "approveWithMasterPassword": { + "message": "Aprova amb contrasenya mestra" + }, + "ssoIdentifierRequired": { + "message": "Es requereix un identificador SSO de l'organització." + }, + "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." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Mostra" + }, + "accountSuccessfullyCreated": { + "message": "Compte creat correctament!" + }, + "adminApprovalRequested": { + "message": "S'ha sol·licitat l'aprovació de l'administrador" + }, + "adminApprovalRequestSentToAdmins": { + "message": "La vostra sol·licitud s'ha enviat a l'administrador." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Se us notificarà una vegada aprovat." + }, + "troubleLoggingIn": { + "message": "Teniu problemes per iniciar la sessió?" + }, + "loginApproved": { + "message": "S'ha aprovat l'inici de sessió" + }, + "userEmailMissing": { + "message": "Falta el correu electrònic de l'usuari" + }, + "deviceTrusted": { + "message": "Dispositiu de confiança" + }, + "inputRequired": { + "message": "L'entrada és obligatòria." + }, + "required": { + "message": "obligatori" + }, + "search": { + "message": "Cerca" + }, + "inputMinLength": { + "message": "L'entrada ha de tenir com a mínim $COUNT$ caràcters.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "L'entrada no ha de superar $COUNT$ caràcters de longitud.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Els següents caràcters no estan permesos:\n$CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "El valor d'entrada ha de ser com a mínim $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "El valor d'entrada no ha de ser superior a $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 o més correus no són vàlids" + }, + "inputTrimValidator": { + "message": "L'entrada no ha de contenir només espais en blanc.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "L'entrada no és una adreça de correu electrònic." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ camp(s) de dalt necessiten la vostra atenció.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Selecciona --" + }, + "multiSelectPlaceholder": { + "message": "-- Escriviu per filtrar --" + }, + "multiSelectLoading": { + "message": "Obtenint opcions..." + }, + "multiSelectNotFound": { + "message": "No s'ha trobat cap element" + }, + "multiSelectClearAll": { + "message": "Esborra-ho tot" + }, + "plusNMore": { + "message": "+ $QUANTITY$ més", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenú" + }, + "toggleCollapse": { + "message": "Redueix/Amplia", + "description": "Toggling an expand/collapse state." + }, + "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 de la pàgina està desactivat.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina per que utilitze la configuració predeterminada.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Desbloqueja el compte", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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ó." + }, + "importDestination": { + "message": "Destinació de la importació" + }, + "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" + }, + "typePasskey": { + "message": "Clau de pas" + }, + "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." + }, + "logInWithPasskey": { + "message": "Inici de sessió amb clau de pas?" + }, + "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." + }, + "confirm": { + "message": "Confirma-ho" + }, + "savePasskey": { + "message": "Guarda la clau de pas" + }, + "savePasskeyNewLogin": { + "message": "Guarda la clau de pas com a nou inici de sessió" + }, + "choosePasskey": { + "message": "Trieu un inici de sessió per guardar aquesta clau de pas" + }, + "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." + }, + "useBrowserName": { + "message": "Utilitza navegador" + }, + "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" + }, + "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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index d82f0cb0ee53..6310e145d3a7 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -7,11 +7,11 @@ "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í.", + "message": "Bezpečný a bezplatný správce hesel pro všechna Vaše zařízení.", "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Pro přístup do vašeho bezpečného trezoru se přihlašte nebo si vytvořte nový účet." + "message": "Pro přístup do Vašeho bezpečného trezoru se přihlaste nebo si vytvořte nový účet." }, "createAccount": { "message": "Vytvořit účet" @@ -29,7 +29,7 @@ "message": "Zavřít" }, "submit": { - "message": "Potvrdit" + "message": "Odeslat" }, "emailAddress": { "message": "E-mailová adresa" @@ -38,10 +38,10 @@ "message": "Hlavní heslo" }, "masterPassDesc": { - "message": "Hlavní heslo je heslo, které používáte k přístupu do vašeho trezoru. Je velmi důležité, abyste jej nezapomněli. Neexistuje totiž žádný způsob, jak heslo obnovit v případě, že jste na něj zapomněli." + "message": "Hlavní heslo je heslo, které používáte k přístupu do Vašeho trezoru. Je velmi důležité, abyste jej nezapomněli. Neexistuje totiž žádný způsob, jak heslo obnovit v případě, že jste jej zapomněli." }, "masterPassHintDesc": { - "message": "Nápověda k hlavnímu heslu vám pomůže zapamatovat si heslo, pokud ho zapomenete." + "message": "Nápověda k hlavnímu heslu Vám pomůže vzpomenout si heslo, pokud ho zapomenete." }, "reTypeMasterPass": { "message": "Znovu zadejte hlavní heslo" @@ -89,7 +89,16 @@ "message": "Kopírovat bezpečnostní kód" }, "autoFill": { - "message": "Automatické vyplnění" + "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" @@ -98,10 +107,25 @@ "message": "Kopírovat název vlastního pole" }, "noMatchingLogins": { - "message": "Žádné odpovídající přihlašovací údaje." + "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" + "message": "Odemknout Váš trezor" }, "loginToVaultMenu": { "message": "Přihlaste se do svého trezoru" @@ -116,7 +140,7 @@ "message": "Přidat položku" }, "passwordHint": { - "message": "Nápověda k heslu" + "message": "Nápověda pro heslo" }, "enterEmailToGetHint": { "message": "Zadejte e-mailovou adresu pro zaslání nápovědy k hlavnímu heslu." @@ -128,13 +152,13 @@ "message": "Pokračovat" }, "sendVerificationCode": { - "message": "Poslat ověřovací kód na váš e-mail" + "message": "Poslat ověřovací kód na Váš e-mail" }, "sendCode": { "message": "Poslat kód" }, "codeSent": { - "message": "Kód odeslán" + "message": "Kód byl odeslán" }, "verificationCode": { "message": "Ověřovací kód" @@ -149,11 +173,11 @@ "message": "Změnit hlavní heslo" }, "fingerprintPhrase": { - "message": "Unikátní přístupová fráze", + "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." }, "yourAccountsFingerprint": { - "message": "Fráze otisku vašeho účtu", + "message": "Fráze otisku prstu Vašeho účtu", "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": { @@ -184,7 +208,7 @@ "message": "Upravit složku" }, "deleteFolder": { - "message": "Odstranit složku" + "message": "Smazat složku" }, "folders": { "message": "Složky" @@ -195,11 +219,20 @@ "helpFeedback": { "message": "Nápověda a zpětná vazba" }, + "helpCenter": { + "message": "Centrum nápovědy Bitwarden" + }, + "communityForums": { + "message": "Prozkoumejte komunitní fóra Bitwarden" + }, + "contactSupport": { + "message": "Kontakt na podporu" + }, "sync": { "message": "Synchronizace" }, "syncVaultNow": { - "message": "Synchronizovat nyní" + "message": "Synchronizovat trezor nyní" }, "lastSync": { "message": "Poslední synchronizace:" @@ -215,7 +248,7 @@ "message": "Vygenerujte si silné a unikátní heslo pro přihlašovací údaje." }, "bitWebVault": { - "message": "Webová aplikace" + "message": "Webový trezor Bitwardenu" }, "importItems": { "message": "Importovat položky" @@ -227,10 +260,10 @@ "message": "Vygenerovat heslo" }, "regeneratePassword": { - "message": "Vygenerovat další heslo" + "message": "Vygenerovat jiné heslo" }, "options": { - "message": "Možnosti" + "message": "Volby" }, "length": { "message": "Délka" @@ -242,7 +275,7 @@ "message": "Malá písmena (a-z)" }, "numbers": { - "message": "Čísla (0-9)" + "message": "Číslice (0-9)" }, "specialCharacters": { "message": "Speciální znaky (!@#$%^&*)" @@ -258,16 +291,16 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Zahrnout číslo" + "message": "Zahrnout číslice" }, "minNumbers": { - "message": "Minimální počet čísel" + "message": "Minimální počet číslic" }, "minSpecial": { "message": "Minimální počet speciálních znaků" }, "avoidAmbChar": { - "message": "Nepoužít zaměnitelné znaky" + "message": "Nepoužívat zaměnitelné znaky" }, "searchVault": { "message": "Vyhledat v trezoru" @@ -329,6 +362,12 @@ "other": { "message": "Ostatní" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Nastavte metodu odemknutí, abyste změnili časový limit Vašeho trezoru." + }, + "unlockMethodNeeded": { + "message": "Nastavit metodu odemknutí v Nastavení" + }, "rateExtension": { "message": "Ohodnotit rozšíření" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Zamknout nyní" }, + "lockAll": { + "message": "Zamknout vše" + }, "immediately": { "message": "Okamžitě" }, @@ -385,7 +427,7 @@ "message": "Po 1 minutě" }, "twoMinutes": { - "message": "2 minuty" + "message": "Po 2 minutách" }, "fiveMinutes": { "message": "Po 5 minutách" @@ -415,10 +457,10 @@ "message": "Zabezpečení" }, "errorOccurred": { - "message": "Došlo k chybě" + "message": "Vyskytla se chyba" }, "emailRequired": { - "message": "E-mailová adresa je povinná." + "message": "Je vyžadována e-mailová adresa." }, "invalidEmail": { "message": "Neplatná e-mailová adresa." @@ -430,7 +472,14 @@ "message": "Je vyžadováno zopakovat zadání hlavního hesla." }, "masterPasswordMinlength": { - "message": "Hlavní heslo musí obsahovat alespoň 8 znaků." + "message": "Hlavní heslo musí obsahovat alespoň $VALUE$ znaků.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Potvrzení hlavního hesla se neshoduje." @@ -439,10 +488,10 @@ "message": "Váš účet byl vytvořen! Můžete se přihlásit." }, "masterPassSent": { - "message": "Poslali jsme vám e-mail s nápovědou k hlavnímu heslu." + "message": "Poslali jsme Vám e-mail s nápovědou k hlavnímu heslu." }, "verificationCodeRequired": { - "message": "Ověřovací kód je povinný." + "message": "Je vyžadován ověřovací kód." }, "invalidVerificationCode": { "message": "Neplatný ověřovací kód" @@ -476,13 +525,13 @@ "message": "Ne" }, "unexpectedError": { - "message": "Došlo k neznámé chybě." + "message": "Vyskytla se neočekávaná chyba." }, "nameRequired": { - "message": "Název je povinný." + "message": "Je vyžadován název." }, "addedFolder": { - "message": "Složka byla úspěšně přidána" + "message": "Složka byla přidána" }, "changeMasterPass": { "message": "Změnit hlavní heslo" @@ -491,16 +540,16 @@ "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 aplikace, SMS, e-mailu nebo telefonního hovoru. Dvoufázové přihlášení lze aktivovat na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?" + "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?" }, "editedFolder": { - "message": "Složka byla upravena" + "message": "Složka byla uložena" }, "deleteFolderConfirmation": { - "message": "Opravdu chcete tuto složku smazat?" + "message": "Opravdu chcete smazat tuto složku?" }, "deletedFolder": { - "message": "Smazaná složka" + "message": "Složka byla smazána" }, "gettingStartedTutorial": { "message": "Průvodce pro začátečníky" @@ -509,7 +558,7 @@ "message": "Podívejte se na našeho průvodce pro začátečníky a zjistěte, jak používat naše rozšíření prohlížeče." }, "syncingComplete": { - "message": "Synchronizace je dokončena" + "message": "Synchronizace byla dokončena" }, "syncingFailed": { "message": "Synchronizace selhala" @@ -534,10 +583,10 @@ "message": "Nová URI" }, "addedItem": { - "message": "Přidaná položka" + "message": "Položka byla přidána" }, "editedItem": { - "message": "Položka byla upravena" + "message": "Položka byla uložena" }, "deleteItemConfirmation": { "message": "Opravdu chcete položku přesunout do koše?" @@ -558,10 +607,10 @@ "message": "Opravdu chcete přepsat aktuální uživatelské jméno?" }, "searchFolder": { - "message": "Vyhledat ve složce" + "message": "Prohledat složku" }, "searchCollection": { - "message": "Vyledat v kolekci" + "message": "Prohledat kolekci" }, "searchType": { "message": "Typ hledání" @@ -574,52 +623,73 @@ "message": "Ptát se na přidání přihlášení" }, "addLoginNotificationDesc": { - "message": "Dotaz ohledně uložení údajů, pokud nebyly v trezoru nalezeny." + "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." }, "showCardsCurrentTab": { - "message": "Zobrazit karty na obrazovce Karta" + "message": "Zobrazit platební karty na obrazovce Karta" }, "showCardsCurrentTabDesc": { - "message": "Zobrazit karetní položky na obrazovce Karta pro snadné vyplnění." + "message": "Pro snadné vyplnění zobrazí platební karty na obrazovce Karta." }, "showIdentitiesCurrentTab": { "message": "Zobrazit identity na obrazovce Karta" }, "showIdentitiesCurrentTabDesc": { - "message": "Zobrazit položky identit na obrazovce Karta pro snadné vyplnění." + "message": "Pro snadné vyplnění zobrazí položky identit na obrazovce Karta." }, "clearClipboard": { - "message": "Vyčistit schránku", + "message": "Vymazat schránku", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Automaticky vymazat zkopírované hodnoty z vaší schránky.", + "message": "Automaticky vymaže zkopírované hodnoty z Vaší schránky.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Má si pro vás Bitwarden toto heslo pamatovat?" + "message": "Má si Bitwarden toto heslo pamatovat?" }, "notificationAddSave": { - "message": "Ano, uložit nyní" + "message": "Uložit" }, "enableChangedPasswordNotification": { "message": "Zeptat se na aktualizaci existujícího přihlášení" }, "changedPasswordNotificationDesc": { - "message": "Dotázat se na aktualizaci hesla pro přihlášení, pokud je na webové stránce zjištěno použití jiného hesla." + "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 Bitwarden?" + "message": "Chcete aktualizovat toto heslo v Bitwardenu?" }, "notificationChangeSave": { - "message": "Ano, aktualizovat" + "message": "Aktualizovat" + }, + "notificationUnlockDesc": { + "message": "Pro dokončení požadavku na automatické vyplnění odemkněte Váš trezor na Bitwardenu." + }, + "notificationUnlock": { + "message": "Odemknout" }, "enableContextMenuItem": { - "message": "Zobrazit v kontextovém menu" + "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. " }, + "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." @@ -631,7 +701,10 @@ "message": "Motiv" }, "themeDesc": { - "message": "Změna barevného motivu aplikace." + "message": "Změní barevný motiv aplikace." + }, + "themeDescAlt": { + "message": "Změní barevný motiv aplikace. Platí pro všechny přihlášené účty." }, "dark": { "message": "Tmavý", @@ -642,11 +715,11 @@ "description": "Light color" }, "solarizedDark": { - "message": "Tmavý –⁠ Solarized", + "message": "Tmavý (solarizovaný)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Exportovat přihlašovací údaje" + "message": "Exportovat trezor" }, "fileFormat": { "message": "Formát souboru" @@ -659,25 +732,25 @@ "message": "Potvrdit export trezoru" }, "exportWarningDesc": { - "message": "Tento export obsahuje data vašeho trezoru v nezašifrovaném formátu. Soubor exportu byste neměli ukládat ani odesílat přes nezabezpečené kanály (např. e-mailem). Odstraňte jej okamžitě po jeho použití." + "message": "Tento export obsahuje data Vašeho trezoru v nezašifrovaném formátu. Soubor s exportem byste neměli ukládat ani odesílat přes nezabezpečené kanály (např. e-mailem). Smažte jej okamžitě po jeho použití." }, "encExportKeyWarningDesc": { - "message": "Tento export zašifruje vaše data pomocí šifrovacího klíče vašeho účtu. Pokud někdy změníte šifrovací klíč vašeho účtu, měli by jste vyexportovat data znovu, protože tento exportovaný soubor nebudete moci dešifrovat." + "message": "Tento export zašifruje Vaše data pomocí šifrovacího klíče Vašeho účtu. Pokud někdy změníte šifrovací klíč Vašeho účtu, měli by jste vyexportovat data znovu, protože tento exportovaný soubor nebudete moci dešifrovat." }, "encExportAccountWarningDesc": { - "message": "Šifrovací klíče účtu jsou pro každý uživatelský účet Bitwarden jedinečné, takže nelze importovat šifrovaný export do jiného účtu." + "message": "Šifrovací klíče účtu jsou pro každý uživatelský účet Bitwardenu jedinečné, takže nelze importovat šifrovaný export do jiného účtu." }, "exportMasterPassword": { - "message": "Zadejte své hlavní heslo pro export dat." + "message": "Pro exportování dat zadejte své hlavní heslo." }, "shared": { "message": "Sdílené" }, "learnOrg": { - "message": "Zjistěte více o organizacích" + "message": "Více o organizacích" }, "learnOrgConfirmation": { - "message": "Bitwarden umožňuje sdílet vaše 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?" + "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?" }, "moveToOrganization": { "message": "Přesunout do organizace" @@ -711,7 +784,7 @@ "message": "Ověřovací kód (TOTP)" }, "copyVerificationCode": { - "message": "Zkopírovat ověřovací kód" + "message": "Kopírovat ověřovací kód" }, "attachments": { "message": "Přílohy" @@ -720,13 +793,13 @@ "message": "Smazat přílohu" }, "deleteAttachmentConfirmation": { - "message": "Opravdu chcete tuto přílohu smazat?" + "message": "Opravdu chcete smazat tuto přílohu?" }, "deletedAttachment": { "message": "Příloha byla smazána" }, "newAttachment": { - "message": "Přidat přílohu" + "message": "Přidat novou přílohu" }, "noAttachments": { "message": "Žádné přílohy." @@ -738,16 +811,16 @@ "message": "Soubor" }, "selectFile": { - "message": "Vybrat soubor." + "message": "Zvolte soubor" }, "maxFileSize": { "message": "Maximální velikost souboru je 500 MB." }, "featureUnavailable": { - "message": "Funkce není dostupná" + "message": "Funkce je nedostupná" }, - "updateKey": { - "message": "Tuto funkci nemůžete použít dokud neaktualizujete svůj šifrovací klíč." + "encryptionKeyMigrationRequired": { + "message": "Vyžaduje se migrace šifrovacího klíče. Pro aktualizaci šifrovacího klíče se přihlaste přes webový trezor." }, "premiumMembership": { "message": "Prémiové členství" @@ -762,31 +835,31 @@ "message": "Obnovit členství" }, "premiumNotCurrentMember": { - "message": "Momentálně nejste prémiovým členem." + "message": "Aktuálně nemáte členství Premium." }, "premiumSignUpAndGet": { - "message": "Přihlaste se k prémiovému členství a získejte:" + "message": "Přihlaste se k členství Premium a získejte:" }, "ppremiumSignUpStorage": { "message": "1 GB šifrovaného úložiště pro přílohy." }, - "ppremiumSignUpTwoStep": { - "message": "Další možnosti dvoufázového přihlášení, jako je například YubiKey, FIDO U2F a Duo." + "premiumSignUpTwoStepOptions": { + "message": "Volby proprietálních dvoufázových přihlášení jako je YubiKey a Duo." }, "ppremiumSignUpReports": { - "message": "Reporty o hygieně vašich hesel, zdraví účtu a narušeních bezpečnosti." + "message": "Reporty o hygieně Vašich hesel, zdraví účtu a narušeních bezpečnosti." }, "ppremiumSignUpTotp": { - "message": "Generátor TOTP kódu dvoufázového přihlašování (2FA) pro přihlašovací údaje ve vašem trezoru." + "message": "Generátor TOTP kódu dvoufázového přihlašování (2FA) pro přihlašovací údaje ve Vašem trezoru." }, "ppremiumSignUpSupport": { "message": "Prioritní zákaznickou podporu." }, "ppremiumSignUpFuture": { - "message": "Všechny budoucí prémiové funkce. Více již brzy!" + "message": "Všechny budoucí funkce členství Premium. Více již brzy!" }, "premiumPurchase": { - "message": "Zakoupit prémiové členství" + "message": "Zakoupit členství Premium" }, "premiumPurchaseAlert": { "message": "Prémiové členství můžete zakoupit na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?" @@ -795,10 +868,10 @@ "message": "Jste prémiovým členem!" }, "premiumCurrentMemberThanks": { - "message": "Děkujeme za podporu Bitwarden." + "message": "Děkujeme za podporu Bitwardenu." }, "premiumPrice": { - "message": "Vše jen za %price% ročně!", + "message": "Vše jen za $PRICE$ ročně!", "placeholders": { "price": { "content": "$1", @@ -813,16 +886,16 @@ "message": "Automaticky kopírovat TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Pokud mají vaše přihlašovací údaje přidán autentizační klíč pro TOTP, vygenerovaný ověřovací kód (TOTP) se automaticky zkopíruje do schránky při každém automatickém vyplnění přihlašovacích údajů." + "message": "Pokud mají Vaše přihlašovací údaje přidán autentizační klíč pro TOTP, vygenerovaný ověřovací kód (TOTP) se automaticky zkopíruje do schránky při každém automatickém vyplnění přihlašovacích údajů." }, "enableAutoBiometricsPrompt": { "message": "Ověřit biometrické údaje při spuštění" }, "premiumRequired": { - "message": "Vyžaduje prémiové členství" + "message": "Je vyžadováno členství Premium" }, "premiumRequiredDesc": { - "message": "Pro použití této funkce je potřebné prémiové členství." + "message": "Pro použití této funkce je potřebné členství Premium." }, "enterVerificationCodeApp": { "message": "Zadejte 6místný kód z ověřovací aplikace." @@ -846,7 +919,7 @@ } }, "rememberMe": { - "message": "Pamatuj si mě" + "message": "Zapamatovat mě" }, "sendVerificationCodeEmailAgain": { "message": "Znovu zaslat ověřovací kód na e-mail" @@ -855,13 +928,13 @@ "message": "Použít jinou metodu dvoufázového přihlášení" }, "insertYubiKey": { - "message": "Vložte YubiKey do USB portu vašeho počítače a stiskněte jeho tlačítko." + "message": "Vložte YubiKey do USB portu Vašeho počítače a stiskněte jeho tlačítko." }, "insertU2f": { - "message": "Vložte svůj bezpečnostní klíč do USB portu vašeho počítače a pokud má tlačítko, tak jej stiskněte." + "message": "Vložte svůj bezpečnostní klíč do USB portu Vašeho počítače a pokud má tlačítko, tak jej stiskněte." }, "webAuthnNewTab": { - "message": "Pokračujte v ověřování WebAuthn 2FA na nové kartě." + "message": "Pro spuštění ověření WebAuthn 2FA: Klepnutím na tlačítko níže otevřete novou kartu a postupujte podle pokynů uvedených v nové kartě." }, "webAuthnNewTabOpen": { "message": "Otevřít novou kartu" @@ -873,13 +946,13 @@ "message": "Přihlášení není dostupné" }, "noTwoStepProviders": { - "message": "Tento účet má zapnuté dvoufázové ověřování, ale žádný z nastavených poskytovalů dvoufázového přihlášení není v tomto prohlížeči podporován." + "message": "Tento účet má zapnuté dvoufázové ověřování, ale žádný z nastavených poskytovatelů dvoufázového přihlášení není v tomto prohlížeči podporován." }, "noTwoStepProviders2": { - "message": "Použijte prosím podporovaný webový prohlížeč (například Chrome) a přidejte další poskytovatele, kteří lépe podporují více různých webových prohlížečích (jako například ověřovací aplikace)." + "message": "Použijte podporovaný webový prohlížeč (například Chrome) a přidejte další poskytovatele, kteří lépe podporují více různých webových prohlížečích (jako například ověřovací aplikace)." }, "twoStepOptions": { - "message": "Možnosti dvoufázového přihlášení" + "message": "Volby dvoufázového přihlášení" }, "recoveryCodeDesc": { "message": "Ztratili jste přístup ke všem nastaveným poskytovatelům dvoufázového přihlášení? Použijte obnovovací kód pro vypnutí dvoufázového přihlášení." @@ -895,36 +968,36 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP bezpečnostní klíč" + "message": "Bezpečnostní klíč YubiKey OTP" }, "yubiKeyDesc": { - "message": "Použít YubiKey pro přístup k vašemu trezoru. Podporuje YubiKey 4, 4 Nano, 4C a NEO zařízení." + "message": "Použije YubiKey pro přístup k Vašemu trezoru. Podporuje YubiKey 4, 4 Nano, 4C a NEO." }, "duoDesc": { - "message": "Ověřit pomocí Duo Security prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo U2F bezpečnostního kódu.", + "message": "Ověření pomocí Duo Security prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo bezpečnostního klíče U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Ověřit pomocí Duo Security pro vaši organizaci prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo U2F bezpečnostního kódu.", + "message": "Ověření pomocí Duo Security pro Vaši organizaci prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo bezpečnostního klíče U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Použijte jakýkoliv WebAuthn bezpečnostní klíč pro přístup k vašemu účtu." + "message": "Použije jakýkoli bezpečnostní klíč WebAuthn pro přístup k Vašemu účtu." }, "emailTitle": { "message": "E-mail" }, "emailDesc": { - "message": "Ověřovací kódy vám budou zaslány e-mailem." + "message": "Ověřovací kódy Vám budou zaslány e-mailem." }, "selfHostedEnvironment": { - "message": "Vlastnoručně hostované prostředí" + "message": "Vlastní hostované prostředí" }, "selfHostedEnvironmentFooter": { - "message": "Zadejte základní URL adresu vlastnoručně hostované aplikace Bitwarden." + "message": "Zadejte základní URL adresu vlastní hostované aplikace Bitwarden." }, "customEnvironment": { "message": "Vlastní prostředí" @@ -936,7 +1009,7 @@ "message": "URL serveru" }, "apiUrl": { - "message": "URL serveru API" + "message": "URL API serveru" }, "webVaultUrl": { "message": "URL serveru webového trezoru" @@ -948,11 +1021,36 @@ "message": "URL serveru pro oznámení" }, "iconsUrl": { - "message": "URL serveru ikonek" + "message": "URL serveru ikon" }, "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Automaticky vyplnit údaje při načtení stránky" }, @@ -960,19 +1058,19 @@ "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." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromitované nebo nedůvěryhodné webové stránky mohou zneužívat automatické vyplňování při načítání stránky." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Více informací o automatickém vyplňování" }, "defaultAutoFillOnPageLoad": { "message": "Výchozí nastavení automatického vyplňování pro položky přihlášení" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Po povolení automatického vyplňování při načtení stránky můžete tuto funkci povolit nebo zakázat pro jednotlivé položky přihlášení. Toto je výchozí nastavení pro položky přihlášení, které nejsou samostatně konfigurovány." + "message": "Můžete vypnout automatické vyplňování při načtení stránky pro jednotlivé přihlašovací položky v zobrazení pro úpravu položky." }, "itemAutoFillOnPageLoad": { - "message": "Automatické vyplnění při načtení stránky (pokud je povoleno v nastavení)" + "message": "Automatické vyplnění při načtení stránky (pokud je nastaveno)" }, "autoFillOnPageLoadUseDefault": { "message": "Použít výchozí nastavení" @@ -990,13 +1088,13 @@ "message": "Otevřít trezor v postranním panelu" }, "commandAutofillDesc": { - "message": "Automaticky vyplnit poslední použité přihlašovací údaje pro tuto stránku." + "message": "Automaticky vyplní poslední použité přihlašovací údaje pro tuto stránku." }, "commandGeneratePasswordDesc": { - "message": "Vygenerovat a zkopírovat nové náhodné heslo do schránky." + "message": "Vygeneruje a zkopíruje nové náhodné heslo do schránky." }, "commandLockVaultDesc": { - "message": "Zamknout trezor" + "message": "Zamkne trezor." }, "privateModeWarning": { "message": "Podpora soukromého režimu je experimentální a některé funkce jsou omezené." @@ -1005,7 +1103,7 @@ "message": "Vlastní pole" }, "copyValue": { - "message": "Zkopírovat hodnotu" + "message": "Kopírovat hodnotu" }, "value": { "message": "Hodnota" @@ -1023,7 +1121,7 @@ "message": "Skryté" }, "cfTypeBoolean": { - "message": "Ano/Ne" + "message": "Boolean" }, "cfTypeLinked": { "message": "Propojené", @@ -1037,19 +1135,22 @@ "message": "Klepnutím mimo vyskakovací okno při zjišťování ověřovacího kódu zaslaného na e-mail bude vyskakovací okno zavřeno. Chcete otevřít toto vyskakovací okno v novém okně, aby se nezavřelo?" }, "popupU2fCloseMessage": { - "message": "Tento prohlížeč nemůže zpracovat U2F požadavky ve vyskakovacím okně. Chcete otevřít toto vyskakovací okno v novém okně, abyste se mohli přihlásit pomocí U2F?" + "message": "Tento prohlížeč nemůže zpracovat požadavky U2F ve vyskakovacím okně. Chcete otevřít toto vyskakovací okno v novém okně, abyste se mohli přihlásit pomocí U2F?" }, "enableFavicon": { "message": "Zobrazit ikony webových stránek" }, "faviconDesc": { - "message": "Zobrazit rozeznatelný obrázek vedle každého přihlášení." + "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" }, "badgeCounterDesc": { - "message": "Zobrazit počet přihlašovacích údajů pro aktuální webovou stránku na ikoně rozšíření prohlížeče." + "message": "Zobrazí počet přihlašovacích údajů pro aktuální webovou stránku na ikoně rozšíření prohlížeče." }, "cardholderName": { "message": "Jméno držitele karty" @@ -1124,16 +1225,16 @@ "message": "Slečna" }, "dr": { - "message": "MUDr" + "message": "MUDr." }, "mx": { - "message": "Mx" + "message": "Neutrální" }, "firstName": { - "message": "Jméno" + "message": "Křestní jméno" }, "middleName": { - "message": "Druhé jméno" + "message": "Prostřední jméno" }, "lastName": { "message": "Příjmení" @@ -1145,7 +1246,7 @@ "message": "Název identity" }, "company": { - "message": "Firma" + "message": "Společnost" }, "ssn": { "message": "Číslo sociálního pojištění" @@ -1154,7 +1255,7 @@ "message": "Číslo cestovního pasu" }, "licenseNumber": { - "message": "Licenční číslo" + "message": "Číslo dokladu totožnosti" }, "email": { "message": "E-mail" @@ -1196,7 +1297,7 @@ "message": "Přihlašovací údaje" }, "typeSecureNote": { - "message": "Poznámka" + "message": "Zabezpečená poznámka" }, "typeCard": { "message": "Karta" @@ -1232,7 +1333,7 @@ "message": "Přihlašovací údaje" }, "secureNotes": { - "message": "Poznámky" + "message": "Zabezpečené poznámky" }, "clear": { "message": "Vymazat", @@ -1262,7 +1363,7 @@ "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "Hostitel", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1280,14 +1381,14 @@ "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Výchozí", + "message": "Výchozí zjišťování shody", "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Přepnout možnosti" + "message": "Přepnout volby" }, "toggleCurrentUris": { - "message": "Přepnout zobrazení aktuálních URI", + "message": "Přepnout aktuální URI", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1308,13 +1409,13 @@ "message": "Nejsou k dispozici žádná hesla." }, "remove": { - "message": "Smazat" + "message": "Odebrat" }, "default": { "message": "Výchozí" }, "dateUpdated": { - "message": "Změněno", + "message": "Aktualizováno", "description": "ex. Date this item was updated" }, "dateCreated": { @@ -1322,11 +1423,11 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Heslo bylo změněno", + "message": "Heslo bylo aktualizováno", "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Opravdu chcete použít možnost „Nikdy“? Nastavením možností uzamčení na „Nikdy“ bude šifrovací klíč k trezoru uložen přímo ve vašem zařízení. Pokud tuto možnost použijete, měli byste vaše zařízení řádně zabezpečit a chránit." + "message": "Opravdu chcete použít volbu \"Nikdy\"? Nastavením možností uzamčení na \"Nikdy\" bude šifrovací klíč k trezoru uložen přímo ve Vašem zařízení. Pokud tuto možnost použijete, měli byste Vaše zařízení řádně zabezpečit a chránit." }, "noOrganizationsList": { "message": "Nepatříte do žádné organizace. Organizace umožňují bezpečné sdílení položek s ostatními uživateli." @@ -1356,7 +1457,7 @@ "message": "Slabé hlavní heslo" }, "weakMasterPasswordDesc": { - "message": "Zvolené hlavní heslo je slabé. Pro správnou ochranu účtu Bitwarden byste měli použít silné hlavní heslo (nebo heslovou frázi). Opravdu chcete toto heslo použít?" + "message": "Zvolené hlavní heslo je slabé. Pro správnou ochranu účtu Bitwardenu byste měli použít silné hlavní heslo (nebo heslovou frázi). Opravdu chcete toto heslo použít?" }, "pin": { "message": "PIN", @@ -1366,10 +1467,10 @@ "message": "Odemknout pomocí PIN" }, "setYourPinCode": { - "message": "Nastavte svůj PIN kód pro odemknutí trezoru. Pokud se zcela odhlásíte z aplikace bude váš současný PIN bude resetován." + "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." }, "pinRequired": { - "message": "PIN kód je vyžadován." + "message": "Je vyžadován PIN kód." }, "invalidPin": { "message": "Neplatný PIN kód." @@ -1381,7 +1482,7 @@ "message": "Čeká se na potvrzení z aplikace v počítači" }, "awaitDesktopDesc": { - "message": "Prosím potvrďte použití biometrie v desktopové Bitwarden aplikaci, pro povolení biometrie v prohlížeči." + "message": "Pro povolení biometrie v prohlížeči potvrďte její použití v desktopové aplikaci Bitwarden." }, "lockWithMasterPassOnRestart": { "message": "Zamknout trezor při restartu prohlížeče pomocí hlavního hesla" @@ -1410,7 +1511,7 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Hledat v koši" + "message": "Prohledat koš" }, "permanentlyDeleteItem": { "message": "Trvale smazat položku" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Obnovit položku" }, - "restoreItemConfirmation": { - "message": "Opravdu chcete tuto položku obnovit?" - }, "restoredItem": { "message": "Položka byla obnovena" }, @@ -1440,14 +1538,41 @@ "message": "Automaticky vyplnit a uložit" }, "autoFillSuccessAndSavedUri": { - "message": "Položka byla automaticky vyplněna a uloženo URI" + "message": "Položka byla automaticky vyplněna a URI bylo uloženo" }, "autoFillSuccess": { - "message": "Položka byla automaticky vyplněna" + "message": "Položka byla automaticky vyplněna " + }, + "insecurePageWarning": { + "message": "Varování: Toto je nezabezpečená stránka HTTP a všechny informace, které odešlete, mohou být případně viditelné a změněny ostatními. Toto přihlášení bylo původně uloženo na zabezpečené (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Chcete přesto vyplnit toto přihlášení?" + }, + "autofillIframeWarning": { + "message": "Formulář je hostován jinou doménou než URI uloženého přihlášení. Zvolte OK pro automatické vyplnění nebo Zrušit pro zrušení." + }, + "autofillIframeWarningTip": { + "message": "Aby se zabránilo tomuto varování v budoucnu, uložte tuto URI: $HOSTNAME$ do vaší přihlašovací položky Bitwarden pro tuto stránku.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { "message": "Nastavit hlavní heslo" }, + "currentMasterPass": { + "message": "Aktuální hlavní heslo" + }, + "newMasterPass": { + "message": "Nové hlavní heslo" + }, + "confirmNewMasterPass": { + "message": "Potvrďte nové hlavní heslo" + }, "masterPasswordPolicyInEffect": { "message": "Jedna nebo více zásad organizace vyžaduje, aby hlavní heslo splňovalo následující požadavky:" }, @@ -1491,10 +1616,10 @@ "message": "Vaše nové hlavní heslo nesplňuje požadavky zásad organizace." }, "acceptPolicies": { - "message": "Zaškrtnutím tohoto políčka souhlasím s následujícím:" + "message": "Zaškrtnutím tohoto políčka souhlasíte s následujícím:" }, "acceptPoliciesRequired": { - "message": "Podmínky použití a zásady ochrany osobních údajů nebyly odsouhlaseny." + "message": "Podmínky použití a Zásady ochrany osobních údajů nebyly odsouhlaseny." }, "termsOfService": { "message": "Podmínky použití" @@ -1503,52 +1628,52 @@ "message": "Zásady ochrany osobních údajů" }, "hintEqualsPassword": { - "message": "Nápověda k vašemu heslu nemůže být stejná jako vaše heslo." + "message": "Nápověda k Vašemu heslu nemůže být stejná jako Vaše heslo." }, "ok": { "message": "OK" }, "desktopSyncVerificationTitle": { - "message": "Ověření synchronizace s desktopovou aplikací" + "message": "Ověření synchronizace s aplikací pro počítač" }, "desktopIntegrationVerificationText": { - "message": "Ověřte, zda desktopová aplikace zobrazuje tento otisk: " + "message": "Ověřte, zda aplikace pro počítač zobrazuje tento otisk: " }, "desktopIntegrationDisabledTitle": { - "message": "Integrace prohlížeče není povolena" + "message": "Integrace prohlížeče není nastavena" }, "desktopIntegrationDisabledDesc": { - "message": "Integrace prohlížeče není povolena v aplikaci Bitwarden. Povolte ji prosím v nastavení v aplikaci pro počítač." + "message": "Integrace prohlížeče není v aplikaci Bitwarden nastavena. Nastavte ji v aplikaci pro počítač." }, "startDesktopTitle": { - "message": "Spustit aplikaci Bitwarden" + "message": "Spustit aplikaci Bitwarden pro počítač" }, "startDesktopDesc": { - "message": "Počítačová aplikace Bitwarden musí být spuštěna před použitím této funkce." + "message": "Před použitím této funkce musí být spuštěna aplikace Bitwarden pro počítač." }, "errorEnableBiometricTitle": { - "message": "Nelze povolit biometrii" + "message": "Nelze nastavit biometrii" }, "errorEnableBiometricDesc": { "message": "Akce byla zrušena aplikací pro počítač" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Aplikace pro počítač zrušila platnost zabezpečeného komunikačního kanálu. Zkuste to prosím znovu" + "message": "Aplikace pro počítač zrušila platnost zabezpečeného komunikačního kanálu. Zkuste to znovu." }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Komunikace s počítačovou aplikací přerušena" + "message": "Komunikace s aplikací pro počítač byla přerušena" }, "nativeMessagingWrongUserDesc": { - "message": "Počítačová aplikace je přihlášena k jinému účtu. Ujistěte se, že jsou obě aplikace přihlášeny ke stejnému účtu." + "message": "Aplikace pro počítač je přihlášena k jinému účtu. Ujistěte se, že jsou obě aplikace přihlášeny ke stejnému účtu." }, "nativeMessagingWrongUserTitle": { - "message": "Neshoda účtu" + "message": "Neshoda účtů" }, "biometricsNotEnabledTitle": { - "message": "Biometrie není povolena" + "message": "Biometrie není nastavena" }, "biometricsNotEnabledDesc": { - "message": "Biometrické prvky v prohlížeči vyžadují, aby v nastavení počítačové aplikace byla povolena biometrie." + "message": "Biometrické prvky v prohlížeči vyžadují, aby byla nastavena biometrie nejprve v aplikaci pro počítač." }, "biometricsNotSupportedTitle": { "message": "Biometrie není podporována" @@ -1556,30 +1681,42 @@ "biometricsNotSupportedDesc": { "message": "Biometrie v prohlížeči není na tomto zařízení podporována." }, + "biometricsFailedTitle": { + "message": "Biometrika selhala" + }, + "biometricsFailedDesc": { + "message": "Biometriku nelze dokončit, zvažte použití hlavního hesla nebo odhlášení. Pokud to přetrvává, kontaktujte podporu Bitwardenu." + }, "nativeMessaginPermissionErrorTitle": { "message": "Oprávnění nebylo uděleno" }, "nativeMessaginPermissionErrorDesc": { - "message": "Bez oprávnění ke komunikaci s počítačovou aplikací Bitwarden nelze v rozšíření prohlížeče používat biometrické údaje. Zkuste to prosím znovu." + "message": "Bez oprávnění ke komunikaci s aplikací Bitwarden pro počítač nelze v rozšíření prohlížeče používat biometrické údaje. Zkuste to znovu." }, "nativeMessaginPermissionSidebarTitle": { "message": "Žádost o oprávnění selhala" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Tuto akci nelze provést v postranním panelu, prosím zkuste akci znovu v novém okně." + "message": "Tuto akci nelze provést v postranním panelu, zkuste akci znovu v novém okně." }, "personalOwnershipSubmitError": { - "message": "Z důvodu zásad organizace nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." + "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." }, "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ není platná doména", "placeholders": { @@ -1594,7 +1731,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Hledat Sends", + "message": "Prohledat Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { @@ -1619,7 +1756,7 @@ "message": "Vypršela platnost" }, "pendingDeletion": { - "message": "Čeká na smazání" + "message": "Čekání na smazání" }, "passwordProtected": { "message": "Chráněno heslem" @@ -1629,34 +1766,34 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Odstranit heslo" + "message": "Odebrat heslo" }, "delete": { "message": "Smazat" }, "removedPassword": { - "message": "Odstraněné heslo" + "message": "Heslo odebráno" }, "deletedSend": { - "message": "Send odstraněn", + "message": "Send smazán", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Odkaz tohoto Send", + "message": "Odkaz pro Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { "message": "Zakázáno" }, "removePasswordConfirmation": { - "message": "Jste si jisti, že chcete odstranit heslo?" + "message": "Opravdu chcete odebrat heslo?" }, "deleteSend": { "message": "Smazat Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Jste si jisti, že chcete odstranit tento Send?", + "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." }, "editSend": { @@ -1675,7 +1812,7 @@ "message": "Soubor, který chcete odeslat." }, "deletionDate": { - "message": "Datum odstranění" + "message": "Datum smazání" }, "deletionDateDesc": { "message": "Tento Send bude trvale smazán v určený datum a čas.", @@ -1692,7 +1829,7 @@ "message": "1 den" }, "days": { - "message": "$DAYS$ dní", + "message": "$DAYS$ dnů", "placeholders": { "days": { "content": "$1", @@ -1719,11 +1856,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Vypnout tento Send, díky čemuž k němu nebude moci nikdo přistoupit.", + "message": "Deaktivuje tento Send, díky čemuž k němu nebude moci nikdo přistoupit.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Zkopírovat odkaz pro sdílení tohoto Send po uložení.", + "message": "Zkopíruje odkaz pro sdílení tohoto Send po uložení.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -1734,21 +1871,21 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Počet aktuálních přístupů" + "message": "Aktuální počet přístupů" }, "createSend": { - "message": "Vytvořit nový Send", + "message": "Nový Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Nové heslo" }, "sendDisabled": { - "message": "Send deaktivován", + "message": "Send odebrán", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Kvůli firemním pravidlům můžete odstranit pouze existující Send.", + "message": "Z důvodu podnikových zásad můžete smazat pouze existující Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -1760,13 +1897,13 @@ "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ě kliknutím na tento banner." + "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." }, "sendFirefoxFileWarning": { - "message": "Chcete-li vybrat soubor pomocí prohlížeče Firefox, otevřete rozšíření v postranním panelu (pokud je to možné) nebo jej otevřete v novém okně kliknutím na tento banner." + "message": "Chcete-li vybrat soubor pomocí prohlížeče Firefox, 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." }, "sendSafariFileWarning": { - "message": "Chcete-li vybrat soubor pomocí prohlížeče Safari, otevřete nové okno kliknutím na tento banner." + "message": "Chcete-li vybrat soubor pomocí prohlížeče Safari, otevřete nové okno klepnutím na tento banner." }, "sendFileCalloutHeader": { "message": "Než začnete" @@ -1776,7 +1913,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": "klikněte zde", + "message": "klepněte zde", "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": { @@ -1787,16 +1924,16 @@ "message": "Uvedené datum vypršení platnosti není platné." }, "deletionDateIsInvalid": { - "message": "Uvedené datum odstranění není platné." + "message": "Uvedené datum smazání není platné." }, "expirationDateAndTimeRequired": { "message": "Je vyžadován datum a čas vypršení platnosti." }, "deletionDateAndTimeRequired": { - "message": "Je vyžadován datum a čas odstranění." + "message": "Je vyžadován datum a čas smazání." }, "dateParsingError": { - "message": "Došlo k chybě při ukládání data odstranění a vypršení platnosti." + "message": "Došlo k chybě při ukládání datumu smzání a vypršení platnosti." }, "hideEmail": { "message": "Skrýt mou e-mailovou adresu před příjemci." @@ -1811,43 +1948,64 @@ "message": "Potvrzení hlavního hesla" }, "passwordConfirmationDesc": { - "message": "Tato akce je chráněna. Chcete-li pokračovat, zadejte znovu vaše hlavní heslo, abychom ověřili vaší totožnost." + "message": "Tato akce je chráněna. Chcete-li pokračovat, zadejte znovu Vaše hlavní heslo, abychom ověřili Vaši totožnost." }, "emailVerificationRequired": { - "message": "Je vyžadováno ověření emailu" + "message": "Je vyžadováno ověření e-mailu" }, "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." }, "updatedMasterPassword": { - "message": "Hlavní heslo aktualizováno" + "message": "Hlavní heslo bylo aktualizováno" }, "updateMasterPassword": { - "message": "Změnit hlavní heslo" + "message": "Aktualizovat hlavní heslo" }, "updateMasterPasswordWarning": { - "message": "Administrátor v organizaci nedávno změnil vaše hlavní heslo. Pro přístup k trezoru jej nyní musíte změnit. Pokračování vás odhlásí z vaší aktuální relace a bude nutné se znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." + "message": "Administrátor v organizaci nedávno změnil Vaše hlavní heslo. Pro přístup k trezoru jej nyní musíte změnit. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatická registrace" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Tato organizace má podnikové zásady, které vás automaticky zaregistrují k obnovení hesla. Registrace umožní správcům organizace změnit vaše hlavní heslo." + "message": "Tato organizace má podnikové zásady, které Vás automaticky zaregistrují k obnovení hesla. Registrace umožní správcům organizace změnit Vaše hlavní heslo." }, "selectFolder": { - "message": "Vyberte složku" + "message": "Vyberte složku..." + }, + "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" }, - "ssoCompleteRegistration": { - "message": "Chcete-li dokončit přihlášení pomocí SSO, nastavte prosím hlavní přístupové heslo k vašemu trezoru." + "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" }, "hours": { - "message": "Hodin" + "message": "hodin" }, "minutes": { - "message": "Minuty" + "message": "minut" }, "vaultTimeoutPolicyInEffect": { - "message": "Pravidla vaší organizace ovlivňují časový limit trezoru. Maximální povolený časový limit trezoru je $HOURS$ hodin a $MINUTES$ minut", + "message": "Pravidla Vaší organizace ovlivňují časový limit trezoru. Maximální povolený časový limit trezoru je $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": { "hours": { "content": "$1", @@ -1856,17 +2014,30 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Zásady Vaší organizace nastavily akce po časovém limitu trezoru na $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, "vaultTimeoutTooLarge": { - "message": "Časový limit vašeho trezoru překračuje omezení stanovená vaší organizací." + "message": "Časový limit Vašeho trezoru překračuje omezení stanovená Vaší organizací." }, "vaultExportDisabled": { - "message": "Export trezoru zakázán" + "message": "Export trezoru není dostupný" }, "personalVaultExportPolicyInEffect": { - "message": "Jedna nebo více zásad organizace vám brání v exportu vašeho osobního trezoru." + "message": "Jedna nebo více zásad organizace Vám brání v exportu Vašeho osobního trezoru." }, "copyCustomFieldNameInvalidElement": { "message": "Nelze identifikovat platný prvek formuláře. Zkuste místo toho zkontrolovat HTML." @@ -1875,7 +2046,7 @@ "message": "Nenalezen žádný jedinečný identifikátor." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ používá SSO s vlastním klíčovým serverem. Hlavní heslo pro členy této organizace již není vyžadováno.", + "message": "$ORGANIZATION$ používá SSO s vlastním serverem s klíči. Hlavní heslo pro členy této organizace již není vyžadováno.", "placeholders": { "organization": { "content": "$1", @@ -1887,10 +2058,10 @@ "message": "Opustit organizaci" }, "removeMasterPassword": { - "message": "Odstranit hlavní heslo" + "message": "Odebrat hlavní heslo" }, "removedMasterPassword": { - "message": "Hlavní heslo bylo odstraněno." + "message": "Hlavní heslo bylo odebráno" }, "leaveOrganizationConfirmation": { "message": "Opravdu chcete tuto organizaci opustit?" @@ -1902,13 +2073,13 @@ "message": "Zobrazit počet znaků" }, "sessionTimeout": { - "message": "Vypršel časový limit relace. Vraťte se prosím zpět a zkuste se znovu přihlásit." + "message": "Vypršel časový limit relace. Vraťte se zpět a zkuste se znovu přihlásit." }, "exportingPersonalVaultTitle": { - "message": "Export mého trezoru" + "message": "Exportování osobního trezoru" }, - "exportingPersonalVaultDescription": { - "message": "Budou exportovány pouze položky trezoru spojené s účtem $EMAIL$. Nebudou zahrnuty položky trezoru v organizaci.", + "exportingIndividualVaultDescription": { + "message": "Budou exportovány jen osobní položky trezoru spojené s $EMAIL$. Položky trezoru organizace nebudou zahrnuty. Budou exportovány jen informace o položkách trezoru a nebudou zahrnuty související přílohy.", "placeholders": { "email": { "content": "$1", @@ -1923,7 +2094,7 @@ "message": "Znovu vygenerovat uživatelské jméno" }, "generateUsername": { - "message": "Generovat uživatelské jméno" + "message": "Vygenerovat uživatelské jméno" }, "usernameType": { "message": "Typ uživatelského jména" @@ -1970,16 +2141,16 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "Přístupový token" + "message": "Přístupový token API" }, "apiKey": { - "message": "API klíč" + "message": "Klíč API" }, "ssoKeyConnectorError": { "message": "Chyba Key Connector: ujistěte se, že je Key Connector k dispozici a funguje správně." }, "premiumSubcriptionRequired": { - "message": "Vyžadováno prémiové předplatné" + "message": "Je vyžadováno předplatné Premium" }, "organizationIsDisabled": { "message": "Organizace je deaktivována." @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "K položkám v deaktivované organizaci nemáte přístup. Požádejte o pomoc vlastníka organizace." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Přihlašování do $DOMAIN$", "placeholders": { @@ -2003,7 +2171,7 @@ "message": "Nastavení byla upravena" }, "environmentEditedClick": { - "message": "Klikněte zde" + "message": "Klepněte zde" }, "environmentEditedReset": { "message": "pro obnovení do přednastavených nastavení" @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Verze serveru" }, - "selfHosted": { - "message": "Vlastní hosting" + "selfHostedServer": { + "message": "vlastní hosting" }, "thirdParty": { "message": "Tretí strana" @@ -2027,7 +2195,7 @@ } }, "lastSeenOn": { - "message": "naposledy spatřen: $DATE$", + "message": "Naposledy spatřen: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2039,45 +2207,615 @@ "message": "Přihlásit se pomocí hlavního hesla" }, "loggingInAs": { - "message": "Jste přihlášení jako" + "message": "Přihlašování jako" }, "notYou": { - "message": "Nejste to vy?" + "message": "Nejste to Vy?" }, "newAroundHere": { "message": "Jste tu noví?" }, "rememberEmail": { - "message": "Pamatovat si e-mail" + "message": "Zapamatovat si e-mail" + }, + "loginWithDevice": { + "message": "Přihlásit se zařízením" + }, + "loginWithDeviceEnabledInfo": { + "message": "Přihlášení zařízením musí být nastaveno v aplikaci Bitwarden pro počítač. Potřebujete další volby?" + }, + "fingerprintPhraseHeader": { + "message": "Fráze otisku prstu" + }, + "fingerprintMatchInfo": { + "message": "Ověřte, zda je trezor odemčený a jestli se fráze otisku prstu shoduje s frází na druhém zařízení." + }, + "resendNotification": { + "message": "Znovu odeslat oznámení" + }, + "viewAllLoginOptions": { + "message": "Zobrazit všechny volby přihlášení" + }, + "notificationSentDevice": { + "message": "Na Vaše zařízení bylo odesláno oznámení." + }, + "loginInitiated": { + "message": "Bylo zahájeno přihlášení" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Odhalené hlavní heslo" }, "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": "Heslo bylo nalezeno mezi odhalenými hesly. K zabezpečení Vašeho účtu používejte jedinečné heslo. Opravdu chcete používat odhalené heslo?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Slabé a odhalené hlavní heslo" }, "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": "Slabé heslo bylo nalezeno mezi odhalenými hesly. K zabezpečení Vašeho účtu používejte silné a jedinečné heslo. Opravdu chcete používat toto heslo?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Zkontrolovat heslo, zda nebylo odhaleno" }, "important": { - "message": "Important:" + "message": "Důležité:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Pokud zapomenete Vaše hlavní heslo, nebude možné jej obnovit!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Alespoň $LENGTH$ znaků", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Podle zásad Vaší organizace je zapnuto automatické vyplňování při načítání stránky." + }, + "howToAutofill": { + "message": "Jak na automatické vyplňování" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Rozumím" + }, + "autofillSettings": { + "message": "Nastavení automatického vyplňování" + }, + "autofillShortcut": { + "message": "Klávesová kombinace 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." + }, + "autofillShortcutText": { + "message": "Klávesová kombinace pro automatické vyplňování je: $COMMAND$. Změňte ji v nastavení prohlížeče.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Výchozí klávesová kombinace pro automatické vyplňování: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Přihlašování na" + }, + "opensInANewWindow": { + "message": "Otevře se v novém okně" + }, + "deviceApprovalRequired": { + "message": "Vyžaduje se schválení zařízení. Vyberte možnost schválení níže:" + }, + "rememberThisDevice": { + "message": "Zapamatovat toto zařízení" + }, + "uncheckIfPublicDevice": { + "message": "Odškrtněte, pokud používáte veřejné zařízení" + }, + "approveFromYourOtherDevice": { + "message": "Schválit s mým dalším zařízením" + }, + "requestAdminApproval": { + "message": "Žádost o schválení správcem" + }, + "approveWithMasterPassword": { + "message": "Schválit hlavním heslem" + }, + "ssoIdentifierRequired": { + "message": "Je vyžadován SSO identifikátor organizace." + }, + "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." + }, + "general": { + "message": "Obecné" + }, + "display": { + "message": "Zobrazení" + }, + "accountSuccessfullyCreated": { + "message": "Účet byl úspěšně vytvořen!" + }, + "adminApprovalRequested": { + "message": "Bylo vyžádáno schválení správcem" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Váš požadavek byl odeslán Vašemu správci." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Po schválení budete upozorněni." + }, + "troubleLoggingIn": { + "message": "Potíže s přihlášením?" + }, + "loginApproved": { + "message": "Přihlášení bylo schváleno" + }, + "userEmailMissing": { + "message": "Chybí e-mail uživatele" + }, + "deviceTrusted": { + "message": "Zařízení zařazeno mezi důvěryhodné" + }, + "inputRequired": { + "message": "Je vyžadován vstup." + }, + "required": { + "message": "vyžadováno" + }, + "search": { + "message": "Hledat" + }, + "inputMinLength": { + "message": "Vstup musí mít alespoň $COUNT$ znaků.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Vstup nesmí být delší než $COUNT$ znaků.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Následující znaky nejsou povoleny: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Vstupní hodnota musí být alespoň $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Vstupní hodnota nesmí přesáhnout $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 nebo více e-mailů jsou neplatné" + }, + "inputTrimValidator": { + "message": "Vstup nesmí obsahovat jen mezery.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Vstup není e-mailová adresa." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ polí výše vyžaduje Vaši pozornost.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Vybrat --" + }, + "multiSelectPlaceholder": { + "message": "-- Pište pro filtrování --" + }, + "multiSelectLoading": { + "message": "Načítání voleb..." + }, + "multiSelectNotFound": { + "message": "Nebyly nalezeny žádné položky" + }, + "multiSelectClearAll": { + "message": "Vymazat vše" + }, + "plusNMore": { + "message": "+ $QUANTITY$ dalších", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Podmenu" + }, + "toggleCollapse": { + "message": "Přepnout sbalení", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Odemknout účet", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Cíl importu" + }, + "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" + }, + "typePasskey": { + "message": "Přístupový klíč" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Potvrdit" + }, + "savePasskey": { + "message": "Uložit přístupový klíč" + }, + "savePasskeyNewLogin": { + "message": "Uložit přístupový klíč jako nové přihlášení" + }, + "choosePasskey": { + "message": "Vyberte přihlášení pro uložení tohoto přístupového klíče" + }, + "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." + }, + "useBrowserName": { + "message": "Použít prohlížeč" + }, + "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" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json new file mode 100644 index 000000000000..5b1a8d901042 --- /dev/null +++ b/apps/browser/src/_locales/cy/messages.json @@ -0,0 +1,2821 @@ +{ + "appName": { + "message": "Bitwarden" + }, + "extName": { + "message": "Bitwarden - Rheolydd cyfineiriau am ddim", + "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" + }, + "loginOrCreateNewAccount": { + "message": "Mewngofnodwch neu crëwch gyfrif newydd i gael mynediad i'ch cell ddiogel." + }, + "createAccount": { + "message": "Creu cyfrif" + }, + "login": { + "message": "Mewngofnodi" + }, + "enterpriseSingleSignOn": { + "message": "Enterprise single sign-on" + }, + "cancel": { + "message": "Cancel" + }, + "close": { + "message": "Cau" + }, + "submit": { + "message": "Cyflwyno" + }, + "emailAddress": { + "message": "Cyfeiriad ebost" + }, + "masterPass": { + "message": "Prif gyfrinair" + }, + "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." + }, + "masterPassHintDesc": { + "message": "A master password hint can help you remember your password if you forget it." + }, + "reTypeMasterPass": { + "message": "Re-type master password" + }, + "masterPassHint": { + "message": "Master password hint (optional)" + }, + "tab": { + "message": "Tab" + }, + "vault": { + "message": "Cell" + }, + "myVault": { + "message": "Fy nghell" + }, + "allVaults": { + "message": "Pob cell" + }, + "tools": { + "message": "Offer" + }, + "settings": { + "message": "Gosodiadau" + }, + "currentTab": { + "message": "Y tab cyfredol" + }, + "copyPassword": { + "message": "Copïo cyfrinair" + }, + "copyNote": { + "message": "Copy note" + }, + "copyUri": { + "message": "Copïo URI" + }, + "copyUsername": { + "message": "Copïo enw defnyddiwr" + }, + "copyNumber": { + "message": "Copïo rhif" + }, + "copySecurityCode": { + "message": "Copy security code" + }, + "autoFill": { + "message": "Llenwi'n awtomatig" + }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, + "generatePasswordCopied": { + "message": "Cynhyrchu cyfrinair (wedi'i gopïo)" + }, + "copyElementIdentifier": { + "message": "Copy custom field name" + }, + "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": "Datgloi'ch cell" + }, + "loginToVaultMenu": { + "message": "Mewngofnodi i'ch cell" + }, + "autoFillInfo": { + "message": "There are no logins available to auto-fill for the current browser tab." + }, + "addLogin": { + "message": "Ychwanegu manylion mewngofnodi" + }, + "addItem": { + "message": "Ychwanegu eitem" + }, + "passwordHint": { + "message": "Password hint" + }, + "enterEmailToGetHint": { + "message": "Enter your account email address to receive your master password hint." + }, + "getMasterPasswordHint": { + "message": "Get master password hint" + }, + "continue": { + "message": "Parhau" + }, + "sendVerificationCode": { + "message": "Send a verification code to your email" + }, + "sendCode": { + "message": "Anfod cod" + }, + "codeSent": { + "message": "Cod wedi'i anfon" + }, + "verificationCode": { + "message": "Cod dilysu" + }, + "confirmIdentity": { + "message": "Cadarnhewch eich hunaniaeth i barhau." + }, + "account": { + "message": "Cyfrif" + }, + "changeMasterPassword": { + "message": "Change master password" + }, + "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." + }, + "yourAccountsFingerprint": { + "message": "Your account's 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." + }, + "twoStepLogin": { + "message": "Two-step login" + }, + "logOut": { + "message": "Allgofnodi" + }, + "about": { + "message": "Ynghylch" + }, + "version": { + "message": "Fersiwn" + }, + "save": { + "message": "Cadw" + }, + "move": { + "message": "Symud" + }, + "addFolder": { + "message": "Ychwanegu ffolder" + }, + "name": { + "message": "Enw" + }, + "editFolder": { + "message": "Golygu ffolder" + }, + "deleteFolder": { + "message": "Dileu'r ffolder" + }, + "folders": { + "message": "Ffolderi" + }, + "noFolders": { + "message": "Does dim ffolderi i'w rhestru." + }, + "helpFeedback": { + "message": "Cymorth ac adborth" + }, + "helpCenter": { + "message": "Canolfan gymorth Bitwarden" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, + "sync": { + "message": "Cysoni" + }, + "syncVaultNow": { + "message": "Cysoni'r gell nawr" + }, + "lastSync": { + "message": "Wedi'i chysoni ddiwethaf:" + }, + "passGen": { + "message": "Cynhyrchydd cyfrineiriau" + }, + "generator": { + "message": "Cynhyrchydd", + "description": "Short for 'Password Generator'." + }, + "passGenInfo": { + "message": "Cynhyrchu cyfrineiriau cryf ac unigryw ar gyfer eich cyfrifon yn awtomatig." + }, + "bitWebVault": { + "message": "Cell we Bitwarden" + }, + "importItems": { + "message": "Mewnforio eitemau" + }, + "select": { + "message": "Dewis" + }, + "generatePassword": { + "message": "Cynhyrchu cyfrinair" + }, + "regeneratePassword": { + "message": "Ailgynhyrchu cyfrinair" + }, + "options": { + "message": "Dewisiadau" + }, + "length": { + "message": "Hyd" + }, + "uppercase": { + "message": "Priflythrennau (A-Z)" + }, + "lowercase": { + "message": "Llythrennau bach (a-z)" + }, + "numbers": { + "message": "Rhifau (0-9)" + }, + "specialCharacters": { + "message": "Nodau arbennig (!@#$%^&*)" + }, + "numWords": { + "message": "Nifer o eiriau" + }, + "wordSeparator": { + "message": "Gwahanydd geiriau" + }, + "capitalize": { + "message": "Priflythrennu", + "description": "Make the first letter of a work uppercase." + }, + "includeNumber": { + "message": "Cynnwys rhif" + }, + "minNumbers": { + "message": "Minimum numbers" + }, + "minSpecial": { + "message": "Minimum special" + }, + "avoidAmbChar": { + "message": "Avoid ambiguous characters" + }, + "searchVault": { + "message": "Chwilio'r gell" + }, + "edit": { + "message": "Golygu" + }, + "view": { + "message": "View" + }, + "noItemsInList": { + "message": "Does dim eitemau i'w rhestru." + }, + "itemInformation": { + "message": "Item information" + }, + "username": { + "message": "Enw defnyddiwr" + }, + "password": { + "message": "Cyfrinair" + }, + "passphrase": { + "message": "Cyfrinymadrodd" + }, + "favorite": { + "message": "Ffefrynnu" + }, + "notes": { + "message": "Nodiadau" + }, + "note": { + "message": "Nodyn" + }, + "editItem": { + "message": "Edit item" + }, + "folder": { + "message": "Ffolder" + }, + "deleteItem": { + "message": "Delete item" + }, + "viewItem": { + "message": "View item" + }, + "launch": { + "message": "Lansio" + }, + "website": { + "message": "Gwefan" + }, + "toggleVisibility": { + "message": "Toggle visibility" + }, + "manage": { + "message": "Rheoli" + }, + "other": { + "message": "Other" + }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "rateExtension": { + "message": "Rate the extension" + }, + "rateExtensionDesc": { + "message": "Ystyriwch ein helpu ni gydag adolygiad da!" + }, + "browserNotSupportClipboard": { + "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + }, + "verifyIdentity": { + "message": "Gwirio'ch hunaniaeth" + }, + "yourVaultIsLocked": { + "message": "Mae eich cell dan glo. Gwiriwch eich hunaniaeth i barhau." + }, + "unlock": { + "message": "Datgloi" + }, + "loggedInAsOn": { + "message": "Wedi mewngofnodi gyda $EMAIL$ ar $HOSTNAME$.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "hostname": { + "content": "$2", + "example": "bitwarden.com" + } + } + }, + "invalidMasterPassword": { + "message": "Prif gyfrinair annilys" + }, + "vaultTimeout": { + "message": "Cloi'r gell" + }, + "lockNow": { + "message": "Cloi nawr" + }, + "lockAll": { + "message": "Lock all" + }, + "immediately": { + "message": "ar unwaith" + }, + "tenSeconds": { + "message": "ar ôl 10 eiliad" + }, + "twentySeconds": { + "message": "ar ôl 20 eiliad" + }, + "thirtySeconds": { + "message": "ar ôl 30 eiliad" + }, + "oneMinute": { + "message": "ar ôl munud" + }, + "twoMinutes": { + "message": "ar ôl 2 funud" + }, + "fiveMinutes": { + "message": "ar ôl 5 munud" + }, + "fifteenMinutes": { + "message": "ar ôl chwarter awr" + }, + "thirtyMinutes": { + "message": "ar ôl hanner awr" + }, + "oneHour": { + "message": "ar ôl awr" + }, + "fourHours": { + "message": "ar ôl 4 awr" + }, + "onLocked": { + "message": "On system lock" + }, + "onRestart": { + "message": "On browser restart" + }, + "never": { + "message": "byth" + }, + "security": { + "message": "Diogelwch" + }, + "errorOccurred": { + "message": "Bu gwall" + }, + "emailRequired": { + "message": "Mae angen cyfeiriad ebost." + }, + "invalidEmail": { + "message": "Cyfeiriad ebost annilys." + }, + "masterPasswordRequired": { + "message": "Mae angen prif gyfrinair." + }, + "confirmMasterPasswordRequired": { + "message": "Mae angen aildeipio'r prif gyfrinair." + }, + "masterPasswordMinlength": { + "message": "Rhaid i'r prif gyfrinair gynnwys o leiaf $VALUE$ nod.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } + }, + "masterPassDoesntMatch": { + "message": "Master password confirmation does not match." + }, + "newAccountCreated": { + "message": "Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi." + }, + "masterPassSent": { + "message": "Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair." + }, + "verificationCodeRequired": { + "message": "Mae angen cod dilysu." + }, + "invalidVerificationCode": { + "message": "Cod dilysu annilys" + }, + "valueCopied": { + "message": "$VALUE$ copied", + "description": "Value has been copied to the clipboard.", + "placeholders": { + "value": { + "content": "$1", + "example": "Password" + } + } + }, + "autofillError": { + "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + }, + "loggedOut": { + "message": "Logged out" + }, + "loginExpired": { + "message": "Mae eich sesiwn wedi dod i ben." + }, + "logOutConfirmation": { + "message": "Ydych chi'n siŵr eich bod am allgofnodi?" + }, + "yes": { + "message": "Yes" + }, + "no": { + "message": "No" + }, + "unexpectedError": { + "message": "An unexpected error has occurred." + }, + "nameRequired": { + "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?" + }, + "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?" + }, + "editedFolder": { + "message": "Ffolder wedi'i chadw" + }, + "deleteFolderConfirmation": { + "message": "Are you sure you want to delete this folder?" + }, + "deletedFolder": { + "message": "Ffolder wedi'i dileu" + }, + "gettingStartedTutorial": { + "message": "Getting started tutorial" + }, + "gettingStartedTutorialVideo": { + "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + }, + "syncingComplete": { + "message": "Syncing complete" + }, + "syncingFailed": { + "message": "Syncing failed" + }, + "passwordCopied": { + "message": "Cyfrinair wedi'i gopïo" + }, + "uri": { + "message": "URI" + }, + "uriPosition": { + "message": "URI $POSITION$", + "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.", + "placeholders": { + "position": { + "content": "$1", + "example": "2" + } + } + }, + "newUri": { + "message": "URI newydd" + }, + "addedItem": { + "message": "Eitem wedi'i hychwanegu" + }, + "editedItem": { + "message": "Eitem wedi'i chadw" + }, + "deleteItemConfirmation": { + "message": "Ydych chi wir eisiau anfon i'r sbwriel?" + }, + "deletedItem": { + "message": "Anfonwyd yr eitem i'r sbwriel" + }, + "overwritePassword": { + "message": "Trosysgrifo'r cyfrinair" + }, + "overwritePasswordConfirmation": { + "message": "Are you sure you want to overwrite the current password?" + }, + "overwriteUsername": { + "message": "Trosysgrifo'r enw defnyddiwr" + }, + "overwriteUsernameConfirmation": { + "message": "Are you sure you want to overwrite the current username?" + }, + "searchFolder": { + "message": "Search folder" + }, + "searchCollection": { + "message": "Search collection" + }, + "searchType": { + "message": "Search type" + }, + "noneFolder": { + "message": "Dim ffolder", + "description": "This is the folder for uncategorized items" + }, + "enableAddLoginNotification": { + "message": "Ask to add login" + }, + "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." + }, + "showCardsCurrentTab": { + "message": "Show cards on Tab page" + }, + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." + }, + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" + }, + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." + }, + "clearClipboard": { + "message": "Clirio'r clipfwrdd", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "clearClipboardDesc": { + "message": "Automatically clear copied values from your clipboard.", + "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?" + }, + "notificationAddSave": { + "message": "Cadw" + }, + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" + }, + "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": "Diweddaru" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Datgloi" + }, + "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." + }, + "defaultUriMatchDetectionDesc": { + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + }, + "theme": { + "message": "Thema" + }, + "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" + }, + "light": { + "message": "Golau", + "description": "Light color" + }, + "solarizedDark": { + "message": "Solarized dark", + "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." + }, + "exportVault": { + "message": "Allforio'r gell" + }, + "fileFormat": { + "message": "Fformat y ffeil" + }, + "warning": { + "message": "RHYBUDD", + "description": "WARNING (should stay in capitalized letters if the language permits)" + }, + "confirmVaultExport": { + "message": "Confirm vault export" + }, + "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." + }, + "encExportKeyWarningDesc": { + "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + }, + "encExportAccountWarningDesc": { + "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + }, + "exportMasterPassword": { + "message": "Enter your master password to export your vault data." + }, + "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?" + }, + "moveToOrganization": { + "message": "Move to organization" + }, + "share": { + "message": "Rhannu" + }, + "movedItemToOrg": { + "message": "Symudwyd $ITEMNAME$ i $ORGNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "orgname": { + "content": "$2", + "example": "Company Name" + } + } + }, + "moveToOrgDesc": { + "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + }, + "learnMore": { + "message": "Dysgu mwy" + }, + "authenticatorKeyTotp": { + "message": "Authenticator key (TOTP)" + }, + "verificationCodeTotp": { + "message": "Verification code (TOTP)" + }, + "copyVerificationCode": { + "message": "Copy verification code" + }, + "attachments": { + "message": "Atodiadau" + }, + "deleteAttachment": { + "message": "Delete attachment" + }, + "deleteAttachmentConfirmation": { + "message": "Are you sure you want to delete this attachment?" + }, + "deletedAttachment": { + "message": "Attachment deleted" + }, + "newAttachment": { + "message": "Ychwanegu atodiad newydd" + }, + "noAttachments": { + "message": "Dim atodiadau." + }, + "attachmentSaved": { + "message": "Attachment saved" + }, + "file": { + "message": "Ffeil" + }, + "selectFile": { + "message": "Dewis ffeil" + }, + "maxFileSize": { + "message": "Maximum file size is 500 MB." + }, + "featureUnavailable": { + "message": "Feature unavailable" + }, + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + }, + "premiumMembership": { + "message": "Aelodaeth uwch" + }, + "premiumManage": { + "message": "Rheoli'ch aelodaeth" + }, + "premiumManageAlert": { + "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumRefresh": { + "message": "Adnewyddu'ch aelodaeth" + }, + "premiumNotCurrentMember": { + "message": "Does gennych chi ddim aeloaeth uwch ar hyn o bryd." + }, + "premiumSignUpAndGet": { + "message": "Cofrestrwch ar gyfer aelodaeth uwch i gael:" + }, + "ppremiumSignUpStorage": { + "message": "Storfa 1GB wedi'i hamgryptio ar gyfer atodiadau ffeiliau." + }, + "premiumSignUpTwoStepOptions": { + "message": "Dewisiadau mewngofnodi dau gam perchenogol megis YubiKey a Duo." + }, + "ppremiumSignUpReports": { + "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + }, + "ppremiumSignUpTotp": { + "message": "Cynhyrchydd codau dilysu TOTP (2FA) ar gyfer manylion mewngofnodi yn eich cell." + }, + "ppremiumSignUpSupport": { + "message": "Cymorth wedi'i flaenoriaethu." + }, + "ppremiumSignUpFuture": { + "message": "All future Premium features. More coming soon!" + }, + "premiumPurchase": { + "message": "Prynu aelodaeth uwch" + }, + "premiumPurchaseAlert": { + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumCurrentMember": { + "message": "Mae gennych aelodaeth uwch!" + }, + "premiumCurrentMemberThanks": { + "message": "Diolch am gefnogi Bitwarden." + }, + "premiumPrice": { + "message": "Hyn oll am $PRICE$ y flwyddyn!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "refreshComplete": { + "message": "Refresh complete" + }, + "enableAutoTotpCopy": { + "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." + }, + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" + }, + "premiumRequired": { + "message": "Mae angen aelodaeth uwch" + }, + "premiumRequiredDesc": { + "message": "Mae angen aelodaeth uwch i ddefnyddio'r nodwedd hon." + }, + "enterVerificationCodeApp": { + "message": "Enter the 6 digit verification code from your authenticator app." + }, + "enterVerificationCodeEmail": { + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "verificationCodeEmailSent": { + "message": "Verification email sent to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "rememberMe": { + "message": "Fy nghofio i" + }, + "sendVerificationCodeEmailAgain": { + "message": "Send verification code email again" + }, + "useAnotherTwoStepMethod": { + "message": "Use another two-step login method" + }, + "insertYubiKey": { + "message": "Insert your YubiKey into your computer's USB port, then touch its button." + }, + "insertU2f": { + "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + }, + "webAuthnNewTab": { + "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": "Agor tab newydd" + }, + "webAuthnAuthenticate": { + "message": "Authenticate WebAuthn" + }, + "loginUnavailable": { + "message": "Login unavailable" + }, + "noTwoStepProviders": { + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + }, + "noTwoStepProviders2": { + "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": "Dewisiadau mewngofnodi dau gam" + }, + "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": "Cod adfer" + }, + "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." + }, + "yubiKeyTitle": { + "message": "YubiKey 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.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "duoOrganizationDesc": { + "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "webAuthnTitle": { + "message": "FIDO2 WebAuthn" + }, + "webAuthnDesc": { + "message": "Use any WebAuthn compatible security key to access your account." + }, + "emailTitle": { + "message": "Ebost" + }, + "emailDesc": { + "message": "Verification codes will be emailed to you." + }, + "selfHostedEnvironment": { + "message": "Self-hosted environment" + }, + "selfHostedEnvironmentFooter": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + }, + "customEnvironment": { + "message": "Amgylchedd addasedig" + }, + "customEnvironmentFooter": { + "message": "For advanced users. You can specify the base URL of each service independently." + }, + "baseUrl": { + "message": "Server URL" + }, + "apiUrl": { + "message": "API server URL" + }, + "webVaultUrl": { + "message": "Web vault server URL" + }, + "identityUrl": { + "message": "Identity server URL" + }, + "notificationsUrl": { + "message": "Notifications server URL" + }, + "iconsUrl": { + "message": "Icons server URL" + }, + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, + "enableAutoFillOnPageLoad": { + "message": "Auto-fill on page load" + }, + "enableAutoFillOnPageLoadDesc": { + "message": "Llenwi'n awtomatig wrth i dudalen lwytho os canfyddir ffurflen mewngofnodi." + }, + "experimentalFeature": { + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofill": { + "message": "Dysgu mwy am lenwi'n awtomatig" + }, + "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." + }, + "itemAutoFillOnPageLoad": { + "message": "Auto-fill on page load (if set up in Options)" + }, + "autoFillOnPageLoadUseDefault": { + "message": "Defnyddio'r gosodiad rhagosodedig" + }, + "autoFillOnPageLoadYes": { + "message": "Auto-fill on page load" + }, + "autoFillOnPageLoadNo": { + "message": "Do not auto-fill on page load" + }, + "commandOpenPopup": { + "message": "Open vault popup" + }, + "commandOpenSidebar": { + "message": "Open vault in sidebar" + }, + "commandAutofillDesc": { + "message": "Auto-fill the last used login for the current website" + }, + "commandGeneratePasswordDesc": { + "message": "Generate and copy a new random password to the clipboard" + }, + "commandLockVaultDesc": { + "message": "Cloi'r gell" + }, + "privateModeWarning": { + "message": "Private mode support is experimental and some features are limited." + }, + "customFields": { + "message": "Meysydd addasedig" + }, + "copyValue": { + "message": "Copy value" + }, + "value": { + "message": "Gwerth" + }, + "newCustomField": { + "message": "Maes addasedig newydd" + }, + "dragToSort": { + "message": "Drag to sort" + }, + "cfTypeText": { + "message": "Testun" + }, + "cfTypeHidden": { + "message": "Hidden" + }, + "cfTypeBoolean": { + "message": "Gwerth Boole" + }, + "cfTypeLinked": { + "message": "Linked", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Linked value", + "description": "This describes a value that is 'linked' (tied) to another value." + }, + "popup2faCloseMessage": { + "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + }, + "popupU2fCloseMessage": { + "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + }, + "enableFavicon": { + "message": "Dangos eiconau gwefannau" + }, + "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" + }, + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." + }, + "cardholderName": { + "message": "Enw ar y cerdyn" + }, + "number": { + "message": "Rhif" + }, + "brand": { + "message": "Brand" + }, + "expirationMonth": { + "message": "Mis dod i ben" + }, + "expirationYear": { + "message": "Blwyddyn dod i ben" + }, + "expiration": { + "message": "Dod i ben" + }, + "january": { + "message": "Ionawr" + }, + "february": { + "message": "Chwefror" + }, + "march": { + "message": "Mawrth" + }, + "april": { + "message": "Ebrill" + }, + "may": { + "message": "Mai" + }, + "june": { + "message": "Mehefin" + }, + "july": { + "message": "Gorffennaf" + }, + "august": { + "message": "Awst" + }, + "september": { + "message": "Medi" + }, + "october": { + "message": "Hydref" + }, + "november": { + "message": "Tachwedd" + }, + "december": { + "message": "Rhagfyr" + }, + "securityCode": { + "message": "Cod diogelwch" + }, + "ex": { + "message": "engh." + }, + "title": { + "message": "Teitl" + }, + "mr": { + "message": "Mr" + }, + "mrs": { + "message": "Mrs" + }, + "ms": { + "message": "Ms" + }, + "dr": { + "message": "Dr" + }, + "mx": { + "message": "Mx" + }, + "firstName": { + "message": "Enw cyntaf" + }, + "middleName": { + "message": "Enw canol" + }, + "lastName": { + "message": "Cyfenw" + }, + "fullName": { + "message": "Enw llawn" + }, + "identityName": { + "message": "Identity name" + }, + "company": { + "message": "Cwmni" + }, + "ssn": { + "message": "Social Security number" + }, + "passportNumber": { + "message": "Rhif pasbort" + }, + "licenseNumber": { + "message": "Rhif trwydded" + }, + "email": { + "message": "Ebost" + }, + "phone": { + "message": "Ffôn" + }, + "address": { + "message": "Cyfeiriad" + }, + "address1": { + "message": "Cyfeiriad 1" + }, + "address2": { + "message": "Cyfeiriad 2" + }, + "address3": { + "message": "Cyfeiriad 3" + }, + "cityTown": { + "message": "Tref / Dinas" + }, + "stateProvince": { + "message": "Talaith / Rhanbarth" + }, + "zipPostalCode": { + "message": "Cod post / zip" + }, + "country": { + "message": "Gwlad" + }, + "type": { + "message": "Math" + }, + "typeLogin": { + "message": "Manylion mewngofnodi" + }, + "typeLogins": { + "message": "Manylion mewngofnodi" + }, + "typeSecureNote": { + "message": "Nodyn diogel" + }, + "typeCard": { + "message": "Cerdyn" + }, + "typeIdentity": { + "message": "Hunaniaeth" + }, + "passwordHistory": { + "message": "Password history" + }, + "back": { + "message": "Yn ôl" + }, + "collections": { + "message": "Casgliadau" + }, + "favorites": { + "message": "Ffefrynnau" + }, + "popOutNewWindow": { + "message": "Syumd i ffenestr newydd" + }, + "refresh": { + "message": "Refresh" + }, + "cards": { + "message": "Cardiau" + }, + "identities": { + "message": "Eitemau hunaniaeth" + }, + "logins": { + "message": "Manylion mewngofnodi" + }, + "secureNotes": { + "message": "Nodiadau diogel" + }, + "clear": { + "message": "Clirio", + "description": "To clear something out. example: To clear browser history." + }, + "checkPassword": { + "message": "Gwirio a ydy'r cyfrinair wedi'i ddatgelu." + }, + "passwordExposed": { + "message": "Mae'r cyfrinair hwn wedi cael ei ddatgelu $VALUE$ o weithiau mewn achosion o dorri data. Dylech chi ei newid.", + "placeholders": { + "value": { + "content": "$1", + "example": "2" + } + } + }, + "passwordSafe": { + "message": "Chafodd y cyfrinair hwn mo'i ganfod mewn unrhyw achos hysbys o dorri data. Dylai fod yn iawn i'w ddefnyddio." + }, + "baseDomain": { + "message": "Base domain", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Domain name", + "description": "Domain name. Ex. website.com" + }, + "host": { + "message": "Host", + "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." + }, + "exact": { + "message": "Exact" + }, + "startsWith": { + "message": "Starts with" + }, + "regEx": { + "message": "Mynegiant rheolaidd", + "description": "A programming term, also known as 'RegEx'." + }, + "matchDetection": { + "message": "Match detection", + "description": "URI match detection for auto-fill." + }, + "defaultMatchDetection": { + "message": "Default match detection", + "description": "Default URI match detection for auto-fill." + }, + "toggleOptions": { + "message": "Toggle options" + }, + "toggleCurrentUris": { + "message": "Toggle current URIs", + "description": "Toggle the display of the URIs of the currently open tabs in the browser." + }, + "currentUri": { + "message": "URI cyfredol", + "description": "The URI of one of the current open tabs in the browser." + }, + "organization": { + "message": "Sefydliad", + "description": "An entity of multiple related people (ex. a team or business organization)." + }, + "types": { + "message": "Types" + }, + "allItems": { + "message": "Pob eitem" + }, + "noPasswordsInList": { + "message": "Does dim cyfrineiriau i'w rhestru." + }, + "remove": { + "message": "Tynnu" + }, + "default": { + "message": "Default" + }, + "dateUpdated": { + "message": "Updated", + "description": "ex. Date this item was updated" + }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, + "datePasswordUpdated": { + "message": "Password updated", + "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." + }, + "noOrganizationsList": { + "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + }, + "noCollectionsInList": { + "message": "There are no collections to list." + }, + "ownership": { + "message": "Perchnogaeth" + }, + "whoOwnsThisItem": { + "message": "Pwy sy'n berchen ar yr eitem hon?" + }, + "strong": { + "message": "Cryf", + "description": "ex. A strong password. Scale: Weak -> Good -> Strong" + }, + "good": { + "message": "Da", + "description": "ex. A good password. Scale: Weak -> Good -> Strong" + }, + "weak": { + "message": "Gwan", + "description": "ex. A weak password. Scale: Weak -> Good -> Strong" + }, + "weakMasterPassword": { + "message": "Prif gyfrinair gwan" + }, + "weakMasterPasswordDesc": { + "message": "Mae'r prif gyfrinair rydych chi wedi'i ddewis yn wan. Dylech ddefnyddio prif gyfrinair (neu gyfrinymadrodd) cryf i amddiffyn eich cyfrif Bitwarden. Ydych chi'n siŵr eich bod am ddefnyddio'r prif gyfrinair hwn?" + }, + "pin": { + "message": "PIN", + "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." + }, + "unlockWithPin": { + "message": "Datgloi â 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." + }, + "pinRequired": { + "message": "Mae angen cod PIN." + }, + "invalidPin": { + "message": "Cod PIN annilys." + }, + "unlockWithBiometrics": { + "message": "Unlock with biometrics" + }, + "awaitDesktop": { + "message": "Awaiting confirmation from desktop" + }, + "awaitDesktopDesc": { + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + }, + "lockWithMasterPassOnRestart": { + "message": "Lock with master password on browser restart" + }, + "selectOneCollection": { + "message": "You must select at least one collection." + }, + "cloneItem": { + "message": "Clone item" + }, + "clone": { + "message": "Clone" + }, + "passwordGeneratorPolicyInEffect": { + "message": "One or more organization policies are affecting your generator settings." + }, + "vaultTimeoutAction": { + "message": "Vault timeout action" + }, + "lock": { + "message": "Cloi", + "description": "Verb form: to make secure or inaccesible by" + }, + "trash": { + "message": "Sbwriel", + "description": "Noun: a special folder to hold deleted items" + }, + "searchTrash": { + "message": "Chwilio drwy'r sbwriel" + }, + "permanentlyDeleteItem": { + "message": "Dileu'r eitem yn barhaol" + }, + "permanentlyDeleteItemConfirmation": { + "message": "Are you sure you want to permanently delete this item?" + }, + "permanentlyDeletedItem": { + "message": "Eitem wedi'i dileu'n barhaol" + }, + "restoreItem": { + "message": "Adfer yr eitem" + }, + "restoredItem": { + "message": "Item restored" + }, + "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?" + }, + "vaultTimeoutLogOutConfirmationTitle": { + "message": "Timeout action confirmation" + }, + "autoFillAndSave": { + "message": "Auto-fill and save" + }, + "autoFillSuccessAndSavedUri": { + "message": "Item auto-filled and URI saved" + }, + "autoFillSuccess": { + "message": "Item auto-filled " + }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "setMasterPassword": { + "message": "Gosod prif gyfrinair" + }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "Prif gyfrinair newydd" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, + "masterPasswordPolicyInEffect": { + "message": "One or more organization policies require your master password to meet the following requirements:" + }, + "policyInEffectMinComplexity": { + "message": "Minimum complexity score of $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, + "policyInEffectMinLength": { + "message": "Minimum length of $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "policyInEffectUppercase": { + "message": "Contain one or more uppercase characters" + }, + "policyInEffectLowercase": { + "message": "Contain one or more lowercase characters" + }, + "policyInEffectNumbers": { + "message": "Contain one or more numbers" + }, + "policyInEffectSpecial": { + "message": "Contain one or more of the following special characters $CHARS$", + "placeholders": { + "chars": { + "content": "$1", + "example": "!@#$%^&*" + } + } + }, + "masterPasswordPolicyRequirementsNotMet": { + "message": "Your new master password does not meet the policy requirements." + }, + "acceptPolicies": { + "message": "Drwy dicio'r blwch hwn, rydych yn cytuno i'r canlynol:" + }, + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." + }, + "termsOfService": { + "message": "Telerau gwasanaeth" + }, + "privacyPolicy": { + "message": "Polisi preifatrwydd" + }, + "hintEqualsPassword": { + "message": "Your password hint cannot be the same as your password." + }, + "ok": { + "message": "Ok" + }, + "desktopSyncVerificationTitle": { + "message": "Desktop sync verification" + }, + "desktopIntegrationVerificationText": { + "message": "Please verify that the desktop application shows this fingerprint: " + }, + "desktopIntegrationDisabledTitle": { + "message": "Browser integration is not set up" + }, + "desktopIntegrationDisabledDesc": { + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + }, + "startDesktopTitle": { + "message": "Start the Bitwarden desktop application" + }, + "startDesktopDesc": { + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + }, + "errorEnableBiometricTitle": { + "message": "Unable to set up biometrics" + }, + "errorEnableBiometricDesc": { + "message": "Action was canceled by the desktop application" + }, + "nativeMessagingInvalidEncryptionDesc": { + "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + }, + "nativeMessagingInvalidEncryptionTitle": { + "message": "Desktop communication interrupted" + }, + "nativeMessagingWrongUserDesc": { + "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + }, + "nativeMessagingWrongUserTitle": { + "message": "Account missmatch" + }, + "biometricsNotEnabledTitle": { + "message": "Biometrics not set up" + }, + "biometricsNotEnabledDesc": { + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + }, + "biometricsNotSupportedTitle": { + "message": "Biometrics not supported" + }, + "biometricsNotSupportedDesc": { + "message": "Browser biometrics is not supported on this device." + }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, + "nativeMessaginPermissionErrorTitle": { + "message": "Permission not provided" + }, + "nativeMessaginPermissionErrorDesc": { + "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + }, + "nativeMessaginPermissionSidebarTitle": { + "message": "Permission request error" + }, + "nativeMessaginPermissionSidebarDesc": { + "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + }, + "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." + }, + "personalOwnershipPolicyInEffect": { + "message": "An organization policy is affecting your ownership options." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "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." + }, + "excludedDomainsInvalidDomain": { + "message": "Dyw $DOMAIN$ ddim yn barth dilys", + "placeholders": { + "domain": { + "content": "$1", + "example": "googlecom" + } + } + }, + "send": { + "message": "Send", + "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." + }, + "addSend": { + "message": "Ychwanegu Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeText": { + "message": "Testun" + }, + "sendTypeFile": { + "message": "Ffeil" + }, + "allSends": { + "message": "Pob Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "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": "Wedi dod i ben" + }, + "pendingDeletion": { + "message": "Pending deletion" + }, + "passwordProtected": { + "message": "Password protected" + }, + "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" + }, + "delete": { + "message": "Dileu" + }, + "removedPassword": { + "message": "Password removed" + }, + "deletedSend": { + "message": "Send deleted", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLink": { + "message": "Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "disabled": { + "message": "Disabled" + }, + "removePasswordConfirmation": { + "message": "Are you sure you want to remove the password?" + }, + "deleteSend": { + "message": "Delete Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendConfirmation": { + "message": "Are you sure you want to delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editSend": { + "message": "Edit 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?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNameDesc": { + "message": "A friendly name to describe this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFileDesc": { + "message": "The file you want to send." + }, + "deletionDate": { + "message": "Dyddiad dileu" + }, + "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." + }, + "expirationDate": { + "message": "Dyddiad dod i ben" + }, + "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 diwrnod" + }, + "days": { + "message": "$DAYS$ o ddyddiau", + "placeholders": { + "days": { + "content": "$1", + "example": "2" + } + } + }, + "custom": { + "message": "Addasedig" + }, + "maximumAccessCount": { + "message": "Maximum Access Count" + }, + "maximumAccessCountDesc": { + "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDesc": { + "message": "Optionally require a password for users to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNotesDesc": { + "message": "Private notes about this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisableDesc": { + "message": "Deactivate this Send so that no one can access it.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendShareDesc": { + "message": "Copy this Send's link to clipboard upon save.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTextDesc": { + "message": "The text you want to send." + }, + "sendHideText": { + "message": "Hide this Send's text by default.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "currentAccessCount": { + "message": "Current access count" + }, + "createSend": { + "message": "New Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "newPassword": { + "message": "New password" + }, + "sendDisabled": { + "message": "Send removed", + "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.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSend": { + "message": "Send created", + "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." + }, + "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." + }, + "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." + }, + "sendSafariFileWarning": { + "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + }, + "sendFileCalloutHeader": { + "message": "Cyn i chi ddechrau" + }, + "sendFirefoxCustomDatePopoutMessage1": { + "message": "To use a calendar style date picker", + "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", + "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.", + "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": "Dyw'r dyddiad dod i ben a roddwyd ddim yn ddilys." + }, + "deletionDateIsInvalid": { + "message": "Dyw'r dyddiad dileu a roddwyd ddim yn ddilys." + }, + "expirationDateAndTimeRequired": { + "message": "Mae angen rhoi dyddiad ac amser dod i ben." + }, + "deletionDateAndTimeRequired": { + "message": "Mae angen rhoi dyddiad ac amser dileu." + }, + "dateParsingError": { + "message": "There was an error saving your deletion and expiration dates." + }, + "hideEmail": { + "message": "Cuddio fy nghyfeiriad ebost rhag derbynwyr." + }, + "sendOptionsPolicyInEffect": { + "message": "One or more organization policies are affecting your Send options." + }, + "passwordPrompt": { + "message": "Master password re-prompt" + }, + "passwordConfirmation": { + "message": "Master password confirmation" + }, + "passwordConfirmationDesc": { + "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + }, + "emailVerificationRequired": { + "message": "Email verification required" + }, + "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" + }, + "updateMasterPassword": { + "message": "Update master password" + }, + "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." + }, + "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." + }, + "resetPasswordPolicyAutoEnroll": { + "message": "Automatic enrollment" + }, + "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." + }, + "selectFolder": { + "message": "Dewis ffolder..." + }, + "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" + }, + "hours": { + "message": "Hours" + }, + "minutes": { + "message": "Minutes" + }, + "vaultTimeoutPolicyInEffect": { + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." + }, + "vaultExportDisabled": { + "message": "Vault export unavailable" + }, + "personalVaultExportPolicyInEffect": { + "message": "One or more organization policies prevents you from exporting your individual vault." + }, + "copyCustomFieldNameInvalidElement": { + "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + }, + "copyCustomFieldNameNotUnique": { + "message": "No unique identifier found." + }, + "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.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Leave organization" + }, + "removeMasterPassword": { + "message": "Remove master password" + }, + "removedMasterPassword": { + "message": "Master password removed" + }, + "leaveOrganizationConfirmation": { + "message": "Are you sure you want to leave this organization?" + }, + "leftOrganization": { + "message": "You have left the organization." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "Your session has timed out. Please go back and try logging in again." + }, + "exportingPersonalVaultTitle": { + "message": "Exporting individual 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.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Gwall" + }, + "regenerateUsername": { + "message": "Regenerate username" + }, + "generateUsername": { + "message": "Cynhyrchu enw defnyddiwr" + }, + "usernameType": { + "message": "Math o enw defnyddiwr" + }, + "plusAddressedEmail": { + "message": "Plus addressed email", + "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." + }, + "catchallEmail": { + "message": "Catch-all email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Hap" + }, + "randomWord": { + "message": "Gair ar hap" + }, + "websiteName": { + "message": "Website name" + }, + "whatWouldYouLikeToGenerate": { + "message": "Beth hoffech chi ei gynhyrchu?" + }, + "passwordType": { + "message": "Math o gyfrinair" + }, + "service": { + "message": "Gwasanaeth" + }, + "forwardedEmail": { + "message": "Forwarded email alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "API Access Token" + }, + "apiKey": { + "message": "Allwedd API" + }, + "ssoKeyConnectorError": { + "message": "Key connector error: make sure key connector is available and working correctly." + }, + "premiumSubcriptionRequired": { + "message": "Premium subscription required" + }, + "organizationIsDisabled": { + "message": "Organization suspended." + }, + "disabledOrganizationFilterError": { + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "loggingInTo": { + "message": "Logging in to $DOMAIN$", + "placeholders": { + "domain": { + "content": "$1", + "example": "example.com" + } + } + }, + "settingsEdited": { + "message": "Settings have been edited" + }, + "environmentEditedClick": { + "message": "Click here" + }, + "environmentEditedReset": { + "message": "to reset to pre-configured settings" + }, + "serverVersion": { + "message": "Server version" + }, + "selfHostedServer": { + "message": "self-hosted" + }, + "thirdParty": { + "message": "Third-party" + }, + "thirdPartyServerMessage": { + "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "placeholders": { + "servername": { + "content": "$1", + "example": "ThirdPartyServerName" + } + } + }, + "lastSeenOn": { + "message": "last seen on: $DATE$", + "placeholders": { + "date": { + "content": "$1", + "example": "Jun 15, 2015" + } + } + }, + "loginWithMasterPassword": { + "message": "Log in with master password" + }, + "loggingInAs": { + "message": "Logging in as" + }, + "notYou": { + "message": "Not you?" + }, + "newAroundHere": { + "message": "New around here?" + }, + "rememberEmail": { + "message": "Cofio'r ebost" + }, + "loginWithDevice": { + "message": "Mewngofnodi â dyfais" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "Gweld pob dewis mewngofnodi" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, + "exposedMasterPassword": { + "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?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "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?" + }, + "checkForBreaches": { + "message": "Chwilio am achosion o ddatgelu data sy'n cynnwys y cyfrinair hwn" + }, + "important": { + "message": "Pwysig:" + }, + "masterPasswordHint": { + "message": "Allwch chi ddim adfer eich prif gyfrinair os caiff ei anghofio!" + }, + "characterMinimum": { + "message": "Isafswm o $LENGTH$ nod", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "Sut i lenwi'n awtomatig" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Iawn" + }, + "autofillSettings": { + "message": "Gosodiadau llenwi awtomatig" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Cofio'r ddyfais hon" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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." + }, + "general": { + "message": "Cyffredinol" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Chwilio" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Dewis --" + }, + "multiSelectPlaceholder": { + "message": "-- Teipiwch i hidlo --" + }, + "multiSelectLoading": { + "message": "Yn nôl dewisiadau..." + }, + "multiSelectNotFound": { + "message": "Heb ganfod eitemau" + }, + "multiSelectClearAll": { + "message": "Clirio'r cyfan" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Is-ddewislen" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" + } +} diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index d83db8e07173..922f4ca5f2e7 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Auto-udfyld" }, + "autoFillLogin": { + "message": "Autoudfyld login" + }, + "autoFillCard": { + "message": "Autoudfyld kort" + }, + "autoFillIdentity": { + "message": "Autoudfyld identitet" + }, "generatePasswordCopied": { "message": "Generér adgangskode (kopieret)" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Hjælp & feedback" }, + "helpCenter": { + "message": "Bitwarden Hjælpecenter" + }, + "communityForums": { + "message": "Tjek Bitwardens fællesskabsfora ud" + }, + "contactSupport": { + "message": "Kontakt Bitwarden-support" + }, "sync": { "message": "Synkronisér" }, @@ -329,6 +362,12 @@ "other": { "message": "Andre" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Opsæt en oplåsningsmetode til at ændre bokstimeouthandlingen." + }, + "unlockMethodNeeded": { + "message": "Opsæt en oplåsningsmetode i Indstillinger" + }, "rateExtension": { "message": "Bedøm udvidelsen" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lås nu" }, + "lockAll": { + "message": "Lås alle" + }, "immediately": { "message": "Straks" }, @@ -430,7 +472,14 @@ "message": "Hovedadgangskode kræves angivet igen." }, "masterPasswordMinlength": { - "message": "Hovedadgangskode skal være mindst 8 tegn." + "message": "Hovedadgangskoden skal udgøre minimum $VALUE$ tegn.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "De to adgangskoder matcher ikke." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Vis kort på fanebladet" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Opdatér" }, + "notificationUnlockDesc": { + "message": "Oplås din Bitwarden boks for at færdiggøre autoudfyldanmodningen." + }, + "notificationUnlock": { + "message": "Oplås" + }, "enableContextMenuItem": { "message": "Vis indstillinger i kontekstmenuen" }, "contextMenuItemDesc": { "message": "Brug et sekundært klik for at få adgang til adgangskodegenerering og matchende logins til hjemmesiden." }, + "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Skift applikationens farvetema." }, + "themeDescAlt": { + "message": "Skift applikationens farvetema. Gælder for alle indloggede konti." + }, "dark": { "message": "Mørk", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funktion ikke tilgængelig" }, - "updateKey": { - "message": "Du kan ikke bruge denne funktion, før du opdaterer din krypteringsnøgle." + "encryptionKeyMigrationRequired": { + "message": "Krypteringsnøglemigrering nødvendig. Log ind gennem web-boksen for at opdatere krypteringsnøglen." }, "premiumMembership": { "message": "Premium-medlemskab" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB krypteret lager til vedhæftede filer." }, - "ppremiumSignUpTwoStep": { - "message": "Yderligere to-trins login muligheder såsom YubiKey, FIDO U2F og Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietære totrins-login muligheder, såsom YubiKey og Duo." }, "ppremiumSignUpReports": { "message": "Adgangskodehygiejne, kontosundhed og rapporter om datalæk til at holde din boks sikker." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Miljøets URLs er blevet gemt." }, + "showAutoFillMenuOnFormFields": { + "message": "Vis autoudfyld-menu i formularfelter", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Gælder for alle indloggede konti." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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 autoudfyld-ikon vælges", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, "enableAutoFillOnPageLoad": { "message": "Auto-udfyld ved sideindlæsning" }, @@ -960,10 +1058,10 @@ "message": "Hvis der registreres en loginformular, så auto-udfyld, når websiden indlæses." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromitterede eller ikke-betroede websteder kan udnytte autoudfyldning ved sideindlæsning." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Læs mere om autoudfyldning" }, "defaultAutoFillOnPageLoad": { "message": "Standardindstilling for autofyld for loginelementer" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Gendan element" }, - "restoreItemConfirmation": { - "message": "Er du sikker på, at du vil gendanne dette element?" - }, "restoredItem": { "message": "Element gendannet" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Autoudfyldte element" }, + "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?" + }, + "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." + }, + "autofillIframeWarningTip": { + "message": "For at forhindre denne advarsel i fremtiden, så gem denne URI, $HOSTNAME$, til Bitwarden login-emnet for dette websted.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Indstil hovedadgangskode" }, + "currentMasterPass": { + "message": "Aktuel hovedadgangskode" + }, + "newMasterPass": { + "message": "Ny hovedadgangskode" + }, + "confirmNewMasterPass": { + "message": "Bekræft ny hovedadgangskode" + }, "masterPasswordPolicyInEffect": { "message": "Én eller flere organisationspolitikker kræver, at din hovedadgangskode opfylder flg. krav:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browserbiometri understøttes ikke på denne enhed." }, + "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." + }, "nativeMessaginPermissionErrorTitle": { "message": "Tilladelse ikke givet" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "En organisationspolitik påvirker dine ejerskabsmuligheder." }, + "personalOwnershipPolicyInEffectImports": { + "message": "En organisationspolitik hindrer import af emner til den individuelle boks." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ er ikke et gyldigt domæne", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Dit hovedadgangskode blev for nylig ændret af en administrator i din organisation. For at få adgang til boksen skal du opdatere den nu. Hvis du fortsætter, logges du ud af din nuværende session, hvilket kræver, at du logger ind igen. Aktive sessioner på andre enheder kan fortsætte med at være aktive i op til én time." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatisk tilmelding" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Timer" @@ -1847,7 +1992,20 @@ "message": "Minutter" }, "vaultTimeoutPolicyInEffect": { - "message": "Din organisations politikker påvirker din boks-timeout. Maksimalt tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter)", + "message": "Organisationspolitikker har sat maks. tilladt boks-timeout. til $HOURS$ time(r) og $MINUTES$ minut(ter).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Organisationspolitikkerne påvirker boks-timeout. Maks. tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter). Boks-timeouthandlingen er sat til $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Organisationspolitikkerne har sat boks-timeouthandlingen til $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Eksporterer personlig boks" }, - "exportingPersonalVaultDescription": { - "message": "Kun de personlige bokselementer tilknyttet $EMAIL$ vil blive eksporteret. Organisationsbokseelementer vil ikke være inkluderet.", + "exportingIndividualVaultDescription": { + "message": "Kun individuelle Boksemner tilknyttet $EMAIL$ eksporteres. Organisationsboksemner medtages ikke. Kun Boksemneinformation uden tilhørende vedhæftninger eksporteres.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Elementer i suspenderede organisationer kan ikke tilgås. Kontakt din organisationsejer for at få hjælp." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logger ind på $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Selv-hostet" + "selfHostedServer": { + "message": "selv-hostet" }, "thirdParty": { "message": "Tredjepart" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Husk e-mail" }, + "loginWithDevice": { + "message": "Log ind med enhed" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log ind med enhed skal være opsat i indstillingerne i Bitwarden mobil-appen. Behov for en anden mulighed?" + }, + "fingerprintPhraseHeader": { + "message": "Fingeraftrykssætning" + }, + "fingerprintMatchInfo": { + "message": "Sørg for, at din boks er oplåst, samt at Fingeraftrykssætningen på den anden enhed matcher." + }, + "resendNotification": { + "message": "Gensend notifikation" + }, + "viewAllLoginOptions": { + "message": "Vis alle indlogningsmuligheder" + }, + "notificationSentDevice": { + "message": "En notifikation er sendt til din enhed." + }, + "loginInitiated": { + "message": "Indlogning påbegyndt" + }, "exposedMasterPassword": { "message": "Kompromitteret hovedadgangskode" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Organisationspolitikkerne har aktiveret autoudfyldning ved sideindlæsning." + }, + "howToAutofill": { + "message": "Sådan autoudfyldes" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Forstået" + }, + "autofillSettings": { + "message": "Autoudfyldelsesindstillinger" + }, + "autofillShortcut": { + "message": "Autoudfyld-tastaturgenvej" + }, + "autofillShortcutNotSet": { + "message": "Autoudfyldningsgenvejen er ikke opsat. Ændr dette i browserens indstillinger." + }, + "autofillShortcutText": { + "message": "Autoudfyldningsgenvejen er: $COMMAND$. Ændr dette i browserens indstillinger.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standard autoudfyldningsgenvej: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logger ind på" + }, + "opensInANewWindow": { + "message": "Åbnes i et nyt vindue" + }, + "deviceApprovalRequired": { + "message": "Enhedsgodkendelse kræves. Vælg en godkendelsesmulighed nedenfor:" + }, + "rememberThisDevice": { + "message": "Husk denne enhed" + }, + "uncheckIfPublicDevice": { + "message": "Slå fra, hvis en offentlig enhed benyttes" + }, + "approveFromYourOtherDevice": { + "message": "Godkend med min anden enhed" + }, + "requestAdminApproval": { + "message": "Anmod om admin-godkendelse" + }, + "approveWithMasterPassword": { + "message": "Godkend med hovedadgangskode" + }, + "ssoIdentifierRequired": { + "message": "Organisations SSO-identifikator kræves." + }, + "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." + }, + "general": { + "message": "Generelt" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Konto oprettet!" + }, + "adminApprovalRequested": { + "message": "Admin-godkendelse udbedt" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Anmodningen er sendt til din admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Du underrettes, når godkendelse foreligger." + }, + "troubleLoggingIn": { + "message": "Problemer med at logge ind?" + }, + "loginApproved": { + "message": "Indlogning godkendt" + }, + "userEmailMissing": { + "message": "Brugers e-mail mangler" + }, + "deviceTrusted": { + "message": "Enhed betroet" + }, + "inputRequired": { + "message": "Input obligatorisk." + }, + "required": { + "message": "obligatorisk" + }, + "search": { + "message": "Søg" + }, + "inputMinLength": { + "message": "Input skal udgøre minimum $COUNT$ tegn.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input må maksimalt udgøre $COUNT$ tegn.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Flg. tegn er ikke tilladt: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Inputværdi skal være mindst $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Inputværdi må ikke overstige $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 eller flere e-mails er ugyldige" + }, + "inputTrimValidator": { + "message": "Input må ikke indeholde kun mellemrum.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input er ikke en e-mailadresse." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ felt(er) ovenfor kræver opmærksomhed.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Vælg --" + }, + "multiSelectPlaceholder": { + "message": "-- Skriv for at filtrere --" + }, + "multiSelectLoading": { + "message": "Henter indstillinger…" + }, + "multiSelectNotFound": { + "message": "Ingen emner fundet" + }, + "multiSelectClearAll": { + "message": "Ryd alt" + }, + "plusNMore": { + "message": "+ $QUANTITY$ flere", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Undermenu" + }, + "toggleCollapse": { + "message": "Fold sammen/ud", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autoudfyldning ved sideindlæsning sat til standardindstillingen.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Oplås konto", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Importdestination" + }, + "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" + }, + "typePasskey": { + "message": "Adgangsnøgle" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Bekræft" + }, + "savePasskey": { + "message": "Gem adgangsnøgle" + }, + "savePasskeyNewLogin": { + "message": "Gem adgangsnøgle som nyt login" + }, + "choosePasskey": { + "message": "Vælg et login at gemme denne adgangsnøgle til" + }, + "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." + }, + "useBrowserName": { + "message": "Benyt webbrowser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktorgodkendelse afbrudt" + }, + "noLastPassDataFound": { + "message": "Ingen LastPass-data fundet" + }, + "incorrectUsernameOrPassword": { + "message": "Forkert brugernavn eller adgangskode" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 0085b24269e2..70ca03db8829 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -7,11 +7,11 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden ist ein sicherer und kostenloser Passwortmanager für all Ihre Geräte.", + "message": "Ein sicherer und kostenloser Passwortmanager für all deine Geräte.", "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Du musst dich anmelden oder einen neuen Account erstellen, um auf den Tresor zugreifen zu können." + "message": "Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen." }, "createAccount": { "message": "Konto erstellen" @@ -20,7 +20,7 @@ "message": "Anmelden" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise Single-Sign-On" }, "cancel": { "message": "Abbrechen" @@ -80,7 +80,7 @@ "message": "URI kopieren" }, "copyUsername": { - "message": "Nutzernamen kopieren" + "message": "Benutzername kopieren" }, "copyNumber": { "message": "Nummer kopieren" @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -113,7 +137,7 @@ "message": "Zugangsdaten hinzufügen" }, "addItem": { - "message": "Neuer Eintrag" + "message": "Eintrag hinzufügen" }, "passwordHint": { "message": "Passwort-Hinweis" @@ -131,7 +155,7 @@ "message": "Einen Bestätigungscode an deine E-Mail senden" }, "sendCode": { - "message": "Send Code" + "message": "Code senden" }, "codeSent": { "message": "Code gesendet" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Hilfe & Feedback" }, + "helpCenter": { + "message": "Bitwarden Hilfezentrum" + }, + "communityForums": { + "message": "Bitwarden Community-Foren erkunden" + }, + "contactSupport": { + "message": "Bitwarden Support kontaktieren" + }, "sync": { "message": "Synchronisierung" }, @@ -258,7 +291,7 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Ziffer hinzufügen" + "message": "Ziffern einschließen" }, "minNumbers": { "message": "Mindestanzahl Ziffern" @@ -282,10 +315,10 @@ "message": "Keine Einträge zum Anzeigen vorhanden." }, "itemInformation": { - "message": "Anmeldedaten Information" + "message": "Eintragsinformationen" }, "username": { - "message": "Nutzername" + "message": "Benutzername" }, "password": { "message": "Passwort" @@ -329,8 +362,14 @@ "other": { "message": "Sonstige" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Richte eine Entsperrmethode ein, um deine Aktion bei Timeout-Timeout zu ändern." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { - "message": "Bewerte die Erweiterung" + "message": "Erweiterung bewerten" }, "rateExtensionDesc": { "message": "Wir würden uns freuen, wenn du uns mit einer positiven Bewertung helfen könntest!" @@ -342,13 +381,13 @@ "message": "Identität verifizieren" }, "yourVaultIsLocked": { - "message": "Ihr Tresor ist gesperrt. Bestätigen Sie Ihre Identität um fortzufahren." + "message": "Dein Tresor ist gesperrt. Verifiziere deine Identität, um fortzufahren." }, "unlock": { "message": "Entsperren" }, "loggedInAsOn": { - "message": "Eingeloggt als $EMAIL$ auf $HOSTNAME$.", + "message": "Angemeldet als $EMAIL$ auf $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -369,6 +408,9 @@ "lockNow": { "message": "Jetzt sperren" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Sofort" }, @@ -400,7 +442,7 @@ "message": "1 Stunde" }, "fourHours": { - "message": "4 Stunde" + "message": "4 Stunden" }, "onLocked": { "message": "Wenn System gesperrt" @@ -430,7 +472,14 @@ "message": "Erneute Eingabe des Master-Passworts ist erforderlich." }, "masterPasswordMinlength": { - "message": "Das Master-Passwort muss mindestens 8 Zeichen lang sein." + "message": "Das Master-Passwort muss mindestens $VALUE$ Zeichen lang sein.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Die Master-Passwort-Wiederholung stimmt nicht überein." @@ -491,10 +540,10 @@ "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 Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, eine SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Seite jetzt öffnen?" + "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?" }, "editedFolder": { - "message": "Ordner bearbeitet" + "message": "Ordner gespeichert" }, "deleteFolderConfirmation": { "message": "Soll dieser Ordner wirklich gelöscht werden?" @@ -503,7 +552,7 @@ "message": "Ordner gelöscht" }, "gettingStartedTutorial": { - "message": "Erste Schritte Anleitung" + "message": "Erste Schritte" }, "gettingStartedTutorialVideo": { "message": "Sieh dir unser Tutorial an, um hilfreiche Tipps zum Umgang mit der Browser-Erweiterung zu erfahren." @@ -534,10 +583,10 @@ "message": "Neue URL" }, "addedItem": { - "message": "Neuer Eintrag" + "message": "Eintrag hinzugefügt" }, "editedItem": { - "message": "Eintrag bearbeitet" + "message": "Eintrag gespeichert" }, "deleteItemConfirmation": { "message": "Soll dieser Eintrag wirklich in den Papierkorb verschoben werden?" @@ -552,7 +601,7 @@ "message": "Sind Sie sicher, dass Sie das aktuelle Passwort ersetzen möchten?" }, "overwriteUsername": { - "message": "Benutzername überschreiben" + "message": "Benutzername ersetzen" }, "overwriteUsernameConfirmation": { "message": "Bist du sicher, dass du den aktuellen Benutzernamen überschreiben möchtest?" @@ -571,22 +620,25 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Danach fragen Zugangsdaten hinzuzufügen" + "message": "Nach dem Hinzufügen von Zugangsdaten fragen" }, "addLoginNotificationDesc": { - "message": "Die \"Login hinzufügen\" Benachrichtigung fragt dich automatisch, ob du neue Zugangsdaten im Tresor speichern möchtest, wenn du dich zum ersten Mal mit ihnen anmeldest." + "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." }, "showCardsCurrentTab": { "message": "Karten auf Tab Seite anzeigen" }, "showCardsCurrentTabDesc": { - "message": "Karten-Einträge auf der Tab Seite anzeigen, um das automatische Ausfüllen zu vereinfachen." + "message": "Karten-Einträge auf der Tab Seite anzeigen, um das Auto-Ausfüllen zu vereinfachen." }, "showIdentitiesCurrentTab": { "message": "Identitäten auf Tab Seite anzeigen" }, "showIdentitiesCurrentTabDesc": { - "message": "Identitäten-Einträge auf der Tab Seite anzeigen, um das automatische Ausfüllen zu vereinfachen." + "message": "Identitäten-Einträge auf der Tab Seite anzeigen, um das Auto-Ausfüllen zu vereinfachen." }, "clearClipboard": { "message": "Zwischenablage leeren", @@ -603,10 +655,19 @@ "message": "Ja, jetzt speichern" }, "enableChangedPasswordNotification": { - "message": "Danach fragen bestehende Zugangsdaten zu aktualisieren" + "message": "Nach dem Aktualisieren bestehender Zugangsdaten fragen" }, "changedPasswordNotificationDesc": { - "message": "Danach fragen das Passwort der Zugangsdaten zu aktualisieren, wenn eine Änderung auf einer Webseite erkannt wird." + "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?" @@ -614,14 +675,23 @@ "notificationChangeSave": { "message": "Aktualisieren" }, + "notificationUnlockDesc": { + "message": "Entsperre deinen Bitwarden Tresor, um die Auto-Ausfüllen-Anfrage abzuschließen." + }, + "notificationUnlock": { + "message": "Entsperren" + }, "enableContextMenuItem": { "message": "Kontextmenüoptionen anzeigen" }, "contextMenuItemDesc": { - "message": "Verwende einen zweiten Klick, um auf die Erstellung von Passwörtern und passende Zugangsdaten für die Webseite zuzugreifen. " + "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-Match-Erkennung", + "message": "Standard URI-Übereinstimmungserkennung", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { @@ -633,6 +703,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" @@ -723,16 +796,16 @@ "message": "Möchtest du diesen Anhang wirklich löschen?" }, "deletedAttachment": { - "message": "Gelöschter Anhang" + "message": "Anhang gelöscht" }, "newAttachment": { - "message": "Anhang hinzufügen" + "message": "Neuen Anhang hinzufügen" }, "noAttachments": { "message": "Keine Anhänge." }, "attachmentSaved": { - "message": "Der Anhang wurde gespeichert." + "message": "Anhang gespeichert" }, "file": { "message": "Datei" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funktion nicht verfügbar" }, - "updateKey": { - "message": "Du kannst diese Funktion nicht nutzen, solange du deinen Verschlüsselungsschlüssel nicht aktualisiert hast." + "encryptionKeyMigrationRequired": { + "message": "Verschlüsselungscode-Migration erforderlich. Bitte melde dich über den Web-Tresor an, um deinen Verschlüsselungscode zu aktualisieren." }, "premiumMembership": { "message": "Premium-Mitgliedschaft" @@ -765,13 +838,13 @@ "message": "Du bist derzeit kein Premium-Mitglied." }, "premiumSignUpAndGet": { - "message": "Werde Premium-Mitglied und erhalte dafür:" + "message": "Melde dich für eine Premium-Mitgliedschaft an und erhalte dafür:" }, "ppremiumSignUpStorage": { "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." }, - "ppremiumSignUpTwoStep": { - "message": "Zusätzliche Zweifaktor-Anmeldung über YubiKey, FIDO U2F, und Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietäre Optionen für die Zwei-Faktor Authentifizierung wie YubiKey und Duo." }, "ppremiumSignUpReports": { "message": "Berichte über Kennworthygiene, Kontostatus und Datenschutzverletzungen, um deinen Tresor sicher zu halten." @@ -789,7 +862,7 @@ "message": "Premium-Mitgliedschaft kaufen" }, "premiumPurchaseAlert": { - "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Webseite jetzt besuchen?" + "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Website jetzt besuchen?" }, "premiumCurrentMember": { "message": "Du bist jetzt Premium-Mitglied!" @@ -813,13 +886,13 @@ "message": "TOTP automatisch kopieren" }, "disableAutoTotpCopyDesc": { - "message": "Ist ein Authentifizierungsschlüssel mit Ihren Zugangsdaten verknüpft, wird der TOTP Verifizierungscode automatisch in die Zwischenablage kopiert, wenn Sie die Zugangsdaten automatisch ausfüllen lassen." + "message": "Ist ein Authentifizierungsschlüssel mit deinen Zugangsdaten verknüpft, wird der TOTP Verifizierungscode in die Zwischenablage kopiert, wenn du die Zugangsdaten automatisch einfügen lässt." }, "enableAutoBiometricsPrompt": { "message": "Beim Start nach biometrischen Daten fragen" }, "premiumRequired": { - "message": "Erweiterte Mitgliedschaft wird benötigt" + "message": "Premium-Mitgliedschaft benötigt" }, "premiumRequiredDesc": { "message": "Eine Premium-Mitgliedschaft ist für diese Funktion notwendig." @@ -873,22 +946,22 @@ "message": "Anmeldung nicht verfügbar" }, "noTwoStepProviders": { - "message": "Dieses Konto hat eine aktive Zwei-Faktor Authentifizierung, allerdings wird keiner der konfigurierten Zwei-Faktor Anbieter von diesem Browser unterstützt." + "message": "Für dieses Konto ist eine Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Browser unterstützt." }, "noTwoStepProviders2": { "message": "Bitte benutze einen unterstützten Browser (z.B. Chrome) und / oder füge zusätzliche Anbieter hinzu, die von mehr Browsern unterstützt werden (wie eine Authentifizierungs-App)." }, "twoStepOptions": { - "message": "Optionen für Zwei-Faktor Authentifizierung" + "message": "Optionen für Zwei-Faktor-Authentifizierung" }, "recoveryCodeDesc": { - "message": "Zugang zu allen Zwei-Faktor-Anbietern verloren? Benutzen Sie Ihren Wiederherstellungscode, um alle Zwei-Faktor-Anbieter in Ihrem Konto zu deaktivieren." + "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren." }, "recoveryCodeTitle": { "message": "Wiederherstellungscode" }, "authenticatorAppTitle": { - "message": "Authentifizierungs-App" + "message": "Authenticator App" }, "authenticatorAppDesc": { "message": "Verwende eine Authentifizierungs-App (wie zum Beispiel Authy oder Google Authenticator), um zeitbasierte Verifizierungscodes zu generieren.", @@ -912,7 +985,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Benutze einen WebAuthn-kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen." + "message": "Benutze einen beliebigen WebAuthn-kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen." }, "emailTitle": { "message": "E-Mail" @@ -921,7 +994,7 @@ "message": "Bestätigungscodes werden Ihnen per E-Mail zugesandt." }, "selfHostedEnvironment": { - "message": "Selbstgehostete Umgebung" + "message": "Selbst gehostete Umgebung" }, "selfHostedEnvironmentFooter": { "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an." @@ -936,31 +1009,56 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API Server-URL" }, "webVaultUrl": { - "message": "Web-Tresor Server URL" + "message": "URL des Web-Tresor-Servers" }, "identityUrl": { "message": "URL des Identitätsservers" }, "notificationsUrl": { - "message": "URL des Benachrichtigungsserver" + "message": "URL des Benachrichtigungsservers" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "URL des Icons-Servers" }, "environmentSaved": { - "message": "Die URLs der Umgebung wurden gespeichert." + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Gilt für alle angemeldeten Konten." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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" }, "enableAutoFillOnPageLoad": { "message": "Auto-Ausfüllen beim Laden einer Seite aktivieren" }, "enableAutoFillOnPageLoadDesc": { - "message": "Wenn eine Zugangsmaske erkannt wird, füge automatisch die Zugangsdaten ein während die Webseite lädt." + "message": "Wenn eine Anmeldemaske erkannt wird, die Zugangsdaten automatisch ausfüllen während die Webseite lädt." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromittierte oder nicht vertrauenswürdige Websites können Auto-Ausfüllen beim Laden der Seite ausnutzen." }, "learnMoreAboutAutofill": { "message": "Erfahre mehr über Auto-Ausfüllen" @@ -969,10 +1067,10 @@ "message": "Standard Auto-Ausfüllen Einstellung für Login-Einträge" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Nachdem du das automatische Ausfüllen beim Laden der Seite aktiviert hast, kannst du die Funktion für einzelne Login-Einträge aktivieren oder deaktivieren. Dies ist die Standardeinstellung für Login-Einträge, die nicht separat konfiguriert wurden." + "message": "Du kannst Auto-Ausfüllen beim Laden der Seite für einzelne Zugangsdaten-Einträge in der Bearbeiten-Ansicht des Eintrags deaktivieren." }, "itemAutoFillOnPageLoad": { - "message": "Automatisches Ausfüllen beim Laden der Seite (wenn in Optionen aktiviert)" + "message": "Auto-Ausfüllen beim Laden der Seite (wenn in Optionen aktiviert)" }, "autoFillOnPageLoadUseDefault": { "message": "Nutze Standardeinstellung" @@ -1040,16 +1138,19 @@ "message": "Dieser Browser kann U2F-Anfragen in diesem Popup-Fenster nicht verarbeiten. Möchtest du dieses Popup in einem neuen Fenster öffnen, damit du dich mit U2F anmelden kannst?" }, "enableFavicon": { - "message": "Zeige Webseiten-Icons" + "message": "Website-Symbole anzeigen" }, "faviconDesc": { "message": "Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { - "message": "Zeige Badge-Zähler" + "message": "Badge-Zähler anzeigen" }, "badgeCounterDesc": { - "message": "Gebe an, wie viele Zugangsdaten du für die aktuelle Webseite besitzt." + "message": "Zeigt an, wie viele Zugangsdaten du für die aktuelle Webseite besitzt." }, "cardholderName": { "message": "Name des Karteninhabers" @@ -1154,7 +1255,7 @@ "message": "Reisepassnummer" }, "licenseNumber": { - "message": "Führerscheinnummer" + "message": "Lizenznummer" }, "email": { "message": "E-Mail" @@ -1205,7 +1306,7 @@ "message": "Identität" }, "passwordHistory": { - "message": "Kennwort-Historie" + "message": "Passwortverlauf" }, "back": { "message": "Zurück" @@ -1232,7 +1333,7 @@ "message": "Zugangsdaten" }, "secureNotes": { - "message": "Sichere Notiz" + "message": "Sichere Notizen" }, "clear": { "message": "Löschen", @@ -1276,7 +1377,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match-Erkennung", + "message": "Übereinstimmungserkennung", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1284,10 +1385,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Umschaltoptionen" + "message": "Optionen umschalten" }, "toggleCurrentUris": { - "message": "Aktuelle URIs ändern", + "message": "Aktuelle URIs umschalten", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1381,7 +1482,7 @@ "message": "Warte auf Bestätigung vom Desktop" }, "awaitDesktopDesc": { - "message": "Bitte bestätige die Verwendung von Biometrie in der Bitwarden Desktop-Anwendung, um Biometrie für den Browser zu aktivieren." + "message": "Bitte bestätige die Verwendung von Biometrie in der Bitwarden Desktop-Anwendung, um Biometrie für den Browser einzurichten." }, "lockWithMasterPassOnRestart": { "message": "Bei Neustart des Browsers mit Master-Passwort sperren" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Eintrag wiederherstellen" }, - "restoreItemConfirmation": { - "message": "Soll dieser Eintrag wirklich wiederhergestellt werden?" - }, "restoredItem": { "message": "Eintrag wiederhergestellt" }, @@ -1437,17 +1535,44 @@ "message": "Bestätigung der Timeout-Aktion" }, "autoFillAndSave": { - "message": "Automatisch ausfüllen und speichern" + "message": "Auto-Ausfüllen und speichern" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-Ausgefüllter Eintrag und gespeicherte URI" + "message": "Eintrag automatisch ausgefüllt und URI gespeichert" }, "autoFillSuccess": { - "message": "Automatisch ausgefüllter Eintrag" + "message": "Eintrag automatisch ausgefüllt " + }, + "insecurePageWarning": { + "message": "Warnung: Dies ist eine ungesicherte HTTP-Seite und alle Informationen, die du absendest, können möglicherweise von anderen gesehen und geändert werden. Diese Zugangsdaten wurden ursprünglich auf einer sicheren (HTTPS-)Seite gespeichert." + }, + "insecurePageWarningFillPrompt": { + "message": "Möchtest du diese Zugangsdaten trotzdem ausfüllen?" + }, + "autofillIframeWarning": { + "message": "Das Formular wird von einer anderen Domain als der URI deines gespeicherten Logins gehostet. Wähle OK, um trotzdem automatisch auszufüllen, oder Abbrechen, um aufzuhören." + }, + "autofillIframeWarningTip": { + "message": "Um diese Warnung in Zukunft zu verhindern, speichere diese URI, $HOSTNAME$, in deinem Bitwarden Zugangsdaten-Eintrag für diese Seite.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { "message": "Master-Passwort festlegen" }, + "currentMasterPass": { + "message": "Aktuelles Master-Passwort" + }, + "newMasterPass": { + "message": "Neues Master-Passwort" + }, + "confirmNewMasterPass": { + "message": "Neues Master-Passwort bestätigen" + }, "masterPasswordPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien erfordern, dass dein Masterpasswort die folgenden Anforderungen erfüllt:" }, @@ -1512,22 +1637,22 @@ "message": "Desktop-Sync-Überprüfung" }, "desktopIntegrationVerificationText": { - "message": "Bitte bestätigen Sie, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: " + "message": "Bitte überprüfe, dass die Desktop-Anwendung diesen Fingerabdruck anzeigt: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser-Einbindung ist nicht aktiviert" + "message": "Browser-Integration ist nicht aktiviert" }, "desktopIntegrationDisabledDesc": { - "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktivieren Sie diese in den Einstellungen innerhalb der Desktop-Anwendung." + "message": "Die Browser-Integration ist in der Bitwarden Desktop-Anwendung nicht eingerichtet. Bitte richte diese in den Einstellungen der Desktop-Anwendung ein." }, "startDesktopTitle": { "message": "Bitwarden Desktop-Anwendung starten" }, "startDesktopDesc": { - "message": "Die Bitwarden Desktop-Anwendung muss gestartet werden, bevor diese Funktion verwendet werden kann." + "message": "Die Bitwarden Desktop-Anwendung muss gestartet werden, bevor Entsperren mit Biometrie verwendet werden kann." }, "errorEnableBiometricTitle": { - "message": "Biometrie kann nicht aktiviert werden" + "message": "Biometrie konnte nicht eingerichtet werden" }, "errorEnableBiometricDesc": { "message": "Die Aktion wurde von der Desktop-Anwendung abgebrochen" @@ -1539,16 +1664,16 @@ "message": "Desktop-Kommunikation unterbrochen" }, "nativeMessagingWrongUserDesc": { - "message": "Die Desktop-Anwendung ist in ein anderes Konto eingeloggt. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." + "message": "Die Desktop-Anwendung ist in einem anderen Konto angemeldet. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." }, "nativeMessagingWrongUserTitle": { "message": "Konten stimmen nicht überein" }, "biometricsNotEnabledTitle": { - "message": "Biometrie ist nicht aktiviert" + "message": "Biometrie ist nicht eingerichtet" }, "biometricsNotEnabledDesc": { - "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert ist." + "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung eingerichtet wird." }, "biometricsNotSupportedTitle": { "message": "Biometrie wird nicht unterstützt" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrie im Browser wird auf diesem Gerät nicht unterstützt." }, + "biometricsFailedTitle": { + "message": "Biometrie fehlgeschlagen" + }, + "biometricsFailedDesc": { + "message": "Die biometrische Verifizierung kann nicht abgeschlossen werden. Versuch es mit dem Master-Passwort oder melde dich ab. Sollte das Problem weiterhin bestehen, kontaktiere bitte den Bitwarden-Support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Berechtigung nicht erteilt" }, @@ -1574,14 +1705,20 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ ist keine gültige Domäne", + "message": "$DOMAIN$ ist keine gültige Domain", "placeholders": { "domain": { "content": "$1", @@ -1737,14 +1874,14 @@ "message": "Aktuelle Zugriffsanzahl" }, "createSend": { - "message": "Neues Send erstellen", + "message": "Neues Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Neues Passwort" }, "sendDisabled": { - "message": "Send deaktiviert", + "message": "Send gelöscht", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1756,7 +1893,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Bearbeitetes Send", + "message": "Send gespeichert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1826,7 +1963,10 @@ "message": "Master-Passwort aktualisieren" }, "updateMasterPasswordWarning": { - "message": "Dein Master-Passwort wurde kürzlich von einem Administrator Ihrer Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet, eine erneute Anmeldung wird erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." + "message": "Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatische Registrierung" @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Stunden" @@ -1847,7 +1992,20 @@ "message": "Minuten" }, "vaultTimeoutPolicyInEffect": { - "message": "Deine Unternehmensrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout ist $HOURS$ Stunde(n) und $MINUTES$ Minute(n)", + "message": "Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.", + "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": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Durch deine Organisationsrichtlinien wurde deine Tresor-Timeout-Aktion auf $ACTION$ gesetzt.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1863,7 +2034,7 @@ "message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen." }, "vaultExportDisabled": { - "message": "Tresor-Export deaktiviert" + "message": "Tresor-Export nicht verfügbar" }, "personalVaultExportPolicyInEffect": { "message": "Eine oder mehrere Unternehmensrichtlinien hindern dich daran, deinen persönlichen Tresor zu exportieren." @@ -1890,7 +2061,7 @@ "message": "Master-Passwort entfernen" }, "removedMasterPassword": { - "message": "Master-Passwort entfernt." + "message": "Master-Passwort entfernt" }, "leaveOrganizationConfirmation": { "message": "Bist du sicher, dass du diese Organisation verlassen möchtest?" @@ -1902,13 +2073,13 @@ "message": "Zeichenzählung ein-/ausschalten" }, "sessionTimeout": { - "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut einzuloggen." + "message": "Deine Sitzung ist abgelaufen. Bitte gehe zurück und versuche dich erneut anzumelden." }, "exportingPersonalVaultTitle": { - "message": "Persönlichen Tresor exportieren" + "message": "Persönlicher Tresor wird exportiert" }, - "exportingPersonalVaultDescription": { - "message": "Nur die persönlichen Tresoreinträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", + "exportingIndividualVaultDescription": { + "message": "Es werden nur persönliche Tresoreinträge exportiert, die mit $EMAIL$ verbunden sind. Tresoreinträge der Organisation werden nicht berücksichtigt. Es werden nur Informationen der Tresoreinträge exportiert. Diese enthalten nicht die zugehörigen Anhänge.", "placeholders": { "email": { "content": "$1", @@ -1923,13 +2094,13 @@ "message": "Benutzername neu generieren" }, "generateUsername": { - "message": "Benutzernamen generieren" + "message": "Benutzername generieren" }, "usernameType": { - "message": "Benutzernamentyp" + "message": "Benutzernamenstyp" }, "plusAddressedEmail": { - "message": "Mit Plus adressierte E-Mail", + "message": "Plus-adressierte E-Mail-Adresse", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -1948,7 +2119,7 @@ "message": "Zufälliges Wort" }, "websiteName": { - "message": "Webseiten-Name" + "message": "Websitename" }, "whatWouldYouLikeToGenerate": { "message": "Was möchtest du generieren?" @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Anmelden bei $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server-Version" }, - "selfHosted": { - "message": "Selbst-gehostet" + "selfHostedServer": { + "message": "selbst gehostet" }, "thirdParty": { "message": "Drittanbieter" @@ -2027,7 +2195,7 @@ } }, "lastSeenOn": { - "message": "zuletzt am $DATE$ gesehen", + "message": "zuletzt gesehen am: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2039,7 +2207,7 @@ "message": "Mit Master-Passwort anmelden" }, "loggingInAs": { - "message": "Einloggen als" + "message": "Anmelden als" }, "notYou": { "message": "Nicht du?" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "E-Mail-Adresse merken" }, + "loginWithDevice": { + "message": "Mit Gerät anmelden" + }, + "loginWithDeviceEnabledInfo": { + "message": "Die Anmeldung über ein Gerät muss in den Einstellungen der Bitwarden App eingerichtet werden. Benötigst du eine andere Option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerabdruck-Phrase" + }, + "fingerprintMatchInfo": { + "message": "Bitte stelle sicher, dass dein Tresor entsperrt ist und die Fingerabdruck-Phrase mit dem anderen Gerät übereinstimmt." + }, + "resendNotification": { + "message": "Benachrichtigung erneut senden" + }, + "viewAllLoginOptions": { + "message": "Alle Anmeldeoptionen anzeigen" + }, + "notificationSentDevice": { + "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." + }, + "loginInitiated": { + "message": "Anmeldung eingeleitet" + }, "exposedMasterPassword": { "message": "Kompromittiertes Master-Passwort" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Deine Organisationsrichtlinien haben Auto-Ausfüllen beim Laden von Seiten aktiviert." + }, + "howToAutofill": { + "message": "So funktioniert Auto-Ausfüllen" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Verstanden" + }, + "autofillSettings": { + "message": "Auto-Ausfüllen Einstellungen" + }, + "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." + }, + "autofillShortcutText": { + "message": "Das Auto-Ausfüllen Tastaturkürzel ist: $COMMAND$. Du kannst es in den Browser-Einstellungen ändern.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standard-Auto-Ausfüllen Tastaturkürzel: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Anmelden bei" + }, + "opensInANewWindow": { + "message": "Wird in einem neuen Fenster geöffnet" + }, + "deviceApprovalRequired": { + "message": "Geräte-Genehmigung erforderlich. Wähle unten eine Genehmigungsoption aus:" + }, + "rememberThisDevice": { + "message": "Dieses Gerät merken" + }, + "uncheckIfPublicDevice": { + "message": "Deaktivieren, wenn ein öffentliches Gerät verwendet wird" + }, + "approveFromYourOtherDevice": { + "message": "Von deinem anderen Gerät genehmigen" + }, + "requestAdminApproval": { + "message": "Admin-Genehmigung anfragen" + }, + "approveWithMasterPassword": { + "message": "Mit Master-Passwort genehmigen" + }, + "ssoIdentifierRequired": { + "message": "SSO-Kennung der Organisation erforderlich." + }, + "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." + }, + "general": { + "message": "Allgemein" + }, + "display": { + "message": "Anzeige" + }, + "accountSuccessfullyCreated": { + "message": "Konto erfolgreich erstellt!" + }, + "adminApprovalRequested": { + "message": "Admin-Genehmigung angefragt" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Deine Anfrage wurde an deinen Administrator gesendet." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Nach einer Genehmigung wirst du benachrichtigt." + }, + "troubleLoggingIn": { + "message": "Probleme beim Anmelden?" + }, + "loginApproved": { + "message": "Anmeldung genehmigt" + }, + "userEmailMissing": { + "message": "E-Mail-Adresse des Benutzers fehlt" + }, + "deviceTrusted": { + "message": "Gerät wird vertraut" + }, + "inputRequired": { + "message": "Eingabe ist erforderlich." + }, + "required": { + "message": "Erforderlich" + }, + "search": { + "message": "Suche" + }, + "inputMinLength": { + "message": "Die Eingabe muss mindestens $COUNT$ Zeichen lang sein.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Die Eingabe darf $COUNT$ Zeichen nicht überschreiten.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Die folgenden Zeichen sind nicht erlaubt: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Der Eingabewert muss mindestens $MIN$ betragen.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Der Eingabewert darf $MAX$ nicht überschreiten.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Mindestens 1 E-Mail-Adresse ist ungültig" + }, + "inputTrimValidator": { + "message": "Die Eingabe darf nicht nur Leerzeichen enthalten.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Die Eingabe ist keine E-Mail-Adresse." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ Feld(er) oben benötigen deine Aufmerksamkeit.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Auswählen --" + }, + "multiSelectPlaceholder": { + "message": "-- Schreiben zum Filtern --" + }, + "multiSelectLoading": { + "message": "Optionen werden abgerufen..." + }, + "multiSelectNotFound": { + "message": "Keine Einträge gefunden" + }, + "multiSelectClearAll": { + "message": "Alles löschen" + }, + "plusNMore": { + "message": "+ $QUANTITY$ mehr", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Untermenü" + }, + "toggleCollapse": { + "message": "Ein-/ausklappen", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-Ausfüllen beim Lader einer Seite wurde auf die Standardeinstellung gesetzt.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Konto entsperren", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import-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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Bestätigen" + }, + "savePasskey": { + "message": "Passkey speichern" + }, + "savePasskeyNewLogin": { + "message": "Passkey als neue Zugangsdaten speichern" + }, + "choosePasskey": { + "message": "Wähle Zugangsdaten aus, in die dieser Passkey gespeichert werden sollen" + }, + "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." + }, + "useBrowserName": { + "message": "Browser verwenden" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktor-Authentifizierung abgebrochen" + }, + "noLastPassDataFound": { + "message": "Keine LastPass-Daten gefunden" + }, + "incorrectUsernameOrPassword": { + "message": "Falscher Benutzername oder Passwort" + }, + "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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 31a07e5c4e7b..e6a920d3e907 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -14,7 +14,7 @@ "message": "Συνδεθείτε ή δημιουργήστε ένα νέο λογαριασμό για να αποκτήσετε πρόσβαση στο ασφαλές vault σας." }, "createAccount": { - "message": "Δημιουργία Λογαριασμού" + "message": "Δημιουργία λογαριασμού" }, "login": { "message": "Σύνδεση" @@ -44,7 +44,7 @@ "message": "Η υπόδειξη του κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας, σε περίπτωση που τον ξεχάσετε." }, "reTypeMasterPass": { - "message": "Εισάγετε Ξανά τον Κύριο Κωδικό σας" + "message": "Πληκτρολογήστε ξανά τον Κύριο Κωδικό" }, "masterPassHint": { "message": "Υπόδειξη Κύριου Κωδικού (προαιρετικό)" @@ -68,7 +68,7 @@ "message": "Ρυθμίσεις" }, "currentTab": { - "message": "Τρέχουσα Καρτέλα" + "message": "Τρέχουσα καρτέλα" }, "copyPassword": { "message": "Αντιγραφή Κωδικού" @@ -91,6 +91,15 @@ "autoFill": { "message": "Αυτόματη συμπλήρωση" }, + "autoFillLogin": { + "message": "Αυτόματη συμπλήρωση σύνδεσης" + }, + "autoFillCard": { + "message": "Αυτόματη συμπλήρωση κάρτας" + }, + "autoFillIdentity": { + "message": "Αυτόματη συμπλήρωση ταυτότητας" + }, "generatePasswordCopied": { "message": "Δημιουργία Κωδικού (αντιγράφηκε)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Δεν υπάρχουν αντιστοιχίσεις σύνδεσης." }, + "noCards": { + "message": "Δεν υπάρχουν κάρτες" + }, + "noIdentities": { + "message": "Δεν υπάρχουν ταυτότητες" + }, + "addLoginMenu": { + "message": "Προσθήκη Στοιχείων Σύνδεσης" + }, + "addCardMenu": { + "message": "Προσθήκη κάρτας" + }, + "addIdentityMenu": { + "message": "Προσθήκη ταυτότητας" + }, "unlockVaultMenu": { "message": "Ξεκλειδώστε το vault σας" }, @@ -134,7 +158,7 @@ "message": "Αποστολή Κωδικού" }, "codeSent": { - "message": "Ο Κωδικός Στάλθηκε" + "message": "Ο κωδικός στάλθηκε" }, "verificationCode": { "message": "Κωδικός Επαλήθευσης" @@ -175,7 +199,7 @@ "message": "Μετακίνηση" }, "addFolder": { - "message": "Προσθήκη Φακέλου" + "message": "Προσθήκη φακέλου" }, "name": { "message": "Όνομα" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Βοήθεια & Σχόλια" }, + "helpCenter": { + "message": "Κέντρο βοήθειας Bitwarden" + }, + "communityForums": { + "message": "Εξερευνήστε τα φόρουμ της κοινότητας του Bitwarden" + }, + "contactSupport": { + "message": "Επικοινωνία με την υποστήριξη Bitwarden" + }, "sync": { "message": "Συγχρονισμός" }, @@ -329,6 +362,12 @@ "other": { "message": "Άλλες" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Ρυθμίστε μια μέθοδο ξεκλειδώματος για να αλλάξετε την ενέργεια χρονικού ορίου θησαυ/κιου." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Βαθμολογήστε την επέκταση" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Κλείδωμα Τώρα" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Άμεσα" }, @@ -430,7 +472,14 @@ "message": "Απαιτείται ξανά ο κύριος κωδικός πρόσβασης." }, "masterPasswordMinlength": { - "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον 8 χαρακτήρες." + "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον $VALUE$ χαρακτήρες.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Η επιβεβαίωση κύριου κωδικού δεν ταιριάζει." @@ -534,7 +583,7 @@ "message": "Νέο URI" }, "addedItem": { - "message": "Προστέθηκε στοιχείο" + "message": "Το στοιχείο προστέθηκε" }, "editedItem": { "message": "Επεξεργασμένο στοιχείο" @@ -546,13 +595,13 @@ "message": "Διαγραμμένο στοιχείο" }, "overwritePassword": { - "message": "Αντικατάσταση Κωδικού Πρόσβασης" + "message": "Αντικατάσταση κωδικού πρόσβασης" }, "overwritePasswordConfirmation": { "message": "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε τον τρέχον κωδικό πρόσβασης;" }, "overwriteUsername": { - "message": "Αντικατάσταση Username" + "message": "Αντικατάσταση ονόματος χρήστη" }, "overwriteUsernameConfirmation": { "message": "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε το τρέχον username;" @@ -567,7 +616,7 @@ "message": "Τύπος αναζήτησης" }, "noneFolder": { - "message": "Χωρίς Φάκελο", + "message": "Χωρίς φάκελο", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Η \"Προσθήκη Ειδοποίησης Σύνδεσης\" σας προτρέπει αυτόματα να αποθηκεύσετε νέες συνδέσεις στο vault σας κάθε φορά που θα συνδεθείτε για πρώτη φορά." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Εμφάνιση καρτών στη σελίδα Καρτέλας" }, @@ -608,18 +660,36 @@ "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 ;" }, "notificationChangeSave": { "message": "Ναι, Ενημέρωση Τώρα" }, + "notificationUnlockDesc": { + "message": "Ξεκλειδώστε το θησαυ/κιο Bitwarden σας για να ολοκληρώσετε το αίτημα αυτόματης πλήρωσης." + }, + "notificationUnlock": { + "message": "Ξεκλείδωμα" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Αλλαγή χρώματος θέματος εφαρμογής." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Σκοτεινό", "description": "Dark color" @@ -649,14 +722,14 @@ "message": "Εξαγωγή Vault" }, "fileFormat": { - "message": "Μορφή Αρχείου" + "message": "Μορφή αρχείου" }, "warning": { "message": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Επιβεβαίωση εξαγωγής Vault" + "message": "Επιβεβαίωση εξαγωγής vault" }, "exportWarningDesc": { "message": "Αυτή η εξαγωγή περιέχει τα δεδομένα σε μη κρυπτογραφημένη μορφή. Δεν πρέπει να αποθηκεύετε ή να στείλετε το εξαγόμενο αρχείο μέσω μη ασφαλών τρόπων (όπως μέσω email). Διαγράψτε το αμέσως μόλις τελειώσετε με τη χρήση του." @@ -680,7 +753,7 @@ "message": "Το Bitwarden επιτρέπει να μοιράζεστε τα στοιχεία του vault σας με άλλους χρησιμοποιώντας ένα λογαριασμό οργανισμού. Θέλετε να επισκεφθείτε την ιστοσελίδα bitwarden.com για να μάθετε περισσότερα;" }, "moveToOrganization": { - "message": "Μετακίνηση στον Οργανισμό" + "message": "Μετακίνηση σε οργανισμό" }, "share": { "message": "Κοινοποίηση" @@ -708,10 +781,10 @@ "message": "Κλειδί επαλήθευσης (TOTP)" }, "verificationCodeTotp": { - "message": "Κωδικός Επαλήθευσης (TOTP)" + "message": "Κωδικός επαλήθευσης (TOTP)" }, "copyVerificationCode": { - "message": "Αντιγραφή Κωδικού Επαλήθευσης" + "message": "Αντιγραφή κωδικού επαλήθευσης" }, "attachments": { "message": "Συνημμένα" @@ -726,52 +799,52 @@ "message": "Το συνημμένο διαγράφηκε" }, "newAttachment": { - "message": "Προσθήκη Νέου Συνημμένου" + "message": "Προσθήκη νέου συνημμένου" }, "noAttachments": { "message": "Χωρίς συνημμένα." }, "attachmentSaved": { - "message": "Το συννημένο έχει αποθηκευτεί." + "message": "Το συνημμένο αποθηκεύτηκε" }, "file": { "message": "Αρχείο" }, "selectFile": { - "message": "Επιλέξτε ένα αρχείο." + "message": "Επιλέξτε αρχείο" }, "maxFileSize": { "message": "Το μέγιστο μέγεθος αρχείου είναι 500 MB." }, "featureUnavailable": { - "message": "Μη Διαθέσιμο Χαρακτηριστικό" + "message": "Μη διαθέσιμο χαρακτηριστικό" }, - "updateKey": { - "message": "Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία μέχρι να ενημερώσετε το κλειδί κρυπτογράφησης." + "encryptionKeyMigrationRequired": { + "message": "Απαιτείται μεταφορά κλειδιού κρυπτογράφησης. Παρακαλούμε συνδεθείτε μέσω του διαδικτυακού θησαυ/κιου για να ενημερώσετε το κλειδί κρυπτογράφησης." }, "premiumMembership": { "message": "Συνδρομή Premium" }, "premiumManage": { - "message": "Διαχείριση Συνδρομής" + "message": "Διαχείριση συνδρομής" }, "premiumManageAlert": { "message": "Μπορείτε να διαχειριστείτε την ιδιότητά σας ως μέλος στο bitwarden.com web vault. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" }, "premiumRefresh": { - "message": "Ανανέωση Συνδρομής" + "message": "Ανανέωση συνδρομής" }, "premiumNotCurrentMember": { - "message": "Δεν είστε premium μέλος." + "message": "Δεν είστε μέλος Premium." }, "premiumSignUpAndGet": { - "message": "Εγγραφείτε για μια premium συνδρομή και λάβετε:" + "message": "Εγγραφείτε για συνδρομή Premium και λάβετε:" }, "ppremiumSignUpStorage": { "message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία." }, - "ppremiumSignUpTwoStep": { - "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey, το FIDO U2F και το Duo." + "premiumSignUpTwoStepOptions": { + "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo." }, "ppremiumSignUpReports": { "message": "Ασφάλεια κωδικών, υγεία λογαριασμού και αναφορές παραβίασης δεδομένων για να διατηρήσετε ασφαλές το vault σας." @@ -783,16 +856,16 @@ "message": "Προτεραιότητα υποστήριξης πελατών." }, "ppremiumSignUpFuture": { - "message": "Όλα τα μελλοντικά χαρακτηριστικά premium. Έρχονται περισσότερα σύντομα!" + "message": "Όλα τα μελλοντικά χαρακτηριστικά Premium. Έρχονται περισσότερα σύντομα!" }, "premiumPurchase": { "message": "Αγορά Premium έκδοσης" }, "premiumPurchaseAlert": { - "message": "Μπορείτε να αγοράσετε συνδρομή premium στο bitwarden.com web vault. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" + "message": "Μπορείτε να αγοράσετε συνδρομή Premium στο web vault του bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" }, "premiumCurrentMember": { - "message": "Είστε ένα premium μέλος!" + "message": "Είστε μέλος Premium!" }, "premiumCurrentMemberThanks": { "message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden." @@ -819,10 +892,10 @@ "message": "Ζητήστε βιομετρικά κατά την εκκίνηση" }, "premiumRequired": { - "message": "Απαιτείται Έκδοση Premium" + "message": "Απαιτείται έκδοση Premium" }, "premiumRequiredDesc": { - "message": "Για να χρησιμοποιήσετε αυτή τη λειτουργία, απαιτείται η έκδοση premium." + "message": "Για να χρησιμοποιήσετε αυτή τη λειτουργία, απαιτείται έκδοση Premium." }, "enterVerificationCodeApp": { "message": "Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή επαλήθευσης." @@ -870,25 +943,25 @@ "message": "Ταυτοποίηση WebAuthn" }, "loginUnavailable": { - "message": "Σύνδεση μη Διαθέσιμη" + "message": "Μη διαθέσιμη σύνδεση" }, "noTwoStepProviders": { - "message": "Αυτός ο λογαριασμός έχει ενεργοποιημένη τη σύνδεση σε δύο βήματα, ωστόσο, κανένας από τους διαμορφωμένους παροχείς δύο βημάτων δεν υποστηρίζεται από αυτό το πρόγραμμα περιήγησης." + "message": "Αυτός ο λογαριασμός έχει ενεργοποιημένη τη σύνδεση σε δύο βήματα, ωστόσο, κανένας από τους καθορισμένους παρόχους δύο βημάτων δεν υποστηρίζεται από αυτό το πρόγραμμα περιήγησης." }, "noTwoStepProviders2": { "message": "Παρακαλούμε χρησιμοποιήστε ένα υποστηριζόμενο πρόγραμμα περιήγησης (όπως το Chrome) και/ή προσθέστε επιπλέον ή/και προσθέστε άλλους παρόχους που υποστηρίζονται καλύτερα σε προγράμματα περιήγησης (όπως μια εφαρμογή επαλήθευσης)." }, "twoStepOptions": { - "message": "Επιλογές σύνδεσης δύο παραγόντων" + "message": "Επιλογές σύνδεσης δύο βημάτων" }, "recoveryCodeDesc": { "message": "Έχετε χάσει την πρόσβαση σε όλους τους παρόχους δύο παραγόντων; Χρησιμοποιήστε τον κωδικό ανάκτησης για να απενεργοποιήσετε όλους τους παρόχους δύο παραγόντων από το λογαριασμό σας." }, "recoveryCodeTitle": { - "message": "Κωδικός Ανάκτησης" + "message": "Κωδικός ανάκτησης" }, "authenticatorAppTitle": { - "message": "Εφαρμογή Επαλήθευσης Ταυτότητας" + "message": "Εφαρμογή ελέγχου ταυτότητας" }, "authenticatorAppDesc": { "message": "Χρησιμοποιήστε μια εφαρμογή επαλήθευσης (όπως το Authy ή Google Authenticator) για να δημιουργήσει κωδικούς επαλήθευσης με χρόνικο περιορισμό.", @@ -912,7 +985,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Χρησιμοποιήστε οποιοδήποτε κλειδί ασφαλείας WebAuthn για να αποκτήσετε πρόσβαση στο λογαριασμό σας." + "message": "Χρησιμοποιήστε οποιοδήποτε κλειδί ασφαλείας συμβατό με το WebAuthn για να αποκτήσετε πρόσβαση στο λογαριασμό σας." }, "emailTitle": { "message": "Email" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Οι διευθύνσεις URL περιβάλλοντος έχουν αποθηκευτεί." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Ενεργοποίηση αυτόματης συμπλήρωσης κατά την φόρτωση της σελίδας" }, @@ -960,10 +1058,10 @@ "message": "Εάν εντοπιστεί μια φόρμα σύνδεσης, πραγματοποιείται αυτόματα μια αυτόματη συμπλήρωση όταν φορτώνεται η ιστοσελίδα." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Παραβιασμένοι ή μη αξιόπιστοι ιστότοποι μπορούν να εκμεταλλευτούν την αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Μάθετε περισσότερα σχετικά με την αυτόματη συμπλήρωση" }, "defaultAutoFillOnPageLoad": { "message": "Προεπιλεγμένη ρύθμιση αυτόματης συμπλήρωσης για στοιχεία σύνδεσης" @@ -972,7 +1070,7 @@ "message": "Μπορείτε να απενεργοποιήσετε την αυτόματη συμπλήρωση φόρτωσης σελίδας για μεμονωμένα στοιχεία σύνδεσης από την προβολή Επεξεργασία στοιχείου." }, "itemAutoFillOnPageLoad": { - "message": "Αυτόματη συμπλήρωση της Φόρτισης Σελίδας (αν είναι ενεργοποιημένη στις Επιλογές)" + "message": "Αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας (αν έχει ενεργοποιηθεί στις Ρυθμίσεις)" }, "autoFillOnPageLoadUseDefault": { "message": "Χρήση προεπιλεγμένης ρύθμισης" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Εμφάνιση μιας αναγνωρίσιμης εικόνας δίπλα σε κάθε σύνδεση." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Εμφάνιση μετρητή εμβλημάτων" }, @@ -1127,7 +1228,7 @@ "message": "Dr" }, "mx": { - "message": "Mx" + "message": "Κ@" }, "firstName": { "message": "Όνομα" @@ -1413,7 +1514,7 @@ "message": "Αναζήτηση Κάδου" }, "permanentlyDeleteItem": { - "message": "Μόνιμη Διαγραφή Αντικειμένου" + "message": "Οριστική διαγραφή αντικειμένου" }, "permanentlyDeleteItemConfirmation": { "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα αυτό το στοιχείο;" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Ανάκτηση Στοιχείου" }, - "restoreItemConfirmation": { - "message": "Είστε βέβαιοι ότι θέλετε να ανακτήσετε αυτό το στοιχείο;" - }, "restoredItem": { "message": "Στοιχείο που έχει Ανακτηθεί" }, @@ -1445,8 +1543,35 @@ "autoFillSuccess": { "message": "Αυτόματη συμπλήρωση αντικειμένου" }, + "insecurePageWarning": { + "message": "Προειδοποίηση: Αυτή είναι μια μη ασφαλή σελίδα HTTP και οποιαδήποτε πληροφορία υποβάλλετε μπορεί να γίνει ορατή και επεμβάσιμη από άλλους. Αυτή η σύνδεση αποθηκεύτηκε αρχικά σε μια ασφαλή (HTTPS) σελίδα." + }, + "insecurePageWarningFillPrompt": { + "message": "Θέλετε ακόμα να συμπληρώσετε αυτή τη σύνδεση;" + }, + "autofillIframeWarning": { + "message": "Η φόρμα φιλοξενείται από διαφορετικό τομέα (domain) από το λινκ (uri) της αποθηκευμένης σύνδεσης σας (login). Επιλέξτε OK για αυτόματη συμπλήρωση, ή Ακύρωση για να σταματήσετε." + }, + "autofillIframeWarningTip": { + "message": "Για να αποτρέψετε αυτή την προειδοποίηση στο μέλλον, αποθηκεύστε αυτό το URI, $HOSTNAME$, στο στοιχείο σύνδεσης Bitwarden σας για αυτόν τον ιστότοπο.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { - "message": "Ορισμός Κύριου Κωδικού" + "message": "Καθορισμός κύριου κωδικού" + }, + "currentMasterPass": { + "message": "Τρέχων Κύριος Κωδικός" + }, + "newMasterPass": { + "message": "Νέος κύριος κωδικός" + }, + "confirmNewMasterPass": { + "message": "Επιβεβαίωση Νέου Κύριου Κωδικού" }, "masterPasswordPolicyInEffect": { "message": "Σε μία ή περισσότερες πολιτικές του οργανισμού απαιτείται ο κύριος κωδικός να πληρεί τις ακόλουθες απαιτήσεις:" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Τα βιομετρικά στοιχεία του προγράμματος περιήγησης δεν υποστηρίζονται σε αυτήν τη συσκευή." }, + "biometricsFailedTitle": { + "message": "Ο βιομετρικός έλεγχος απέτυχε" + }, + "biometricsFailedDesc": { + "message": "Τα βιομετρικά δεν μπόρεσαν να ολοκληρωθούν, σκεφτείτε να χρησιμοποιήσετε έναν κύριο κωδικό πρόσβασης ή να αποσυνδεθείτε. Αν αυτό εξακολουθεί να συμβαίνει, παρακαλώ επικοινωνήστε με την υποστήριξη της Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Δεν Έχει Χορηγηθεί Άδεια" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Μια πολιτική του οργανισμού, επηρεάζει τις επιλογές ιδιοκτησίας σας." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Μια οργανωτική πολιτική έχει αποτρέψει την εισαγωγή στοιχείων στο προσωπικό θησαυ/κιο σας." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "Το $DOMAIN$ δεν είναι έγκυρος τομέας", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Ο Κύριος Κωδικός Πρόσβασής σας άλλαξε πρόσφατα από διαχειριστή στον οργανισμό σας. Για να αποκτήσετε πρόσβαση στο vault, πρέπει να τον ενημερώσετε τώρα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές για μία ώρα." }, + "updateWeakMasterPasswordWarning": { + "message": "Ο Κύριος κωδικός πρόσβασης δεν πληροί τις απαιτήσεις πολιτικής αυτού του οργανισμού. Για να έχετε πρόσβαση στο vault, πρέπει να ενημερώσετε τον Κύριο σας κωδικό άμεσα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές για μία ώρα." + }, "resetPasswordPolicyAutoEnroll": { "message": "Αυτόματη Εγγραφή" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Επιλέξτε φάκελο..." }, - "ssoCompleteRegistration": { - "message": "Για να ολοκληρώσετε τη σύνδεση με SSO, ορίστε έναν κύριο κωδικό πρόσβασης για πρόσβαση και προστασία του vault σας." + "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" }, "hours": { "message": "Ώρες" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο λήξης του vault σας. Το μέγιστο επιτρεπόμενο χρονικό όριο λήξης vault είναι $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(ά). H ενέργεια χρονικού ορίου λήξης είναι ορισμένη ως $ACTION$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Οι πολιτικές του οργανισμού σας έχουν ορίσει την ενέργεια χρονικού ορίου λήξης vault ως $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Εξαγωγή Προσωπικού Vault" }, - "exportingPersonalVaultDescription": { - "message": "Θα εξαχθούν μόνο τα προσωπικά αντικείμενα Vault που σχετίζονται με το $EMAIL$ . Τα αντικείμενα Vault οργανισμού δεν θα συμπεριληφθούν.", + "exportingIndividualVaultDescription": { + "message": "Μόνο τα μεμονωμένα αντικείμενα θησαυ/κιου που σχετίζονται με το $EMAIL$ θα εξαχθούν. Τα αντικείμενα θησαυ/κιου οργανισμού δε θα συμπεριληφθούν. Μόνο πληροφορίες αντικειμένων θησαυ/κιου θα εξαχθούν και δε θα περιλαμβάνουν συσχετιζόμενα συνημμένα.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Δεν είναι δυνατή η πρόσβαση σε αντικείμενα σε απενεργοποιημένους οργανισμούς. Επικοινωνήστε με τον ιδιοκτήτη του Οργανισμού για βοήθεια." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Σύνδεση στο $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Έκδοση διακομιστή" }, - "selfHosted": { - "message": "Αυτο-φιλοξενείται" + "selfHostedServer": { + "message": "αυτο-φιλοξενούμενο" }, "thirdParty": { "message": "Τρίτο μέρος" @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "Απομνημόνευση email" }, + "loginWithDevice": { + "message": "Σύνδεση με τη χρήση συσκευής" + }, + "loginWithDeviceEnabledInfo": { + "message": "Η σύνδεση με τη χρήση συσκευής πρέπει να έχει ρυθμιστεί στις ρυθμίσεις της εφαρμογής Bitwarden. Χρειάζεστε κάποια άλλη επιλογή;" + }, + "fingerprintPhraseHeader": { + "message": "Φράση δακτυλικών αποτυπωμάτων" + }, + "fingerprintMatchInfo": { + "message": "Βεβαιωθείτε ότι το vault σας είναι ξεκλειδωμένο και η Φράση δακτυλικών αποτυπωμάτων ταιριάζει στην άλλη συσκευή." + }, + "resendNotification": { + "message": "Επαναποστολή ειδοποίησης" + }, + "viewAllLoginOptions": { + "message": "Δείτε όλες τις επιλογές σύνδεσης" + }, + "notificationSentDevice": { + "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." + }, + "loginInitiated": { + "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", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Οι πολιτικές του οργανισμού σας έχουν ενεργοποιήσει την αυτόματη συμπλήρωση με φόρτωση σελίδας." + }, + "howToAutofill": { + "message": "Πώς να συμπληρώσετε αυτόματα" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Το κατάλαβα" + }, + "autofillSettings": { + "message": "Ρυθμίσεις αυτόματης συμπλήρωσης" + }, + "autofillShortcut": { + "message": "Συντόμευση πληκτρολογίου αυτόματης συμπλήρωσης" + }, + "autofillShortcutNotSet": { + "message": "Η συντόμευση αυτόματης συμπλήρωσης δεν έχει οριστεί. Αλλάξτε τη στις ρυθμίσεις του περιηγητή." + }, + "autofillShortcutText": { + "message": "Η συντόμευση αυτόματης συμπλήρωσης είναι: $COMMAND$. Αλλάξτε τη στις ρυθμίσεις του προγράμματος περιήγησης.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Προεπιλεγμένη συντόμευση αυτόματης συμπλήρωσης: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Σύνδεση ως" + }, + "opensInANewWindow": { + "message": "Ανοίγει σε νέο παράθυρο" + }, + "deviceApprovalRequired": { + "message": "Απαιτείται έγκριση συσκευής. Επιλέξτε μια επιλογή έγκρισης παρακάτω:" + }, + "rememberThisDevice": { + "message": "Απομνημόνευση αυτής της συσκευής" + }, + "uncheckIfPublicDevice": { + "message": "Αποεπιλέξτε αν γίνεται χρήση δημόσιας συσκευής" + }, + "approveFromYourOtherDevice": { + "message": "Έγκριση από άλλη συσκευή σας" + }, + "requestAdminApproval": { + "message": "Αίτηση έγκρισης διαχειριστή" + }, + "approveWithMasterPassword": { + "message": "Έγκριση με τον κύριο κωδικό" + }, + "ssoIdentifierRequired": { + "message": "Απαιτείται αναγνωριστικό οργανισμού SSO." + }, + "eu": { + "message": "ΕΕ", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Δεν επιτρέπεται η πρόσβαση. Δεν έχετε άδεια για να δείτε αυτή τη σελίδα." + }, + "general": { + "message": "Γενικά" + }, + "display": { + "message": "Εμφάνιση" + }, + "accountSuccessfullyCreated": { + "message": "Επιτυχής δημιουργία λογαριασμού!" + }, + "adminApprovalRequested": { + "message": "Ζητήθηκε έγκριση διαχειριστή" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Το αίτημά σας εστάλη στον διαχειριστή σας." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Θα ειδοποιηθείτε μόλις εγκριθεί." + }, + "troubleLoggingIn": { + "message": "Δεν μπορείτε να συνδεθείτε;" + }, + "loginApproved": { + "message": "Η σύνδεση εγκρίθηκε" + }, + "userEmailMissing": { + "message": "Το email του χρήστη απουσιάζει" + }, + "deviceTrusted": { + "message": "Αξιόπιστη συσκευή" + }, + "inputRequired": { + "message": "Απαιτείται εισαγωγή." + }, + "required": { + "message": "απαιτείται" + }, + "search": { + "message": "Αναζήτηση" + }, + "inputMinLength": { + "message": "Η καταχώρηση πρέπει να είναι τουλάχιστον $COUNT$ χαρακτήρες.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Η καταχώρηση δεν πρέπει να υπερβαίνει τους $COUNT$ χαρακτήρες σε μήκος.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Οι ακόλουθοι χαρακτήρες δεν επιτρέπονται: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Η τιμή καταχώρησης πρέπει να είναι τουλάχιστον $MIN$", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Η τιμή καταχώρησης δεν πρέπει να υπερβαίνει το $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 ή περισσότερα email δεν είναι έγκυρα" + }, + "inputTrimValidator": { + "message": "Η καταχώρηση δεν πρέπει να περιέχει μόνο κενά.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Η καταχώρηση δεν είναι διεύθυνση email." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ Το/α παραπάνω πεδίo/α χρειάζονται την προσοχή σας.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Επιλογή --" + }, + "multiSelectPlaceholder": { + "message": "-- Πληκτρολογήστε για φιλτράρισμα --" + }, + "multiSelectLoading": { + "message": "Ανάκτηση επιλογών..." + }, + "multiSelectNotFound": { + "message": "Δεν βρέθηκαν αντικείμενα" + }, + "multiSelectClearAll": { + "message": "Εκκαθάριση όλων" + }, + "plusNMore": { + "message": "+ $QUANTITY$ περισσότερα", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Υπομενού" + }, + "toggleCollapse": { + "message": "Εναλλαγή σύμπτυξης", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Συνώνυμο 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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "Εισαγωγή δεδομένων", + "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" + } + } + }, + "total": { + "message": "Σύνολο" + }, + "importWarning": { + "message": "Εισαγάγετε δεδομένα στο $ORGANIZATION$. Τα δεδομένα σας μπορεί να μοιραστούν με μέλη αυτού του οργανισμού. Θέλετε να συνεχίσετε;", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "Τα δεδομένα δεν έχουν διαμορφωθεί σωστά. Ελέγξτε το αρχείο εισαγωγής και δοκιμάστε ξανά." + }, + "importNothingError": { + "message": "Τίποτα δεν εισήχθη." + }, + "importEncKeyError": { + "message": "Σφάλμα αποκρυπτογράφησης του εξαγόμενου αρχείου. Το κλειδί κρυπτογράφησης δεν ταιριάζει με το κλειδί κρυπτογράφησης που χρησιμοποιήθηκε για την εξαγωγή των δεδομένων." + }, + "invalidFilePassword": { + "message": "Μη έγκυρος κωδικός πρόσβασης, παρακαλώ χρησιμοποιήστε τον κωδικό πρόσβασης που εισαγάγατε όταν δημιουργήσατε το αρχείο εξαγωγής." + }, + "importDestination": { + "message": "Προορισμός εισαγωγής" + }, + "learnAboutImportOptions": { + "message": "Μάθετε για τις επιλογές εισαγωγής σας" + }, + "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": "Το αρχείο περιέχει μη συσχετισμένα στοιχεία." + }, + "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": "Επιβεβαίωση κωδικού πρόσβασης αρχείου" + }, + "typePasskey": { + "message": "Passkey" + }, + "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": "Απαιτείται επαλήθευση από τον ιστότοπο εκκίνησης. Αυτή η λειτουργία δεν έχει ακόμα υλοποιηθεί για λογαριασμούς χωρίς τον κύριο κωδικό πρόσβασης." + }, + "logInWithPasskey": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "Δεν έχετε στοιχεία σύνδεσης που να συνδυάζονται με αυτόν τον ιστότοπο." + }, + "confirm": { + "message": "Επιβεβαίωση" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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": "Η λειτουργία δεν υποστηρίζεται ακόμη" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "useBrowserName": { + "message": "Χρήση περιηγητή" + }, + "multifactorAuthenticationCancelled": { + "message": "Ο πολυμερής έλεγχος ταυτότητας ακυρώθηκε" + }, + "noLastPassDataFound": { + "message": "Δεν βρέθηκαν δεδομένα LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Λάθος όνομα χρήστη ή κωδικού πρόσβασης" + }, + "multifactorAuthenticationFailed": { + "message": "Ο πολυμερής έλεγχος ταυτότητας απέτυχε" + }, + "includeSharedFolders": { + "message": "Συμπερίληψη κοινόχρηστων φακέλων" + }, + "lastPassEmail": { + "message": "Διεύθυνση Αλληλογραφίας Lastpass" + }, + "importingYourAccount": { + "message": "Εισαγωγή του λογαριασμού σας..." + }, + "lastPassMFARequired": { + "message": "Απαιτείται πολυμερής ταυτοποίηση LastPass" + }, + "lastPassMFADesc": { + "message": "Εισαγάγετε τον κωδικό μιας χρήσης από την εφαρμογή ελέγχου ταυτότητας" + }, + "lastPassOOBDesc": { + "message": "Εγκρίνετε το αίτημα σύνδεσης στην εφαρμογή ελέγχου ταυτότητας ή εισαγάγετε έναν κωδικό πρόσβασης μιας χρήσης." + }, + "passcode": { + "message": "Passcode" + }, + "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": "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 26ecc0396f41..a6aff9e455b2 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -962,7 +1060,7 @@ "experimentalFeature": { "message": "Compromised or untrusted websites can exploit auto-fill on page load." }, - "learnMoreAboutAutofill":{ + "learnMoreAboutAutofill": { "message": "Learn more about auto-fill" }, "defaultAutoFillOnPageLoad": { @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1985,10 +2156,7 @@ "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message" : "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." - }, - "cardBrandMir": { - "message": "Mir" + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "loggingInTo": { "message": "Logging in to $DOMAIN$", @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,12 +2218,36 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "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?" - }, + }, "weakAndExposedMasterPassword": { "message": "Weak and Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 44d439273981..b2b927b02433 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help centre" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,18 +660,36 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -960,7 +1058,7 @@ "message": "If a login form is detected, auto-fill when the web page loads." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." }, "learnMoreAboutAutofill": { "message": "Learn more about auto-fill" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organisation policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organisation policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Your master password was recently changed by an administrator in your organisation. 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 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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrolment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organisation policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organisation." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organisation vault items will not be included.", + "exportingIndividualVaultDescription": { + "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", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organisations cannot be accessed. Contact your Organisation owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organisation SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index f6813d8e0c5e..26272877ad2e 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,18 +660,36 @@ "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": "Yes, update now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Change the application's colour theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Enable auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Restored item" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Auto-filled item" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organisation policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic Enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting Personal Vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server Version" }, - "selfHosted": { - "message": "Self-Hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-Party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 6b24e4ca203f..58cd79f2559e 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -17,7 +17,7 @@ "message": "Crear cuenta" }, "login": { - "message": "Identificarse" + "message": "Iniciar sesión" }, "enterpriseSingleSignOn": { "message": "Inicio de sesión único empresarial" @@ -91,6 +91,15 @@ "autoFill": { "message": "Autorellenar" }, + "autoFillLogin": { + "message": "Autocompletar inicio de sesión" + }, + "autoFillCard": { + "message": "Autocompletar tarjeta" + }, + "autoFillIdentity": { + "message": "Autocompletar identidad" + }, "generatePasswordCopied": { "message": "Generar contraseña (copiada)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Ayuda y comentarios" }, + "helpCenter": { + "message": "Centro de ayuda de Bitwarden" + }, + "communityForums": { + "message": "Explorar los foros de la comunidad Bitwarden" + }, + "contactSupport": { + "message": "Contactar al soporte de Bitwarden" + }, "sync": { "message": "Sincronizar" }, @@ -329,6 +362,12 @@ "other": { "message": "Otros" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Configura un método de desbloqueo para cambiar tu acción de cierre de la bóveda." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Valora la extensión" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Bloquear" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Inmediatamente" }, @@ -430,7 +472,14 @@ "message": "Se requiere volver a teclear la contraseña maestra." }, "masterPasswordMinlength": { - "message": "La contraseña maestra debe tener al menos 8 caracteres." + "message": "La contraseña maestra debe tener al menos $VALUE$ caracteres.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "La confirmación de contraseña maestra no coincide." @@ -576,6 +625,9 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Mostrar las tarjetas en la pestaña" }, @@ -608,18 +660,36 @@ "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": "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": "¿Desea actualizar esta contraseña en Bitwarden?" }, "notificationChangeSave": { "message": "Actualizar" }, + "notificationUnlockDesc": { + "message": "Desbloquea tu bóveda Bitwarden para completar la solicitud de autollenado." + }, + "notificationUnlock": { + "message": "Desbloquear" + }, "enableContextMenuItem": { "message": "Mostrar las opciones de menú contextuales" }, "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": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Detección por defecto de coincidencia de URI", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Cambiar el tema de la aplicación." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Oscuro", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Característica no disponible" }, - "updateKey": { - "message": "No puedes usar esta característica hasta que actualices tu clave de cifrado." + "encryptionKeyMigrationRequired": { + "message": "Se requiere migración de la clave de cifrado. Por favor, inicie sesión a través de la caja fuerte para actualizar su clave de cifrado." }, "premiumMembership": { "message": "Membresía Premium" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB de espacio cifrado en disco para adjuntos." }, - "ppremiumSignUpTwoStep": { - "message": "Métodos de autenticación en dos pasos adicionales como YubiKey, FIDO U2F y Duo." + "premiumSignUpTwoStepOptions": { + "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." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Las URLs del entorno han sido guardadas." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Habilitar autorrellenar al cargar la página" }, @@ -960,10 +1058,10 @@ "message": "Si se detecta un formulario, realizar automáticamente un autorellenado cuando la web cargue." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Los sitios web vulnerados o no confiables pueden explotar el autorelleno al cargar la página." }, "learnMoreAboutAutofill": { - "message": "Más información sobre autorelleno" + "message": "Más información sobre el relleno automático" }, "defaultAutoFillOnPageLoad": { "message": "Configuración de autorrelleno por defecto para elementos de inicio de sesión" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Mostrar una imagen reconocible junto a cada inicio de sesión." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Mostrar el contador numérico" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restaurar elemento" }, - "restoreItemConfirmation": { - "message": "¿Estás seguro de que quieres restaurar este elemento?" - }, "restoredItem": { "message": "Elemento restaurado" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Objeto autorellenado" }, + "insecurePageWarning": { + "message": "Atención: Esta es una página HTTP no segura, y cualquier información que envíes puede ser vista y cambiada por otros. Este inicio de sesión fue guardado originalmente en una página segura (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "¿Sigue deseando rellenar este inicio de sesión?" + }, + "autofillIframeWarning": { + "message": "El formulario está alojado por un dominio diferente al URI de su registro guardado. Elija OK para autorrellenar de todos modos, o Cancelar para parar." + }, + "autofillIframeWarningTip": { + "message": "Para prevenir esta advertencia en el futuro, guarde esta URI, $HOSTNAME$, en su elemento de inicio de sesión de Bitwarden para este sitio.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Establecer contraseña maestra" }, + "currentMasterPass": { + "message": "Contraseña maestra actual" + }, + "newMasterPass": { + "message": "Nueva contraseña maestra" + }, + "confirmNewMasterPass": { + "message": "Confirma la nueva contraseña maestra" + }, "masterPasswordPolicyInEffect": { "message": "Una o más políticas de la organización requieren que su contraseña maestra cumpla con los siguientes requisitos:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "La biometría del navegador no es compatible con este dispositivo." }, + "biometricsFailedTitle": { + "message": "Fallo de biométrica" + }, + "biometricsFailedDesc": { + "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" }, @@ -1574,12 +1705,18 @@ "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." + }, "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 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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ no es un dominio válido", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Su contraseña maestra ha sido cambiada recientemente por un administrador de su organización. Para acceder a la caja fuerte, debe actualizarla 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 una hora." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Inscripción automática" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Horas" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Las políticas de su organización han establecido su acción de tiempo de espera de tu caja fuerte en $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "El tiempo de espera de tu caja fuerte excede las restricciones establecidas por tu organización." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exportando caja fuerte personal" }, - "exportingPersonalVaultDescription": { - "message": "Solo se exportarán los elementos de la caja fuerte personal asociados a $EMAIL$. Los elementos de la caja fuerte de tu organización no se incluirán.", + "exportingIndividualVaultDescription": { + "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", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "No se puede acceder a los elementos de las organizaciones desactivadas. Póngase en contacto con el personal propietario de la organización para obtener ayuda." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Iniciando sesión en $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Versión del servidor" }, - "selfHosted": { - "message": "Autoalojado" + "selfHostedServer": { + "message": "autoalojado" }, "thirdParty": { "message": "Aplicaciones de terceros" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Recordar email" }, + "loginWithDevice": { + "message": "Acceder con un dispositivo" + }, + "loginWithDeviceEnabledInfo": { + "message": "El acceso con dispositivo debe prepararse en la configuración de la aplicación Bitwarden. ¿Necesita otra opción?" + }, + "fingerprintPhraseHeader": { + "message": "Frase de huella" + }, + "fingerprintMatchInfo": { + "message": "Por favor, asegúrese de que su caja fuerte está desbloqueada y la frase de huella dactilar coincide en el otro dispositivo." + }, + "resendNotification": { + "message": "Reenviar notificación" + }, + "viewAllLoginOptions": { + "message": "Ver todas las opciones de acceso" + }, + "notificationSentDevice": { + "message": "Se ha enviado una notificación a tu dispositivo." + }, + "loginInitiated": { + "message": "Inicio de sesión en proceso" + }, "exposedMasterPassword": { "message": "Contraseña maestra comprometida" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Las políticas de su organización han activado autocompletar al cargar la página." + }, + "howToAutofill": { + "message": "Cómo autorellenar" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Entendido" + }, + "autofillSettings": { + "message": "Ajustes de autocompletar" + }, + "autofillShortcut": { + "message": "Atajo de teclado para autocompletar" + }, + "autofillShortcutNotSet": { + "message": "El atajo de autocompletar no está establecido. Cambie esto en los ajustes del navegador." + }, + "autofillShortcutText": { + "message": "El atajo de autocompletar es $COMMAND$. Cambie esto en los ajustes del navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Atajo de autocompletar predeterminado: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Iniciando sesión en" + }, + "opensInANewWindow": { + "message": "Abre en una nueva ventana" + }, + "deviceApprovalRequired": { + "message": "Se requiere aprobación del dispositivo. Seleccione una opción de aprobación a continuación:" + }, + "rememberThisDevice": { + "message": "Recordar este dispositivo" + }, + "uncheckIfPublicDevice": { + "message": "Desmarcar si se utiliza un dispositivo público" + }, + "approveFromYourOtherDevice": { + "message": "Apruebe desde otro dispositivo" + }, + "requestAdminApproval": { + "message": "Solicitar aprobación del administrador" + }, + "approveWithMasterPassword": { + "message": "Aprobar con contraseña maestra" + }, + "ssoIdentifierRequired": { + "message": "Se requiere un identificador único de inicio de sesión de la organización." + }, + "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." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Visualización" + }, + "accountSuccessfullyCreated": { + "message": "¡Cuenta creada con éxito!" + }, + "adminApprovalRequested": { + "message": "Aprobación del administrador solicitada" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Su solicitud ha sido enviada a su administrador." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Se le notificará una vez aprobado." + }, + "troubleLoggingIn": { + "message": "¿Problemas para iniciar sesión?" + }, + "loginApproved": { + "message": "Inicio de sesión aprobado" + }, + "userEmailMissing": { + "message": "Falta el correo electrónico del usuario" + }, + "deviceTrusted": { + "message": "Dispositivo de confianza" + }, + "inputRequired": { + "message": "Entrada requerida." + }, + "required": { + "message": "requerido" + }, + "search": { + "message": "Buscar" + }, + "inputMinLength": { + "message": "La entrada debe tener al menos $COUNT$ caracteres.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "La entrada no debe exceder los $COUNT$ caracteres de longitud.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Los siguientes caracteres no están permitidos: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "El valor de entrada debe ser por lo menos de $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "El valor de entrada no debe exceder $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Una o más direcciones de correo electrónico no son válidas" + }, + "inputTrimValidator": { + "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": "La entrada no es una dirección de correo electrónico." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campo(s) anteriores necesitan su atención.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Seleccione --" + }, + "multiSelectPlaceholder": { + "message": "-- Escriba para filtrar --" + }, + "multiSelectLoading": { + "message": "Recuperando opciones..." + }, + "multiSelectNotFound": { + "message": "No hay elementos" + }, + "multiSelectClearAll": { + "message": "Borrar todo" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenú" + }, + "toggleCollapse": { + "message": "Colapsar/Expandir", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Importar 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "message": "¿Iniciar sesión con contraseña?" + }, + "passkeyAlreadyExists": { + "message": "Ya existe una clave de acceso para esta aplicación." + }, + "noPasskeysFoundForThisApplication": { + "message": "No se encontraron contraseñas para esta aplicación." + }, + "noMatchingPasskeyLogin": { + "message": "No tiene un inicio de sesión que coincida para este sitio." + }, + "confirm": { + "message": "Confirme" + }, + "savePasskey": { + "message": "Guardar clave" + }, + "savePasskeyNewLogin": { + "message": "Guardar contraseña como nuevo inicio de sesión" + }, + "choosePasskey": { + "message": "Elija un inicio de sesión para guardar esta clave de acceso" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "¿Sobrescribir contraseña?" + }, + "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." + }, + "useBrowserName": { + "message": "Use un navegador web" + }, + "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" + }, + "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": "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index e414be377f62..618c52757be3 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Automaatne täitmine" }, + "autoFillLogin": { + "message": "Täida konto andmed" + }, + "autoFillCard": { + "message": "Täida kaardi andmed" + }, + "autoFillIdentity": { + "message": "Täida identiteet" + }, "generatePasswordCopied": { "message": "Genereeri parool (kopeeritakse)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Abi ja tagasiside" }, + "helpCenter": { + "message": "Bitwardeni abikeskus" + }, + "communityForums": { + "message": "Ava Bitwardeni foorum" + }, + "contactSupport": { + "message": "Võta Bitwardeniga ühendust" + }, "sync": { "message": "Sünkroniseeri" }, @@ -329,6 +362,12 @@ "other": { "message": "Muu" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Hoidla ajalõpu tegevuse muutmiseks vali esmalt lahtilukustamise meetod." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Hinda seda laiendust" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lukusta paroolihoidla" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Koheselt" }, @@ -430,7 +472,14 @@ "message": "Vajalik on ülemparooli uuesti sisestamine." }, "masterPasswordMinlength": { - "message": "Ülemparool peab olema vähemalt 8 tähemärgi pikkune." + "message": "Ülemparool peab olema vähemalt $VALUE$ tähemärgi pikkune.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Ülemparoolid ei ühti." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Kuva \"Kaart\" vaates kaardiandmed" }, @@ -608,18 +660,36 @@ "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": "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": "Soovid seda parooli ka Bitwardenis uuendada?" }, "notificationChangeSave": { "message": "Jah, uuenda" }, + "notificationUnlockDesc": { + "message": "Ava Bitwardeni hoidla, et automaattäide lõpuni viia." + }, + "notificationUnlock": { + "message": "Lukusta lahti" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funktsioon pole saadaval" }, - "updateKey": { - "message": "Seda funktsiooni ei saa enne krüpteerimise võtme uuendamist kasutada." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium versioon" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB ulatuses krüpteeritud salvestusruum." }, - "ppremiumSignUpTwoStep": { - "message": "Lisavõimalused kaheastmeliseks kinnitamiseks, näiteks YubiKey, FIDO U2F ja Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Parooli hügieen, konto seisukord ja andmelekete raportid aitavad hoidlat turvalisena hoida." @@ -798,7 +871,7 @@ "message": "Täname, et toetad Bitwardenit." }, "premiumPrice": { - "message": "Kõik see ainult %price% aastas!", + "message": "Kõik see ainult $PRICE$ / aastas!", "placeholders": { "price": { "content": "$1", @@ -828,7 +901,7 @@ "message": "Sisesta autentimise rakendusest 6 kohaline number." }, "enterVerificationCodeEmail": { - "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile", + "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Luba kontoandmete täitmine" }, @@ -960,10 +1058,10 @@ "message": "Sisselogimise vormi tuvastamisel sisestatakse sinna kontoandmed automaatselt." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Häkitud või ebausaldusväärsed veebilehed võivad lehe laadimisel automaatset sisestamist kuritarvitada." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Rohkem infot automaattäite kohta" }, "defaultAutoFillOnPageLoad": { "message": "Vaikevalik kontoandmete täitmiseks" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Kuvab iga kirje kõrval lehekülje ikooni." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Kuva kirjete arvu" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Taasta kirje" }, - "restoreItemConfirmation": { - "message": "Oled kindel, et soovid selle kirje taastada?" - }, "restoredItem": { "message": "Kirje on taastatud" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Kirje täideti" }, + "insecurePageWarning": { + "message": "Hoiatus: See on ebaturvaline HTTP lehekülg. Teised osapooled võivad sinu sisestatud infot potentsiaalselt näha ja muuta. Algselt oli see kirje salvestatud turvalise (HTTPS) lehe jaoks." + }, + "insecurePageWarningFillPrompt": { + "message": "Soovid kirje automaattäita?" + }, + "autofillIframeWarning": { + "message": "See vorm on majutatud teistsugusel domeenil kui sinu salvestatud URI. Vajuta OK, et automaattäita või Tühista, et täitmine peatada." + }, + "autofillIframeWarningTip": { + "message": "Selleks, et antud teavitust edaspidi ei kuvataks, salvesta see URI $HOSTNAME$ Bitwardeni kirjesse.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Määra ülemparool" }, + "currentMasterPass": { + "message": "Praegune ülemparool" + }, + "newMasterPass": { + "message": "Uus ülemparool" + }, + "confirmNewMasterPass": { + "message": "Kinnita uus ülemparool" + }, "masterPasswordPolicyInEffect": { "message": "Üks või enam organisatsiooni eeskirja nõuavad, et ülemparool vastaks nendele nõudmistele:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Brauseri biomeetria ei ole selles seadmes toetatud" }, + "biometricsFailedTitle": { + "message": "Biomeetria nurjus" + }, + "biometricsFailedDesc": { + "message": "Biomeetriaga kinnitamine ebaõnnestus. Kasuta ülemparooli või logi välja. Kui probleem püsib, võta ühendust Bitwardeni toega." + }, "nativeMessaginPermissionErrorTitle": { "message": "Luba puudub" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Organisatsiooni poliitika on seadnud omaniku valikutele piirangu." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ei ole õige domeen.", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Organisatsiooni administraator muutis hiljuti sinu ülemparooli. Hoidlale ligi pääsemiseks pead seda nüüd uuendama. Jätkates logitakse sind käimasolevast sessioonist välja, misjärel nõutakse uuesti sisselogimist. Teistes seadmetes olevad aktiivsed sessioonid jäävad aktiivseks kuni üheks tunniks." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automaatne liitumine" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Tundi" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Organisatsiooni poliitika on sinu hoidla ajalõpu tegevuse seadistanud $ACTION$ peale.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Personaalse hoidla eksportimine" }, - "exportingPersonalVaultDescription": { - "message": "Ainult personaalsed $EMAIL$ alla kuuluvad kirjed eksportidakse. Organisatsiooni kirjeid ei ekspordita.", + "exportingIndividualVaultDescription": { + "message": "Ainult e-postiga $EMAIL$ seonduvad kirjed eksporditakse. Organisatsiooni kirjeid ei kaasata. Samuti ei kaasata organisatsiooniga seonduvaid manuseid.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Sisselogimine läbi $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Serveri versioon" }, - "selfHosted": { - "message": "Enda majutatud" + "selfHostedServer": { + "message": "enda majutatud" }, "thirdParty": { "message": "Kolmanda osapoole" @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "Mäleta e-posti aadressi" }, + "loginWithDevice": { + "message": "Logi sisse seadme kaudu" + }, + "loginWithDeviceEnabledInfo": { + "message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?" + }, + "fingerprintPhraseHeader": { + "message": "Sõrmejälje fraas" + }, + "fingerprintMatchInfo": { + "message": "Veendu, et hoidla on lahti lukustatud ja sõrmejälje fraasid seadmete vahel ühtivad." + }, + "resendNotification": { + "message": "Saada märguanne uuesti" + }, + "viewAllLoginOptions": { + "message": "Vaata kõiki valikuid" + }, + "notificationSentDevice": { + "message": "Sinu seadmesse saadeti teavitus." + }, + "loginInitiated": { + "message": "Sisselogimine on käivitatud" + }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Ülemparool on haavatav" }, "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": "Ülemparool on varasemalt lekkinud. Kasuta konto kaitsmiseks unikaalset parooli. Oled kindel, et soovid kasutada varem lekkinud parooli?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Nõrk ja haavatav ülemparool" }, "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": "Tuvastati nõrk ning andmelekkes lekkinud ülemparool. Kasuta konto paremaks turvamiseks tugevamat parooli. Oled kindel, et soovid nõrga parooliga jätkata?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Otsi seda parooli teadaolevatest andmeleketest" }, "important": { - "message": "Important:" + "message": "Tähtis:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Ülemparooli ei saa taastada, kui sa selle unustama peaksid!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Minimaalselt $LENGTH$ tähemärki", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Sinu organisatsioon ei võimalda lehe laadimisel automaatset kontoandmete täitmist kasutada." + }, + "howToAutofill": { + "message": "Kuidas automaatselt täita" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Selge" + }, + "autofillSettings": { + "message": "Automaattäite seaded" + }, + "autofillShortcut": { + "message": "Automaattäite klaviatuuri otseteed" + }, + "autofillShortcutNotSet": { + "message": "Automaattäite otsetee pole määratud. Muuda seda brauseri seadetes." + }, + "autofillShortcutText": { + "message": "Automaattäite otsetee on: $COMMAND$. Saad seda brauseri seadetes muuta.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Vaike automaattäite otsetee on: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Sisselogimas kui" + }, + "opensInANewWindow": { + "message": "Avaneb uues aknas" + }, + "deviceApprovalRequired": { + "message": "Nõutav on seadme kinnitamine. Vali kinnitamise meetod alt:" + }, + "rememberThisDevice": { + "message": "Mäleta seda seadet" + }, + "uncheckIfPublicDevice": { + "message": "Eemalda märgistus, kui oled avalikus seadmes" + }, + "approveFromYourOtherDevice": { + "message": "Kinnita teises seadmes" + }, + "requestAdminApproval": { + "message": "Küsi admini kinnitust" + }, + "approveWithMasterPassword": { + "message": "Kinnita ülemparooliga" + }, + "ssoIdentifierRequired": { + "message": "Nõutav on organisatsiooni SSO identifikaator." + }, + "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." + }, + "general": { + "message": "Üldine" + }, + "display": { + "message": "Kuvamine" + }, + "accountSuccessfullyCreated": { + "message": "Konto edukalt loodud!" + }, + "adminApprovalRequested": { + "message": "Päring on saadetud" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Kinnituspäring saadeti adminile." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Kinnitamise järel saad selle kohta teavituse." + }, + "troubleLoggingIn": { + "message": "Kas sisselogimisel on probleeme?" + }, + "loginApproved": { + "message": "Sisselogimine on kinnitatud" + }, + "userEmailMissing": { + "message": "Kasutaja e-post on puudulik" + }, + "deviceTrusted": { + "message": "Seade on usaldusväärne" + }, + "inputRequired": { + "message": "Sisestus on nõutav." + }, + "required": { + "message": "nõutav" + }, + "search": { + "message": "Otsi" + }, + "inputMinLength": { + "message": "Sisend peab olema vähemalt $COUNT$ tähemärki pikk.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Sisend ei tohi olla üle $COUNT$ tähemärgi pikkune.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Järgnevad kirjamärgid pole lubatud: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Sisend peab olema vähemalt $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Sisend ei tohi ületada $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Üks või rohkem e-posti on kehtetud" + }, + "inputTrimValidator": { + "message": "Sisend ei tohi koosneda ainult tühikutest.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Sisend pole e-posti aadress." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ välja nõuab tähelepanu.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Vali --" + }, + "multiSelectPlaceholder": { + "message": "-- Filtreeritav tüüp --" + }, + "multiSelectLoading": { + "message": "Valikute hankimine..." + }, + "multiSelectNotFound": { + "message": "Ühtki kirjet ei leitud" + }, + "multiSelectClearAll": { + "message": "Tühjenda kõik" + }, + "plusNMore": { + "message": "+ $QUANTITY$ veel", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Alammenüü" + }, + "toggleCollapse": { + "message": "Peida", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Alias domeen" + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 9fdfe531f5e9..483c40a9a8f8 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Auto-betetzea" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Sortu pasahitza (kopiatuta)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Bat datozen saio-hasierarik gabe" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Desblokeatu kutxa gotorra" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Laguntza eta iritziak" }, + "helpCenter": { + "message": "Bitwarden Laguntza zentroa" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinkronizatu" }, @@ -329,6 +362,12 @@ "other": { "message": "Bestelakoak" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Baloratu gehigarria" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Blokeatu orain" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Berehala" }, @@ -430,7 +472,14 @@ "message": "Pasahitz nagusia berridaztea derrigorrezkoa da." }, "masterPasswordMinlength": { - "message": "Pasahitz nagusiak gutxienez 8 karaktere izan behar ditu." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Pasahitz nagusiaren egiaztatzea ez dator bat." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Erakutsi txartelak fitxa orrian" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Eguneratu" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Ezaugarria ez dago erabilgarri" }, - "updateKey": { - "message": "Ezin duzu ezaugarri hau erabili zifratze-gakoa eguneratu arte." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium bazkidea" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "Eranskinentzako 1GB-eko zifratutako biltegia." }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey, FIDO U2F eta Duo bezalako bi urratseko saio hasierarako aukera gehigarriak." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Pasahitzaren higienea, kontuaren egoera eta datu-bortxaketen txostenak, kutxa gotorra seguru mantentzeko." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Inguruneko URL-ak gorde dira." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-bete orrialdea kargatzean" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Berreskuratu elementua" }, - "restoreItemConfirmation": { - "message": "Ziur zaude elementu hau berreskuratu nahi duzula?" - }, "restoredItem": { "message": "Elementua berreskuratua" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Elementua auto-beteta" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Ezarri pasahitz nagusia" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok pasahitz nagusia behar dute baldintza hauek betetzeko:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Nabigatzailearen biometria ezin da gailu honetan erabili." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Baimena ukatuta" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Erakunde politika batek, jabetza aukerei eragiten die." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ez da onartutako domeinu bat", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Zure erakundeko administratzaile batek pasahitz nagusia aldatu berri du. Kutxa gotorrera sartzeko, pasahitz nagusia orain eguneratu behar duzu. Beraz, oraingo saiotik atera eta saioa hasteko eskatuko zaizu. Beste gailu batzuetako saio aktiboek ordubete iraun dezakete aktibo." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Izen-emate automatikoa" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Hautatu karpeta..." }, - "ssoCompleteRegistration": { - "message": "SSO-rekin saioa hasteko, mesedez, ezarri pasahitz nagusi bat kutxa gotorrera sartu eta babesteko." + "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" }, "hours": { "message": "Ordu" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Zure kutxa gotorreko itxaronaldiak, zure erakundeak ezarritako murrizpenak gainditzen ditu." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Kutxa gotor pertsonala esportatzen" }, - "exportingPersonalVaultDescription": { - "message": "$EMAIL$-ekin lotutako kutxa gotor pertsonaleko elementuak bakarrik esportatuko dira. Erakundeko kutxa gotorraren elementuak ez dira sartuko.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Ezin da sartu desgaitutako erakundeetako elementuetara. Laguntza lortzeko, jarri harremanetan zure erakundearekin." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "$DOMAIN$-en saioa hasten", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Zerbitzariaren bertsioa" }, - "selfHosted": { - "message": "Ostatatze propioduna" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Hirugarrenen aplikazioak" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Emaila gogoratu" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 2cb2dd1baf53..d024a4b3ae3f 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "وارد شوید یا یک حساب کاربری بسازید تا به گاوصندوق امنتان دسترسی یابید." + "message": "وارد شوید یا یک حساب کاربری بسازید تا به گاوصندوق امن‌تان دسترسی یابید." }, "createAccount": { "message": "ایجاد حساب کاربری" @@ -91,6 +91,15 @@ "autoFill": { "message": "پر کردن خودکار" }, + "autoFillLogin": { + "message": "پر کردن خودکار ورود" + }, + "autoFillCard": { + "message": "پر کردن خودکار کارت" + }, + "autoFillIdentity": { + "message": "پر کردن خودکار هویت" + }, "generatePasswordCopied": { "message": "ساخت کلمه عبور (کپی شد)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "ورودی‌ها منتطبق نیست" }, + "noCards": { + "message": "کارتی وجود ندارد" + }, + "noIdentities": { + "message": "هویتی وجود ندارد" + }, + "addLoginMenu": { + "message": "افزودن ورود" + }, + "addCardMenu": { + "message": "افزودن کارت" + }, + "addIdentityMenu": { + "message": "افزودن هویت" + }, "unlockVaultMenu": { "message": "قفل گاوصندوق خود را باز کنید" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "کمک و بازخورد" }, + "helpCenter": { + "message": "مرکز راهنمایی Bitwarden" + }, + "communityForums": { + "message": "انجمن‌های Bitwarden را کاوش کنید" + }, + "contactSupport": { + "message": "پیام به پشتیبانیBitwarden" + }, "sync": { "message": "همگام‌سازی" }, @@ -329,6 +362,12 @@ "other": { "message": "ساير" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "یک روش بازگشایی برای پایان زمان مجاز تنظیم کنید." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "به این افزونه امتیاز دهید" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "الان قفل شود" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "بلافاصله" }, @@ -430,7 +472,14 @@ "message": "نوشتن مجدد کلمه عبور اصلی ضروری است." }, "masterPasswordMinlength": { - "message": "طول کلمه عبور اصلی باید حداقل ۸ کاراکتر باشد." + "message": "طول کلمه عبور اصلی باید حداقل $VALUE$ کاراکتر باشد.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "کلمه عبور اصلی با تکرار آن مطابقت ندارد." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "در صورتی که موردی در گاوصندوق شما یافت نشد، درخواست افزودن کنید." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "نمایش کارت‌ها در صفحه برگه" }, @@ -608,18 +660,36 @@ "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 هستید؟" }, "notificationChangeSave": { "message": "به‌روزرسانی" }, + "notificationUnlockDesc": { + "message": "برای پر کردن خودکار گاوصندوق Bitwarden خود را باز کنید." + }, + "notificationUnlock": { + "message": "باز کردن قفل" + }, "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": "بررسی مطابقت نشانی اینترنتی پیش‌فرض", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "تغییر رنگ پوسته برنامه." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "تاریک", "description": "Dark color" @@ -677,7 +750,7 @@ "message": "درباره سازمان‌ها اطلاعات کسب کنید" }, "learnOrgConfirmation": { - "message": "Bitwarden به شما اجازه می‌دهد با استفاده از سازماندهی، موارد گاوصندوق خود را با دیگران به اشتراک بگذارید. آیا مایل به بازدید از وب سایت bitwarden.com برای کسب اطلاعات بیشتر هستید؟" + "message": "Bitwarden به شما اجازه می‌دهد با استفاده از سازمان، موارد گاوصندوق خود را با دیگران به اشتراک بگذارید. آیا مایل به بازدید از وب سایت bitwarden.com برای کسب اطلاعات بیشتر هستید؟" }, "moveToOrganization": { "message": "انتقال به سازمان" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "ویژگی موجود نیست" }, - "updateKey": { - "message": "تا زمانی که کد رمزنگاری را به‌روز نکنید نمی‌توانید از این قابلیت استفاده کنید." + "encryptionKeyMigrationRequired": { + "message": "انتقال کلید رمزگذاری مورد نیاز است. لطفاً از طریق گاوصندوق وب وارد شوید تا کلید رمزگذاری خود را به روز کنید." }, "premiumMembership": { "message": "عضویت پرمیوم" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده." }, - "ppremiumSignUpTwoStep": { - "message": "گزینه‌های ورود دو مرحله‌ای اضافی مانند YubiKey, FIDO U2F و Duo." + "premiumSignUpTwoStepOptions": { + "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey و Duo." }, "ppremiumSignUpReports": { "message": "گزارش‌های بهداشت رمز عبور، سلامت حساب و نقض داده‌ها برای ایمن نگهداشتن گاوصندوق شما." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "نشانی‌های اینترنتی محیط ذخیره شد" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "پر کردن خودکار هنگام بارگذاری صفحه" }, @@ -960,10 +1058,10 @@ "message": "اگر یک فرم ورودی شناسایی شد، وقتی صفحه وب بارگذاری شد، به صورت خودکار پر شود." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "وب‌سایت‌های در معرض خطر یا نامعتبر می‌توانند از پر کردن خودکار در بارگذاری صفحه سوء استفاده کنند." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "درباره پر کردن خودکار بیشتر بدانید" }, "defaultAutoFillOnPageLoad": { "message": "تنظیم تکمیل خودکار پیش‌فرض برای موارد ورود به سیستم" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "یک تصویر قابل تشخیص در کنار هر ورود نشان دهید." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "نمایش شمارنده نشان" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "بازیابی مورد" }, - "restoreItemConfirmation": { - "message": "آیا مطمئن هستید که می‌خواهید این مورد را بازیابی کنید؟" - }, "restoredItem": { "message": "مورد بازیابی شد" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "مورد خودکار پر شد" }, + "insecurePageWarning": { + "message": "هشدار: این یک صفحه HTTP ناامن است و هر اطلاعاتی که ارسال می‌کنید می‌تواند توسط دیگران دیده شود و تغییر کند. این ورود در ابتدا در یک صفحه امن (HTTPS) ذخیره شد." + }, + "insecurePageWarningFillPrompt": { + "message": "آیا هنوز می‌خواهید این ورود را پر کنید؟" + }, + "autofillIframeWarning": { + "message": "فرم توسط دامنه ای متفاوت از نشانی اینترنتی ورود به سیستم ذخیره شده شما میزبانی می‌شود. به هر حال برای پر کردن خودکار، تأیید را انتخاب کنید یا برای توقف، لغو را انتخاب کنید." + }, + "autofillIframeWarningTip": { + "message": "برای جلوگیری از این هشدار در آینده، این نشانی اینترنتی، $HOSTNAME$، را در مورد ورود Bitwarden خود برای این سایت ذخیره کنید.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "تنظیم کلمه عبور اصلی" }, + "currentMasterPass": { + "message": "کلمه عبور اصلی فعلی" + }, + "newMasterPass": { + "message": "کلمه عبور اصلی جدید" + }, + "confirmNewMasterPass": { + "message": "تأیید کلمه عبور اصلی جدید" + }, "masterPasswordPolicyInEffect": { "message": "یک یا چند سیاست سازمانی برای تأمین شرایط زیر به کلمه عبور اصلی شما احتیاج دارد:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "بیومتریک مرورگر در این دستگاه پشتیبانی نمی‌شود." }, + "biometricsFailedTitle": { + "message": "زیست‌سنجی ناموفق بود" + }, + "biometricsFailedDesc": { + "message": "زیست‌سنجی نمی‌تواند انجام شود، استفاده از کلمه عبور اصلی یا خروج را در نظر بگیرید. اگر این مشکل ادامه یافت لطفاً با پشتیبانی Bitwarden تماس بگیرید." + }, "nativeMessaginPermissionErrorTitle": { "message": "مجوز ارائه نشده است" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "سیاست سازمانی بر تنظیمات مالکیت شما تأثیر می‌گذارد." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ دامنه معتبری نیست", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "کلمه عبور اصلی شما اخیراً توسط سرپرست سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, + "updateWeakMasterPasswordWarning": { + "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." + }, "resetPasswordPolicyAutoEnroll": { "message": "ثبت نام خودکار" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "پوشه را انتخاب کنید..." }, - "ssoCompleteRegistration": { - "message": "برای پر کردن ورود به سیستم با SSO، لطفاً یک کلمه عبور اصلی برای دسترسی و محافظت از گاوصندوق خود تنظیم کنید." + "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" }, "hours": { "message": "ساعت" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "سباست‌های سازمان شما، عملگر زمان‌بندی گاوصندوق شما را روی $ACTION$ تنظیم کرده است.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "برون ریزی گاو‌صندوق شخصی" }, - "exportingPersonalVaultDescription": { - "message": "فقط موارد گاو‌صندوق شخصی مرتبط با $EMAIL$ برون ریزی خواهد شد. موارد گاو‌صندوق سازمان شامل نخواهد شد.", + "exportingIndividualVaultDescription": { + "message": "فقط موارد شخصی گاوصندوق مرتبط با $EMAIL$ برون ریزی خواهند شد. موارد گاوصندوق سازمان شامل نخواهد شد. فقط اطلاعات مورد گاوصندوق برون ریزی خواهد شد و شامل تاریخچه کلمه عبور مرتبط یا پیوست نمی‌شود.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "موارد موجود در سازمان‌های غیرفعال، قابل دسترسی نیستند. برای دریافت کمک با مالک سازمان خود تماس بگیرید." }, - "cardBrandMir": { - "message": "میر" - }, "loggingInTo": { "message": "ورود به $DOMAIN$", "placeholders": { @@ -2011,7 +2179,7 @@ "serverVersion": { "message": "نسخه سرور" }, - "selfHosted": { + "selfHostedServer": { "message": "خود میزبان" }, "thirdParty": { @@ -2045,11 +2213,35 @@ "message": "شما نیستید؟" }, "newAroundHere": { - "message": "اینجا جدیده؟" + "message": "اینجا تازه واردی؟" }, "rememberEmail": { "message": "ایمیل را به خاطر بسپار" }, + "loginWithDevice": { + "message": "ورود با دستگاه" + }, + "loginWithDeviceEnabledInfo": { + "message": "ورود به سیستم با دستگاه باید در تنظیمات برنامه‌ی Bitwarden تنظیم شود. به گزینه دیگری نیاز دارید؟" + }, + "fingerprintPhraseHeader": { + "message": "عبارت اثر انگشت" + }, + "fingerprintMatchInfo": { + "message": "لطفاً مطمئن شوید که قفل گاوصندوق شما باز است و عبارت اثر انگشت با دستگاه دیگر مطابقت دارد." + }, + "resendNotification": { + "message": "ارسال مجدد اعلان" + }, + "viewAllLoginOptions": { + "message": "مشاهده همه گزینه‌های ورود به سیستم" + }, + "notificationSentDevice": { + "message": "یک اعلان به دستگاه شما ارسال شده است." + }, + "loginInitiated": { + "message": "ورود به سیستم آغاز شد" + }, "exposedMasterPassword": { "message": "کلمه عبور اصلی افشا شده" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "خط مشی‌های سازمان شما پر کردن خودکار هنگام بارگیری صفحه را روشن کرده است." + }, + "howToAutofill": { + "message": "نحوه پر کردن خودکار" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "متوجه شدم" + }, + "autofillSettings": { + "message": "تنظیمات پر کردن خودکار" + }, + "autofillShortcut": { + "message": "میانبر صفحه کلید پر کردن خودکار" + }, + "autofillShortcutNotSet": { + "message": "میانبر پر کردن خودکار تنظیم نشده است. این را در تنظیمات مرورگر تغییر دهید." + }, + "autofillShortcutText": { + "message": "میانبر پر کردن خودکار: $COMMAND$ است. این را در تنظیمات مرورگر تغییر دهید.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "میانبر پر کردن خودکار پیش‌فرض: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "ورود با" + }, + "opensInANewWindow": { + "message": "در پنجره جدید باز می‌شود" + }, + "deviceApprovalRequired": { + "message": "تأیید دستگاه لازم است. یک روش تأیید انتخاب کنید:" + }, + "rememberThisDevice": { + "message": "این دستگاه را به خاطر بسپار" + }, + "uncheckIfPublicDevice": { + "message": "اگر از دستگاه عمومی استفاده می‌کنید علامت را بردارید" + }, + "approveFromYourOtherDevice": { + "message": "تأیید با دستگاه دیگرتان" + }, + "requestAdminApproval": { + "message": "درخواست تأیید مدیر" + }, + "approveWithMasterPassword": { + "message": "تأیید با کلمه عبور اصلی" + }, + "ssoIdentifierRequired": { + "message": "شناسه سازمان SSO مورد نیاز است." + }, + "eu": { + "message": "اروپا", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "دسترسی رد شد. شما اجازه مشاهده این صفحه را ندارید." + }, + "general": { + "message": "عمومی" + }, + "display": { + "message": "نمایش" + }, + "accountSuccessfullyCreated": { + "message": "حساب کاربری با موفقیت ایجاد شد!" + }, + "adminApprovalRequested": { + "message": "تأیید مدیر درخواست شد" + }, + "adminApprovalRequestSentToAdmins": { + "message": "درخواست شما به مدیرتان فرستاده شد." + }, + "youWillBeNotifiedOnceApproved": { + "message": "به محض تأیید مطلع خواهید شد." + }, + "troubleLoggingIn": { + "message": "در ورود مشکلی دارید؟" + }, + "loginApproved": { + "message": "ورود تأیید شد" + }, + "userEmailMissing": { + "message": "ایمیل کاربر وجود ندارد" + }, + "deviceTrusted": { + "message": "دستگاه مورد اعتماد است" + }, + "inputRequired": { + "message": "ورودی ضروری است." + }, + "required": { + "message": "ضروری" + }, + "search": { + "message": "جستجو" + }, + "inputMinLength": { + "message": "ورودی باید حداقل $COUNT$ کاراکتر داشته باشد.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "طول ورودی نباید بیش از $COUNT$ کاراکتر باشد.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "کاراکترهای زیر مجاز نیستند: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "مقدار ورودی باید حداقل $MIN$ باشد.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "مقدار ورودی نباید از $MAX$ تجاوز کند.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "یک یا چند ایمیل نامعتبر است" + }, + "inputTrimValidator": { + "message": "ورودی نباید فقط حاوی فضای خالی باشد.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "ورودی یک نشانی ایمیل نیست." + }, + "fieldsNeedAttention": { + "message": "فیلد $COUNT$ در بالا به توجه شما نیاز دارد.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- انتخاب --" + }, + "multiSelectPlaceholder": { + "message": "-- برای فیلتر تایپ کنید --" + }, + "multiSelectLoading": { + "message": "در حال بازیابی گزینه‌ها..." + }, + "multiSelectNotFound": { + "message": "موردی یافت نشد" + }, + "multiSelectClearAll": { + "message": "پاک‌کردن همه" + }, + "plusNMore": { + "message": "+ $QUANTITY$ بیشتر", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "زیرمنو" + }, + "toggleCollapse": { + "message": "دکمه بستن", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "دامنه مستعار" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "موارد با درخواست مجدد کلمه عبور اصلی را نمی‌توان در بارگذاری صفحه به‌صورت خودکار پر کرد. پر کردن خودکار در بارگیری صفحه خاموش شد.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "پر کردن خودکار در بارگیری صفحه برای استفاده از تنظیمات پیش‌فرض تنظیم شده است.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "passkeyNotCopied": { + "message": "کلید عبور کپی نمی‌شود" + }, + "passkeyNotCopiedAlert": { + "message": "کلید عبور در مورد شبیه سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه سازی این مورد ادامه دهید؟" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های بدون کلمه عبور اصلی اجرا نشده است." + }, + "logInWithPasskey": { + "message": "با کلید عبور وارد می‌شوید؟" + }, + "passkeyAlreadyExists": { + "message": "یک کلید عبور از قبل برای این برنامه وجود دارد." + }, + "noPasskeysFoundForThisApplication": { + "message": "هیچ کلمه عبوری برای این برنامه یافت نشد." + }, + "noMatchingPasskeyLogin": { + "message": "شما هیچ ورود مشابهی برای این سایت ندارید." + }, + "confirm": { + "message": "تأیید" + }, + "savePasskey": { + "message": "ذخیره کلید عبور" + }, + "savePasskeyNewLogin": { + "message": "کلید عبور را به عنوان ورود جدید ذخیره کن" + }, + "choosePasskey": { + "message": "یک ورود برای ذخیره این کلید عبور انتخاب کنید" + }, + "passkeyItem": { + "message": "مورد کلید عبور" + }, + "overwritePasskey": { + "message": "بازنویسی کلید عبور؟" + }, + "overwritePasskeyAlert": { + "message": "این مورد از قبل دارای یک کلید عبور است. آیا مطمئنید که می‌خواهید کلمه عبور فعلی را بازنویسی کنید؟" + }, + "featureNotSupported": { + "message": "ویژگی هنوز پشتیبانی نمی‌شود" + }, + "yourPasskeyIsLocked": { + "message": "برای استفاده از کلید عبور، احراز هویت لازم است. برای ادامه، هویت خود را تأیید کنید." + }, + "useBrowserName": { + "message": "استفاده از مرورگر وب" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index cfa12ce154d7..bf98a2fa5e9b 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden – Ilmainen salasananhallinta", + "message": "Bitwarden – Ilmainen salasanahallinta", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Turvallinen ja ilmainen salasanojen hallinta kaikille laitteillesi.", + "message": "Turvallinen ja ilmainen salasanahallinta kaikille laitteillesi.", "description": "Extension description" }, "loginOrCreateNewAccount": { @@ -91,6 +91,15 @@ "autoFill": { "message": "Automaattinen täyttö" }, + "autoFillLogin": { + "message": "Täytä kirjautumistieto automaattisesti" + }, + "autoFillCard": { + "message": "Täytä kortti automaattisesti" + }, + "autoFillIdentity": { + "message": "Täytä identiteetti automaattisesti" + }, "generatePasswordCopied": { "message": "Luo salasana (leikepöydälle)" }, @@ -100,6 +109,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ää identiteetti" + }, "unlockVaultMenu": { "message": "Avaa holvisi" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Tuki ja palaute" }, + "helpCenter": { + "message": "Bitwardenin Tukikeskus" + }, + "communityForums": { + "message": "Tutustu Bitwardenin keskustelualueeseen" + }, + "contactSupport": { + "message": "Ota yhteyttä Bitwardenin asiakaspalveluun" + }, "sync": { "message": "Synkronointi" }, @@ -215,7 +248,7 @@ "message": "Luo kirjautumistiedoillesi automaattisesti vahvoja, ainutlaatuisia salasanoja." }, "bitWebVault": { - "message": "Bitwardenin verkkoholvi" + "message": "Bitwarden Verkkoholvi" }, "importItems": { "message": "Tuo kohteita" @@ -270,7 +303,7 @@ "message": "Vältä epäselviä merkkejä" }, "searchVault": { - "message": "Hae holvista" + "message": "Etsi holvista" }, "edit": { "message": "Muokkaa" @@ -279,7 +312,7 @@ "message": "Näytä" }, "noItemsInList": { - "message": "Ei näytettäviä kohteita." + "message": "Näytettäviä kohteita ei ole." }, "itemInformation": { "message": "Kohteen tiedot" @@ -324,11 +357,17 @@ "message": "Näytä tai piilota" }, "manage": { - "message": "Hallinnoi" + "message": "Hallitse" }, "other": { "message": "Muut" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Muuta holvisi aikakatkaisutoimintoa määrittämällä lukituksen avaustapa." + }, + "unlockMethodNeeded": { + "message": "Määritä avaustapa asetuksista" + }, "rateExtension": { "message": "Arvioi laajennus" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lukitse nyt" }, + "lockAll": { + "message": "Lukitse kaikki" + }, "immediately": { "message": "Välittömästi" }, @@ -430,7 +472,14 @@ "message": "Pääsalasanan uudelleensyöttö vaaditaan." }, "masterPasswordMinlength": { - "message": "Pääsalasanan tulee sisältää ainakin 8 merkkiä." + "message": "Pääsalasanan tulee sisältää vähintään $VALUE$ merkkiä.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Pääsalasanan vahvistus ei täsmää." @@ -458,7 +507,7 @@ } }, "autofillError": { - "message": "Valitttua kohdetta ei voitu täyttää tälle sivulle automaattisesti. Kopioi ja liitä tiedot itse." + "message": "Valittua kohdetta ei voitu täyttää tälle sivulle automaattisesti. Kopioi ja liitä tiedot itse." }, "loggedOut": { "message": "Kirjauduttu ulos" @@ -491,7 +540,7 @@ "message": "Voit vaihtaa pääsalasanasi bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?" }, "twoStepLoginConfirmation": { - "message": "Kaksivaiheinen kirjautuminen tekee tilistäsi turvallisemman edellyttämällä salasanan lisäksi kirjautumisen lisätodennusta todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko käydä sivustolla nyt?" + "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?" }, "editedFolder": { "message": "Kansio tallennettiin" @@ -558,24 +607,27 @@ "message": "Haluatko varmasti korvata nykyisen käyttäjätunnuksen?" }, "searchFolder": { - "message": "Hae kansiosta" + "message": "Etsi kansiosta" }, "searchCollection": { - "message": "Hae kokoelmasta" + "message": "Etsi kokoelmasta" }, "searchType": { - "message": "Hae tyypeistä" + "message": "Etsi tyypistä" }, "noneFolder": { "message": "Ei kansiota", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Kysy lisätäänkö kirjautimistieto" + "message": "Kysy lisätäänkö kirjautumistieto" }, "addLoginNotificationDesc": { "message": "Kysy lisätäänkö uusi kohde, jos holvissa ei vielä ole sopivaa kohdetta." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Näytä kortit välilehtiosiossa" }, @@ -603,10 +655,19 @@ "message": "Tallenna" }, "enableChangedPasswordNotification": { - "message": "Kysy päivitetäänkö olemassa oleva kirjautimistieto" + "message": "Kysy päivitetäänkö kirjautumistieto" }, "changedPasswordNotificationDesc": { - "message": "Kysy päivitetäänkö kirjautumistiedon salasana, kun sivustolla havaitaan muutos." + "message": "Kysy päivitetäänkö kirjautumistiedon salasana sivustolla havaittua muutosta vastaavaksi." + }, + "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": "Pyydä tallentamaan ja käyttämään salausavaimia" + }, + "usePasskeysDesc": { + "message": "Pyydä tallentamaan uusia salausavaimia tai kirjaudu sisään holviisi tallennetuilla salausavaimilla. Koskee kaikkia sisäänkirjautuneita tilejä." }, "notificationChangeDesc": { "message": "Haluatko päivittää salasanan Bitwardeniin?" @@ -614,12 +675,21 @@ "notificationChangeSave": { "message": "Päivitä" }, + "notificationUnlockDesc": { + "message": "Viimeistele automaattisen täytön pyyntö avaamalla Bitwarden-holvisi lukitus." + }, + "notificationUnlock": { + "message": "Avaa" + }, "enableContextMenuItem": { "message": "Näytä sisältövalikon valinnat" }, "contextMenuItemDesc": { "message": "Käytä salasanageneraattoria ja avoimelle sivulle soveltuvia kirjautumistietoja hiiren kakkospainikkeella avattavasta valikosta." }, + "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:n oletusarvoinen täsmäystapa", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Vaihda sovelluksen väriteemaa." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Tumma", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Ominaisuus ei ole käytettävissä" }, - "updateKey": { - "message": "Et voi käyttää tätä toimintoa ennen kuin päivität salausavaimesi." + "encryptionKeyMigrationRequired": { + "message": "Tarvitaan salausavaimen siirto. Kirjaudu verkkoholvin kautta päivittääksesi salausavaimesi." }, "premiumMembership": { "message": "Premium-jäsenyys" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 Gt salattua tallennustilaa tiedostoliitteille." }, - "ppremiumSignUpTwoStep": { - "message": "Muita kaksivaiheisen kirjautumisen todennusmenetelmiä kuten YubiKey, FIDO U2F ja Duo Security." + "premiumSignUpTwoStepOptions": { + "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." }, "ppremiumSignUpReports": { "message": "Salasanahygienian, tilin terveyden ja tietovuotojen raportointitoiminnot pitävät holvisi turvassa." @@ -780,7 +853,7 @@ "message": "Kaksivaiheisen kirjautumisen (2FA) TOTP-todennuskoodien generaattori holvisi kirjautumistiedoille." }, "ppremiumSignUpSupport": { - "message": "Ensisijainen asiakastuki." + "message": "Ensisijainen asiakaspalvelu." }, "ppremiumSignUpFuture": { "message": "Kaikki tulossa olevat Premium-toiminnot. Lisää tulossa pian!" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Palvelinympäristön URL-osoitteet tallennettiin" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Automaattinen täyttö sivun avautuessa" }, @@ -963,7 +1061,7 @@ "message": "Vaarantuneet tai epäluotettavat sivustot voivat väärinkäyttää sivun avautuessa suoritettavaa automaattista täyttöä." }, "learnMoreAboutAutofill": { - "message": "Lue lisää automaattisesta täytöstä" + "message": "Lisätietoja automaattisesta täytöstä" }, "defaultAutoFillOnPageLoad": { "message": "Automaattisen täytön oletusasetus kirjautumistiedoille" @@ -1045,6 +1143,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" }, @@ -1322,7 +1423,7 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Salasana päivitettiin", + "message": "Salasana vaihdettiin", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1410,7 +1511,7 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Hae roskakorista" + "message": "Etsi roskakorista" }, "permanentlyDeleteItem": { "message": "Poista kohde pysyvästi" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Palauta kohde" }, - "restoreItemConfirmation": { - "message": "Haluatko varmasti palauttaa kohteen?" - }, "restoredItem": { "message": "Kohde palautettiin" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Kohde täytettiin automaattisesti" }, + "insecurePageWarning": { + "message": "Varoitus: Tämä on suojaamaton HTTP-sivu, eli ulkopuolisten tahojen voi olla mahdollista tarkastella ja muuttaa lähettämiäsi tietoja. Tämä kirjautumistieto on alun perin tallennettu suojatulle HTTPS-sivulle." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "Välttyäksesi varoitukselta jatkossa, tallenna URI $HOSTNAME$ sivustolle tallennettuun Bitwarden-kirjautumistietoosi.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Aseta pääsalasana" }, + "currentMasterPass": { + "message": "Nykyinen pääsalasana" + }, + "newMasterPass": { + "message": "Uusi pääsalasana" + }, + "confirmNewMasterPass": { + "message": "Vahvista uusi pääsalasana" + }, "masterPasswordPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Selaimen biometriaa ei tueta tällä laitteella." }, + "biometricsFailedTitle": { + "message": "Biometria epäonnistui" + }, + "biometricsFailedDesc": { + "message": "Biometristä todennusta ei voida suorittaa. Harkitse pääsalasanan käyttämistä tai uloskirjautumista. Jos tämä jatkuu, ole yhteydessä Bitwardenin asiakaspalveluun." + }, "nativeMessaginPermissionErrorTitle": { "message": "Oikeutta ei myönnetty" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Organisaatiokäytäntö vaikuttaa omistajuusvalintoihisi." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organisaatiokäytäntö estää kohteiden tuonnin yksityiseen holviisi." + }, "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 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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ei ole kelvollinen verkkotunnus", "placeholders": { @@ -1594,7 +1731,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Hae Sendeistä", + "message": "Etsi Sendeistä", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { @@ -1820,13 +1957,16 @@ "message": "Sinun on vahvistettava sähköpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa." }, "updatedMasterPassword": { - "message": "Pääsalasana päivitettiin" + "message": "Pääsalasanasi on vaihdettu" }, "updateMasterPassword": { - "message": "Vaihda pääsalasana" + "message": "Päivitä pääsalasana" }, "updateMasterPasswordWarning": { - "message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi. Käyttääksesi holvia, on sinun päivitettävä se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." + "message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi ja käyttääksesi holvia sinun on päivitettävä se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Automaattinen liitos" @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Valitse kansio..." }, - "ssoCompleteRegistration": { - "message": "Kirjautuaksesi sisään käyttäen kertakirjautumista (SSO), suojaa holvisi pääsalasanalla." + "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" }, "hours": { "message": "Tuntia" @@ -1847,7 +1992,20 @@ "message": "Minuuttia" }, "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiokäytännöt vaikuttavat holvin aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)", + "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "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$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Organisaatiokäytännöt ovat määrittäneet holvillesi aikakatkaisutoiminnon $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Henkilökohtaisen holvin vienti" }, - "exportingPersonalVaultDescription": { - "message": "Vain tunnukseen $EMAIL$ liitetyt henkilökohtaisen holvin kohteet viedään. Organisaation kohteet eivät sisälly tähän.", + "exportingIndividualVaultDescription": { + "message": "Vain tunnukseen $EMAIL$ liitetyt yksityisen holvin kohteet viedään. Organisaation holvin kohteita ei sisällytetä. Vain holvin kohteiden tiedot viedään ilman niiden sisältämiä liitteitä.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Käytöstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Kirjaudutaan palveluun $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Palvelimen versio" }, - "selfHosted": { - "message": "Itse ylläpidetty" + "selfHostedServer": { + "message": "itse ylläpidetty" }, "thirdParty": { "message": "Ulkopuolinen taho" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Muista sähköpostiosoite" }, + "loginWithDevice": { + "message": "Laitteella kirjautuminen" + }, + "loginWithDeviceEnabledInfo": { + "message": "Laitteella kirjautuminen on määritettävä Bitwarden-sovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" + }, + "fingerprintPhraseHeader": { + "message": "Tunnistelauseke" + }, + "fingerprintMatchInfo": { + "message": "Varmista, että holvisi on avattu ja tunnistelauseke täsmää toisella laitteella." + }, + "resendNotification": { + "message": "Lähetä ilmoitus uudelleen" + }, + "viewAllLoginOptions": { + "message": "Näytä kaikki kirjautumisvaihtoehdot" + }, + "notificationSentDevice": { + "message": "Laitteellesi on lähetetty ilmoitus." + }, + "loginInitiated": { + "message": "Kirjautuminen aloitettu" + }, "exposedMasterPassword": { "message": "Paljastunut pääsalasana" }, @@ -2069,7 +2261,7 @@ "message": "Tärkeää:" }, "masterPasswordHint": { - "message": "Pääsalasanan palautus ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Organisaatiokäytännöt ovat poistaneet käytöstä automaattisen täytön sivun avautuessa." + }, + "howToAutofill": { + "message": "Miten täytetään automaattisesti" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Selvä" + }, + "autofillSettings": { + "message": "Täytön asetukset" + }, + "autofillShortcut": { + "message": "Automaattisen täytön pikanäppäin" + }, + "autofillShortcutNotSet": { + "message": "Automaattisen tä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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Automaattisen täytön oletuspikanäppäin on $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Kirjaudutaan sijaintiin" + }, + "opensInANewWindow": { + "message": "Avautuu uudessa ikkunassa" + }, + "deviceApprovalRequired": { + "message": "Laitehyväksyntä vaaditaan. Valitse hyväksyntätapa alta:" + }, + "rememberThisDevice": { + "message": "Muista tämä laite" + }, + "uncheckIfPublicDevice": { + "message": "Poista valinta julkisilla laitteilla" + }, + "approveFromYourOtherDevice": { + "message": "Hyväksy toiselta laitteiltasi" + }, + "requestAdminApproval": { + "message": "Pyydä hyväksyntää ylläpidolta" + }, + "approveWithMasterPassword": { + "message": "Hyväksy pääsalasanalla" + }, + "ssoIdentifierRequired": { + "message": "Organisaation kertakirjautumistunniste tarvitaan." + }, + "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." + }, + "general": { + "message": "Yleiset" + }, + "display": { + "message": "Ulkoasu" + }, + "accountSuccessfullyCreated": { + "message": "Tilin luonti onnistui!" + }, + "adminApprovalRequested": { + "message": "Hyväksyntää pyydetty ylläpidolta" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Pyyntösi on välitetty ylläpidollesi." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Saat ilmoituksen kun se on hyväksytty." + }, + "troubleLoggingIn": { + "message": "Ongelmia kirjautumisessa?" + }, + "loginApproved": { + "message": "Kirjautuminen hyväksyttiin" + }, + "userEmailMissing": { + "message": "Käyttäjän sähköpostiosoite puuttuu" + }, + "deviceTrusted": { + "message": "Laitteeseen luotettu" + }, + "inputRequired": { + "message": "Syöte vaaditaan." + }, + "required": { + "message": "pakollinen" + }, + "search": { + "message": "Etsi" + }, + "inputMinLength": { + "message": "Syötteen tulee sisältää ainakin $COUNT$ merkkiä.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Syötteen enimmäismerkkimäärä on $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Seuraavia merkkejä ei sallita: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Syötteen vähimmäisarvo on $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Syötteen enimmäisarvo on $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Ainakin yksi sähköpostiosoite on virheellinen" + }, + "inputTrimValidator": { + "message": "Syöte ei voi sisältää vain tyhjiä merkkejä.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Syöte ei ole sähköpostiosoite." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ yllä oleva(a) kenttä(ä) vaatii huomiotasi.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Valitse --" + }, + "multiSelectPlaceholder": { + "message": "-- Suodatettava tyyppi --" + }, + "multiSelectLoading": { + "message": "Noudetaan vaihtoehtoja..." + }, + "multiSelectNotFound": { + "message": "Kohteita ei löytynyt" + }, + "multiSelectClearAll": { + "message": "Tyhjennä kaikki" + }, + "plusNMore": { + "message": "+ $QUANTITY$ lisää", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Alavalikko" + }, + "toggleCollapse": { + "message": "Laajenna tai supista", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Alias-verkkotunnus" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Kohteita, joille pääsalasanan uudelleenkysely on käytössä, ei voida täyttää automaattisesti sivujen avautuessa. Automaattinen täyttö sivujen avautuessa poistettiin käytöstä.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Automaattinen täyttö sivun avautuessa käyttää oletusasetusta.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Avaa tili", + "description": "Button text to display in overlay when the account is locked." + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "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": "Ei näytettäviä kohteita", + "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ää uusi holvikohde", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "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": "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Tuontikohde" + }, + "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" + }, + "typePasskey": { + "message": "Suojausavain" + }, + "passkeyNotCopied": { + "message": "Suojausavainta ei kopioida" + }, + "passkeyNotCopiedAlert": { + "message": "Suojausavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Käynnistävä sivusto edellyttää todennusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." + }, + "logInWithPasskey": { + "message": "Kirjaudu suojausavaimella?" + }, + "passkeyAlreadyExists": { + "message": "Tälle sovellukselle on jo tallennettu suojausavain." + }, + "noPasskeysFoundForThisApplication": { + "message": "Tälle sovellukselle ei löytynyt suojausavaimia." + }, + "noMatchingPasskeyLogin": { + "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." + }, + "confirm": { + "message": "Vahvista" + }, + "savePasskey": { + "message": "Tallenna suojausavain" + }, + "savePasskeyNewLogin": { + "message": "Tallenna suojausavain uuteen kirjautumistietoon" + }, + "choosePasskey": { + "message": "Valitse kirjautumistieto, johon suojausavain tallennetaan" + }, + "passkeyItem": { + "message": "Suojausavaimen kohde" + }, + "overwritePasskey": { + "message": "Korvataanko suojausavain?" + }, + "overwritePasskeyAlert": { + "message": "Kohde sisältää jo suojausavaimen. Haluatko varmasti korvata nykyisen salasanan?" + }, + "featureNotSupported": { + "message": "Ominaisuutta ei vielä tueta" + }, + "yourPasskeyIsLocked": { + "message": "Salausavaimen käyttö edellyttää todennusta. Jatka vahvistamalla henkilöllisyytesi." + }, + "useBrowserName": { + "message": "Käytä verkkoselainta" + }, + "multifactorAuthenticationCancelled": { + "message": "Monivaiheinen todennus peruttiin" + }, + "noLastPassDataFound": { + "message": "LastPass-tietoja ei löytynyt" + }, + "incorrectUsernameOrPassword": { + "message": "Virheellinen käyttäjätunnus tai salasana" + }, + "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 tilejä" + }, + "switchToAccount": { + "message": "Vaihda tiliin" + }, + "activeAccount": { + "message": "Aktiivinen tili" + }, + "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" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index eb1f92df052b..f54a20d88ae0 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Tulong at Mga Feedback" }, + "helpCenter": { + "message": "Bitwarden Tulong sentro" + }, + "communityForums": { + "message": "I-eksplorang Bitwarden komunidad na mga forum" + }, + "contactSupport": { + "message": "Kontakin ang Bitwarden suporta" + }, "sync": { "message": "Ikintal" }, @@ -329,6 +362,12 @@ "other": { "message": "Iba pa" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "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" + }, "rateExtension": { "message": "I-rate ang extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Mag-kandado Na" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Kaagad" }, @@ -430,7 +472,14 @@ "message": "Kinakailangan ang ulitin ang master password." }, "masterPasswordMinlength": { - "message": "Ang master password ay dapat hindi bababa sa 8 na mga character." + "message": "Ang master password ay dapat na hindi bababa sa $VALUE$ na mga character.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Hindi tumutugma ang kumpirmasyon ng master password." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Ipakita ang mga card sa Tab page" }, @@ -608,20 +660,38 @@ "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?" }, "notificationChangeSave": { "message": "I-update" }, + "notificationUnlockDesc": { + "message": "I-unlock ang iyong Bitwarden vault para makumpleto ang kahilingan sa auto-fill." + }, + "notificationUnlock": { + "message": "I-unlock" + }, "enableContextMenuItem": { "message": "Ipakita ang mga opsyon ng menu ng konteksto" }, "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 URI match detection", + "message": "Default na pagtukoy ng tugma ng URI", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { @@ -633,6 +703,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" @@ -735,25 +808,25 @@ "message": "Attachment na nai-save" }, "file": { - "message": "File" + "message": "Mag-file" }, "selectFile": { "message": "Pumili ng File" }, "maxFileSize": { - "message": "Maximum file size is 500 MB." + "message": "Maximum na laki ng file ay 500 MB." }, "featureUnavailable": { "message": "Hindi magagamit ang tampok" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Kinakailangan ang paglilipat ng encryption key. Mangyaring mag-login sa pamamagitan ng web vault upang i-update ang iyong encryption key." }, "premiumMembership": { - "message": "Premium membership" + "message": "Pagiging miyembro ng premium" }, "premiumManage": { - "message": "Manage membership" + "message": "Pamahalaan ang pagiging miyembro" }, "premiumManageAlert": { "message": "Maaari mong i-manage ang iyong membership sa bitwarden.com web vault. Gusto mo bang bisitahin ang website ngayon?" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage para sa mga file attachment." }, - "ppremiumSignUpTwoStep": { - "message": "Dagdag na dalawang hakbang na login option gaya ng YubiKey, FIDO U2F, at Duo." + "premiumSignUpTwoStepOptions": { + "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." @@ -780,7 +853,7 @@ "message": "TOTP Verification Code (2FA) Generator para sa mga login sa iyong vault." }, "ppremiumSignUpSupport": { - "message": "Priority customer support." + "message": "Priority suporta sa customer." }, "ppremiumSignUpFuture": { "message": "Lahat ng mga susunod na Premium na tampok. Marami pang darating!" @@ -888,7 +961,7 @@ "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator app" + "message": "App ng Authenticator" }, "authenticatorAppDesc": { "message": "Gamitin ang isang authenticator app (tulad ng Authy o Google Authenticator) upang lumikha ng time-based verification codes.", @@ -915,7 +988,7 @@ "message": "Gamitin ang anumang WebAuthn compatible security key upang ma-access ang iyong account." }, "emailTitle": { - "message": "Email" + "message": "Mag-email" }, "emailDesc": { "message": "Mga kodigong pang-pagpapatunay ang ipapadala sa iyo sa pamamagitan ng email." @@ -939,34 +1012,59 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "Web vault server URL - URL ng Server ng Web vault" }, "identityUrl": { - "message": "Identity server URL" + "message": "Identity server URL - URL ng Server ng Identity" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "URL ng server ng mga abiso" }, "iconsUrl": { - "message": "Icons server URL" + "message": "Icons server URL - URL ng Server ng Mga Icon" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "Nai-save ang mga URL ng Kapaligiran" + }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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 auto-fill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Awtomatikong punan sa pagkarga ng pahina" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Kung natukoy ang isang form sa pag login, awtomatikong punan kapag naglo load ang web page." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Ang mga nakompromiso o hindi pinagkakatiwalaang mga website ay maaaring samantalahin ang awtomatikong pagpuno sa pag load ng pahina." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Matuto nang higit pa tungkol sa auto fill" }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Default na setting ng autofill para sa mga item sa pag login" }, "defaultAutoFillOnPageLoadDesc": { "message": "Maaari mong i-off ang auto-fill sa pag-load ng pahina para sa indibidwal na login items mula sa view ng Edit ng item." @@ -978,13 +1076,13 @@ "message": "Gamitin ang default na setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Awtomatikong punan sa pagkarga ng pahina" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Huwag awtomatikong punan sa page load" }, "commandOpenPopup": { - "message": "Open vault popup" + "message": "Buksan ang popup ng vault" }, "commandOpenSidebar": { "message": "Buksan ang vault sa sidebar" @@ -1002,7 +1100,7 @@ "message": "Ang suporta sa private mode ay eksperimental at limitado ang ilang mga tampok." }, "customFields": { - "message": "Custom fields" + "message": "Pasadyang mga patlang" }, "copyValue": { "message": "Kopyahin ang halaga" @@ -1045,6 +1143,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" }, @@ -1148,16 +1249,16 @@ "message": "Kumpanya" }, "ssn": { - "message": "Social Security number" + "message": "Numero ng Seguridad Sosyal" }, "passportNumber": { "message": "Numero ng Pasaporte" }, "licenseNumber": { - "message": "License number" + "message": "Numero ng Lisensya" }, "email": { - "message": "Email" + "message": "Mag-email" }, "phone": { "message": "Telepono" @@ -1175,37 +1276,37 @@ "message": "Address 3" }, "cityTown": { - "message": "City / Town" + "message": "Bayan/Town" }, "stateProvince": { "message": "Estado/Probinsya" }, "zipPostalCode": { - "message": "Zip / Postal code" + "message": "Código ng Zip / Postal" }, "country": { "message": "Bayan" }, "type": { - "message": "Type" + "message": "Uri" }, "typeLogin": { "message": "Login" }, "typeLogins": { - "message": "Logins" + "message": "Mga Login" }, "typeSecureNote": { - "message": "Secure note" + "message": "Secure na tala" }, "typeCard": { - "message": "Card" + "message": "Karta" }, "typeIdentity": { - "message": "Identity" + "message": "Pagkakakilanlan" }, "passwordHistory": { - "message": "Password history" + "message": "Kasaysayan ng Password" }, "back": { "message": "Bumalik" @@ -1258,7 +1359,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Pangalan ng domain", "description": "Domain name. Ex. website.com" }, "host": { @@ -1272,11 +1373,11 @@ "message": "Naguumpisa sa" }, "regEx": { - "message": "Regular expression", + "message": "Regular Expression - Regular na Pagpapahayag", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match detection", + "message": "Match Detection - Pagtuklas ng Pares", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1284,14 +1385,14 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle options" + "message": "Mga pagpipilian sa toggle" }, "toggleCurrentUris": { - "message": "Toggle current URIs", + "message": "Toggle kasalukuyang URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "Kasalukuyang URI", "description": "The URI of one of the current open tabs in the browser." }, "organization": { @@ -1311,25 +1412,25 @@ "message": "Alisin" }, "default": { - "message": "Default" + "message": "Default na" }, "dateUpdated": { - "message": "Updated", + "message": "Na-update", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "Nilikha", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Na-update ang password", "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": "Sigurado ka bang gusto mong gamitin ang opsyon na \"Never\" Ang pagtatakda ng iyong mga pagpipilian sa lock sa \"Hindi kailanman\" ay nag iimbak ng key ng pag encrypt ng iyong vault sa iyong aparato. Kung gagamitin mo ang pagpipiliang ito dapat mong tiyakin na pinapanatili mong protektado nang maayos ang iyong aparato." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "Hindi ka kabilang sa anumang mga organisasyon. Pinapayagan ka ng mga organisasyon na ligtas na magbahagi ng mga item sa iba pang mga gumagamit." }, "noCollectionsInList": { "message": "Walang mga koleksyon na maipapakita." @@ -1399,33 +1500,30 @@ "message": "Isang o higit pang patakaran ng organisasyon ay nakakaapekto sa iyong mga setting ng generator." }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "Aksyon sa Vault timeout" }, "lock": { "message": "I-lock", "description": "Verb form: to make secure or inaccesible by" }, "trash": { - "message": "Trash", + "message": "Basurahan", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Search trash" + "message": "Maghanap ng basurahan" }, "permanentlyDeleteItem": { - "message": "Permanently delete item" + "message": "Permanenteng tanggalin ang item" }, "permanentlyDeleteItemConfirmation": { - "message": "Are you sure you want to permanently delete this item?" + "message": "Sigurado ka bang gusto mong tuluyang tanggalin ang item na ito?" }, "permanentlyDeletedItem": { - "message": "Item permanently deleted" + "message": "Item permanenteng tinanggal" }, "restoreItem": { - "message": "Restore item" - }, - "restoreItemConfirmation": { - "message": "Sigurado ka bang nais mong ibalik ang item na ito?" + "message": "Ibalik ang item" }, "restoredItem": { "message": "Item na nai-restore" @@ -1434,7 +1532,7 @@ "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?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "Pagkumpirma ng pagkilos ng timeout" }, "autoFillAndSave": { "message": "Auto-fill at i-save" @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item na auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Itakda ang master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "Bagong master password" + }, + "confirmNewMasterPass": { + "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:" }, @@ -1509,13 +1634,13 @@ "message": "Ok" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Pag verify ng pag sync ng desktop" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Mangyaring i verify na ipinapakita ng desktop application ang fingerprint na ito: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not set up" + "message": "Hindi naka set up ang pagsasama ng browser" }, "desktopIntegrationDisabledDesc": { "message": "Ang browser integration ay hindi naka-set up sa Bitwarden desktop application. Paki-set up ito sa settings sa loob ng desktop application." @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Ang browser biometrics ay hindi sinusuportahan sa device na ito." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permiso ay hindi ibinigay" }, @@ -1574,12 +1705,18 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ay hindi isang valid domain", "placeholders": { @@ -1605,7 +1742,7 @@ "message": "Teksto" }, "sendTypeFile": { - "message": "File" + "message": "Mag-file" }, "allSends": { "message": "Lahat ng Mga Padala", @@ -1638,7 +1775,7 @@ "message": "Password binura" }, "deletedSend": { - "message": "Send deleted", + "message": "Ipadala ang tinanggal", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1704,7 +1841,7 @@ "message": "Pasadyang" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Pinakamataas na Bilang ng Access" }, "maximumAccessCountDesc": { "message": "Kung nakatakda, ang mga user ay hindi na maaaring ma-access ang Send na ito pagkatapos makarating sa maximum access count.", @@ -1814,22 +1951,25 @@ "message": "Ang aksyon na ito ay naka-protekta. Upang magpatuloy, pakisagutan muli ang iyong master password upang tiyakin ang iyong pagkakakilanlan." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "Kailangan ang pag verify ng email" }, "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." }, "updatedMasterPassword": { - "message": "Updated master password" + "message": "I-update ang master password" }, "updateMasterPassword": { - "message": "Update master password" + "message": "Update master password - I-update ang master password" }, "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": "Ang iyong master password ay binago kamakailan ng isang administrator sa iyong samahan. Para ma-access ang vault, kailangan mo itong i-update ngayon. Ang proceeding ay mag-log out sa iyong kasalukuyang session, na nangangailangan na mag-log in muli. Ang mga aktibong sesyon sa iba pang mga aparato ay maaaring patuloy na manatiling aktibo hanggang sa isang oras." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic enrollment" + "message": "Awtomatikong pagpapatala" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Ang organisasyon na ito ay may enterprise policy na automatikong mag-eenroll sa iyo sa password reset. Ang enrollment ay magbibigay ng mga administrator ng organisasyon upang mabago ang iyong master password." @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Oras" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Ang iyong vault timeout ay lumalampas sa mga restriksiyon na itinakda ng iyong organisasyon." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Nag-export ng indibidwal na vault" }, - "exportingPersonalVaultDescription": { - "message": "Lamang ang mga item ng indibidwal na vault na nauugnay sa $EMAIL$ ang maie-export. Hindi kasama ang mga item ng vault ng organisasyon.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1917,35 +2088,35 @@ } }, "error": { - "message": "Error" + "message": "Mali" }, "regenerateUsername": { - "message": "Regenerate username" + "message": "Muling bumuo ng username" }, "generateUsername": { - "message": "Generate username" + "message": "Lumikha ng username" }, "usernameType": { - "message": "Username type" + "message": "Uri ng username" }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "Plus na naka-address na email", "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": "Gamitin ang mga kakayahan ng sub address ng iyong email provider." }, "catchallEmail": { - "message": "Catch-all email" + "message": "Catch-all na email" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Gamitin ang naka configure na inbox ng catch all ng iyong domain." }, "random": { "message": "Random" }, "randomWord": { - "message": "Random word" + "message": "Random na salita" }, "websiteName": { "message": "Pangalan ng website" @@ -1963,10 +2134,10 @@ "message": "Ipinasa ang alias ng email" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Bumuo ng isang email alias na may isang panlabas na serbisyo sa pagpapasa." }, "hostname": { - "message": "Hostname", + "message": "Pangalan ng Hostname", "description": "Part of a URL." }, "apiAccessToken": { @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Mga item sa mga naka-suspindong Organisasyon ay hindi ma-access. Mangyaring makipag-ugnayan sa may-ari ng iyong Organisasyon para sa tulong." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Nag-lolog in sa $DOMAIN$", "placeholders": { @@ -2009,10 +2177,10 @@ "message": "i-reset sa pre-configured na mga setting" }, "serverVersion": { - "message": "Server version" + "message": "Bersyon ng server" }, - "selfHosted": { - "message": "Auto-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Ika-tatlong-partido" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Tandaan ang email" }, + "loginWithDevice": { + "message": "Mag log in gamit ang device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Ang pag log in gamit ang device ay dapat na naka set up sa mga setting ng Bitwarden app. Kailangan mo ng ibang opsyon?" + }, + "fingerprintPhraseHeader": { + "message": "Hulmabig ng Hilik ng Dako" + }, + "fingerprintMatchInfo": { + "message": "Mangyaring tiyakin na ang iyong vault ay naka unlock at ang parirala ng Fingerprint ay tumutugma sa kabilang aparato." + }, + "resendNotification": { + "message": "Muling ipadala ang abiso" + }, + "viewAllLoginOptions": { + "message": "Tingnan ang lahat ng mga pagpipilian sa pag log in" + }, + "notificationSentDevice": { + "message": "Naipadala na ang notification sa iyong device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Nakalantad na Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Ang mga patakaran ng iyong organisasyon ay nagbigay ng pag-automatikong pag-load sa pahina." + }, + "howToAutofill": { + "message": "Paano mag-auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Nakuha ko" + }, + "autofillSettings": { + "message": "Mga setting ng auto-fill" + }, + "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." + }, + "autofillShortcutText": { + "message": "Ang shortcut ng auto-fill ay: $COMMAND$. Baguhin ito sa mga setting ng browser.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default shortcut ng auto-fill: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index e152e207d801..84991609bdac 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Saisie automatique" }, + "autoFillLogin": { + "message": "Saisie automatique de l'identifiant" + }, + "autoFillCard": { + "message": "Saisie automatique de la carte" + }, + "autoFillIdentity": { + "message": "Saisie automatique de l'identité" + }, "generatePasswordCopied": { "message": "Générer un mot de passe (copié)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Aucun identifiant correspondant." }, + "noCards": { + "message": "Aucune carte" + }, + "noIdentities": { + "message": "Aucune identité" + }, + "addLoginMenu": { + "message": "Ajouter un identifiant" + }, + "addCardMenu": { + "message": "Ajouter une carte" + }, + "addIdentityMenu": { + "message": "Ajouter une identité" + }, "unlockVaultMenu": { "message": "Déverrouillez votre coffre" }, @@ -110,7 +134,7 @@ "message": "Il n'y a pas d'identifiants disponibles à saisir automatiquement pour l'onglet actuel du navigateur." }, "addLogin": { - "message": "Ajouter un site" + "message": "Ajouter un identifiant" }, "addItem": { "message": "Ajouter un élément" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Aide et commentaires" }, + "helpCenter": { + "message": "Centre d'aide Bitwarden" + }, + "communityForums": { + "message": "Explorez les forums de la communauté Bitwarden" + }, + "contactSupport": { + "message": "Contacter le support Bitwarden" + }, "sync": { "message": "Synchroniser" }, @@ -215,7 +248,7 @@ "message": "Générer automatiquement des mots de passe robustes et uniques pour vos identifiants." }, "bitWebVault": { - "message": "Coffre en ligne de bitwarden" + "message": "Coffre web bitwarden" }, "importItems": { "message": "Importer des éléments" @@ -258,7 +291,7 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Inclure le numéro" + "message": "Inclure un nombre" }, "minNumbers": { "message": "Minimum de chiffres" @@ -329,6 +362,12 @@ "other": { "message": "Autre" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Configurez une méthode de déverrouillage pour changer le délai d'attente de votre coffre." + }, + "unlockMethodNeeded": { + "message": "Configurer une méthode de déverrouillage dans Paramètres" + }, "rateExtension": { "message": "Noter l'extension" }, @@ -339,7 +378,7 @@ "message": "Votre navigateur web ne supporte pas la copie rapide depuis le presse-papier. Copiez-le manuellement à la place." }, "verifyIdentity": { - "message": "Confirmer votre identité" + "message": "Vérifier l'identité" }, "yourVaultIsLocked": { "message": "Votre coffre est verrouillé. Vérifiez votre identité pour continuer." @@ -369,6 +408,9 @@ "lockNow": { "message": "Verrouiller maintenant" }, + "lockAll": { + "message": "Tout verrouiller" + }, "immediately": { "message": "Immédiatement" }, @@ -430,7 +472,14 @@ "message": "Une nouvelle saisie du mot de passe principal est nécessaire." }, "masterPasswordMinlength": { - "message": "Le mot de passe principal doit comporter au moins 8 caractères." + "message": "Le mot de passe principal doit comporter au moins $VALUE$ caractères.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "La confirmation du mot de passe principal ne correspond pas." @@ -458,7 +507,7 @@ } }, "autofillError": { - "message": "Impossible de saisir automatiquement l'élément sélectionné sur cette page. Plutôt copiez-collez l'information." + "message": "Impossible de saisir automatiquement l'élément sélectionné sur cette page. Copiez-collez plutôt l'information." }, "loggedOut": { "message": "Déconnecté" @@ -552,7 +601,7 @@ "message": "Êtes-vous sûr de vouloir écraser le mot de passe actuel ?" }, "overwriteUsername": { - "message": "Remplacer le nom d'utilisateur" + "message": "Écraser le nom d'utilisateur" }, "overwriteUsernameConfirmation": { "message": "Êtes-vous sûr(e) de vouloir remplacer le nom d'utilisateur actuel ?" @@ -567,7 +616,7 @@ "message": "Rechercher dans le type" }, "noneFolder": { - "message": "Pas de dossier", + "message": "Aucun dossier", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Demander à ajouter un élément si aucun n'est trouvé dans votre coffre." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Afficher les cartes sur la page de l'onglet" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Demander à mettre à jour le mot de passe d'un identifiant lorsqu'un changement est détecté sur 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": "Demander à enregistrer et utiliser les mots de passe" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Souhaitez-vous mettre à jour ce mot de passe dans Bitwarden ?" }, "notificationChangeSave": { "message": "Mettre à jour" }, + "notificationUnlockDesc": { + "message": "Déverrouillez votre coffre Bitwarden pour terminer la demande de saisie automatique." + }, + "notificationUnlock": { + "message": "Déverrouiller" + }, "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. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Détection de correspondance URI par défaut", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Modifier le thème de couleur de l'application." }, + "themeDescAlt": { + "message": "Modifier le thème de couleur de l'application. S'applique à tous les comptes connectés." + }, "dark": { "message": "Sombre", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Fonctionnalité non disponible" }, - "updateKey": { - "message": "Vous ne pouvez pas utiliser cette fonctionnalité avant de mettre à jour votre clé de chiffrement." + "encryptionKeyMigrationRequired": { + "message": "Migration de la clé de chiffrement nécessaire. Veuillez vous connecter sur le coffre web pour mettre à jour votre clé de chiffrement." }, "premiumMembership": { "message": "Adhésion Premium" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 Go de stockage chiffré pour les fichiers joints." }, - "ppremiumSignUpTwoStep": { - "message": "Options additionnelles d'identification à deux étapes telles que YubiKey, FIDO U2F et Duo." + "premiumSignUpTwoStepOptions": { + "message": "Options de connexion propriétaires à deux facteurs telles que YubiKey et Duo." }, "ppremiumSignUpReports": { "message": "Hygiène du mot de passe, santé du compte et rapports sur les brèches de données pour assurer la sécurité de votre coffre." @@ -873,7 +946,7 @@ "message": "Identifiant non disponible" }, "noTwoStepProviders": { - "message": "Ce compte dispose d'une authentification à deux facteurs mise en place, mais aucun des fournisseurs d'authentification à deux facteurs configurés ne sont pris en charge par ce navigateur web." + "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." }, "noTwoStepProviders2": { "message": "Merci d'utiliser un navigateur web compatible (comme Chrome) et/ou d'ajouter des services additionnels d'identification en deux étapes qui sont mieux supportés par les navigateurs web (comme par exemple une application d'authentification)." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Les URLs d'environnement ont été enregistrées." }, + "showAutoFillMenuOnFormFields": { + "message": "Afficher le menu de saisie automatique sur les champs du formulaire", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Appliquer à tous les comptes connectés." + }, + "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": "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" + }, "enableAutoFillOnPageLoad": { "message": "Saisir automatiquement au chargement de la page" }, @@ -960,13 +1058,13 @@ "message": "Si un formulaire de connexion est détecté, saisir automatiquement lors du chargement de la page web." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Les sites web compromis ou non fiables peuvent exploiter la saisie automatique au chargement de la page." }, "learnMoreAboutAutofill": { "message": "En savoir plus sur la saisie automatique" }, "defaultAutoFillOnPageLoad": { - "message": "Paramètre de saisie automatique par défaut pour les identifiants" + "message": "Paramètre de saisie automatique par défaut pour les éléments de connexion" }, "defaultAutoFillOnPageLoadDesc": { "message": "Vous pouvez désactiver la saisie automatique au chargement de la page pour les éléments de connexion individuels à partir de la vue Éditer l'élément." @@ -1040,11 +1138,14 @@ "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." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Afficher le compteur de badge" }, @@ -1136,7 +1237,7 @@ "message": "Deuxième prénom" }, "lastName": { - "message": "Nom" + "message": "Nom de famille" }, "fullName": { "message": "Nom et prénom" @@ -1396,7 +1497,7 @@ "message": "Cloner" }, "passwordGeneratorPolicyInEffect": { - "message": "Une ou plusieurs politiques d'organisation affectent les paramètres de votre générateur." + "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur." }, "vaultTimeoutAction": { "message": "Action après délai d'expiration du coffre" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restaurer l'élément" }, - "restoreItemConfirmation": { - "message": "Êtes-vous sûr de vouloir restaurer cet élément ?" - }, "restoredItem": { "message": "Élément restauré" }, @@ -1445,11 +1543,38 @@ "autoFillSuccess": { "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)." + }, + "insecurePageWarningFillPrompt": { + "message": "Voulez-vous toujours saisir automatiquement cet identifiant ?" + }, + "autofillIframeWarning": { + "message": "Le formulaire est hébergé par un domaine différent de l'URI d'enregistrement de votre identifiant. Choisissez OK pour poursuivre la saisie automatique, ou Annuler pour arrêter." + }, + "autofillIframeWarningTip": { + "message": "À l'avenir, pour éviter cet avertissement, enregistrez cet URI, $HOSTNAME$, dans votre élément de connexion Bitwarden pour ce site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Définir le mot de passe principal" }, + "currentMasterPass": { + "message": "Mot de passe principal actuel" + }, + "newMasterPass": { + "message": "Nouveau mot de passe principal" + }, + "confirmNewMasterPass": { + "message": "Confirmer le nouveau mot de passe principal" + }, "masterPasswordPolicyInEffect": { - "message": "Une ou plusieurs politiques de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes :" + "message": "Une ou plusieurs politiques de sécurité de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes :" }, "policyInEffectMinComplexity": { "message": "Score de complexité minimum de $SCORE$", @@ -1488,13 +1613,13 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "Votre nouveau mot de passe principal ne répond pas aux exigences en matière de politique de sécurité." + "message": "Votre nouveau mot de passe principal ne répond pas aux exigences de politique de sécurité." }, "acceptPolicies": { - "message": "En cochant cette case, vous acceptez les éléments suivants :" + "message": "En cochant cette case vous acceptez ce qui suit :" }, "acceptPoliciesRequired": { - "message": "Les Conditions d'Utilisation et la Politique de Confidentialité n'ont pas été acceptées." + "message": "Les conditions d'utilisation et la politique de confidentialité n'ont pas été acceptées." }, "termsOfService": { "message": "Conditions d'utilisation" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Le déverrouillage biométrique dans le navigateur n’est pas pris en charge sur cet appareil" }, + "biometricsFailedTitle": { + "message": "Le déverrouillage biométique a échoué\n" + }, + "biometricsFailedDesc": { + "message": "Impossible d'utiliser le déverrouillage biométrique, utilisez votre mot de passe principal ou déconnectez-vous. Si le problème persiste, veuillez contacter le support Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission non accordée" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Une politique d'organisation affecte vos options de propriété." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." }, + "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ n'est pas un domaine valide", "placeholders": { @@ -1802,7 +1939,7 @@ "message": "Masquer mon adresse électronique aux destinataires." }, "sendOptionsPolicyInEffect": { - "message": "Une ou plusieurs politiques d'organisation affectent vos options Send." + "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent vos options Send." }, "passwordPrompt": { "message": "Ressaisir le mot de passe principal" @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Votre mot de passe principal a été récemment changé par un administrateur de votre organisation. Pour pouvoir accéder au coffre, vous devez le mettre à jour maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuvent rester actives pendant encore une heure." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Inscription automatique" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Heures" @@ -1847,7 +1992,20 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Les politiques de votre organisation affectent le délai d'expiration de votre coffre-fort. Le délai d'expiration maximal autorisé est de $HOURS$ heure(s) et $MINUTES$ minute(s)", + "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": { + "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": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Les politiques de sécurité de votre organisation ont défini l'action après délai d'expiration de votre coffre à $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1866,7 +2037,7 @@ "message": "Export du coffre désactivé" }, "personalVaultExportPolicyInEffect": { - "message": "Une ou plusieurs politiques d'organisation vous empêchent d'exporter votre coffre personnel." + "message": "Une ou plusieurs politiques de sécurité de l'organisation vous empêchent d'exporter votre coffre individuel." }, "copyCustomFieldNameInvalidElement": { "message": "Aucun élément de formulaire valide n'a pu être identifié. Essayez plutôt d'inspecter le HTML." @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Export du coffre personnel" }, - "exportingPersonalVaultDescription": { - "message": "Seuls les éléments individuels du coffre associés à $EMAIL$ seront exportés. Les éléments du coffre de l'organisation ne seront pas inclus.", + "exportingIndividualVaultDescription": { + "message": "Seuls les éléments individuels du coffre associés à $EMAIL$ seront exportés. Les éléments du coffre de l'organisation ne seront pas inclus. Seules les informations sur les éléments du coffre seront exportées et n'incluront pas les pièces jointes associées.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Les éléments des organisations suspendues ne sont pas accessibles. Contactez le propriétaire de votre organisation pour obtenir de l'aide." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Connexion à $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Version du serveur" }, - "selfHosted": { - "message": "Auto-hébergé" + "selfHostedServer": { + "message": "auto-hébergé" }, "thirdParty": { "message": "Tierce partie" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Se souvenir du courriel" }, + "loginWithDevice": { + "message": "Se connecter avec l'appareil" + }, + "loginWithDeviceEnabledInfo": { + "message": "La connexion avec l'appareil doit être configurée dans les paramètres de l'application Bitwarden. Besoin d'une autre option ?" + }, + "fingerprintPhraseHeader": { + "message": "Phrase d'empreinte" + }, + "fingerprintMatchInfo": { + "message": "Veuillez vous assurer que votre coffre est déverrouillé et que la phrase d'empreinte correspond à celle de l'autre appareil." + }, + "resendNotification": { + "message": "Renvoyer la notification" + }, + "viewAllLoginOptions": { + "message": "Afficher toutes les options de connexion" + }, + "notificationSentDevice": { + "message": "Une notification a été envoyée à votre appareil." + }, + "loginInitiated": { + "message": "Connexion initiée" + }, "exposedMasterPassword": { "message": "Mot de passe principal exposé" }, @@ -2072,12 +2264,558 @@ "message": "Votre mot de passe principal ne peut pas être récupéré si vous l'oubliez !" }, "characterMinimum": { - "message": "Caractère minimum $LENGTH$", + "message": "$LENGTH$ caractère minimum", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Les politiques de sécurité de votre organisation ont activé la saisie automatique lors du chargement de la page." + }, + "howToAutofill": { + "message": "Comment saisir automatiquement" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Compris" + }, + "autofillSettings": { + "message": "Paramètres de saisie automatique" + }, + "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." + }, + "autofillShortcutText": { + "message": "Le raccourci de saisie automatique est : $COMMAND$. Changez-le dans les paramètres du navigateur.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Raccourci de saisie automatique par défaut : $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Connexion sur" + }, + "opensInANewWindow": { + "message": "S'ouvre dans une nouvelle fenêtre" + }, + "deviceApprovalRequired": { + "message": "L'approbation de l'appareil est requise. Sélectionnez une option d'approbation ci-dessous :" + }, + "rememberThisDevice": { + "message": "Se souvenir de cet appareil" + }, + "uncheckIfPublicDevice": { + "message": "Décocher si vous utilisez un appareil public" + }, + "approveFromYourOtherDevice": { + "message": "Approuver sur votre autre appareil" + }, + "requestAdminApproval": { + "message": "Demander l'approbation de l'administrateur" + }, + "approveWithMasterPassword": { + "message": "Approuver avec le mot de passe principal" + }, + "ssoIdentifierRequired": { + "message": "Identifiant SSO de l'organisation requis." + }, + "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." + }, + "general": { + "message": "Général" + }, + "display": { + "message": "Affichage" + }, + "accountSuccessfullyCreated": { + "message": "Compte créé avec succès !" + }, + "adminApprovalRequested": { + "message": "Approbation de l'administrateur demandée" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Demande transmise à votre administrateur." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Vous serez notifié une fois approuvé." + }, + "troubleLoggingIn": { + "message": "Problème pour vous connecter ?" + }, + "loginApproved": { + "message": "Connexion approuvée" + }, + "userEmailMissing": { + "message": "Courriel de l'utilisateur manquant" + }, + "deviceTrusted": { + "message": "Appareil de confiance" + }, + "inputRequired": { + "message": "Saisie requise." + }, + "required": { + "message": "requis" + }, + "search": { + "message": "Rechercher" + }, + "inputMinLength": { + "message": "La saisie doit comporter au moins $COUNT$ caractères.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "La saisie ne doit pas dépasser $COUNT$ caractères de long.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Les caractères suivants ne sont pas autorisés : $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "La valeur d'entrée doit être au moins de $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "La valeur d'entrée ne doit pas excéder $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Une ou plusieurs adresses e-mail ne sont pas valides" + }, + "inputTrimValidator": { + "message": "La saisie ne doit pas contenir que des espaces.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "La saisie n'est pas une adresse e-mail." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ champ(s) ci-dessus nécessitent votre attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Sélectionner --" + }, + "multiSelectPlaceholder": { + "message": "-- Saisir pour filtrer --" + }, + "multiSelectLoading": { + "message": "Récupération des options..." + }, + "multiSelectNotFound": { + "message": "Aucun élément trouvé" + }, + "multiSelectClearAll": { + "message": "Effacer tout" + }, + "plusNMore": { + "message": "+ $QUANTITY$ de plus", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Sous-menu" + }, + "toggleCollapse": { + "message": "Déplier/Replier", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "bitwardenOverlayButton": { + "message": "Bouton menu de saisie automatique Bitwarden", + "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." + }, + "unlockAccount": { + "message": "Déverrouiller le compte", + "description": "Button text to display in overlay when the account is locked." + }, + "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": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "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": "Activer" + }, + "ignore": { + "message": "Ignorer" + }, + "importData": { + "message": "Import data", + "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" + } + } + }, + "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" + } + } + }, + "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": "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." + }, + "importDestination": { + "message": "Import 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": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choisir le fichier" + }, + "noFileChosen": { + "message": "Aucun fichier choisi" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "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" + }, + "typePasskey": { + "message": "Clé d'accès" + }, + "passkeyNotCopied": { + "message": "La clé d'accès ne sera pas copiée" + }, + "passkeyNotCopiedAlert": { + "message": "La clé d'accès ne sera pas présente sur l'entrée clonée. Continuer quand même ?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Le site requiert une vérification qui n'est pas supportée pour les comptes sans mot de passe maître." + }, + "logInWithPasskey": { + "message": "Se connecter avec une clé d'accès ?" + }, + "passkeyAlreadyExists": { + "message": "Une clé d'accès existe déjà pour cette application." + }, + "noPasskeysFoundForThisApplication": { + "message": "Aucune clé d'accès trouvée pour cette application." + }, + "noMatchingPasskeyLogin": { + "message": "Vous n'avez aucun élément correspondant à ce site." + }, + "confirm": { + "message": "Confirmer" + }, + "savePasskey": { + "message": "Enregistrer la clé d'accès" + }, + "savePasskeyNewLogin": { + "message": "Enregistrer comme nouvel élément" + }, + "choosePasskey": { + "message": "Choisissez l'élément à associer à la clé d'accès" + }, + "passkeyItem": { + "message": "Élément avec clé d'accès" + }, + "overwritePasskey": { + "message": "Écraser la clé d'accès existante ?" + }, + "overwritePasskeyAlert": { + "message": "Cet élément contient déjà une clé d'accès. Voulez-vous vraiment l'écraser ?" + }, + "featureNotSupported": { + "message": "Fonctionnalité non supportée" + }, + "yourPasskeyIsLocked": { + "message": "Authentification requise pour utiliser cette clé d'accès. Veuillez vérifier votre identité pour continuer." + }, + "useBrowserName": { + "message": "Utiliser le navigateur" + }, + "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" + }, + "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": "Please continue to log in using your company credentials." + }, + "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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index ddda55bfd0ac..ab3933bf5b77 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index d0f621d6b86c..c195d4cb9604 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "השלמה אוטומטית" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "צור סיסמה (העתק)" }, @@ -100,6 +109,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": "שחרור הכספת שלך" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "עזרה ומשוב" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "סנכרן" }, @@ -329,6 +362,12 @@ "other": { "message": "אחר" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "דירוג הרחבה" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "נעל עכשיו" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "באופן מיידי" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "שדה אימות סיסמה ראשית לא תואם." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "ההודעה \"שמור פרטי כניסה\" מופיעה בכל פעם שתכנס לאתר חדש בפעם הראשונה." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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?" }, "notificationChangeSave": { "message": "כן, עדכן עכשיו" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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": "ברירת מחדל לזיהוי התאמת כתובות", @@ -633,6 +703,9 @@ "themeDesc": { "message": "שנה את ערכת הצבע של האפליקציה." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "כהה", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "יכולת זו לא זמינה" }, - "updateKey": { - "message": "לא ניתן להשתמש ביכולת זו עד שתעדכן את מפתח ההצפנה שלך." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "חשבון פרימיום" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים." }, - "ppremiumSignUpTwoStep": { - "message": "אפשרויות כניסה דו שלבית מתקדמות כמו YubiKey, FIDO U2F, וגם Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "כתובות הסביבה נשמרו." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "הפעל השלמה אוטומטית בזמן טעינת העמוד" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "שחזר פריט" }, - "restoreItemConfirmation": { - "message": "האם אתה בטוח שברצונך לשחזר פריט זה?" - }, "restoredItem": { "message": "פריט ששוחזר" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "בוצעה השלמה אוטומטית" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "הגדר סיסמה ראשית" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "אחד או יותר מאילוצי המדיניות של הארגון דורשים שהסיסמה הראשית שלך תעמוד בדרישות הבאות:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "מכשיר זה לא תומך בזיהוי ביומטרי בדפדפן." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "הרשאה לא סופקה" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "מדיניות ארגונית משפיעה על אפשרויות הבעלות שלך." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "הזמן הקצוב לכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "הכספת האישית מיוצאת" }, - "exportingPersonalVaultDescription": { - "message": "רק פריטי הכספת האישית שמשויכת אל $EMAIL$ ייוצאו. פריטי הכספת הארגוניים לא יהיו חלק מהייצוא.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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": "כללי" + }, + "display": { + "message": "תצוגה" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "ייבוא נתונים", + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "יעד ייבוא" + }, + "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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index df1566dbe533..99b9dfa3cbff 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "स्वत:भरण" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generate Password (copied)" }, @@ -100,6 +109,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": "आपकी तिजोरी का ताला खोलें" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & Feedback" }, + "helpCenter": { + "message": "बिटवॉर्डेन सहायता केंद्र" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "बिटवॉर्डेन सहायता से संपर्क करें" + }, "sync": { "message": "सिंक" }, @@ -329,6 +362,12 @@ "other": { "message": "अन्य" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the Extension" }, @@ -348,7 +387,7 @@ "message": "ताला खोलें" }, "loggedInAsOn": { - "message": "पर के रूप में लॉग इन किया ।", + "message": "$HOSTNAME$ पर $EMAIL$ के रूप में लॉग इन किया है।", "placeholders": { "email": { "content": "$1", @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock Now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "तत्‍काल" }, @@ -430,7 +472,14 @@ "message": "मास्टर पासवर्ड पुनः डालने की आवश्यकता है।" }, "masterPasswordMinlength": { - "message": "मास्टर पासवर्ड कम से कम 8 वर्ण लंबा होना चाहिए।" + "message": "मास्टर पासवर्ड कम से कम $VALUE$ अक्षर लंबा होना चाहिए।", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "मास्टर पासवर्ड पुष्टि मेल नहीं खाती है।" @@ -448,7 +497,7 @@ "message": "सत्यापन कोड अवैध है" }, "valueCopied": { - "message": " copied", + "message": "$VALUE$ कॉपी हो गया है।", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "टैब पेज पर कार्ड दिखाएं" }, @@ -608,18 +660,36 @@ "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": "क्या आप बिटवर्डन में इस पासवर्ड को अपडेट करना चाहते हैं?" }, "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature Unavailable" }, - "updateKey": { - "message": "जब तक आप अपनी एन्क्रिप्शन कुंजी को अपडेट नहीं करते, तब तक आप इस सुविधा का उपयोग नहीं कर सकते हैं।" + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium Membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, - "ppremiumSignUpTwoStep": { - "message": "अतिरिक्त दो-चरण लॉगिन विकल्प जैसे YubiKey, FIDO U2F, और डुओ।" + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "अपनी वॉल्ट को सुरक्षित रखने के लिए पासवर्ड स्वच्छता, खाता स्वास्थ्य और डेटा उल्लंघन रिपोर्ट।" @@ -798,7 +871,7 @@ "message": "Thank you for supporting bitwarden." }, "premiumPrice": { - "message": "All for just %price% /year!", + "message": "All for just $PRICE$ /year!", "placeholders": { "price": { "content": "$1", @@ -828,7 +901,7 @@ "message": "अपने ऑथेंटिकेटर ऐप से 6 डिजिट वेरिफिकेशन कोड डालें।" }, "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to", + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "पर्यावरण URL को बचाया गया है।" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Enable Auto-fill On Page Load." }, @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "प्रत्येक लॉगिन के आगे एक पहचानने योग्य छवि दिखाएं।" }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "बैज काउंटर दिखाएं" }, @@ -1242,7 +1343,7 @@ "message": "चेक करें कि पासवर्ड सामने आ गया है या नहीं।" }, "passwordExposed": { - "message": "This password has been exposed in data breaches. You should change it.", + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", "placeholders": { "value": { "content": "$1", @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "आइटम बहाल करें" }, - "restoreItemConfirmation": { - "message": "क्या आप सुनिश्चित हैं कि आप इस आइटम को बहाल करना चाहते हैं?" - }, "restoredItem": { "message": "बहाल आइटम" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "ऑटो फिल आइटम" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "मास्टर पासवर्ड सेट करें" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "एक या एक से अधिक संगठन नीतियों को निम्नलिखित आवश्यकताओं को पूरा करने के लिए आपके मास्टर पासवर्ड की आवश्यकता होती है:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "ब्राउज़र बॉयोमीट्रिक्स इस डिवाइस पर समर्थित नहीं है।" }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "अनुमति नहीं दी गयी है" }, @@ -1574,14 +1705,20 @@ "personalOwnershipPolicyInEffect": { "message": "एक संगठन नीति आपके स्वामित्व विकल्पों को प्रभावित कर रही है।" }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN $ एक वैध डोमेन नहीं है", + "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", @@ -1692,7 +1829,7 @@ "message": "1 दिन" }, "days": { - "message": "#DAYS# दिन", + "message": "$DAYS$ days", "placeholders": { "days": { "content": "$1", @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "आपका मास्टर पासवर्ड हाल ही में आपके संगठन के एक व्यवस्थापक द्वारा बदल दिया गया था। तिजोरी तक पहुँचने के लिए, आपको इसे अभी अपडेट करना होगा। ये कार्यवाही आपको अपने वर्तमान सत्र से लॉग आउट कर देगी, जिसके लिए आपको वापस लॉग इन करने की आवश्यकता होगी। अन्य उपकरणों पर सक्रिय सत्र एक घंटे तक सक्रिय रह सकते हैं।" }, + "updateWeakMasterPasswordWarning": { + "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, "resetPasswordPolicyAutoEnroll": { "message": "स्वचालित नामांकन" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "फ़ोल्डर चुनें..." }, - "ssoCompleteRegistration": { - "message": "SSO के साथ लॉग-इन पूर्ण करने के लिए, कृपया अपनी तिजोरी तक पहुँचने और सुरक्षित रखने के लिए एक मास्टर पासवर्ड सेट करें।" + "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" }, "hours": { "message": "घंटे" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "आपके तिजोरी टाइमआउट का समय आपके संगठन द्वारा निर्धारित प्रतिबंधों से अधिक है।" }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "exportingIndividualVaultDescription": { + "message": "केवल $EMAIL$ से संबद्ध, व्यक्तिगत वॉल्ट वस्तुएँ निर्यात की जाएंगी. संगठन वॉल्ट वस्तुएँ शामिल नहीं की जाएंगी. केवल वॉल्ट वस्तुओं की जानकारी निर्यात की जाएगी और इसमें संबंधित अनुलग्नक शामिल नहीं होंगे.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "ईमेल याद रखें" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "ऑटो-फ़िल कैसे करें" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "डोमेन उपनाम" + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index aa1d6ce4406d..c338a11edfe4 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Pomoć i povratne informacije" }, + "helpCenter": { + "message": "Bitwarden centar za pomoć" + }, + "communityForums": { + "message": "Istraži forume zajednice Bitwarden" + }, + "contactSupport": { + "message": "Kontaktiraj Bitwarden pomoć" + }, "sync": { "message": "Sinkronizacija" }, @@ -329,6 +362,12 @@ "other": { "message": "Ostalo" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Za promjenu vremena isteka trezora, odredi način otključavanja." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Ocijeni proširenje" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Zaključaj sada" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Odmah" }, @@ -430,7 +472,14 @@ "message": "Potreban je ponovni unos glavne lozinke." }, "masterPasswordMinlength": { - "message": "Glavna lozinka mora imati najmanje 8 znakova." + "message": "Glavna lozinka mora imati najmanje $VALUE$ znakova.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Potvrda glavne lozinke se ne podudara." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Prikaži platne kartice" }, @@ -608,18 +660,36 @@ "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 i 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?" }, "notificationChangeSave": { "message": "Ažuriraj" }, + "notificationUnlockDesc": { + "message": "Za dovršetak auto-ispune, otključaj svoj trezor." + }, + "notificationUnlock": { + "message": "Otključaj" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Promijeni temu boja." }, + "themeDescAlt": { + "message": "Promijeni boju aplikacije. Primjenjuje se na sve prijavljene račune." + }, "dark": { "message": "Tamna", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Značajka nije dostupna" }, - "updateKey": { - "message": "Ne možeš koristiti ovu značajku prije nego ažuriraš ključ za šifriranje." + "encryptionKeyMigrationRequired": { + "message": "Potrebna je migracija ključa za šifriranje. Prijavi se na web trezoru za ažuriranje ključa za šifriranje." }, "premiumMembership": { "message": "Premium članstvo" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB šifriranog prostora za pohranu podataka." }, - "ppremiumSignUpTwoStep": { - "message": "Dodatne mogućnosti za prijavu dvostrukom autentifikacijom kao što su YubiKey, FIDO U2F i Duo." + "premiumSignUpTwoStepOptions": { + "message": "Mogućnosti za prijavu u dva koraka kao što su YubiKey i Duo." }, "ppremiumSignUpReports": { "message": "Higijenu lozinki, zdravlje računa i izvještaje o krađi podatak radi zaštite svojeg trezora." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Primjenjuje se na sve prijavljene račune." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-ispuna kod učitavanja" }, @@ -960,10 +1058,10 @@ "message": "Nakon učitavanja web stranice, ako je otkriven obrazac za prijavu, auto-ispuni." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Ugrožene ili nepouzdane web stranice mogu iskoristiti auto-ispunu prilikom učitavanja stranice." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Saznaj više o auto-ispuni" }, "defaultAutoFillOnPageLoad": { "message": "Zadana postvaka Auto-ispune za prijave" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Prikaži prepoznatljivu sliku pored svake prijave." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Prikaži značku brojača" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Vrati stavku" }, - "restoreItemConfirmation": { - "message": "Sigurno želiš vratiti ovu stavku?" - }, "restoredItem": { "message": "Stavka vraćena" }, @@ -1434,7 +1532,7 @@ "message": "Odjava će ukloniti pristup tvom trezoru i zahtijevati mrežnu potvrdu identiteta nakon isteka vremenske neaktivnosti. Sigurno želiš koristiti ovu postavku?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Potvrda akcije vremenske neaktivnosti" + "message": "Potvrda radnje nakon vremenske neaktivnosti" }, "autoFillAndSave": { "message": "Auto-ispuni i spremi" @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Auto-ispunjena stavka" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "message": "Želiš li i dalje ispuniti ove podatke za prijavu?" + }, + "autofillIframeWarning": { + "message": "Obrazac je na poslužitelju koji se nalazi na drugačijoj domeni od URI-a za koji su spremljeni tvoji podaci za pristup. Odobri za auto-ispunu ili odustani za prekid." + }, + "autofillIframeWarningTip": { + "message": "Kako se ovo upozorenje ubuduće ne bi prikazivalo, spremi ovaj URI ( $HOSTNAME$) u svoju stavku za prijavu.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Postavi glavnu lozinku" }, + "currentMasterPass": { + "message": "Trenutna glavna lozinka" + }, + "newMasterPass": { + "message": "Nova glavna lozinka" + }, + "confirmNewMasterPass": { + "message": "Potvrdi novu glavnu lozinku" + }, "masterPasswordPolicyInEffect": { "message": "Jedno ili više pravila organizacije zahtijeva da tvoja glavna lozinka ispunjava sljedeće uvjete:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrija preglednika nije podržana na ovom uređaju." }, + "biometricsFailedTitle": { + "message": "Biometrija neuspješna" + }, + "biometricsFailedDesc": { + "message": "Biometrija se ne može dovršiti. Pokušaj glavnom lozinkom ili se odjavi i ponovno prijavi. Ako se ovo nastavi, obrati se Bitwarden podršci." + }, "nativeMessaginPermissionErrorTitle": { "message": "Dopuštenje nije dano" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Pravila organizacije utječu na tvoje mogućnosti vlasništva. " }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organizacijsko pravilo onemogućuje uvoz stavki u tvoj osobni trezor." + }, "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 tražiti spremanje podataka za prijavu za ove domene za sve prijavljene račune. Moraš osvježiti stranicu kako bi promjene stupile na snagu." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nije valjana domena", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Tvoju glavnu lozinku je nedavno promijenio administrator tvoje organizacije. Za pristup trezoru, potrebno je ažurirati glavnu lozinku, što će te odjaviti iz trenutne sesije, te ćeš se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne još sat vremena." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatsko učlanjenje" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "sat(i)" @@ -1847,7 +1992,20 @@ "message": "minuta" }, "vaultTimeoutPolicyInEffect": { - "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h.", + "message": "Pravilo tvoje organizacije podesilo je najveće dozvoljeno vrijeme isteka trezora na $HOURS$:$MINUTES$ h.", + "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": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Pravilo tvoje organizacije podesilo je radnju nakon isteka trezora na: $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Izvoz osobnog trezora" }, - "exportingPersonalVaultDescription": { - "message": "Izvest će se samo stavke osobnog trezora povezanog s $EMAIL$. Stavke organizacijskog trezora neće biti uključene.", + "exportingIndividualVaultDescription": { + "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", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Stavkama u suspendiranoj Organizaciji se ne može pristupiti. Kontaktiraj vlasnika Organizacije za pomoć." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Prijava u $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Verzija poslužitelja" }, - "selfHosted": { - "message": "Vlastiti poslužitelj" + "selfHostedServer": { + "message": "vlastiti poslužitelj" }, "thirdParty": { "message": "Third-party" @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "Zapamti adresu e-pošte" }, + "loginWithDevice": { + "message": "Prijava uređajem" + }, + "loginWithDeviceEnabledInfo": { + "message": "Prijava uređajem mora biti namještena u postavka Bitwarden mobilne aplikacije. Trebaš drugu opciju?" + }, + "fingerprintPhraseHeader": { + "message": "Jedinstvena fraza" + }, + "fingerprintMatchInfo": { + "message": "Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem." + }, + "resendNotification": { + "message": "Ponovno pošalji obavijest" + }, + "viewAllLoginOptions": { + "message": "Pogledaj sve mogućnosti prijave" + }, + "notificationSentDevice": { + "message": "Obavijest je poslana na tvoj uređaj." + }, + "loginInitiated": { + "message": "Prijava pokrenuta" + }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Ukradena glavna lozinka" }, "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": "Lozinka je nađena među ukradenima tijekom krađa podataka. Za zaštitu svog računa koristi jedinstvenu lozinku. Želiš li svejedno korisiti ukradenu lozinku?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Slaba i ukradena glavna lozinka" }, "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": "Slaba lozinka je nađena među ukradenima tijekom krađa podataka. Za zaštitu svog računa koristi jaku i jedinstvenu lozinku. Želiš li svejedno korisiti slabu, ukradenu lozinku?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Provjeri je li lozinka ukradena prilikom krađe podataka" }, "important": { - "message": "Important:" + "message": "Važno:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Glavnu lozinku nije moguće oporaviti ako ju zaboraviš!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "najmanje $LENGTH$ znakova", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Prema pravilima tvoje organizacije uključena je auto-ispuna prilikom učitavanja stranice." + }, + "howToAutofill": { + "message": "Kako auto-ispuniti" + }, + "autofillSelectInfoWithCommand": { + "message": "Odaberi stavku s ovog zaslona, upotrijebi prečac $COMMAND$ ili istraži druge opcije u postavkama.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Odaberi stavku s ovog zaslona ili istraži druge opcije u postavkama." + }, + "gotIt": { + "message": "U redu" + }, + "autofillSettings": { + "message": "Postavke auto-ispune" + }, + "autofillShortcut": { + "message": "Tipkovnički precač auto-ispune" + }, + "autofillShortcutNotSet": { + "message": "Prečac auto-ispune nije postavljen. Promijeni u postavkama preglednika." + }, + "autofillShortcutText": { + "message": "Prečac auto-ispune je: $COMMAND$. Promijeni u postavkama preglednika.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Zadani prečac auto-ispune: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Prijava na" + }, + "opensInANewWindow": { + "message": "Otvara u novom prozoru" + }, + "deviceApprovalRequired": { + "message": "Potrebno je odobriti uređaj. Odaberi metodu odobravanja:" + }, + "rememberThisDevice": { + "message": "Zapamti ovaj uređaj" + }, + "uncheckIfPublicDevice": { + "message": "Odznači ako koristiš javni uređaj" + }, + "approveFromYourOtherDevice": { + "message": "Odobri drugim uređajem" + }, + "requestAdminApproval": { + "message": "Zatraži odobrenje administratora" + }, + "approveWithMasterPassword": { + "message": "Odobri glavnom lozinkom" + }, + "ssoIdentifierRequired": { + "message": "Potreban je identifikator organizacije." + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Pristup odbijen. Nemaš prava vidjeti ovu stranicu." + }, + "general": { + "message": "Opće" + }, + "display": { + "message": "Prikaz" + }, + "accountSuccessfullyCreated": { + "message": "Račun je uspješno stvoren!" + }, + "adminApprovalRequested": { + "message": "Zatraženo odobrenje administratora" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Tvoj zahtjev je poslan administratoru." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Dobiti ćeš obavijest kada bude odobreno." + }, + "troubleLoggingIn": { + "message": "Problem s prijavom?" + }, + "loginApproved": { + "message": "Prijava odobrena" + }, + "userEmailMissing": { + "message": "Nedostaje e-pošta korisnika" + }, + "deviceTrusted": { + "message": "Uređaj pouzdan" + }, + "inputRequired": { + "message": "Potreban je unos." + }, + "required": { + "message": "obavezno" + }, + "search": { + "message": "Traži" + }, + "inputMinLength": { + "message": "Unos mora sadržavati najmanje $COUNT$ znakova.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Unos ne smije imati više od $COUNT$ znakova.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Ovi znakovi nisu dozvoljeni: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Unos mora biti najmanje $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Unos ne smije biti više od $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Jedna ili više adresa e-pošte nije valjana" + }, + "inputTrimValidator": { + "message": "Unos ne smije biti prazan.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Nije unesena adresa e-pošte." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ polje/a treba tvoju pažnju.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Odaberi --" + }, + "multiSelectPlaceholder": { + "message": "-- Upiši za filtriranje --" + }, + "multiSelectLoading": { + "message": "Dohvaćanje opcija..." + }, + "multiSelectNotFound": { + "message": "Nije pronađena niti jedna stavka" + }, + "multiSelectClearAll": { + "message": "Očisti sve" + }, + "plusNMore": { + "message": "+ još $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Podizbornik" + }, + "toggleCollapse": { + "message": "Sažmi/Proširi", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-ispuna kod učitavanja stranice koristi zadane postavke.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Otključaj račun", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Odredište uvoza" + }, + "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" + }, + "typePasskey": { + "message": "Pristupni ključ" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Autoriziraj" + }, + "savePasskey": { + "message": "Spremi pristupni ključ" + }, + "savePasskeyNewLogin": { + "message": "Spremi pristupni ključ kao novu prijavu" + }, + "choosePasskey": { + "message": "Odaberi prijavu za spremanje ovog pristupnog ključa" + }, + "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." + }, + "useBrowserName": { + "message": "Koristi preglednik" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktorska autentifikacija otkazana" + }, + "noLastPassDataFound": { + "message": "Nisu nađeni LastPass podaci" + }, + "incorrectUsernameOrPassword": { + "message": "Neispravno korisničko ime ili lozinka" + }, + "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": "Passcode" + }, + "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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 02b5d7445fb2..7bd6558daa7d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -143,7 +167,7 @@ "message": "A folytatáshoz meg kell erősíteni a személyazonosságot." }, "account": { - "message": "Felhasználó" + "message": "Fiók" }, "changeMasterPassword": { "message": "Mesterjelszó módosítása" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Súgó és visszajelzés" }, + "helpCenter": { + "message": "Bitwardsn Segítségközpont" + }, + "communityForums": { + "message": "Bitwarden közösségi fórum felfedezése" + }, + "contactSupport": { + "message": "Kapcsolatfelvétel a Bitwarden támogatással" + }, "sync": { "message": "Szinkronizálás" }, @@ -329,6 +362,12 @@ "other": { "message": "Egyéb" }, + "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" + }, "rateExtension": { "message": "Bővítmény értékelése" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Zárolás most" }, + "lockAll": { + "message": "Összes zárolása" + }, "immediately": { "message": "Azonnal" }, @@ -430,7 +472,14 @@ "message": "A mesterjelszó ismételt megadása kötelező." }, "masterPasswordMinlength": { - "message": "Mesterjelszónak legalább 8 karakter hosszúnak kell lennie." + "message": "A mesterjelszónak legalább $VALUE$ karakter hosszúnak kell lennie.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "A megadott két jelszó nem egyezik meg." @@ -494,7 +543,7 @@ "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?" }, "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?" @@ -543,7 +592,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" @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Kártyák megjelenítése a Fül oldalon" }, @@ -608,18 +660,36 @@ "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 jhozzá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?" }, "notificationChangeSave": { "message": "Frissítés" }, + "notificationUnlockDesc": { + "message": "A Bitwarden széf feloldása az automatikus kitöltési kérés teljesítéséhez." + }, + "notificationUnlock": { + "message": "Feloldás" + }, "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." @@ -633,6 +703,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" @@ -744,10 +817,10 @@ "message": "A naximális fájlméret 500 MB." }, "featureUnavailable": { - "message": "Ez a funkció nem érhető el." + "message": "A funkció nem érhető el." }, - "updateKey": { - "message": "Ez a funkció nem használható, amíg nem frissíted a titkosítási kulcsod." + "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." }, "premiumMembership": { "message": "Prémium tagság" @@ -762,7 +835,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:" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB titkosított tárhely a fájlmellékleteknek." }, - "ppremiumSignUpTwoStep": { - "message": "További két lépcsős bejelentkezés lehetőségek, mint például YubiKey, FIDO U2F és Duo." + "premiumSignUpTwoStepOptions": { + "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." @@ -792,7 +865,7 @@ "message": "A prémium tagság megvásárolható a bitwarden.com webes széfben. Szeretnénk felkeresni a webhelyet most?" }, "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." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Minden bejelentkezett fiókra vonatkozik." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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" + }, "enableAutoFillOnPageLoad": { "message": "Automatikus kitöltés oldalbetöltésnél" }, @@ -960,7 +1058,7 @@ "message": "Ha egy bejelentkezési űrlap észlelésre került, az adatok automatikus kitöltése az oldal betöltésekor." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Az oldalbetöltésnél automatikus kitöltést a feltört vagy nem megbízhatató weboldalak kihasználhatják." }, "learnMoreAboutAutofill": { "message": "További információk az automatikus kitöltésről" @@ -969,7 +1067,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)" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Elem visszaállítása" }, - "restoreItemConfirmation": { - "message": "Biztosan visszaállításra kerüljön ezt az elem?" - }, "restoredItem": { "message": "Visszaállított elem" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Automatikusan kitöltött elem" }, + "insecurePageWarning": { + "message": "Figyelmeztetés: Ez egy nem biztonságos HTTP oldal és az elküldött információkat mások láthatják és módosíthatják. Ezt a bejelentkezést eredetileg egy biztonságos (HTTPS) oldalra mentették." + }, + "insecurePageWarningFillPrompt": { + "message": "Még mindig ki szeretnénk tölteni ezt a bejelentkezést?" + }, + "autofillIframeWarning": { + "message": "Az űrlapot egy másik domain tárolja, mint a mentett bejelentkezés URI-ja. Az automatikus kitöltéshez válasszuk az OK gombot, a leállításhoz pedig a Mégsem lehetőséget." + }, + "autofillIframeWarningTip": { + "message": "Ennek a figyelmeztetésnek a jövőbeni elkerülése érdekében mentsük el ezt az URI-t - $HOSTNAME$ - a Bitwarden bejelentkezési elemébe ennél a webhelynél.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Mesterjelszó beállítása" }, + "currentMasterPass": { + "message": "Jelenlegi mesterjelszó" + }, + "newMasterPass": { + "message": "Új mesterjelszó" + }, + "confirmNewMasterPass": { + "message": "Új mesterjelszó megerősítése" + }, "masterPasswordPolicyInEffect": { "message": "Egy vagy több szervezeti rendszabályhoz mesterjelszó szükséges a következő követelmények megfeleléséhez:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "A böngésző biometrikus adatait ez az eszköz nem támogatja." }, + "biometricsFailedTitle": { + "message": "A biometria nem sikerült." + }, + "biometricsFailedDesc": { + "message": "A biometrikus adatokat nem lehet kitölteni, fontoljuk meg a mesterjelszó használatát vagy a kijelentkezést. Ha ez továbbra is fennáll, forduljunk a Bitwarden ügyfélszolgálatához." + }, "nativeMessaginPermissionErrorTitle": { "message": "A jogosultság nincs megadva." }, @@ -1574,12 +1705,18 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nem érvényes domain.", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "A szervezet egyik adminisztrátora nemrég megváltoztatta a mesterjelszót. A széf eléréséhez most frissíteni kell a mesterjelszót. Továbblépéskor kijelentkezés történik a jelenlegi munkamenetből és újra be kell jelentkezni. Ha van aktív munkamenet más eszközön, az még legfeljebb egy óráig aktív maradhat." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatikus regisztráció" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Óra" @@ -1847,7 +1992,20 @@ "message": "Perc" }, "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" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "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. A széf időkifutási művelete $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "A szervezeti házirendek által jelenleg beállított időkifutási művelet $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Személyes széf exportálása" }, - "exportingPersonalVaultDescription": { - "message": "Csak $EMAIL$ email címmel társított személyes széf elemek kerülnek exportálásra. Ebbe nem kerülnek be a szervezeti széf elemek.", + "exportingIndividualVaultDescription": { + "message": "$EMAIL$ email címhez társított egyedi széfek kerülnek csak exportálásra. A szervezeti széf elemei nem lesznek benne. Csak a széf információk kerülnek exportálásra és nem tartalmazzák a kapcsolódó mellékleteket.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Bejelentkezés $DOMAIN$ területre", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Szerver verzió" }, - "selfHosted": { - "message": "Saját kiszolgáló" + "selfHostedServer": { + "message": "saját üzemeltetésű" }, "thirdParty": { "message": "Harmadik fél" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Email megjegyzése" }, + "loginWithDevice": { + "message": "Bejelentkezés eszközzel" + }, + "loginWithDeviceEnabledInfo": { + "message": "Az eszközzel történő bejelentkezést a Biwarden mobilalkalmazás beállításaiban kell beállítani. Másik opcióra van szükség?" + }, + "fingerprintPhraseHeader": { + "message": "Ujjlenyomat kifejezés" + }, + "fingerprintMatchInfo": { + "message": "Ellenőrizzük, hogy a széf feloldásra került és az Ujjlenyomat kifejezés egyezik a másik eszközön levővel." + }, + "resendNotification": { + "message": "Értesítés újraküldése" + }, + "viewAllLoginOptions": { + "message": "Összes bejelentkezési opció megtekintése" + }, + "notificationSentDevice": { + "message": "Egy értesítés lett elküldve az eszközre." + }, + "loginInitiated": { + "message": "A bejelentkezés elindításra került." + }, "exposedMasterPassword": { "message": "Kiszivárgott mesterjelszó" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "A szervezeti szabályzat bekapcsolta az automatikus kitöltést az oldalbetöltéskor." + }, + "howToAutofill": { + "message": "Az automatikus kitöltés működése" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Rendben" + }, + "autofillSettings": { + "message": "Automatikus kitöltés beállítások" + }, + "autofillShortcut": { + "message": "Automatikus kitöltés billentyűparancs" + }, + "autofillShortcutNotSet": { + "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": { + "message": "Az automatikus kitöltés billentyűparancsa: $COMMAND$. Módosítsuk ezt a böngésző beállításaiban.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Alapértelmezett automatikus kitöltési billenytűparancs: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Bejelentkezés:" + }, + "opensInANewWindow": { + "message": "Megnyitás új ablakban" + }, + "deviceApprovalRequired": { + "message": "Az eszköz jóváhagyása szükséges. Válasszunk egy jóváhagyási lehetőséget lentebb:" + }, + "rememberThisDevice": { + "message": "Eszköz megjegyzése" + }, + "uncheckIfPublicDevice": { + "message": "Töröljük a jelölést, ha nyilvános eszközt használunk." + }, + "approveFromYourOtherDevice": { + "message": "Jóváhagyás másik eszközzel" + }, + "requestAdminApproval": { + "message": "Adminisztrátori jóváhagyás kérés" + }, + "approveWithMasterPassword": { + "message": "Jóváhagyás mesterjelszóval" + }, + "ssoIdentifierRequired": { + "message": "A szervezeti SSO azonosító megadása szükséges." + }, + "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." + }, + "general": { + "message": "Általános" + }, + "display": { + "message": "Megjelenítés" + }, + "accountSuccessfullyCreated": { + "message": "A fiók sikeresen létrehozásra került." + }, + "adminApprovalRequested": { + "message": "Adminisztrátori jóváhagyás kérés történt" + }, + "adminApprovalRequestSentToAdmins": { + "message": "A kérés elküldésre került az adminisztrátornak." + }, + "youWillBeNotifiedOnceApproved": { + "message": "A jóváhagyás után értesítés érkezik." + }, + "troubleLoggingIn": { + "message": "Probléma van a bejelentkezéssel?" + }, + "loginApproved": { + "message": "A bejelentkezés jóváhagyásra került." + }, + "userEmailMissing": { + "message": "A felhasználói email cím hiányzik." + }, + "deviceTrusted": { + "message": "Az eszköz megbízható." + }, + "inputRequired": { + "message": "Az adatbevitel kötelező." + }, + "required": { + "message": "kötelező" + }, + "search": { + "message": "Keresés" + }, + "inputMinLength": { + "message": "A bevitel legyen legalább $COUNT$ karakter hosszú.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "A bevitel nem haladhatja meg $COUNT$ karakter hosszt.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "A következő karakterek nem engedélyezettek: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "A beviteli érték legyen legalább $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "A beviteli érték ne haladja meg $MAX$ értéket.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 vagy több email cím érvénytelen." + }, + "inputTrimValidator": { + "message": "A bevitel nem tartalmazhat csak fehér szóköz karaktert.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Az megadott bevitel nem email cím." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ mező fentebb figyelmet érdemel.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Választás --" + }, + "multiSelectPlaceholder": { + "message": "-- Gépelés a szűréshez --" + }, + "multiSelectLoading": { + "message": "Az opciók beolvasása folyamatban can..." + }, + "multiSelectNotFound": { + "message": "Nem található elem." + }, + "multiSelectClearAll": { + "message": "Összes törlése" + }, + "plusNMore": { + "message": "+ $QUANTITY$ további", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Almenü" + }, + "toggleCollapse": { + "message": "Összezárás váltás", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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 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." + }, + "unlockAccount": { + "message": "Fiók feloldása", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Importálás leírás" + }, + "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" + }, + "typePasskey": { + "message": "Hozzáférési kulcs" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "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" + }, + "choosePasskey": { + "message": "Bejelentkezés választás a hozzáférési kulcs mentéséhez" + }, + "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." + }, + "useBrowserName": { + "message": "Böngésző használata" + }, + "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ó" + }, + "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" + }, + "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:" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 9dea25050c9b..3b3a39da4f98 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Isi otomatis" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Membuat Kata Sandi (tersalin)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Tidak ada info masuk yang cocok." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Buka brankas Anda" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Bantuan & Umpan Balik" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sinkronisasi" }, @@ -329,6 +362,12 @@ "other": { "message": "Lainnya" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Nilai Ekstensi" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Kunci Sekarang" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Segera" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Kata sandi utama harus memiliki panjang setidaknya 8 karakter." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Konfirmasi sandi utama tidak cocok." @@ -576,6 +625,9 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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": "Apakah Anda ingin memperbarui kata sandi ini di Bitwarden?" }, "notificationChangeSave": { "message": "Iya, Perbarui Sekarang" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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": "Deteksi Kecocokan URI Bawaan", @@ -633,6 +703,9 @@ "themeDesc": { "message": "Ubah tema warna aplikasi." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Gelap", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Fitur Tidak Tersedia" }, - "updateKey": { - "message": "Anda tidak dapat menggunakan fitur ini sampai Anda memperbarui kunci enkripsi Anda." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Keanggotaan Premium" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB penyimpanan berkas yang dienkripsi." }, - "ppremiumSignUpTwoStep": { - "message": "Pilihan info masuk dua langkah tambahan seperti YubiKey, FIDO U2F, dan Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Kebersihan kata sandi, kesehatan akun, dan laporan kebocoran data untuk tetap menjaga keamanan brankas Anda." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "URL dari semua lingkungan telah disimpan." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Aktifkan Isi-Otomatis Saat Memuat Laman" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Pulihkan Item" }, - "restoreItemConfirmation": { - "message": "Apakah Anda yakin ingin memulihkan item ini?" - }, "restoredItem": { "message": "Item Yang Dipulihkan" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item Terisi Otomatis" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Atur Kata Sandi Utama" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi membutuhkan kata sandi utama Anda untuk memenuhi persyaratan berikut:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometrik peramban tidak didukung di perangkat ini." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Izin tidak diberikan" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Kebijakan organisasi memengaruhi opsi kepemilikan Anda." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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 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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ bukan domain yang valid", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Pendaftaran Otomatis" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Pilih Folder..." }, - "ssoCompleteRegistration": { - "message": "Untuk menyelesaikan masuk dengan SSO, harap setel kata sandi utama untuk mengakses dan melindungi brankas Anda." + "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" }, "hours": { "message": "Jam" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Ingat email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 7a10eaa89575..f7b7b09dd8b8 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gestore di password gratuito", + "message": "Bitwarden - Password Manager Gratis", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Un gestore di password sicuro e gratuito per tutti i tuoi dispositivi.", + "message": "Un password manager sicuro e gratis per tutti i tuoi dispositivi.", "description": "Extension description" }, "loginOrCreateNewAccount": { @@ -38,16 +38,16 @@ "message": "Password principale" }, "masterPassDesc": { - "message": "La password principale è la password che utilizzi per accedere alla tua cassaforte. È molto importante che tu non la dimentichi. Non c'è modo di recuperare questa password nel caso che tu la dimenticassi." + "message": "La password principale ti serve per accedere alla tua cassaforte. È molto importante non dimenticarla. Non possiamo aiutarti a recuperare questa password se la dimentichi." }, "masterPassHintDesc": { - "message": "Un suggerimento per la password principale può aiutarti a ricordarla nel caso la dimenticassi." + "message": "Un suggerimento per la password principale può aiutarti a ricordarla se la dimentichi." }, "reTypeMasterPass": { - "message": "Ri-digita la tua password principale" + "message": "Inserisci password principale di nuovo" }, "masterPassHint": { - "message": "Suggerimento password principale (facoltativo)" + "message": "Suggerimento per la password principale (facoltativo)" }, "tab": { "message": "Scheda" @@ -56,7 +56,7 @@ "message": "Cassaforte" }, "myVault": { - "message": "Cassaforte" + "message": "La mia cassaforte" }, "allVaults": { "message": "Tutte le casseforti" @@ -68,7 +68,7 @@ "message": "Impostazioni" }, "currentTab": { - "message": "Scheda attuale" + "message": "Scheda corrente" }, "copyPassword": { "message": "Copia password" @@ -86,19 +86,43 @@ "message": "Copia numero" }, "copySecurityCode": { - "message": "Copia il codice di sicurezza" + "message": "Copia codice di sicurezza" }, "autoFill": { - "message": "Auto-riempimento" + "message": "Riempimento automatico" + }, + "autoFillLogin": { + "message": "Riempi automaticamente login" + }, + "autoFillCard": { + "message": "Riempi automaticamente carta" + }, + "autoFillIdentity": { + "message": "Riempi automaticamente identità" }, "generatePasswordCopied": { - "message": "Genera password (copiata)" + "message": "Genera password e copiala" }, "copyElementIdentifier": { "message": "Copia nome campo personalizzato" }, "noMatchingLogins": { - "message": "Nessun accesso corrispondente." + "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" @@ -107,7 +131,7 @@ "message": "Accedi alla tua cassaforte" }, "autoFillInfo": { - "message": "Non ci sono login disponibili per completare la scheda attuale del browser." + "message": "Non ci sono login disponibili per riempire automaticamente questa scheda del browser." }, "addLogin": { "message": "Aggiungi un login" @@ -119,10 +143,10 @@ "message": "Suggerimento password" }, "enterEmailToGetHint": { - "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento della password principale." + "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale." }, "getMasterPasswordHint": { - "message": "Ottieni il suggerimento della password principale" + "message": "Ottieni suggerimento della password principale" }, "continue": { "message": "Continua" @@ -146,14 +170,14 @@ "message": "Account" }, "changeMasterPassword": { - "message": "Modifica password principale" + "message": "Cambia password principale" }, "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." }, "yourAccountsFingerprint": { - "message": "Frase impronta dell'account", + "message": "Frase impronta del tuo account", "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": { @@ -190,10 +214,19 @@ "message": "Cartelle" }, "noFolders": { - "message": "Non ci sono cartelle da elencare." + "message": "Non ci sono cartelle da mostrare." }, "helpFeedback": { - "message": "Aiuto e segnalazioni" + "message": "Aiuto e feedback" + }, + "helpCenter": { + "message": "Centro assistenza Bitwarden" + }, + "communityForums": { + "message": "Esplora i forum della comunità Bitwarden" + }, + "contactSupport": { + "message": "Contatta assistenza Bitwarden" }, "sync": { "message": "Sincronizza" @@ -279,10 +312,10 @@ "message": "Visualizza" }, "noItemsInList": { - "message": "Non ci sono elementi da elencare." + "message": "Non ci sono elementi da mostrare." }, "itemInformation": { - "message": "Informazioni sull'elemento" + "message": "Informazioni elemento" }, "username": { "message": "Nome utente" @@ -321,7 +354,7 @@ "message": "Sito web" }, "toggleVisibility": { - "message": "Mostra/Nascondi" + "message": "Mostra/nascondi" }, "manage": { "message": "Gestisci" @@ -329,20 +362,26 @@ "other": { "message": "Altro" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Imposta un metodo di sblocco per modificare l'azione timeout cassaforte." + }, + "unlockMethodNeeded": { + "message": "Imposta un metodo di sblocco in Impostazioni" + }, "rateExtension": { "message": "Valuta l'estensione" }, "rateExtensionDesc": { - "message": "Prendi in considerazione l'idea di lasciarci una buona recensione!" + "message": "Aiutaci lasciando una buona recensione!" }, "browserNotSupportClipboard": { - "message": "Il tuo browser non supporta la copia dagli appunti. Copiala manualmente." + "message": "Il tuo browser non supporta copiare dagli appunti. Copialo manualmente." }, "verifyIdentity": { - "message": "Verifica l'identità." + "message": "Verifica identità" }, "yourVaultIsLocked": { - "message": "La tua cassaforte è bloccata. Inserisci la tua password principale per continuare." + "message": "La tua cassaforte è bloccata. Verifica la tua identità per continuare." }, "unlock": { "message": "Sblocca" @@ -367,7 +406,10 @@ "message": "Timeout cassaforte" }, "lockNow": { - "message": "Blocca" + "message": "Blocca ora" + }, + "lockAll": { + "message": "Blocca tutto" }, "immediately": { "message": "Immediatamente" @@ -418,22 +460,29 @@ "message": "Si è verificato un errore" }, "emailRequired": { - "message": "L'indirizzo email è obbligatorio." + "message": "Indirizzo email obbligatorio." }, "invalidEmail": { "message": "Indirizzo email non valido." }, "masterPasswordRequired": { - "message": "È necessario inserire la password principale." + "message": "Password principale obbligatoria." }, "confirmMasterPasswordRequired": { - "message": "È necessario reinserire la password principale." + "message": "Reinserire la password principale è obbligatorio." }, "masterPasswordMinlength": { - "message": "La password principale deve essere lunga almeno 8 caratteri." + "message": "La password principale deve essere lunga almeno $VALUE$ caratteri.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { - "message": "La conferma della password principale non corrisponde." + "message": "Le password principali non corrispondono." }, "newAccountCreated": { "message": "Il tuo nuovo account è stato creato! Ora puoi eseguire l'accesso." @@ -445,7 +494,7 @@ "message": "Il codice di verifica è obbligatorio." }, "invalidVerificationCode": { - "message": "Codice di verifica non valido." + "message": "Codice di verifica non valido" }, "valueCopied": { "message": "$VALUE$ copiata", @@ -458,7 +507,7 @@ } }, "autofillError": { - "message": "Impossibile completare automaticamente il login selezionato per questa pagina. Copia e incolla manualmente le tue credenziali." + "message": "Impossibile riempire automaticamente questo elemento nella pagina. Copia e incolla le credenziali." }, "loggedOut": { "message": "Disconnesso" @@ -485,19 +534,19 @@ "message": "Cartella aggiunta" }, "changeMasterPass": { - "message": "Modifica password principale" + "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": "L'autenticazione in due passaggi rende il tuo account più sicuro richiedendo di verificare il login con un altro dispositivo come una chiave di sicurezza, applicazione di autenticazione, SMS, telefonata o email. Può essere abilitata sulla cassaforte online di bitwarden.com. Vuoi visitare il sito ora?" + "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?" }, "editedFolder": { - "message": "Cartella modificata" + "message": "Cartella salvata" }, "deleteFolderConfirmation": { - "message": "Sei sicuro di voler modificare questa cartella?" + "message": "Sei sicuro di voler eliminare questa cartella?" }, "deletedFolder": { "message": "Cartella eliminata" @@ -537,13 +586,13 @@ "message": "Elemento aggiunto" }, "editedItem": { - "message": "Elemento modificato" + "message": "Elemento salvato" }, "deleteItemConfirmation": { - "message": "Sei sicuro di voler cestinare questo elemento?" + "message": "Sei sicuro di voler eliminare questo elemento?" }, "deletedItem": { - "message": "Elemento cestinato" + "message": "Elemento eliminato" }, "overwritePassword": { "message": "Sovrascrivi password" @@ -555,7 +604,7 @@ "message": "Sovrascrivi nome utente" }, "overwriteUsernameConfirmation": { - "message": "Sei sicuro di voler sovrascrivere il nome utente attuale?" + "message": "Sei sicuro di voler sovrascrivere il nome utente corrente?" }, "searchFolder": { "message": "Cerca nella cartella" @@ -564,74 +613,98 @@ "message": "Cerca nella raccolta" }, "searchType": { - "message": "Cerca tipo" + "message": "Cerca in questo tipo" }, "noneFolder": { "message": "Nessuna cartella", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Chiedi di aggiungere il login" + "message": "Chiedi di aggiungere nuovi login" }, "addLoginNotificationDesc": { - "message": "\"Aggiungi notifica di login\" richiede automaticamente di salvare i nuovi login nella tua cassaforte ogni volta che accedi per la prima volta." + "message": "Chiedi di aggiungere un nuovo elemento se non ce n'è uno nella tua cassaforte." + }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." }, "showCardsCurrentTab": { - "message": "Mostra le carte nella pagina delle schede" + "message": "Mostra le carte nella sezione Scheda" }, "showCardsCurrentTabDesc": { - "message": "Elenca le carte nella pagina della scheda per un facile completamento automatico." + "message": "Mostra le carte nella sezione Scheda per riempirle automaticamente." }, "showIdentitiesCurrentTab": { - "message": "Mostra le identità nella pagina della scheda" + "message": "Mostra le identità nella sezione Scheda" }, "showIdentitiesCurrentTabDesc": { - "message": "Elenca le carte nella pagina della scheda per un facile completamento automatico." + "message": "Mostra le identità nella sezione Scheda per riempirle automaticamente." }, "clearClipboard": { "message": "Cancella appunti", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Cancella automaticamente dagli appunti i valori copiati.", + "message": "Cancella automaticamente i valori copiati dagli appunti.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { "message": "Vuoi che Bitwarden ricordi questa password per te?" }, "notificationAddSave": { - "message": "Sì, salva ora" + "message": "Salva" }, "enableChangedPasswordNotification": { "message": "Chiedi di aggiornare il login esistente" }, "changedPasswordNotificationDesc": { - "message": "Chiedi di aggiornare la password di accesso quando viene rilevato un cambiamento su un sito web." + "message": "Chiedi di aggiornare la password di un login quando rileviamo che è cambiata su un sito 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": "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?" }, "notificationChangeSave": { - "message": "Sì, aggiorna ora" + "message": "Aggiorna" + }, + "notificationUnlockDesc": { + "message": "Sblocca la tua cassaforte di Bitwarden per completare la richiesta di riempimento automatico." + }, + "notificationUnlock": { + "message": "Sblocca" }, "enableContextMenuItem": { - "message": "Mostra le opzioni del menu contestuale" + "message": "Mostra opzioni nel menu contestuale" }, "contextMenuItemDesc": { - "message": "Utilizza un clic secondario per accedere alla generazione di password e login per il sito web. " + "message": "Utilizza un secondo clic per accedere alla generazione di password e login corrispondenti per il sito 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": "Rilevamento corrispondenza URI predefinito", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI viene gestito per gli accessi quando si eseguono azioni come il riempimento automatico." + "message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI è gestito per i login quando si eseguono azioni come il riempimento automatico." }, "theme": { "message": "Tema" }, "themeDesc": { - "message": "Cambia lo schema di colori dell'applicazione." + "message": "Cambia lo schema di colori dell'app." + }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." }, "dark": { "message": "Scuro", @@ -642,7 +715,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarizzato scuro", + "message": "Scuro solarizzato", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -659,13 +732,13 @@ "message": "Conferma esportazione della cassaforte" }, "exportWarningDesc": { - "message": "Questa esportazione contiene i dati della tua cassaforte in un formato non cifrato. Non salvare o inviare il file esportato su canali non protetti (come la posta elettronica). 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 cifra i tuoi dati utilizzando la chiave di cifratura del tuo account. Se cambi la chiave di cifratura del tuo account, non sarai più in grado di decifrare il file esportato e sarà necessario 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 cifratura dell'account sono uniche per ogni account utente Bitwarden, quindi non è possibile importare un'esportazione cifrata 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." @@ -674,7 +747,7 @@ "message": "Condiviso" }, "learnOrg": { - "message": "Scopri le organizzazioni" + "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ù?" @@ -699,10 +772,10 @@ } }, "moveToOrgDesc": { - "message": "Scegli un'organizzazione in cui desideri spostare questo elemento. Spostare in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Non sarai più il proprietario diretto di questo elemento una volta spostato." + "message": "Scegli un'organizzazione in cui vuoi spostare questo elemento. Spostarlo in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Una volta spostato, non sarai più il proprietario diretto di questo elemento." }, "learnMore": { - "message": "Per saperne di più" + "message": "Ulteriori informazioni" }, "authenticatorKeyTotp": { "message": "Chiave di autenticazione (TOTP)" @@ -711,7 +784,7 @@ "message": "Codice di verifica (TOTP)" }, "copyVerificationCode": { - "message": "Copia il codice di verifica" + "message": "Copia codice di verifica" }, "attachments": { "message": "Allegati" @@ -732,67 +805,67 @@ "message": "Nessun allegato." }, "attachmentSaved": { - "message": "L'allegato è stato salvato." + "message": "Allegato salvato" }, "file": { "message": "File" }, "selectFile": { - "message": "Seleziona un file." + "message": "Seleziona un file" }, "maxFileSize": { "message": "La dimensione massima del file è 500 MB." }, "featureUnavailable": { - "message": "Funzione non disponibile" + "message": "Funzionalità non disponibile" }, - "updateKey": { - "message": "Non puoi utilizzare questa funzione finché non aggiorni la tua chiave di cifratura." + "encryptionKeyMigrationRequired": { + "message": "Migrazione della chiave di crittografia obbligatoria. Accedi tramite la cassaforte web per aggiornare la tua chiave di crittografia." }, "premiumMembership": { - "message": "Abbonamento premium" + "message": "Abbonamento Premium" }, "premiumManage": { "message": "Gestisci abbonamento" }, "premiumManageAlert": { - "message": "Puoi gestire il tuo abbonamento premium online su bitwarden.com. Vuoi visitare ora il sito?" + "message": "Puoi gestire il tuo abbonamento Premium usando la cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, "premiumRefresh": { "message": "Aggiorna abbonamento" }, "premiumNotCurrentMember": { - "message": "Al momento non sei un membro premium." + "message": "Al momento non sei un membro Premium." }, "premiumSignUpAndGet": { - "message": "Iscriviti ad un abbonamento premium e ottieni:" + "message": "Passa a Premium e ottieni:" }, "ppremiumSignUpStorage": { - "message": "1 GB di spazio di archiviazione cifrato per gli allegati." + "message": "1 GB di spazio di archiviazione crittografato per gli allegati." }, - "ppremiumSignUpTwoStep": { - "message": "Opzioni addizionali di login in due passaggi come YubiKey, FIDO U2F, e Duo." + "premiumSignUpTwoStepOptions": { + "message": "Opzioni di verifica in due passaggi proprietarie come YubiKey e Duo." }, "ppremiumSignUpReports": { - "message": "Sicurezza delle password, integrità dell'account e resoconti sulla violazione di dati per mantenere sicura la tua cassaforte." + "message": "Sicurezza delle password, integrità dell'account, e rapporti su violazioni di dati per mantenere sicura la tua cassaforte." }, "ppremiumSignUpTotp": { - "message": "Generatore di codice di verifica TOTP (2FA) per i login nella tua cassaforte." + "message": "Generatore di codici di verifica TOTP (2FA) per i login nella tua cassaforte." }, "ppremiumSignUpSupport": { "message": "Supporto clienti prioritario." }, "ppremiumSignUpFuture": { - "message": "Tutte le funzioni Premium future. Nuove in arrivo!" + "message": "Tutte le prossime funzioni Premium. Nuove in arrivo!" }, "premiumPurchase": { - "message": "Acquista Premium" + "message": "Passa a Premium" }, "premiumPurchaseAlert": { - "message": "Puoi acquistare il tuo abbonamento premium online su bitwarden.com. Vuoi visitare ora il sito?" + "message": "Puoi acquistare il un abbonamento Premium dalla cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, "premiumCurrentMember": { - "message": "Sei un membro premium!" + "message": "Sei un membro Premium!" }, "premiumCurrentMemberThanks": { "message": "Grazie per il tuo supporto a Bitwarden." @@ -813,22 +886,22 @@ "message": "Copia TOTP automaticamente" }, "disableAutoTotpCopyDesc": { - "message": "Se il login ha una chiave di autenticazione, il codice di verifica TOTP viene automaticamente copiato negli appunti ogni volta che si compila automaticamente l'accesso." + "message": "Se un login ha una chiave di autenticazione, copia automaticamente il codice di verifica TOTP negli appunti quando riempi automaticamente il login." }, "enableAutoBiometricsPrompt": { "message": "Richiedi dati biometrici all'avvio" }, "premiumRequired": { - "message": "Premium richiesto" + "message": "Premium necessario" }, "premiumRequiredDesc": { - "message": "Un abbonamento Premium è richiesto per utilizzare questa funzionalità." + "message": "Passa a Premium per utilizzare questa funzionalità." }, "enterVerificationCodeApp": { - "message": "Inserisci il codice di verifica a 6 cifre dalla tua applicazione di autenticazione." + "message": "Inserisci il codice di verifica a 6 cifre dalla tua app di autenticazione." }, "enterVerificationCodeEmail": { - "message": "Inserisci il codice di verifica a 6 cifrato inviato a $EMAIL$.", + "message": "Inserisci il codice di verifica a 6 cifre inviato a $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -849,10 +922,10 @@ "message": "Ricordami" }, "sendVerificationCodeEmailAgain": { - "message": "Invia nuovamente l'email con il codice di verifica" + "message": "Invia email con codice di verifica di nuovo" }, "useAnotherTwoStepMethod": { - "message": "Usa un altro metodo di login in due passaggi" + "message": "Usa un altro metodo di verifica in due passaggi" }, "insertYubiKey": { "message": "Inserisci la tua YubiKey nella porta USB del computer, poi premi il suo pulsante." @@ -861,7 +934,7 @@ "message": "Inserisci la tua chiave di sicurezza nella porta USB del tuo computer. Se dispone di un pulsante, premilo." }, "webAuthnNewTab": { - "message": "Per avviare la verifica WebAuthn 2FA. Fare clic sul pulsante in basso per aprire una nuova scheda e seguire le istruzioni fornite nella nuova scheda. " + "message": "Per avviare la verifica WebAuthn 2FA. Clicca il pulsante qui sotto per aprire una nuova scheda e segui le istruzioni fornite nella nuova scheda." }, "webAuthnNewTabOpen": { "message": "Apri nuova scheda" @@ -873,25 +946,25 @@ "message": "Login non disponibile" }, "noTwoStepProviders": { - "message": "Questo account ha abilitato il login in due passaggi, ma nessuno dei provider configurati è supportato da questo browser web." + "message": "La verifica in due passaggi è abilitata per il tuo account, ma nessuno dei metodi configurati è supportato da questo browser." }, "noTwoStepProviders2": { - "message": "Utilizzare un browser web supportato (come Chrome) e/o aggiungere altri provider che sono supportati meglio da tutti i browser web (ad esempio un'applicazione di autenticazione)." + "message": "Usa un browser web supportato (come Chrome) e/o aggiungi altri metodi che sono supportati meglio da tutti i browser web (come un'app di autenticazione)." }, "twoStepOptions": { - "message": "Opzioni di login in due passaggi" + "message": "Opzioni di verifica in due passaggi" }, "recoveryCodeDesc": { - "message": "Hai perso l'accesso a tutti i tuoi provider a due passaggi? Usa il tuo codice di recupero per disattivarli dal tuo account." + "message": "Hai perso l'accesso a tutti i tuoi metodi di verifica in due passaggi? Usa il tuo codice di recupero per disattivarli tutti dal tuo account." }, "recoveryCodeTitle": { "message": "Codice di recupero" }, "authenticatorAppTitle": { - "message": "Applicazione di autenticazione" + "message": "App di autenticazione" }, "authenticatorAppDesc": { - "message": "Usa un'applicazione di autenticazione (come Authy o Google Authenticator) per generare codici di verifica a tempo.", + "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." }, "yubiKeyTitle": { @@ -901,11 +974,11 @@ "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'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", + "message": "Verifica con Duo Security usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verifica con Duo Security per la tua azienda usando l'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", + "message": "Verifica con Duo Security per la tua azienda usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -924,7 +997,7 @@ "message": "Ambiente self-hosted" }, "selfHostedEnvironmentFooter": { - "message": "Specifica l'URL principale della tua installazione Bitwarden self-hosted." + "message": "Specifica l'URL principale della tua installazione self-hosted di Bitwarden." }, "customEnvironment": { "message": "Ambiente personalizzato" @@ -951,46 +1024,71 @@ "message": "URL del server di icone" }, "environmentSaved": { - "message": "Gli URL dell'ambiente sono stati salvati." + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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": "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" }, "enableAutoFillOnPageLoad": { - "message": "Abilita l'auto-completamento al caricamento della pagina" + "message": "Riempi automaticamente al caricamento della pagina" }, "enableAutoFillOnPageLoadDesc": { - "message": "Se viene rilevato un modulo di accesso, effettua un auto-completamento quando la pagina web si carica." + "message": "Se sono rilevati campi di login, riempili automaticamente quando la pagina si carica." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Siti compromessi potrebbero sfruttare il riempimento automatico al caricamento della pagina." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Ulteriori informazioni" }, "defaultAutoFillOnPageLoad": { - "message": "Impostazioni di completamento automatico predefinito per i login" + "message": "Impostazioni di riempimento automatico predefinito per i login" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Dopo aver abilitato il completamento automatico al caricamento della pagina, è possibile abilitare o disabilitare la funzione per singoli login. Questa è l'impostazione predefinita per i login che non sono configurati separatamente." + "message": "Puoi disattivare il riempimento automatico al caricamento della pagina per singoli login dalla sezione Modifica elemento." }, "itemAutoFillOnPageLoad": { - "message": "Autocompletamento al caricamento della pagina (se abilitato nelle opzioni)" + "message": "Riempi automaticamente al caricamento della pagina (se abilitato in Impostazioni)" }, "autoFillOnPageLoadUseDefault": { "message": "Usa impostazione predefinita" }, "autoFillOnPageLoadYes": { - "message": "Autocompletamento al caricamento della pagina" + "message": "Riempi automaticamente al caricamento della pagina" }, "autoFillOnPageLoadNo": { - "message": "Non completare automaticamente al caricamento della pagina" + "message": "Non riempire automaticamente al caricamento della pagina" }, "commandOpenPopup": { - "message": "Apri popup cassaforte" + "message": "Apri cassaforte in un pop-up" }, "commandOpenSidebar": { - "message": "Apri la cassaforte nella barra laterale" + "message": "Apri cassaforte nella barra laterale" }, "commandAutofillDesc": { - "message": "Auto-completa con l'ultimo accesso utilizzato sul sito corrente" + "message": "Riempi automaticamente con l'ultimo login utilizzato sul sito corrente" }, "commandGeneratePasswordDesc": { "message": "Genera e copia una nuova password casuale negli appunti" @@ -1034,22 +1132,25 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Facendo clic all'esterno della finestra popup per controllare la mail con il codice di verifica chiuderà la finestra di popup. Vuoi aprire questo popup in una nuova finestra?" + "message": "Cliccare fuori del pop-up per controllare il codice di verifica nella tua email chiuderà questo pop-up. Vuoi aprire questo pop-up in una nuova finestra in modo che non si chiuda?" }, "popupU2fCloseMessage": { - "message": "Questo browser non può elaborare richieste U2F in questa finestra a comparsa. Vuoi aprire questo popup in una nuova finestra in modo da poter accedere usando U2F?" + "message": "Questo browser non può elaborare richieste U2F in questo pop-up. Aprire questo pop-up in una nuova finestra per accedere usando U2F?" }, "enableFavicon": { - "message": "Mostra icone del sito" + "message": "Mostra icone dei siti" }, "faviconDesc": { - "message": "Mostra un'immagine riconoscibile accanto a ogni login." + "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 contatore" + "message": "Mostra badge contatore" }, "badgeCounterDesc": { - "message": "Indica quanti login hai per la pagina web corrente." + "message": "Mostra il numero di login salvati per il sito web corrente nell'icona dell'estensione." }, "cardholderName": { "message": "Titolare della carta" @@ -1124,7 +1225,7 @@ "message": "Sig.ra" }, "dr": { - "message": "Dottore" + "message": "Dott" }, "mx": { "message": "Mx" @@ -1139,7 +1240,7 @@ "message": "Cognome" }, "fullName": { - "message": "Nome completo" + "message": "Nome e cognome" }, "identityName": { "message": "Nome dell'identità" @@ -1151,10 +1252,10 @@ "message": "Codice fiscale/Previdenza sociale" }, "passportNumber": { - "message": "Numero del passaporto" + "message": "Numero passaporto" }, "licenseNumber": { - "message": "Numero della patente" + "message": "Numero patente" }, "email": { "message": "Email" @@ -1242,7 +1343,7 @@ "message": "Verifica se la password è stata esposta." }, "passwordExposed": { - "message": "Questa password è presente $VALUE$ volta/e in database di violazioni. Dovresti cambiarla.", + "message": "Questa password è stata esposta $VALUE$ volte nei database di violazioni dei dati. Dovresti cambiarla.", "placeholders": { "value": { "content": "$1", @@ -1251,7 +1352,7 @@ } }, "passwordSafe": { - "message": "Questa password non è stata trovata in database di violazioni noti. Dovrebbe essere sicura da usare." + "message": "Questa password non è stata trovata in violazioni di dati note. Dovrebbe essere sicura da usare." }, "baseDomain": { "message": "Dominio di base", @@ -1284,14 +1385,14 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Attiva/Disattiva opzioni" + "message": "Mostra/nascondi" }, "toggleCurrentUris": { - "message": "Mostra/Nascondi URI attuale", + "message": "Mostra/nascondi URI corrente", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "URI attuale", + "message": "URI corrente", "description": "The URI of one of the current open tabs in the browser." }, "organization": { @@ -1305,7 +1406,7 @@ "message": "Tutti gli elementi" }, "noPasswordsInList": { - "message": "Non ci sono password da elencare." + "message": "Non ci sono password da mostrare." }, "remove": { "message": "Rimuovi" @@ -1326,13 +1427,13 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Sei sicuro di voler usare l'opzione \"Mai\"? Impostando le opzioni di blocco su \"Mai\", la chiave di cifratura della cassaforte sarà salvata sul tuo dispositivo. Se utilizzi questa opzione, assicurati di mantenere il 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 ad alcuna organizzazione. Le organizzazioni ti consentono di condividere oggetti in modo sicuro con altri utenti." + "message": "Non appartieni a nessuna organizzazione. Le organizzazioni ti consentono di condividere elementi con altri in modo sicuro." }, "noCollectionsInList": { - "message": "Nessuna raccolta da elencare." + "message": "Nessuna raccolta da mostrare." }, "ownership": { "message": "Proprietà" @@ -1356,7 +1457,7 @@ "message": "Password principale debole" }, "weakMasterPasswordDesc": { - "message": "La password principale che hai scelto è debole. È necessario utilizzare una password principale forte (o una frase segreta) per proteggere adeguatamente il tuo account Bitwarden. Sei sicuro di voler utilizzare questa password principale?" + "message": "La password principale che hai scelto è debole. Usa una password principale (o una frase segreta) forte per proteggere adeguatamente il tuo account Bitwarden. Sei sicuro di voler utilizzare questa password principale?" }, "pin": { "message": "PIN", @@ -1366,10 +1467,10 @@ "message": "Sblocca con PIN" }, "setYourPinCode": { - "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le impostazioni PIN saranno reimpostate se eseguirai una disconnessione completa dall'applicazione." + "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app." }, "pinRequired": { - "message": "È richiesto il PIN." + "message": "Codice PIN obbligatorio." }, "invalidPin": { "message": "Codice PIN non valido." @@ -1381,7 +1482,7 @@ "message": "In attesa di conferma dal desktop" }, "awaitDesktopDesc": { - "message": "Si prega di confermare utilizzando l'autenticazione biometrica nell'applicazione Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser." + "message": "Conferma utilizzando l'autenticazione biometrica nell'app Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser." }, "lockWithMasterPassOnRestart": { "message": "Blocca con la password principale al riavvio del browser" @@ -1396,7 +1497,7 @@ "message": "Clona" }, "passwordGeneratorPolicyInEffect": { - "message": "Una o più policy dell'organizzazione controllano le impostazioni del tuo generatore." + "message": "Una o più politiche dell'organizzazione stanno influenzando le impostazioni del tuo generatore." }, "vaultTimeoutAction": { "message": "Azione timeout cassaforte" @@ -1413,7 +1514,7 @@ "message": "Cerca nel cestino" }, "permanentlyDeleteItem": { - "message": "Elimina definitivamente l'elemento" + "message": "Elimina elemento definitivamente" }, "permanentlyDeleteItemConfirmation": { "message": "Sei sicuro di voler eliminare definitivamente questo elemento?" @@ -1424,14 +1525,11 @@ "restoreItem": { "message": "Ripristina elemento" }, - "restoreItemConfirmation": { - "message": "Sei sicuro di voler ripristinare questo elemento?" - }, "restoredItem": { "message": "Elemento ripristinato" }, "vaultTimeoutLogOutConfirmation": { - "message": "La disconnessione rimuove tutti gli accessi alla cassaforte e richiede l'autenticazione online dopo il periodo di timeout. Sei sicuro di voler utilizzare questa impostazione?" + "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?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Conferma azione di timeout" @@ -1443,13 +1541,40 @@ "message": "Elemento riempito automaticamente e URI salvato" }, "autoFillSuccess": { - "message": "Elemento riempito automaticamente" + "message": "Elemento riempito automaticamente " + }, + "insecurePageWarning": { + "message": "Attenzione: questa è una pagina HTTP non protetta, e tutte le informazioni che invii potrebbero essere viste e modificate da altri. Questo login è stato originariamente salvato su una pagina sicura (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Vuoi comunque riempire automaticamente questo login?" + }, + "autofillIframeWarning": { + "message": "Il modulo è ospitato da un dominio diverso dall'URI del tuo login salvato. Clicca Ok per riempire automaticamente comunque, o Annulla per interrompere." + }, + "autofillIframeWarningTip": { + "message": "Per evitare questo avviso in futuro, salva questo URI, $HOSTNAME$, nel tuo elemento di login Bitwarden per questo sito.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { - "message": "Imposta la password principale" + "message": "Imposta password principale" + }, + "currentMasterPass": { + "message": "Password principale attuale" + }, + "newMasterPass": { + "message": "Nuova password principale" + }, + "confirmNewMasterPass": { + "message": "Conferma nuova password principale" }, "masterPasswordPolicyInEffect": { - "message": "La password principale deve avere i seguenti requisiti, stabiliti da una o più regole dell'organizzazione:" + "message": "Una o più politiche dell'organizzazione richiedono che la tua password principale soddisfi questi requisiti:" }, "policyInEffectMinComplexity": { "message": "Punteggio minimo di complessità di $SCORE$", @@ -1476,7 +1601,7 @@ "message": "Contiene almeno un carattere minuscolo" }, "policyInEffectNumbers": { - "message": "Contiene almeno una cifra" + "message": "Contiene uno o più numeri" }, "policyInEffectSpecial": { "message": "Contiene almeno uno dei seguenti caratteri speciali $CHARS$", @@ -1488,19 +1613,19 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "La tua nuova password principale non soddisfa i parametri di sicurezza." + "message": "La tua nuova password principale non soddisfa i requisiti di sicurezza." }, "acceptPolicies": { - "message": "Selezionando la casella accetti quanto segue:" + "message": "Selezionando questa casella accetti quanto segue:" }, "acceptPoliciesRequired": { - "message": "I termini di servizio e l'informativa sulla privacy non sono stati accettati." + "message": "I Termini di Servizio e l'Informativa sulla Privacy non sono stati accettati." }, "termsOfService": { - "message": "Termini del servizio" + "message": "Termini di Servizio" }, "privacyPolicy": { - "message": "Informativa sulla privacy" + "message": "Informativa sulla Privacy" }, "hintEqualsPassword": { "message": "Il suggerimento della password non può essere uguale alla password." @@ -1512,43 +1637,43 @@ "message": "Verifica sincronizzazione desktop" }, "desktopIntegrationVerificationText": { - "message": "Verifica che l'applicazione desktop mostri questa impronta digitale: " + "message": "Verifica che l'app desktop mostri questa impronta: " }, "desktopIntegrationDisabledTitle": { "message": "L'integrazione del browser non è abilitata" }, "desktopIntegrationDisabledDesc": { - "message": "L'integrazione del browser non è abilitata nell'applicazione Bitwarden Desktop. Attivala nelle impostazioni all'interno dell'applicazione desktop." + "message": "L'integrazione del browser non è abilitata nell'app Bitwarden Desktop. Attivala nelle impostazioni all'interno dell'app desktop." }, "startDesktopTitle": { - "message": "Avvia l'applicazione desktop Bitwarden" + "message": "Avvia l'app desktop Bitwarden" }, "startDesktopDesc": { - "message": "L'applicazione Bitwarden Desktop deve essere avviata prima che questa funzione possa essere utilizzata." + "message": "L'app Bitwarden Desktop deve essere avviata prima che l'autenticazione biometrica possa essere usata." }, "errorEnableBiometricTitle": { - "message": "Impossibile abilitare l'autenticazione biometrica" + "message": "Impossibile abilitare autenticazione biometrica" }, "errorEnableBiometricDesc": { - "message": "L'azione è stata annullata dall'applicazione desktop" + "message": "L'azione è stata annullata dall'app desktop" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "L'applicazione desktop ha invalidato il canale di comunicazione sicuro. Ritenta l'operazione" + "message": "L'app desktop ha invalidato il canale di comunicazione sicuro. Riprova di nuovo" }, "nativeMessagingInvalidEncryptionTitle": { "message": "Comunicazione desktop interrotta" }, "nativeMessagingWrongUserDesc": { - "message": "L'applicazione desktop è collegata a un account diverso. Assicurati che entrambe le applicazioni siano collegate allo stesso account." + "message": "L'app desktop è collegata a un account diverso. Assicurati che entrambe le app siano collegate allo stesso account." }, "nativeMessagingWrongUserTitle": { - "message": "Account non corrispondente" + "message": "Account non corrispondono" }, "biometricsNotEnabledTitle": { "message": "Autenticazione biometrica non abilitata" }, "biometricsNotEnabledDesc": { - "message": "L'autenticazione biometrica del browser richiede che l'autenticazione biometrica del desktop sia prima abilitata nelle impostazioni." + "message": "L'autenticazione biometrica del browser richiede che l'autenticazione biometrica sia già abilitata anche nelle impostazioni del desktop." }, "biometricsNotSupportedTitle": { "message": "Autenticazione biometrica non supportata" @@ -1556,29 +1681,41 @@ "biometricsNotSupportedDesc": { "message": "L'autenticazione biometrica del browser non è supportata su questo dispositivo." }, + "biometricsFailedTitle": { + "message": "Autenticazione biometrica fallita" + }, + "biometricsFailedDesc": { + "message": "L'autenticazione biometrica non può essere completata, prova a usare una password principale o a uscire. Se il problema persiste, contatta l'assistenza di Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permesso non fornito" }, "nativeMessaginPermissionErrorDesc": { - "message": "Senza l'autorizzazione per comunicare con l'applicazione Bitwarden Desktop non è possibile fornire l'autenticazione biometrica nell'estensione del browser. Riprova di nuovo." + "message": "Senza l'autorizzazione per comunicare con l'app desktop di Bitwarden non è possibile fornire l'autenticazione biometrica nell'estensione del browser. Riprova di nuovo." }, "nativeMessaginPermissionSidebarTitle": { "message": "Errore richiesta di autorizzazione" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Questa azione non può essere eseguita nella barra laterale, riprova l'azione nel popup o nella finestra." + "message": "Questa azione non può essere eseguita nella barra laterale, riprova l'azione nel pop-up o nella finestra." }, "personalOwnershipSubmitError": { - "message": "A causa di una policy aziendale, non è possibile salvare elementi nella tua cassaforte personale. Cambia l'opzione proprietà in un'organizzazione e scegli tra le raccolte disponibili." + "message": "A causa di una politica aziendale, non puoi salvare elementi nella tua cassaforte personale. Cambia l'opzione di proprietà in un'organizzazione e scegli tra le raccolte disponibili." }, "personalOwnershipPolicyInEffect": { - "message": "Una policy dell'organizzazione controlla le opzioni di proprietà." + "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." }, "excludedDomains": { "message": "Domini esclusi" }, "excludedDomainsDesc": { - "message": "Bitwarden non chiederà di salvare i dettagli di accesso per questi domini. È necessario aggiornare la pagina perché le modifiche abbiano effetto." + "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 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." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ non è un dominio valido", @@ -1625,7 +1762,7 @@ "message": "Protetto da password" }, "copySendLink": { - "message": "Copia collegamento del Send", + "message": "Copia link del Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -1642,7 +1779,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Collegamento del Send", + "message": "Link del Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -1664,7 +1801,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "Di quale tipo di Send si tratta?", + "message": "Che tipo di Send è questo?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { @@ -1678,14 +1815,14 @@ "message": "Data di eliminazione" }, "deletionDateDesc": { - "message": "Il Send sarà definitivamente eliminato alla data e ora specificate.", + "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." }, "expirationDate": { "message": "Data di scadenza" }, "expirationDateDesc": { - "message": "Se impostato, l'accesso a questo Send scadrà alla data e all'ora specificate.", + "message": "Se impostato, l'accesso a questo Send scadrà alla data e ora specificate.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { @@ -1707,11 +1844,11 @@ "message": "Numero massimo di accessi" }, "maximumAccessCountDesc": { - "message": "Se impostata, gli utenti non saranno più in grado di accedere a questo Send una volta raggiunto il numero massimo di accessi.", + "message": "Se impostata, gli utenti non potranno più accedere a questo Send una volta raggiunto il numero massimo di accessi.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Facoltativamente, richiedi una password agli utenti per accedere al Send.", + "message": "Richiedi una password agli utenti per accedere a questo Send (facoltativo).", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { @@ -1719,11 +1856,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Disabilita il Send per renderlo inaccessibile.", + "message": "Disattiva il Send per renderlo inaccessibile.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copia il collegamento del Send negli appunti dopo aver salvato.", + "message": "Copia il link al Send negli appunti dopo averlo salvato.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -1734,21 +1871,21 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Numero di accessi attuale" + "message": "Numero di accessi correnti" }, "createSend": { - "message": "Crea nuovo Send", + "message": "Nuovo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Nuova password" }, "sendDisabled": { - "message": "Send disabilitato", + "message": "Send rimosso", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "A causa di una policy aziendale, è possibile eliminare solo un Send esistente.", + "message": "A causa di una politica aziendale, puoi eliminare solo Send esistenti.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -1756,17 +1893,17 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send modificato", + "message": "Send salvato", "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 facendo clic su questo banner." + "message": "Per scegliere un file, apri l'estensione nella barra laterale (se possibile) o apri una nuova finestra cliccando questo banner." }, "sendFirefoxFileWarning": { - "message": "Per scegliere un file utilizzando Firefox, apri l'estensione nella barra laterale o apri una nuova finestra facendo clic sul banner." + "message": "Per scegliere un file usando Firefox, apri l'estensione nella barra laterale o apri una nuova finestra cliccando questo banner." }, "sendSafariFileWarning": { - "message": "Per scegliere un file utilizzando Safari, apri una nuova finestra facendo clic sul banner." + "message": "Per scegliere un file usando Safari, apri una nuova finestra cliccando questo banner." }, "sendFileCalloutHeader": { "message": "Prima di iniziare" @@ -1776,7 +1913,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": "fai clic qui", + "message": "clicca qui", "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": { @@ -1790,10 +1927,10 @@ "message": "La data di eliminazione fornita non è valida." }, "expirationDateAndTimeRequired": { - "message": "È necessario inserire data e ora di scadenza." + "message": "La data e ora di scadenza sono obbligatorie." }, "deletionDateAndTimeRequired": { - "message": "È necessario inserire data e ora di eliminazione." + "message": "La data e ora di eliminazione sono obbligatorie." }, "dateParsingError": { "message": "Si è verificato un errore durante il salvataggio delle date di eliminazione e scadenza." @@ -1802,22 +1939,22 @@ "message": "Nascondi il mio indirizzo email dai destinatari." }, "sendOptionsPolicyInEffect": { - "message": "Una o più policy dell'organizzazione influenzano le opzioni dei Send." + "message": "Una o più politiche dell'organizzazione stanno influenzando le tue opzioni di Send." }, "passwordPrompt": { - "message": "Nuova richiesta della password principale" + "message": "Richiedi di inserire la password principale di nuovo per visualizzare questo elemento" }, "passwordConfirmation": { "message": "Conferma della password principale" }, "passwordConfirmationDesc": { - "message": "Questa azione è protetta. Per continuare, inserisci nuovamente la tua password principale per verificare la tua identità." + "message": "Questa azione è protetta. Inserisci la tua password principale di nuovo per verificare la tua identità." }, "emailVerificationRequired": { - "message": "Verifica email richiesta" + "message": "Verifica email obbligatoria" }, "emailVerificationRequiredDesc": { - "message": "Devi verificare la tua email per utilizzare questa funzionalità. Puoi verificare la tua email nella cassaforte web." + "message": "Devi verificare la tua email per usare questa funzionalità. Puoi verificare la tua email nella cassaforte web." }, "updatedMasterPassword": { "message": "Password principale aggiornata" @@ -1826,19 +1963,27 @@ "message": "Aggiorna password principale" }, "updateMasterPasswordWarning": { - "message": "La tua password principale è stata recentemente modificata da un amministratore nella tua organizzazione. Per accedere alla cassaforte, aggiorna ora la password. Procedendo sarai disconnesso dalla sessione attuale e ti sarà richiesto di effettuare nuovamente l'accesso. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora." + "message": "La tua password principale è stata recentemente modificata da un amministratore nella 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." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Iscrizione automatica" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Questa organizzazione ha una policy aziendale che ti iscriverà automaticamente al ripristino della password. Ciò permetterà agli amministratori dell'organizzazione di cambiare la tua password principale." + "message": "Questa organizzazione ha una politica aziendale che ti iscriverà automaticamente al ripristino della password. Questo permetterà agli amministratori dell'organizzazione di cambiare la tua password principale." }, "selectFolder": { "message": "Seleziona cartella..." }, - "ssoCompleteRegistration": { - "message": "Per completare l'accesso con SSO, imposta una password principale per accedere e proteggere la cassaforte." + "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" }, "hours": { "message": "Ore" @@ -1847,7 +1992,20 @@ "message": "Minuti" }, "vaultTimeoutPolicyInEffect": { - "message": "Le policy dell'organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti", + "message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.", + "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": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Le politiche della tua organizzazione hanno impostato l'azione di timeout cassaforte su $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1863,19 +2034,19 @@ "message": "Il timeout della tua cassaforte supera i limiti impostati dalla tua organizzazione." }, "vaultExportDisabled": { - "message": "Esportazione cassaforte disabilitata" + "message": "Esportazione della cassaforte non disponibile" }, "personalVaultExportPolicyInEffect": { - "message": "Una o più policy dell'organizzazione ti impediscono di esportare la tua cassaforte personale." + "message": "Una o più politiche dell'organizzazione ti impediscono di esportare la tua cassaforte personale." }, "copyCustomFieldNameInvalidElement": { - "message": "Impossibile identificare un elemento del form valido. Prova a ispezionare l'HTML." + "message": "Impossibile identificare un elemento del modulo valido. Prova a ispezionare l'HTML." }, "copyCustomFieldNameNotUnique": { "message": "Nessun identificatore univoco trovato." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ sta usando SSO con un server \"self-hosted\". Non è più richiesta una password principale per accedere per i membri di questa organizzazione.", + "message": "$ORGANIZATION$ sta usando SSO con un server self-hosted. Una password principale non è più necessaria per accedere per i membri di questa organizzazione.", "placeholders": { "organization": { "content": "$1", @@ -1884,13 +2055,13 @@ } }, "leaveOrganization": { - "message": "Lascia l'organizzazione" + "message": "Lascia organizzazione" }, "removeMasterPassword": { - "message": "Rimuovi la password principale" + "message": "Rimuovi password principale" }, "removedMasterPassword": { - "message": "Password principale rimossa." + "message": "Password principale rimossa" }, "leaveOrganizationConfirmation": { "message": "Sei sicuro di voler lasciare questa organizzazione?" @@ -1902,13 +2073,13 @@ "message": "Attiva/Disattiva conteggio dei caratteri" }, "sessionTimeout": { - "message": "La tua sessione è scaduta. Torna indietro e riprova ad accedere." + "message": "La tua sessione è scaduta. Torna indietro e prova ad accedere di nuovo." }, "exportingPersonalVaultTitle": { "message": "Esportazione cassaforte personale" }, - "exportingPersonalVaultDescription": { - "message": "Saranno esportati solo gli oggetti della cassaforte personale associati a $EMAIL$. Gli oggetti della cassaforte dell'organizzazione non saranno inclusi.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1933,7 +2104,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Usa le funzionalità di sub-indirizzamento del tuo fornitore di posta elettronica." + "message": "Usa le funzionalità di sub-indirizzamento del tuo fornitore di email." }, "catchallEmail": { "message": "Email catch-all" @@ -1951,7 +2122,7 @@ "message": "Nome sito web" }, "whatWouldYouLikeToGenerate": { - "message": "Cosa vorresti generare?" + "message": "Cosa vuoi generare?" }, "passwordType": { "message": "Tipo di password" @@ -1982,16 +2153,13 @@ "message": "È richiesto un abbonamento Premium" }, "organizationIsDisabled": { - "message": "L'organizzazione è disabilitata." + "message": "Organizzazione disabilitata." }, "disabledOrganizationFilterError": { - "message": "Non è possibile accedere agli oggetti nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per ricevere assistenza." - }, - "cardBrandMir": { - "message": "Mir" + "message": "Non è possibile accedere a elementi da organizzazioni disabilitate. Contatta il proprietario della tua organizzazione." }, "loggingInTo": { - "message": "Accedo a $DOMAIN$", + "message": "Accedendo a $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -2000,7 +2168,7 @@ } }, "settingsEdited": { - "message": "Le impostazioni sono state cambiate" + "message": "Impostazioni modificate" }, "environmentEditedClick": { "message": "Clicca qui" @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Versione Server" }, - "selfHosted": { - "message": "Self-Hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Terze parti" @@ -2036,10 +2204,10 @@ } }, "loginWithMasterPassword": { - "message": "Accedi con la password principale" + "message": "Accedi con password principale" }, "loggingInAs": { - "message": "Accesso eseguito come" + "message": "Accedendo come" }, "notYou": { "message": "Non sei tu?" @@ -2050,20 +2218,44 @@ "rememberEmail": { "message": "Ricorda email" }, + "loginWithDevice": { + "message": "Accedi con dispositivo" + }, + "loginWithDeviceEnabledInfo": { + "message": "L'accesso con dispositivo deve essere abilitato nelle impostazioni dell'app Bitwarden. Ti serve un'altra opzione?" + }, + "fingerprintPhraseHeader": { + "message": "Frase impronta" + }, + "fingerprintMatchInfo": { + "message": "Assicurati che la tua cassaforte sia sbloccata e che la frase impronta corrisponda sull'altro dispositivo." + }, + "resendNotification": { + "message": "Invia notifica di nuovo" + }, + "viewAllLoginOptions": { + "message": "Visualizza tutte le opzioni di accesso" + }, + "notificationSentDevice": { + "message": "Una notifica è stata inviata al tuo dispositivo." + }, + "loginInitiated": { + "message": "Accesso avviato" + }, "exposedMasterPassword": { "message": "Password principale violata" }, "exposedMasterPasswordDesc": { - "message": "Password trovata in un database di data breach noto. Usa una password esclusiva per proteggere il tuo account. Sei sicuro di voler usare una password violata?" + "message": "Password trovata una violazione dei dati. Usa una password unica per proteggere il tuo account. Sei sicuro di voler usare una password violata?" }, "weakAndExposedMasterPassword": { "message": "Password principale debole e violata" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Password debole trovata in un database di data breach noto. Usa una password forte ed esclusiva per proteggere il tuo account. Sei sicuro di voler utilizzare questa password?" + "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?" }, "checkForBreaches": { - "message": "Controlla se la tua password è presente nei database dei data breach noti" + "message": "Controlla se la tua password è presente in una violazione dei dati" }, "important": { "message": "Importante:" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Le politiche della tua organizzazione hanno abilitato il riempimento automatico al caricamento della pagina." + }, + "howToAutofill": { + "message": "Come riempire automaticamente" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Ok" + }, + "autofillSettings": { + "message": "Impostazioni di riempimento automatico" + }, + "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." + }, + "autofillShortcutText": { + "message": "La scorciatoia da tastiera per riempire automaticamente è: $COMMAND$. Cambiala nelle impostazioni del browser.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Scorciatoia da tastiera predefinita per riempire automaticamente: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Accedendo su" + }, + "opensInANewWindow": { + "message": "Si apre in una nuova finestra" + }, + "deviceApprovalRequired": { + "message": "Approvazione del dispositivo obbligatoria. Seleziona un'opzione di approvazione:" + }, + "rememberThisDevice": { + "message": "Ricorda questo dispositivo" + }, + "uncheckIfPublicDevice": { + "message": "Deseleziona se stai usando un dispositivo pubblico" + }, + "approveFromYourOtherDevice": { + "message": "Approva dall'altro tuo dispositivo" + }, + "requestAdminApproval": { + "message": "Richiedi approvazione dell'amministratore" + }, + "approveWithMasterPassword": { + "message": "Approva con password principale" + }, + "ssoIdentifierRequired": { + "message": "Identificatore SSO dell'organizzazione obbligatorio." + }, + "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." + }, + "general": { + "message": "Generale" + }, + "display": { + "message": "Schermo" + }, + "accountSuccessfullyCreated": { + "message": "Account creato!" + }, + "adminApprovalRequested": { + "message": "Approvazione dell'amministratore richiesta" + }, + "adminApprovalRequestSentToAdmins": { + "message": "La tua richiesta è stata inviata al tuo amministratore." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Riceverai una notifica una volta approvato." + }, + "troubleLoggingIn": { + "message": "Problemi ad accedere?" + }, + "loginApproved": { + "message": "Accesso approvato" + }, + "userEmailMissing": { + "message": "Email utente mancante" + }, + "deviceTrusted": { + "message": "Dispositivo fidato" + }, + "inputRequired": { + "message": "Input obbligatorio." + }, + "required": { + "message": "obbligatorio" + }, + "search": { + "message": "Cerca" + }, + "inputMinLength": { + "message": "L'input deve essere lungo almeno $COUNT$ caratteri.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "L'input non deve essere più lungo di $COUNT$ caratteri.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Questi caratteri non sono permessi: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Il valore immesso deve essere almeno $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Il valore immesso non deve superare $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Una o più email non sono valide" + }, + "inputTrimValidator": { + "message": "L'input non può contenere solo spazi.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "L'input non è un indirizzo email." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campi qui sopra richiedono la tua attenzione.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Seleziona --" + }, + "multiSelectPlaceholder": { + "message": "-- Digita per filtrare --" + }, + "multiSelectLoading": { + "message": "Ottenendo opzioni..." + }, + "multiSelectNotFound": { + "message": "Nessun elemento trovato" + }, + "multiSelectClearAll": { + "message": "Cancella tutto" + }, + "plusNMore": { + "message": "+$QUANTITY$ in più", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Sottomenu" + }, + "toggleCollapse": { + "message": "Comprimi/espandi", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Riempimento automatico al caricamento della pagina impostato con l'impostazione predefinita.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Sblocca account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Destinazione dell'importazione" + }, + "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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Conferma" + }, + "savePasskey": { + "message": "Salva passkey" + }, + "savePasskeyNewLogin": { + "message": "Salva la passkey come nuovo elemento" + }, + "choosePasskey": { + "message": "Scegli un elemento in cui salvare questa passkey" + }, + "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." + }, + "useBrowserName": { + "message": "Usa browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Verifica in due passaggi annullata" + }, + "noLastPassDataFound": { + "message": "Nessun dato di LastPass trovato" + }, + "incorrectUsernameOrPassword": { + "message": "Nome utente o password errati" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 85fbf9063fe3..400ee49b33cb 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "自動入力" }, + "autoFillLogin": { + "message": "自動入力ログイン" + }, + "autoFillCard": { + "message": "自動入力カード" + }, + "autoFillIdentity": { + "message": "自動入力 ID" + }, "generatePasswordCopied": { "message": "パスワードを生成 (コピー)" }, @@ -98,7 +107,22 @@ "message": "カスタムフィールド名をコピー" }, "noMatchingLogins": { - "message": "一致するログインがありません。" + "message": "一致するログイン認証情報がありません。" + }, + "noCards": { + "message": "カードなし" + }, + "noIdentities": { + "message": "ID なし" + }, + "addLoginMenu": { + "message": "ログイン情報を追加" + }, + "addCardMenu": { + "message": "カードを追加" + }, + "addIdentityMenu": { + "message": "ID を追加" }, "unlockVaultMenu": { "message": "保管庫のロックを解除" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "ヘルプ&フィードバック" }, + "helpCenter": { + "message": "Bitwarden ヘルプセンター" + }, + "communityForums": { + "message": "Bitwarden コミュニティフォーラムを探索" + }, + "contactSupport": { + "message": "Bitwarden サポートへの問い合わせ" + }, "sync": { "message": "同期" }, @@ -329,6 +362,12 @@ "other": { "message": "その他" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "保管庫のタイムアウト動作を変更するには、ロック解除方法を設定してください。" + }, + "unlockMethodNeeded": { + "message": "設定でロック解除方法をセットアップ" + }, "rateExtension": { "message": "拡張機能の評価" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "今すぐロック" }, + "lockAll": { + "message": "すべてロック" + }, "immediately": { "message": "すぐに" }, @@ -430,7 +472,14 @@ "message": "マスターパスワードの再入力が必要です。" }, "masterPasswordMinlength": { - "message": "マスターパスワードは、少なくとも8文字以上で設定してください。" + "message": "マスターパスワードは少なくとも $VALUE$ 文字以上でなければなりません。", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "マスターパスワードが一致しません。" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "初めてログインしたとき保管庫にログイン情報を保存するよう「ログイン情報を追加」通知を自動的に表示します。" }, + "addLoginNotificationDescAlt": { + "message": "保管庫にアイテムが見つからない場合は、アイテムを追加するよう要求します。ログインしているすべてのアカウントに適用されます。" + }, "showCardsCurrentTab": { "message": "タブページにカードを表示" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "ウェブサイトで変更があったとき、ログイン情報のパスワードを更新するか尋ねます" }, + "changedPasswordNotificationDescAlt": { + "message": "ウェブサイトで変更が検出された場合、ログインパスワードを更新するように求めます。ログインしているすべてのアカウントに適用されます。" + }, + "enableUsePasskeys": { + "message": "パスキーの保存と使用を尋ねる" + }, + "usePasskeysDesc": { + "message": "新しいパスキーを保存するか、保管庫に保存されているパスキーでログインするよう要求します。ログインしているすべてのアカウントに適用されます。" + }, "notificationChangeDesc": { "message": "Bitwarden でこのパスワードを更新しますか?" }, "notificationChangeSave": { "message": "今すぐ更新する" }, + "notificationUnlockDesc": { + "message": "Bitwarden 保管庫をロック解除して自動入力リクエストを完了してください。" + }, + "notificationUnlock": { + "message": "ロック解除" + }, "enableContextMenuItem": { "message": "コンテキストメニューオプションを表示" }, "contextMenuItemDesc": { "message": "コンテキストメニューでパスワード生成やログイン情報の入力をできるようにします" }, + "contextMenuItemDescAlt": { + "message": "コンテキストメニューを使用して、ウェブサイトのパスワード生成と一致するログインにアクセスします。ログインしているすべてのアカウントに適用されます。" + }, "defaultUriMatchDetection": { "message": "デフォルトの URI 一致検出方法", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "アプリのテーマカラーを変更します。" }, + "themeDescAlt": { + "message": "アプリのカラーテーマを変更します。ログインしているすべてのアカウントに適用されます。" + }, "dark": { "message": "ダーク", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "サービスが利用できません" }, - "updateKey": { - "message": "暗号キーを更新するまでこの機能は使用できません。" + "encryptionKeyMigrationRequired": { + "message": "暗号化キーの移行が必要です。暗号化キーを更新するには、ウェブ保管庫からログインしてください。" }, "premiumMembership": { "message": "プレミアム会員" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1GB の暗号化されたファイルストレージ" }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey、FIDO U2F、Duoなどの追加の2段階認証ログインオプション" + "premiumSignUpTwoStepOptions": { + "message": "YubiKey、Duo などのプロプライエタリな2段階認証オプション。" }, "ppremiumSignUpReports": { "message": "保管庫を安全に保つための、パスワードやアカウントの健全性、データ侵害に関するレポート" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "環境 URL を保存しました。" }, + "showAutoFillMenuOnFormFields": { + "message": "フォーム項目に自動入力メニューを表示", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "ページ読み込み時の自動入力を有効化" }, @@ -960,7 +1058,7 @@ "message": "ページ読み込み時にログインフォームを検出したとき、ログイン情報を自動入力します。" }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "ウイルス感染したり信頼できないウェブサイトは、ページの読み込み時の自動入力を悪用できてしまいます。" }, "learnMoreAboutAutofill": { "message": "自動入力についての詳細" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "ログイン情報の隣にアイコン画像を表示します" }, + "faviconDescAlt": { + "message": "各ログインの横に認識可能な画像を表示します。すべてのログイン済みアカウントに適用されます。" + }, "enableBadgeCounter": { "message": "バッジカウンターを表示" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "アイテムをリストア" }, - "restoreItemConfirmation": { - "message": "このアイテムをリストアしますか?" - }, "restoredItem": { "message": "リストアされたアイテム" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "アイテムを自動入力しました" }, + "insecurePageWarning": { + "message": "警告: これはセキュリティ保護されていない HTTP ページであり、送信する情報は他の人によって見られ、変更される可能性があります。 このログイン情報はもともとセキュア (HTTPS) ページに保存されていました。" + }, + "insecurePageWarningFillPrompt": { + "message": "このログイン情報を入力しますか?" + }, + "autofillIframeWarning": { + "message": "フォームは保存したログイン情報の URI とは異なるドメインによってホストされています。無視して自動入力するなら OK を選択し、中止したければキャンセルを選択してください。" + }, + "autofillIframeWarningTip": { + "message": "この警告を将来的に防ぐためには、この URI と $HOSTNAME$ をこのサイトの Bitwarden ログインアイテムに保存してください。", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "マスターパスワードを設定" }, + "currentMasterPass": { + "message": "現在のマスターパスワード" + }, + "newMasterPass": { + "message": "新しいマスターパスワード" + }, + "confirmNewMasterPass": { + "message": "新しいマスターパスワードの確認" + }, "masterPasswordPolicyInEffect": { "message": "組織が求めるマスターパスワードの要件:" }, @@ -1512,7 +1637,7 @@ "message": "デスクトップ同期の検証" }, "desktopIntegrationVerificationText": { - "message": "デスクトップアプリにこの指紋が表示されていることを確認してください: " + "message": "デスクトップアプリにこれが表示されていることを確認してください: " }, "desktopIntegrationDisabledTitle": { "message": "ブラウザ統合が有効になっていません" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "このデバイスではブラウザの生体認証に対応していません。" }, + "biometricsFailedTitle": { + "message": "生体認証に失敗しました" + }, + "biometricsFailedDesc": { + "message": "生体認証を完了できません。マスターパスワードを使うかログアウトしてください。それでも直らない場合は、Bitwarden サポートまでお問い合わせください。" + }, "nativeMessaginPermissionErrorTitle": { "message": "権限が提供されていません" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "組織のポリシーが所有者のオプションに影響を与えています。" }, + "personalOwnershipPolicyInEffectImports": { + "message": "組織のポリシーにより、個々の保管庫へのアイテムのインポートがブロックされました。" + }, "excludedDomains": { "message": "除外するドメイン" }, "excludedDomainsDesc": { "message": "Bitwarden はこれらのドメインのログイン情報を保存するよう尋ねません。変更を有効にするにはページを更新する必要があります。" }, + "excludedDomainsDescAlt": { + "message": "Bitwarden はログインしているすべてのアカウントで、これらのドメインのログイン情報を保存するよう要求しません。 変更を有効にするにはページを更新する必要があります。" + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ は有効なドメインではありません", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "マスターパスワードは最近組織の管理者によって変更されました。保管庫にアクセスするには、今すぐ更新する必要があります。 続行すると現在のセッションからログアウトし、再度ログインする必要があります。 他のデバイスでのアクティブなセッションは、最大1時間アクティブになり続けることがあります。" }, + "updateWeakMasterPasswordWarning": { + "message": "あなたのマスターパスワードは、組織のポリシーを満たしていません。保管庫にアクセスするには、今すぐマスターパスワードを更新する必要があります。この操作を続けると、現在のセッションがログアウトされ、再ログインする必要があります。他のデバイスでのアクティブなセッションは最大1時間継続する場合があります。" + }, "resetPasswordPolicyAutoEnroll": { "message": "自動登録" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "フォルダーを選択..." }, - "ssoCompleteRegistration": { - "message": "SSO ログインを完了するには、保管庫にアクセス・保護するためのマスターパスワードを設定してください。" + "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" }, "hours": { "message": "時間" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "組織のポリシーがあなたの保管庫のタイムアウトに影響しす。保管庫の最大許容タイムアウトは$HOURS$時間$MINUTES$分です。保管庫のタイムアウト設定は$ACTION$にあります。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "あなたの保管庫のタイムアウト設定は、組織のポリシーで決められた$ACTION$にあります。", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "保管庫のタイムアウトが組織によって設定された制限を超えています。" }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "個人保管庫のエクスポート" }, - "exportingPersonalVaultDescription": { - "message": "$EMAIL$ に関連付けられた個人用保管庫アイテムのみがエクスポートされます。組織用保管庫アイテムは含まれません。", + "exportingIndividualVaultDescription": { + "message": "$EMAIL$ に関連付けられた個人の保管庫アイテムのみがエクスポートされます。組織の保管庫アイテムは含まれません。 保管庫アイテム情報のみがエクスポートされ、関連する添付ファイルはエクスポートされません。", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。" }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "$DOMAIN$ にログイン中", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "サーバーのバージョン" }, - "selfHosted": { - "message": "セルフホスト" + "selfHostedServer": { + "message": "自己ホスト型" }, "thirdParty": { "message": "サードパーティー" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "メールアドレスを保存" }, + "loginWithDevice": { + "message": "デバイスでログイン" + }, + "loginWithDeviceEnabledInfo": { + "message": "Bitwarden アプリの設定でデバイスでログインする必要があります。別のオプションが必要ですか?" + }, + "fingerprintPhraseHeader": { + "message": "パスフレーズ" + }, + "fingerprintMatchInfo": { + "message": "保管庫がロックされていることと、パスフレーズが他のデバイスと一致していることを確認してください。" + }, + "resendNotification": { + "message": "通知を再送信する" + }, + "viewAllLoginOptions": { + "message": "すべてのログインオプションを表示" + }, + "notificationSentDevice": { + "message": "デバイスに通知を送信しました。" + }, + "loginInitiated": { + "message": "ログイン開始" + }, "exposedMasterPassword": { "message": "流出したマスターパスワード" }, @@ -2060,7 +2252,7 @@ "message": "脆弱で流出済みのマスターパスワード" }, "weakAndBreachedMasterPasswordDesc": { - "message": "入力されたパスワードは脆弱かつすでに流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" + "message": "入力されたパスワードは脆弱かつ流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" }, "checkForBreaches": { "message": "このパスワードの既知のデータ流出を確認" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "組織のポリシーはページ読み込み時の自動入力をオンにしました。" + }, + "howToAutofill": { + "message": "自動入力する方法" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "了解" + }, + "autofillSettings": { + "message": "自動入力の設定" + }, + "autofillShortcut": { + "message": "自動入力キーボードショートカット" + }, + "autofillShortcutNotSet": { + "message": "自動入力のショートカットが設定されていません。ブラウザの設定で変更してください。" + }, + "autofillShortcutText": { + "message": "自動入力のショートカットは $COMMAND$ です。ブラウザの設定でこれを変更してください。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "デフォルトの自動入力ショートカットは $COMMAND$ です。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "ログイン先" + }, + "opensInANewWindow": { + "message": "新しいウィンドウで開く" + }, + "deviceApprovalRequired": { + "message": "デバイスの承認が必要です。以下から承認オプションを選択してください:" + }, + "rememberThisDevice": { + "message": "このデバイスを記憶する" + }, + "uncheckIfPublicDevice": { + "message": "パブリックデバイスを使用している場合はチェックしないでください" + }, + "approveFromYourOtherDevice": { + "message": "他のデバイスから承認する" + }, + "requestAdminApproval": { + "message": "管理者の承認を要求する" + }, + "approveWithMasterPassword": { + "message": "マスターパスワードで承認する" + }, + "ssoIdentifierRequired": { + "message": "組織の SSO ID が必要です。" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "アクセスが拒否されました。このページを表示する権限がありません。" + }, + "general": { + "message": "全般" + }, + "display": { + "message": "表示" + }, + "accountSuccessfullyCreated": { + "message": "アカウントを正常に作成しました!" + }, + "adminApprovalRequested": { + "message": "管理者の承認を要求しました" + }, + "adminApprovalRequestSentToAdmins": { + "message": "要求を管理者に送信しました。" + }, + "youWillBeNotifiedOnceApproved": { + "message": "承認されると通知されます。 " + }, + "troubleLoggingIn": { + "message": "ログインできない場合" + }, + "loginApproved": { + "message": "ログインが承認されました" + }, + "userEmailMissing": { + "message": "ユーザーのメールアドレスがありません" + }, + "deviceTrusted": { + "message": "信頼されたデバイス" + }, + "inputRequired": { + "message": "入力が必要です。" + }, + "required": { + "message": "必須" + }, + "search": { + "message": "検索" + }, + "inputMinLength": { + "message": "$COUNT$ 文字以上でなければなりません。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "$COUNT$ 文字を超えてはいけません。", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "次の文字は許可されていません: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "入力値は少なくとも$MIN$桁でなければなりません。", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "入力値は$MAX$桁を超えてはいけません。", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1つ以上のメールアドレスが無効です" + }, + "inputTrimValidator": { + "message": "値を空白のみにしないでください。", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "入力したものはメールアドレスではありません。" + }, + "fieldsNeedAttention": { + "message": "上記の $COUNT$ 点を確認してください。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- 選択 --" + }, + "multiSelectPlaceholder": { + "message": "-- 入力して絞り込み --" + }, + "multiSelectLoading": { + "message": "オプションを取得中..." + }, + "multiSelectNotFound": { + "message": "アイテムが見つかりません" + }, + "multiSelectClearAll": { + "message": "すべてクリア" + }, + "plusNMore": { + "message": "+ $QUANTITY$ 個以上", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "サブメニュー" + }, + "toggleCollapse": { + "message": "開く/閉じる", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "エイリアスドメイン" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "マスターパスワードの再入力を促すアイテムは、ページ読み込み時に自動入力できません。ページ読み込み時の自動入力をオフにしました。", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ページ読み込み時の自動入力はデフォルトの設定を使うよう設定しました。", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "アカウントのロックを解除", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "合計" + }, + "importWarning": { + "message": "$ORGANIZATION$にデータをインポートしています。データはこの組織のメンバーと共有される可能性があります。続行しますか?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "データが正しい形式ではありません。インポートするファイルを確認してやり直してください。" + }, + "importNothingError": { + "message": "何もインポートされませんでした。" + }, + "importEncKeyError": { + "message": "エクスポートされたファイルの復号でエラーが発生しました。暗号化キーが、データをエクスポートするために使用された暗号化キーと一致しません。" + }, + "invalidFilePassword": { + "message": "無効なファイルパスワードです。エクスポートファイルを作成したときに入力したパスワードを使用してください。" + }, + "importDestination": { + "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": "ファイルパスワードの確認" + }, + "typePasskey": { + "message": "パスキー" + }, + "passkeyNotCopied": { + "message": "パスキーはコピーされません" + }, + "passkeyNotCopiedAlert": { + "message": "パスキーは複製されたアイテムにコピーされません。このアイテムを複製しますか?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "開始サイトでの認証が必要です。この機能はマスターパスワードのないアカウントではまだ対応していません。" + }, + "logInWithPasskey": { + "message": "パスキーでログインしますか?" + }, + "passkeyAlreadyExists": { + "message": "このアプリにはすでにパスキーが存在します。" + }, + "noPasskeysFoundForThisApplication": { + "message": "このアプリにはパスキーがありません。" + }, + "noMatchingPasskeyLogin": { + "message": "このサイトに一致するログイン情報がありません。" + }, + "confirm": { + "message": "確認" + }, + "savePasskey": { + "message": "パスキーを保存" + }, + "savePasskeyNewLogin": { + "message": "パスキーを新しいログイン情報として保存" + }, + "choosePasskey": { + "message": "このパスキーを保存するログイン情報を選択してください" + }, + "passkeyItem": { + "message": "パスキーアイテム" + }, + "overwritePasskey": { + "message": "パスキーを上書きしますか?" + }, + "overwritePasskeyAlert": { + "message": "このアイテムにはすでにパスキーが含まれています。現在のパスキーを上書きしてもよろしいですか?" + }, + "featureNotSupported": { + "message": "機能は未対応です" + }, + "yourPasskeyIsLocked": { + "message": "パスキーを使用するには認証が必要です。続行するには本人確認を行ってください。" + }, + "useBrowserName": { + "message": "ブラウザーを使用" + }, + "multifactorAuthenticationCancelled": { + "message": "多要素認証がキャンセルされました" + }, + "noLastPassDataFound": { + "message": "LastPass データが見つかりません" + }, + "incorrectUsernameOrPassword": { + "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": "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": "アクティブなアカウント" + }, + "accountLimitReached": { + "message": "アカウントの制限に達しました。別のアカウントを追加するにはまずログアウトしてください。" + }, + "active": { + "message": "アクティブ" + }, + "locked": { + "message": "ロック中" + }, + "unlocked": { + "message": "ロック解除済み" + }, + "server": { + "message": "サーバー" + }, + "hostedAt": { + "message": "ホスト" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 680cab2a0a6d..edd30fd436ec 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "თვითშევსება" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generate password (copied)" }, @@ -100,6 +109,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" }, @@ -137,7 +161,7 @@ "message": "კოდი გაიგზავნა" }, "verificationCode": { - "message": "ვერიფიკაციის კოდი" + "message": "ერთჯერადი კოდი" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -195,6 +219,15 @@ "helpFeedback": { "message": "დახმარება & გამოხმაურება" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "სინქრონიზაცია" }, @@ -329,6 +362,12 @@ "other": { "message": "სხვა" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "დაუყონებლივ" }, @@ -418,10 +460,10 @@ "message": "დაფიქსირდა შეცდომა" }, "emailRequired": { - "message": "ელექტრონული ფოსტის მისამართი აუცილებელია." + "message": "ელ-ფოსტის მისამართი აუცილებელია." }, "invalidEmail": { - "message": "არასწორი ელექტრო ფოსტის მისამართი." + "message": "არასწორი ელ-ფოსტის მისამართი." }, "masterPasswordRequired": { "message": "Master password is required." @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -442,7 +491,7 @@ "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { - "message": "ვერიფიკაციის კოდი აუცილებელია." + "message": "ერთჯერადი კოდი აუცილებელია." }, "invalidVerificationCode": { "message": "Invalid verification code" @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index ddda55bfd0ac..ab3933bf5b77 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 43aa445b5caa..289cc9c36d87 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "ಸ್ವಯಂ ಭರ್ತಿ" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "ಪಾಸ್ವರ್ಡ್ ರಚಿಸಿ (ನಕಲಿಸಲಾಗಿದೆ)" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "ಸಹಾಯ ಪ್ರತಿಕ್ರಿಯೆ\n" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "ಸಿಂಕ್" }, @@ -329,6 +362,12 @@ "other": { "message": "ಇತರೆ" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "ವಿಸ್ತರಣೆಯನ್ನು ರೇಟ್ ಮಾಡಿ" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "ಈಗ ಲಾಕ್ ಮಾಡಿ" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ತಕ್ಷಣ" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ದೃಢೀಕರಣವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "\"ಲಾಗಿನ್ ಅಧಿಸೂಚನೆಯನ್ನು ಸೇರಿಸಿ\" ನೀವು ಮೊದಲ ಬಾರಿಗೆ ಪ್ರವೇಶಿಸಿದಾಗಲೆಲ್ಲಾ ಹೊಸ ಲಾಗಿನ್‌ಗಳನ್ನು ನಿಮ್ಮ ವಾಲ್ಟ್‌ಗೆ ಉಳಿಸಲು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕೇಳುತ್ತದೆ." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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": "ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಿಟ್ವರ್ಡ್ನಲ್ಲಿ ನವೀಕರಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ?" }, "notificationChangeSave": { "message": "ಹೌದು, ಈಗ ನವೀಕರಿಸಿ" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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": "ಡೀಫಾಲ್ಟ್ ಯುಆರ್ಐ ಹೊಂದಾಣಿಕೆ ಪತ್ತೆ", @@ -633,6 +703,9 @@ "themeDesc": { "message": "ಅಪ್ಲಿಕೇಶನ್‌ನ ಬಣ್ಣ ಥೀಮ್ ಅನ್ನು ಬದಲಾಯಿಸಿ." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ಡಾರ್ಕ್", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ" }, - "updateKey": { - "message": "ನಿಮ್ಮ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ನವೀಕರಿಸುವವರೆಗೆ ನೀವು ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವ" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ." }, - "ppremiumSignUpTwoStep": { - "message": "ಹೆಚ್ಚುವರಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳಾದ ಯೂಬಿಕೆ, ಎಫ್‌ಐಡಿಒ ಯು 2 ಎಫ್, ಮತ್ತು ಡ್ಯುವೋ." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ಪಾಸ್ವರ್ಡ್ ನೈರ್ಮಲ್ಯ, ಖಾತೆ ಆರೋಗ್ಯ ಮತ್ತು ಡೇಟಾ ಉಲ್ಲಂಘನೆ ವರದಿಗಳು." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "ಪರಿಸರ URL ಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "ಪುಟ ಲೋಡ್‌ನಲ್ಲಿ ಸ್ವಯಂ ಭರ್ತಿ ಸಕ್ರಿಯಗೊಳಿಸಿ" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಿ" }, - "restoreItemConfirmation": { - "message": "ಈ ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?" - }, "restoredItem": { "message": "ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "ಸ್ವಯಂ ತುಂಬಿದ ಐಟಂ" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಸಿ" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "ಬ್ರೌಸರ್ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಈ ಸಾಧನದಲ್ಲಿ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "ಅನುಮತಿ ಒದಗಿಸಲಾಗಿಲ್ಲ" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "ಸಂಸ್ಥೆಯ ನೀತಿಯು ನಿಮ್ಮ ಮಾಲೀಕತ್ವದ ಆಯ್ಕೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತಿದೆ." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ಮಾನ್ಯವಾದ ಡೊಮೇನ್ ಅಲ್ಲ", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index ea5ac15bdcbd..309ed96aff0e 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "자동 완성" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "비밀번호 생성 및 클립보드에 복사" }, @@ -100,6 +109,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": "보관함 잠금 해제" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "도움말 및 의견" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "동기화" }, @@ -329,6 +362,12 @@ "other": { "message": "기타" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "확장 프로그램 평가" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "지금 잠그기" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "즉시" }, @@ -409,7 +451,7 @@ "message": "브라우저 다시 시작 시" }, "never": { - "message": "잠그지 않음" + "message": "안함" }, "security": { "message": "보안" @@ -430,7 +472,14 @@ "message": "마스터 비밀번호를 재입력해야 합니다." }, "masterPasswordMinlength": { - "message": "마스터 비밀번호는 최소 8자 이상이어야 합니다." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "마스터 비밀번호 확인과 마스터 비밀번호가 일치하지 않습니다." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "\"로그인 추가 알림\"을 사용하면 새 로그인을 사용할 때마다 보관함에 그 로그인을 추가할 것인지 물어봅니다." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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에 저장되어 있는 비밀번호를 이 비밀번호로 변경하시겠습니까?" }, "notificationChangeSave": { "message": "예, 지금 변경하겠습니다." }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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 일치 인식", @@ -633,6 +703,9 @@ "themeDesc": { "message": "애플리케이션의 색상 테마를 변경합니다." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "어두운 테마", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "기능 사용할 수 없음" }, - "updateKey": { - "message": "이 기능을 사용하려면 암호화 키를 업데이트해야 합니다." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "프리미엄 멤버십" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1GB의 암호화된 파일 저장소." }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey나 FIDO U2F, Duo 등의 추가적인 2단계 인증 옵션." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "보관함을 안전하게 유지하기 위한 암호 위생, 계정 상태, 데이터 유출 보고서" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "환경 URL 값을 저장했습니다." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "페이지 로드 시 자동 완성 사용" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "항목 복원" }, - "restoreItemConfirmation": { - "message": "정말 이 항목을 복원하시겠습니까?" - }, "restoredItem": { "message": "복원된 항목" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "항목을 자동 완성함" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "마스터 비밀번호 설정" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "하나 이상의 단체 정책이 마스터 비밀번호가 다음 사항을 따르도록 요구합니다:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "이 기기에서는 생체 인식이 지원되지 않습니다." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "권한이 부여되지 않음" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "조직의 정책이 소유권 설정에 영향을 미치고 있습니다." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ 도메인은 유효한 도메인이 아닙니다.", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "최근에 조직 관리자가 마스터 비밀번호를 변경했습니다. 보관함에 액세스하려면 지금 업데이트해야 합니다. 계속하면 현재 세션에서 로그아웃되며 다시 로그인해야 합니다. 다른 장치의 활성 세션은 최대 1시간 동안 계속 활성 상태로 유지될 수 있습니다." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "자동 등록" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "폴더 선택..." }, - "ssoCompleteRegistration": { - "message": "SSO 로그인을 하기 위해서 보관함에 접근하고 보호할 수 있도록 마스터 비밀번호를 설정해주세요." + "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" }, "hours": { "message": "시" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "개인 보관함을 내보내는 중" }, - "exportingPersonalVaultDescription": { - "message": "오직 $EMAIL$와 연관된 개인 보관함의 항목만 내보내집니다. 조직 보관함의 항목은 포함되지 않습니다.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index ac0f8dc1c1f8..11b6b88a2456 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -47,7 +47,7 @@ "message": "Pakartokite pagrindinį slaptažodį" }, "masterPassHint": { - "message": " Pagrindinio slaptažodžio užuomina (neprivaloma)" + "message": "Pagrindinio slaptažodžio užuomina (neprivaloma)" }, "tab": { "message": "Skirtukas" @@ -56,7 +56,7 @@ "message": "Saugykla" }, "myVault": { - "message": "Saugykla" + "message": "Mano saugykla" }, "allVaults": { "message": "Visos saugyklos" @@ -91,6 +91,15 @@ "autoFill": { "message": "Automatinis užpildymas" }, + "autoFillLogin": { + "message": "Automatinio užpildymo prisijungimas" + }, + "autoFillCard": { + "message": "Automatinio užpildymo kortelė" + }, + "autoFillIdentity": { + "message": "Automatinio užpildymo tapatybė" + }, "generatePasswordCopied": { "message": "Kurti slaptažodį (paruoštas įterpti)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "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ą" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Pagalba ir atsiliepimai" }, + "helpCenter": { + "message": "Bitwarden pagalbos centras" + }, + "communityForums": { + "message": "Naršyti Bitwarden bendruomenės forumus" + }, + "contactSupport": { + "message": "Susisiekti su Bitwarden palaikymo komanda" + }, "sync": { "message": "Sinchronizuoti" }, @@ -227,7 +260,7 @@ "message": "Kurti slaptažodį" }, "regeneratePassword": { - "message": "Perkurti slaptažodį" + "message": "Generuoti slaptažodį iš naujo" }, "options": { "message": "Pasirinkimai" @@ -309,7 +342,7 @@ "message": "Aplankas" }, "deleteItem": { - "message": "Trinti elementą" + "message": "Šalinti elementą" }, "viewItem": { "message": "Peržiūrėti elementą" @@ -329,6 +362,12 @@ "other": { "message": "Kita" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Nustatyk atrakinimo būdą, kad pakeistum saugyklos laiko limito veiksmą." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Įvertinkite šį plėtinį" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Užrakinti dabar" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Nedelsiant" }, @@ -382,7 +424,7 @@ "message": "30 sekundžių" }, "oneMinute": { - "message": "1 minutę" + "message": "1 minutės" }, "twoMinutes": { "message": "2 minučių" @@ -430,7 +472,14 @@ "message": "Būtinas prisijungimo slaptažodžio patvirtinimas." }, "masterPasswordMinlength": { - "message": "Pagrindinis slaptažodis turi būti bent 8 simbolių ilgio." + "message": "Pagrindinis slaptažodis turi būti bent $VALUE$ simbolių ilgio.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Pagrindinio slaptažodžio patvirtinimas nesutampa." @@ -576,17 +625,20 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Rodyti korteles skirtuko puslapyje" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Pateikti kortelių elementų skirtuko puslapyje sąrašą, kad būtų lengva automatiškai užpildyti." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Rodyti tapatybes skirtuko puslapyje" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Pateikti tapatybės elementų skirtuko puslapyje, kad būtų lengva automatiškai užpildyti." }, "clearClipboard": { "message": "Išvalyti iškarpinę", @@ -597,10 +649,10 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Ar „Bitwarden“ turėtų prisiminti šį slaptažodį?" + "message": "Ar Bitwarden turėtų įsiminti šį slaptažodį už tave?" }, "notificationAddSave": { - "message": "Taip, išsaugoti dabar" + "message": "Išsaugoti" }, "enableChangedPasswordNotification": { "message": "Paprašyti atnaujinti esamą prisijungimą" @@ -608,24 +660,42 @@ "changedPasswordNotificationDesc": { "message": "Paprašyti atnaujinti prisijungimo slaptažodį, kai pakeitimas aptiktas svetainėje." }, + "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": "Ar norite atnaujinti šį slaptažodį „Bitwarden“?" + "message": "Ar nori atnaujinti šį slaptažodį Bitwarden?" }, "notificationChangeSave": { - "message": "Taip, atnaujinti dabar" + "message": "Atnaujinti" + }, + "notificationUnlockDesc": { + "message": "Atrakink savo Bitwarden saugyklą, kad užpildytum automatinio užpildymo užklausą." + }, + "notificationUnlock": { + "message": "Atrakinti" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Rodyti kontekstinio meniu pasririnkimus" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Naudokite antrinį paspaudimą, kad patekti į svetainės slaptažodžio generavimo ir prisijungimo atitikimo parinktis. " + }, + "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", + "message": "Numatytojo URI atitikimo aptikimas", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Pasirinkite standartinį būdą, kuriuo URI būtų aptinkamas prisijungiant, kuomet yra naudojamas automatinio užpildymo veiksmas." }, "theme": { "message": "Tema" @@ -633,6 +703,9 @@ "themeDesc": { "message": "Pakeisti programos spalvos temą" }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Tamsi", "description": "Dark color" @@ -642,7 +715,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "Saulėtas tamsą", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -659,13 +732,13 @@ "message": "Patvirtinti saugyklos eksportą" }, "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": "Šiame duomenų exporte jūsų saugyklos duomenys yra neužšifruoti. Jūs neturėtumete laikyti ar siųsti išeksportuotos duomenų bylos nesaugiu komunikaciniu kanalu (tokiu kaip el. paštas). Ištrinkite jį kaip galima greičiau po to kai pasinaudojote." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "Š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": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "Prieigos kodų raktai yra unikalūs kiekvienai Bitwarden vartotojo paskyrai, taigi jums nepavyktų importuoti užkoduotų eksportuotų duomenų į kitą prieigą." }, "exportMasterPassword": { "message": "Įveskite pagrindinį slaptažodį norint išsinešti saugyklos duomenis." @@ -677,16 +750,16 @@ "message": "Sužinoti apie organizacijas" }, "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?" + "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?" }, "moveToOrganization": { - "message": "Move to organization" + "message": "Perkelti į organizaciją" }, "share": { "message": "Bendrinti" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "$ITEMNAME$ perkelta(s) į $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -699,7 +772,7 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Pasirinkite organizacija, į kurią norite priskirti šį elementą. Priskiriant elementą organizacijai, visos elemento valdymo teisės bus perleistos organizacijai. Jūs daugiau nebebūsite tiesioginis elemento valdytojas po to kai jis bus priskirtas organizacijai." }, "learnMore": { "message": "Sužinoti daugiau" @@ -732,7 +805,7 @@ "message": "Priedų nėra." }, "attachmentSaved": { - "message": "Priedas buvo išsaugotas." + "message": "Priedas išsaugotas" }, "file": { "message": "Failas" @@ -741,13 +814,13 @@ "message": "Pasirinkite failą." }, "maxFileSize": { - "message": "Failai negali būti didesni už 500 MB." + "message": "Didžiausias failo dydis – 500 MB." }, "featureUnavailable": { "message": "Funkcija neprieinama" }, - "updateKey": { - "message": "Negalite naudoti šios funkcijos, kol neatnaujinsite šifravimo raktą." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium narystė" @@ -765,34 +838,34 @@ "message": "Neturite Premium narystės." }, "premiumSignUpAndGet": { - "message": "Sign up for a Premium membership and get:" + "message": "Prisijunk prie Premium narystės ir gauk:" }, "ppremiumSignUpStorage": { - "message": "1 GB encrypted storage for file attachments." + "message": "1 GB užšifruotos vietos diske bylų prisegimams." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Patentuotos dviejų žingsnių prisijungimo parinktys, tokios kaip YubiKey ir Duo." }, "ppremiumSignUpReports": { - "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + "message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad tavo saugyklas būtų saugus." }, "ppremiumSignUpTotp": { - "message": "TOTP verification code (2FA) generator for logins in your vault." + "message": "TOTP patvirtinimo kodų (2FA) generatorius prisijungimams prie tavo saugyklos." }, "ppremiumSignUpSupport": { - "message": "Priority customer support." + "message": "Prioritetinis klientų aptarnavimas." }, "ppremiumSignUpFuture": { - "message": "All future Premium features. More coming soon!" + "message": "Visos būsimos Premium savybės. Daugiau jau greitai!" }, "premiumPurchase": { - "message": "Purchase Premium" + "message": "Įsigyti Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Gali įsigyti Premium narystę bitwarden.com interneto saugykloje. Ar nori aplankyti svetainėje dabar?" }, "premiumCurrentMember": { - "message": "You are a Premium member!" + "message": "Tu esi Premium narys!" }, "premiumCurrentMemberThanks": { "message": "Dėkojame, kad remiate Bitwarden." @@ -813,22 +886,22 @@ "message": "Kopijuoti vienkartinį kodą (TOTP) automatiškai" }, "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": "Jei prisijungimas turi autentifikatoriaus raktą, nukopijuokite TOTP tikrinimo kodą į iškarpinę, kai automatiškai užpildysite prisijungimą." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Paleidžiant patvirtinti biometrinius duomenis" }, "premiumRequired": { - "message": "Tik su Premium naryste" + "message": "Premium reikalinga" }, "premiumRequiredDesc": { "message": "Premium narystė reikalinga šiai funkcijai naudoti." }, "enterVerificationCodeApp": { - "message": "Enter the 6 digit verification code from your authenticator app." + "message": "Įvesk 6 skaitmenų patvirtinimo kodą iš tavo autentifikavimo aplikacijos." }, "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "message": "Įvesk 6 skaitmenų prisijungimo kodą, kuris buvo išsiųstas $EMAIL$ el. paštu.", "placeholders": { "email": { "content": "$1", @@ -837,7 +910,7 @@ } }, "verificationCodeEmailSent": { - "message": "Verification email sent to $EMAIL$.", + "message": "Patvirtinimo elektroninis paštas išsiųstas į $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -849,88 +922,88 @@ "message": "Prisiminti mane" }, "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" + "message": "Pakartotinai atsiųsti patvirtinimo koda el. paštu" }, "useAnotherTwoStepMethod": { "message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą" }, "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." + "message": "Įkišk YubiKey į savo kompiuterio USB prievadą, tada paliesk jo mygtuką." }, "insertU2f": { - "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + "message": "Įkišk savo saugos raktą į kompiuterio USB prievadą. Jei jame yra mygtukas, paliesk jį." }, "webAuthnNewTab": { - "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." + "message": "Norint pradėti WebAuthn 2FA patikrinimą. Spustelėk toliau esantį mygtuką, kad atsidarytų naujas skirtukas, ir sek naujame skirtuke pateiktas instrukcijas." }, "webAuthnNewTabOpen": { "message": "Atidaryti naują skirtuką" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Autentifikuoti WebAuthn" }, "loginUnavailable": { "message": "Prisijungimas nepasiekiamas" }, "noTwoStepProviders": { - "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + "message": "Šioje paskyroje nustatytas dviejų žingsnių prisijungimas, tačiau, nė vienas iš sukonfigūruotų dviejų žingsnių paslaugų teikėjų nėra palaikomas šioje interneto naršyklėje." }, "noTwoStepProviders2": { - "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)." + "message": "Prašome naudoti palaikomą interneto naršyklę (pvz., Chrome) ir/arba pridėti papildomus paslaugų teikėjus, kurie geriau palaikomi įvairiose interneto naršyklėse (pvz., autentifikavimo programėlę)." }, "twoStepOptions": { - "message": "Two-step login options" + "message": "Dviejų žingsnių prisijungimo parinktys" }, "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." + "message": "Praradai prieigą prie visų savo dviejų veiksnių teikėjų? Naudok atkūrimo kodą, kad iš savo paskyros išjungtum visus dviejų veiksnių teikėjus." }, "recoveryCodeTitle": { - "message": "Recovery code" + "message": "Atkūrimo kodas" }, "authenticatorAppTitle": { "message": "Autentifikavimo programa" }, "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "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." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "YubiKey OTP saugumo raktas" }, "yubiKeyDesc": { - "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." + "message": "Naudok YubiKey, kad prisijungtum prie savo paskyros. Veikia su YubiKey 4, 4 Nano, 4C ir NEO įrenginiais." }, "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Patvirtink su Duo Security naudodami Duo Mobile programą, SMS žinutę, telefono skambutį arba U2F saugumo raktą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Patikrink su Duo Security savo organizacijai naudodamasis Duo Mobile programą, SMS žinutę, telefono skambutį arba U2F saugumo raktą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn compatible security key to access your account." + "message": "Naudok bet kurį WebAuthn palaikantį saugumo raktą, kad galėtum naudotis savo paskyra." }, "emailTitle": { "message": "El. paštas" }, "emailDesc": { - "message": "Verification codes will be emailed to you." + "message": "Patvirtinimo kodai bus atsiųsti el. paštu tau." }, "selfHostedEnvironment": { - "message": "Self-hosted environment" + "message": "Savarankiškai sukurta aplinka" }, "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + "message": "Nurodyk pagrindinį URL adresą savo patalpose esančio Bitwarden diegimo." }, "customEnvironment": { - "message": "Custom environment" + "message": "Individualizuota aplinka" }, "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." + "message": "Pažengusiems naudotojams. Galite nurodyti kiekvienos paslaugos pagrindinį URL adresą atskirai." }, "baseUrl": { "message": "Serverio URL" @@ -939,31 +1012,56 @@ "message": "API serverio nuoroda" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "Internetinės saugyklos serverio URL" }, "identityUrl": { - "message": "Identity server URL" + "message": "Identifikavimo serverio URL" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "Notifikacijų serverio URL" }, "iconsUrl": { - "message": "Icons server URL" + "message": "Piktogramų serverio URL" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "Aplinkos URL adresai išsaugoti" + }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" }, "enableAutoFillOnPageLoad": { "message": "Automatiškai užpildyti užsikrovus puslapiui" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Jei aptikta prisijungimo forma, automatiškai užpildyti, kai kraunamas tinklalapis." }, "experimentalFeature": { "message": "Compromised or untrusted websites can exploit auto-fill on page load." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Sužinokite daugiau apie automatinį užpildymą" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" @@ -975,7 +1073,7 @@ "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { - "message": "Use default setting" + "message": "Naudoti numatytuosius nustatymus" }, "autoFillOnPageLoadYes": { "message": "Auto-fill on page load" @@ -984,10 +1082,10 @@ "message": "Do not auto-fill on page load" }, "commandOpenPopup": { - "message": "Open vault popup" + "message": "Atidaryti saugyklą naujame lange" }, "commandOpenSidebar": { - "message": "Open vault in sidebar" + "message": "Atidaryti saugyklą šoninėje juostoje" }, "commandAutofillDesc": { "message": "Auto-fill the last used login for the current website" @@ -1008,13 +1106,13 @@ "message": "Copy value" }, "value": { - "message": "Value" + "message": "Reikšmė" }, "newCustomField": { "message": "Naujas pasirinktis laukelis" }, "dragToSort": { - "message": "Drag to sort" + "message": "Rūšiuok, kad surūšiuotum" }, "cfTypeText": { "message": "Tekstas" @@ -1030,14 +1128,14 @@ "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Susijusi reikšmė", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + "message": "Paspaudę už iššokančio lango, kad patikrintum, ar el. paštu gausi patvirtinimo kodą, uždarys šį iššokantį langą. Ar nori atidaryti šį iššokantį langą naujame lange, kad jis neužsidarytų?" }, "popupU2fCloseMessage": { - "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + "message": "Ši naršyklė negali apdoroti U2F prašymų šiame iššokančiame lange. Ar nori atidaryti šį iššokantį langą naujame lange, kad galėtum prisijungti naudodamas (-a) U2F?" }, "enableFavicon": { "message": "Rodyti tinklalapių ikonėles" @@ -1045,35 +1143,38 @@ "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" + "message": "Rodyti ženkliukų skaitiklį" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Nurodoma, kiek prisijungimų turi dabartiniame žiniatinklio puslapyje." }, "cardholderName": { "message": "Mokėjimo kortelės savininko vardas" }, "number": { - "message": "Number" + "message": "Numeris" }, "brand": { - "message": "Brand" + "message": "Prekės ženktas" }, "expirationMonth": { - "message": "Expiration month" + "message": "Galiojimo pabaigos mėnesis" }, "expirationYear": { - "message": "Expiration year" + "message": "Galiojimo pabaigos metai" }, "expiration": { - "message": "Expiration" + "message": "Galiojimo pabaiga" }, "january": { - "message": "January" + "message": "Sausis" }, "february": { - "message": "February" + "message": "Vasaris" }, "march": { "message": "Kovas" @@ -1115,19 +1216,19 @@ "message": "Pavadinimas" }, "mr": { - "message": "Mr" + "message": "Ponas" }, "mrs": { - "message": "Mrs" + "message": "Ponia" }, "ms": { - "message": "Ms" + "message": "Panelė" }, "dr": { "message": "Dr" }, "mx": { - "message": "Mx" + "message": "Neutralinis (-i)" }, "firstName": { "message": "Vardas" @@ -1229,20 +1330,20 @@ "message": "Tapatybės" }, "logins": { - "message": "Logins" + "message": "Prisijungimai" }, "secureNotes": { - "message": "Secure notes" + "message": "Saugūs užrašai" }, "clear": { - "message": "Clear", + "message": "Išvalyti", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Check if password has been exposed." + "message": "Patikrinkite, ar slaptažodis buvo atskleistas." }, "passwordExposed": { - "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "message": "Šis slaptažodis buvo atskleistas $VALUE$ kartus dėl duomenų pažeidimų. Turėtumėte jį pasikeisti.", "placeholders": { "value": { "content": "$1", @@ -1251,40 +1352,40 @@ } }, "passwordSafe": { - "message": "This password was not found in any known data breaches. It should be safe to use." + "message": "Šis slaptažodis nebuvo rastas per jokius žinomus duomenų pažeidimus. Jis turėtų būti saugus naudoti." }, "baseDomain": { - "message": "Base domain", + "message": "Bazinis domenas", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Domenas", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "Serveris", "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": "Tikslus" }, "startsWith": { - "message": "Starts with" + "message": "Prasideda" }, "regEx": { - "message": "Regular expression", + "message": "Reguliari išraiška", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match detection", + "message": "Atitikmens aptikimas", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Default match detection", + "message": "Numatytasis atitikties aptikimas", "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle options" + "message": "Perjungti opcijas" }, "toggleCurrentUris": { "message": "Toggle current URIs", @@ -1295,34 +1396,34 @@ "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "Organizacija", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "Tipai" }, "allItems": { - "message": "All items" + "message": "Visi elementai" }, "noPasswordsInList": { "message": "There are no passwords to list." }, "remove": { - "message": "Remove" + "message": "Pašalinti" }, "default": { - "message": "Default" + "message": "Numatytas" }, "dateUpdated": { - "message": "Updated", + "message": "Atnaujintas", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "Sukurtas", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Slaptažodis atnaujintas", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1335,21 +1436,21 @@ "message": "There are no collections to list." }, "ownership": { - "message": "Ownership" + "message": "Nuosavybė" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Kam priklauso šis elementas?" }, "strong": { - "message": "Strong", + "message": "Stiprus", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "Geras", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "Silpnas", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { @@ -1363,19 +1464,19 @@ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "Atrakinti PIN kodu" }, "setYourPinCode": { - "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." + "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." }, "pinRequired": { - "message": "PIN code is required." + "message": "PIN kodas yra privalomas." }, "invalidPin": { - "message": "Invalid PIN code." + "message": "Neteisingas PIN kodas." }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Atrakinti naudojant biometrinius duomenis" }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" @@ -1387,13 +1488,13 @@ "message": "Lock with master password on browser restart" }, "selectOneCollection": { - "message": "You must select at least one collection." + "message": "Turite pasirinkti bent vieną kategoriją." }, "cloneItem": { - "message": "Clone item" + "message": "Klonuoti elementą" }, "clone": { - "message": "Clone" + "message": "Klonuoti" }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." @@ -1422,13 +1523,10 @@ "message": "Ištrintas visam laikui" }, "restoreItem": { - "message": "Restore item" - }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" + "message": "Atkurti elementą" }, "restoredItem": { - "message": "Item restored" + "message": "Elementas atkurtas" }, "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?" @@ -1445,14 +1543,41 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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?" + }, + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Pagrindinio slaptažodžio nustatymas" }, + "currentMasterPass": { + "message": "Dabartinis pagrindinis slaptažodis" + }, + "newMasterPass": { + "message": "Naujas pagrindinis slaptažodis" + }, + "confirmNewMasterPass": { + "message": "Patvirtinti naują pagrindinį slaptažodį" + }, "masterPasswordPolicyInEffect": { - "message": "One or more organization policies require your master password to meet the following requirements:" + "message": "Viena ar daugiau organizacijos politikos reikalauja, kad tavo pagrindinis slaptažodis atitiktų šiuos reikalavimus:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "Minimalus sudėtingumo balas $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1461,7 +1586,7 @@ } }, "policyInEffectMinLength": { - "message": "Minimum length of $LENGTH$", + "message": "Minimalus ilgis $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -1470,16 +1595,16 @@ } }, "policyInEffectUppercase": { - "message": "Contain one or more uppercase characters" + "message": "Turi vieną ar daugiau didžiųjų raidžių" }, "policyInEffectLowercase": { - "message": "Contain one or more lowercase characters" + "message": "Turi vieną ar daugiau mažųjų raidžių" }, "policyInEffectNumbers": { - "message": "Contain one or more numbers" + "message": "Turi vieną ar daugiau skaičių" }, "policyInEffectSpecial": { - "message": "Contain one or more of the following special characters $CHARS$", + "message": "Turi vieną ar daugiau iš šių specialiųjų simbolių: $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -1488,13 +1613,13 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "Your new master password does not meet the policy requirements." + "message": "Tavo naujasis pagrindinis slaptažodis neatitinka politikos reikalavimų." }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Paslaugų teikimo sąlygos ir privatumo politika nebuvo pripažinti." }, "termsOfService": { "message": "Paslaugų teikimo paslaugos" @@ -1509,13 +1634,13 @@ "message": "Gerai" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Darbalaukio sinchronizavimo verifikavimas" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Patikrink, ar darbalaukio programoje rodomas šis pirštų atspaudas: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not set up" + "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." @@ -1542,10 +1667,10 @@ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "Paskyros neatitikimas" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not set up" + "message": "Trūksta biometrinių duomenų nustatymų" }, "biometricsNotEnabledDesc": { "message": "Browser biometrics requires desktop biometric to be set up in the settings first." @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Šiame įrenginyje biometrikos negalima naudoti." }, + "biometricsFailedTitle": { + "message": "Biometrika nepavyko" + }, + "biometricsFailedDesc": { + "message": "Biometriniai duomenys negali būti užpildyti, apsvarstyk galimybę naudoti pagrindinį slaptažodį arba atsijungti. Jei tai tęsiasi, kreipkitės į Bitwarden pagalbą." + }, "nativeMessaginPermissionErrorTitle": { "message": "Nesuteiktos teisės" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1590,7 +1727,7 @@ } }, "send": { - "message": "Send", + "message": "Siųsti", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { @@ -1602,57 +1739,57 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Tekstas" }, "sendTypeFile": { - "message": "File" + "message": "Byla" }, "allSends": { - "message": "All Sends", + "message": "Visi siuntimai", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Pasiektas maksimalus prisijungimų skaičius", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Nebegalioja" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "Laukiama ištrynimo" }, "passwordProtected": { - "message": "Password protected" + "message": "Apsaugota slaptažodžiu" }, "copySendLink": { - "message": "Copy Send link", + "message": "Kopijuoti siuntimo nuorodą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "Šalinti slaptažodį" }, "delete": { - "message": "Delete" + "message": "Ištrinti" }, "removedPassword": { - "message": "Password removed" + "message": "Slaptažodis pašalintas" }, "deletedSend": { - "message": "Send deleted", + "message": "Siuntinys ištrintas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "Siųsti nuorodą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "Išjungta" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Ar tikrai norite pašalinti slaptažodį?" }, "deleteSend": { - "message": "Delete Send", + "message": "Ištrinti siuntinį", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { @@ -1672,7 +1809,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "Failas, kurį norite siųsti." }, "deletionDate": { "message": "Deletion date" @@ -1682,17 +1819,17 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration date" + "message": "Galiojimo data" }, "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 d" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ dienos", "placeholders": { "days": { "content": "$1", @@ -1704,7 +1841,7 @@ "message": "Custom" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "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.", @@ -1727,24 +1864,24 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "Tekstas, kurį norite siųsti." }, "sendHideText": { "message": "Hide this Send's text by default.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current access count" + "message": "Dabartinis prisijungimų skaičius" }, "createSend": { - "message": "New Send", + "message": "Naujas Siuntinys", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "Naujas slaptažodis" }, "sendDisabled": { - "message": "Send removed", + "message": "Siuntimas pašalintas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1752,11 +1889,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "Siuntinys sukurtas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send saved", + "message": "Siuntinys išsaugotas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1769,18 +1906,18 @@ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Prieš pradedant" }, "sendFirefoxCustomDatePopoutMessage1": { "message": "To use a calendar style date picker", "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": "spauskite čia", "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": "iškelti atskirame lange.", "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": { @@ -1793,13 +1930,13 @@ "message": "An expiration date and time are required." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Ištrynimo data ir laikas yra privalomi." }, "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Slėpti mano el. pašto adresą nuo gavėjų." }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." @@ -1814,7 +1951,7 @@ "message": "Negalite šio veiksmo padaryti neįvedus savo pagrindinio slaptažodžio ir patvirtinę tapatybę." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "Reikalingas elektroninio pašto patvirtinimas" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." @@ -1823,11 +1960,14 @@ "message": "Naujasis pagrindinis slaptažodis" }, "updateMasterPassword": { - "message": "Update master password" + "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,20 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1890,7 +2061,7 @@ "message": "Ištrinti pagrindinį slaptažodį" }, "removedMasterPassword": { - "message": "Master password removed" + "message": "Pagrindinis slaptažodis pašalintas" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1942,16 +2113,16 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random" + "message": "Atsitiktinis" }, "randomWord": { - "message": "Random word" + "message": "Atsitiktinis žodis" }, "websiteName": { "message": "Website name" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Ką norėtumėte sugeneruoti?" }, "passwordType": { "message": "Password type" @@ -1973,23 +2144,20 @@ "message": "API Access Token" }, "apiKey": { - "message": "API Key" + "message": "API raktas" }, "ssoKeyConnectorError": { "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Reikalingas Premium abonementas" }, "organizationIsDisabled": { - "message": "Organization suspended." + "message": "Organizacija suspenduota." }, "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2003,7 +2171,7 @@ "message": "Settings have been edited" }, "environmentEditedClick": { - "message": "Click here" + "message": "Spauskite čia" }, "environmentEditedReset": { "message": "to reset to pre-configured settings" @@ -2011,11 +2179,11 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { - "message": "Third-party" + "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.", @@ -2036,19 +2204,43 @@ } }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "Prisijungti su pagrindiniu slaptažodžiu" }, "loggingInAs": { - "message": "Logging in as" + "message": "Prisijungimas kaip" }, "notYou": { - "message": "Not you?" + "message": "Ne jūs?" }, "newAroundHere": { - "message": "New around here?" + "message": "Ar jūs naujas čia?" }, "rememberEmail": { - "message": "Remember email" + "message": "Prisiminti el. paštą" + }, + "loginWithDevice": { + "message": "Prisijunkite naudodami įrenginį" + }, + "loginWithDeviceEnabledInfo": { + "message": "Prisijungti su įrenginiu turi būti nustatyta Bitwarden aplikacijos nustatymuose. Reikia kito pasirinkimo?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Iš naujo siųsti pranešimą" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Pradėtas prisijungimas" }, "exposedMasterPassword": { "message": "Exposed Master Password" @@ -2066,7 +2258,7 @@ "message": "Check known data breaches for this password" }, "important": { - "message": "Important:" + "message": "Svarbu:" }, "masterPasswordHint": { "message": "Your master password cannot be recovered if you forget it!" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "Kaip automatiškai užpildyti" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Įrenginio patvirtinimas reikalingas. Pasirink patvirtinimo būdą toliau:" + }, + "rememberThisDevice": { + "message": "Prisiminti šį įrenginį" + }, + "uncheckIfPublicDevice": { + "message": "Panaikink žymėjimą, jei naudojamas viešasis įrenginys" + }, + "approveFromYourOtherDevice": { + "message": "Patvirtinti iš tavo kito įrenginio" + }, + "requestAdminApproval": { + "message": "Prašyti administratoriaus patvirtinimo" + }, + "approveWithMasterPassword": { + "message": "Patvirtinti su pagrindiniu slaptažodžiu" + }, + "ssoIdentifierRequired": { + "message": "Organizacijos SSO identifikatorius yra reikalingas." + }, + "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į." + }, + "general": { + "message": "Bendra" + }, + "display": { + "message": "Rodyti" + }, + "accountSuccessfullyCreated": { + "message": "Paskyra sėkmingai sukurta!" + }, + "adminApprovalRequested": { + "message": "Prašymas administratoriaus patvirtinimas" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Tavo prašymas išsiųstas administratoriui." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Tu būsi praneštas (-a), kai bus patvirtinta." + }, + "troubleLoggingIn": { + "message": "Problemos prisijungiant?" + }, + "loginApproved": { + "message": "Patvirtintas prisijungimas" + }, + "userEmailMissing": { + "message": "Trūksta naudotojo el. pašto" + }, + "deviceTrusted": { + "message": "Patikimas įrenginys" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Prieigos raktas" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 2d369f824677..a8cdcae5c4a4 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -11,16 +11,16 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Pieraksties vai izveido jaunu kontu, lai piekļūtu drošajai glabātavai!" + "message": "Jāpiesakās vai jāizveido jauns konts, lai piekļūtu drošajai glabātavai." }, "createAccount": { "message": "Izveidot kontu" }, "login": { - "message": "Pierakstīties" + "message": "Pieteikties" }, "enterpriseSingleSignOn": { - "message": "Uzņēmuma vienotā pierakstīšanās" + "message": "Uzņēmuma vienotā pieteikšanās" }, "cancel": { "message": "Atcelt" @@ -77,7 +77,7 @@ "message": "Ievietot piezīmi starpliktuvē" }, "copyUri": { - "message": "Ievietot URI starpliktuvē" + "message": "Ievietot vietrādi starpliktuvē" }, "copyUsername": { "message": "Ievietot lietotājvārdu starpliktuvē" @@ -89,28 +89,52 @@ "message": "Ievietot drošības kodu starpliktuvē" }, "autoFill": { - "message": "Automātiskā aizpilde" + "message": "Automātiskā aizpildīšana" + }, + "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": "Veidot paroli (ievietota starpliktuvē)" + "message": "Izveidot paroli (tiks ievietota starpliktuvē)" }, "copyElementIdentifier": { "message": "Pavairot pielāgotā lauka nosaukumu" }, "noMatchingLogins": { - "message": "Nav atbilstošu pierakstīšanās vienumu." + "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" }, "loginToVaultMenu": { - "message": "Pierakstīties glabātavā" + "message": "Pieteikties savā glabātavā" }, "autoFillInfo": { - "message": "Nav pierakstīšanās vienumu, kurus automātiski ievadīt pašreizējā pārlūka cilnē." + "message": "Nav pieteikšanās vienumu, kurus automātiski ievadīt pašreizējā pārlūka cilnē." }, "addLogin": { - "message": "Pievienot pierakstīšanās vienumu" + "message": "Pievienot pieteikšanās vienumu" }, "addItem": { "message": "Pievienot vienumu" @@ -140,7 +164,7 @@ "message": "Apstiprināšanas kods" }, "confirmIdentity": { - "message": "Apstiprināt identitāti, lai turpinātu." + "message": "Jāapstiprina identitāte, lai turpinātu." }, "account": { "message": "Konts" @@ -157,10 +181,10 @@ "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": "Divpakāpju pierakstīšanās" + "message": "Divpakāpju pieteikšanās" }, "logOut": { - "message": "Izrakstīties" + "message": "Atteikties" }, "about": { "message": "Par" @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Palīdzība un atsauksmes" }, + "helpCenter": { + "message": "Bitwarden palīdzības centrs" + }, + "communityForums": { + "message": "Izpētīt Bitwarden kopienas forumus" + }, + "contactSupport": { + "message": "Sazināties ar Bitwarden atbalstu" + }, "sync": { "message": "Sinhronizēt" }, @@ -212,7 +245,7 @@ "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Automātiski veido spēcīgas, neatkārtojamas paroles visiem pierakstīšanās vienumiem. " + "message": "Automātiski veido spēcīgas, neatkārtojamas paroles visiem pieteikšanās vienumiem." }, "bitWebVault": { "message": "Bitwarden tīmekļa glabātava" @@ -221,7 +254,7 @@ "message": "Ievietot vienumus" }, "select": { - "message": "Atlasīt" + "message": "Izvēlēties" }, "generatePassword": { "message": "Veidot paroli" @@ -329,26 +362,32 @@ "other": { "message": "Cits" }, + "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" + }, "rateExtension": { "message": "Novērtēt paplašinājumu" }, "rateExtensionDesc": { - "message": "Lūdzu, apsver palīdzēt mums ar labu atsauksmi!" + "message": "Lūgums apsvērt palīdzēt mums ar labu atsauksmi." }, "browserNotSupportClipboard": { - "message": "Tavs tīmekļa pārlūks neatbalsta vienkāršu starpliktuves kopēšanu. Nokopē to pašrocīgi!" + "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" }, "yourVaultIsLocked": { - "message": "Glabātava ir slēgta. Nepieciešams norādīt galveno paroli, lai turpinātu." + "message": "Glabātava ir aizslēgta. Jāapstiprina identitāte, lai turpinātu." }, "unlock": { "message": "Atslēgt" }, "loggedInAsOn": { - "message": "Pierakstījies $HOSTNAME$ kā $EMAIL$.", + "message": "Pieteicies $HOSTNAME$ kā $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -369,6 +408,9 @@ "lockNow": { "message": "Aizslēgt" }, + "lockAll": { + "message": "Aizslēgt visu" + }, "immediately": { "message": "Nekavējoties" }, @@ -430,13 +472,20 @@ "message": "Ir nepieciešama galvenās paroles atkārtota ievadīšana." }, "masterPasswordMinlength": { - "message": "Galvenajai parolei ir jābūt vismaz 8 rakstzīmes garai." + "message": "Galvenajai parolei ir jābūt vismaz $VALUE$ rakstzīmes garai.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Galvenās paroles apstiprinājums nesakrīt." }, "newAccountCreated": { - "message": "Tavs jaunais konts ir izveidots. Tagad Tu vari pierakstīties." + "message": "Jaunais konts ir izveidots. Tagad vari pieteikties." }, "masterPassSent": { "message": "Mēs nosūtījām galvenās paroles norādi e-pastā." @@ -448,7 +497,7 @@ "message": "Nederīgs apstiprinājuma kods" }, "valueCopied": { - "message": "$VALUE$ ievietota starpliktuvē", + "message": "$VALUE$ ir starpliktuvē", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -458,16 +507,16 @@ } }, "autofillError": { - "message": "Neizdevās automātiski aizpildīt izvēlēto vienumu šajā lapā. Tā vietā kopē un ielīmē to! " + "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." }, "loggedOut": { - "message": "Izrakstījies" + "message": "Atteicies" }, "loginExpired": { - "message": "Pierakstīšanās sesija ir beigusies." + "message": "Pieteikšanās sesija ir beigusies." }, "logOutConfirmation": { - "message": "Vai tiešām izrakstīties?" + "message": "Vai tiešām atteikties?" }, "yes": { "message": "Jā" @@ -491,7 +540,7 @@ "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 pieslēgšanās padara kontu krietni drošāku, pieprasot apstiprināt pierakstīš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 pierakstīš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 apmeklēt tīmekļa vietni?" }, "editedFolder": { "message": "Mape labota" @@ -506,7 +555,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" @@ -540,7 +589,7 @@ "message": "Vienums labots" }, "deleteItemConfirmation": { - "message": "Vai tiešām pārvietot vienumu uz atkritni?" + "message": "Vai tiešām pārvietot uz atkritni?" }, "deletedItem": { "message": "Vienums pārvietots uz atkritni" @@ -571,10 +620,13 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Vaicāt, lai pievienotu pierakstīšanās vienumu" + "message": "Vaicāt, lai pievienotu pieteikšanās vienumu" }, "addLoginNotificationDesc": { - "message": "Iestatījums \"Piekļuves vienumu pievienošanas paziņojumi\" piedāvā saglabāt jaunus pieslēgšanās ierakstus, kad vien tie tiek izmantoti pirmo reizi ierakstoties." + "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 pieslēgtajiem kontiem." }, "showCardsCurrentTab": { "message": "Rādīt kartes cilnes lapā" @@ -593,7 +645,7 @@ "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": { @@ -603,10 +655,19 @@ "message": "Jā, saglabāt" }, "enableChangedPasswordNotification": { - "message": "Vaicāt atjaunināt esošu pierakstīšanās vienumu" + "message": "Vaicāt atjaunināt esošu pieteikšanās vienumu" }, "changedPasswordNotificationDesc": { - "message": "Vaicāt atjaunināt pierakstīšanās vienuma paroli, ja vietnē ir noteiktas tās izmaiņas." + "message": "Vaicāt atjaunināt pieteikšanās vienuma paroli, ja vietnē ir noteiktas tās izmaiņas." + }, + "changedPasswordNotificationDescAlt": { + "message": "Vaicāt, vai atjaunināt pieteikšanās vienuma paroli, kad tīmekļa vietnē ir noteikta atšķirība. Attiecas uzvisiem pieslēgtajiem kontiem." + }, + "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 pieslēgtajiem kontiem." }, "notificationChangeDesc": { "message": "Vai atjaunināt šo paroli Bitwarden?" @@ -614,18 +675,27 @@ "notificationChangeSave": { "message": "Jā, atjaunināt" }, + "notificationUnlockDesc": { + "message": "Jāatslēdz Bitwarden glabātava, lai pabeigtu automātiskās aizpildīšanas pieprasījumu." + }, + "notificationUnlock": { + "message": "Atslēgt" + }, "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 pierakstīšanās vienumiem. " + "message": "Izmantot orējo klikšķi, lai piekļūtu paroļu veidošanai un vietnei atbilstošajiem pieteikšanās vienumiem. " + }, + "contextMenuItemDescAlt": { + "message": "Izmantot orējo klikšķi, lai piekļūtu paroļu veidošanai un tīmekļa vietnei atbilstošajiem pieteikšanās vienumiem. Attiecas uz visiem pieslēgtajiem kontiem." }, "defaultUriMatchDetection": { "message": "Noklusējuma URI atbilstības noteikšana", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Izvēlēties noklusējuma veidu, kādā URI atbilstības noteikšana tiek apstrādāta, 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 aizpildīšana." }, "theme": { "message": "Izskats" @@ -633,6 +703,9 @@ "themeDesc": { "message": "Mainīt lietotnes izskata krāsas." }, + "themeDescAlt": { + "message": "Mainīt lietotnes izskata krāsas. Attiecas uz visiem pieslēgtajiem kontiem." + }, "dark": { "message": "Tumšs", "description": "Dark color" @@ -738,7 +811,7 @@ "message": "Datne" }, "selectFile": { - "message": "Atlasīt datni." + "message": "Atlasīt datni" }, "maxFileSize": { "message": "Lielākais pieļaujamais datnes izmērs ir 500 MB." @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Iespēja nav pieejama" }, - "updateKey": { - "message": "Jūs nevarat izmantot šo funkciju līdz jūs atjaunojat savu šifrēšanas atslēgu." + "encryptionKeyMigrationRequired": { + "message": "Nepieciešama šifrēšanas atslēgas nomaiņa. Lūgums pieteikties tīmekļa glabātavā, lai atjauninātu savu šifrēšanas atslēgu." }, "premiumMembership": { "message": "Premium dalība" @@ -770,14 +843,14 @@ "ppremiumSignUpStorage": { "message": "1 GB šifrētas krātuves datņu pielikumiem." }, - "ppremiumSignUpTwoStep": { - "message": "Tādas papildus divpakāpju pierakstīšanās iespējas kā YubiKey, FIDO U2F un Duo." + "premiumSignUpTwoStepOptions": { + "message": "Tādas slēgtā pirmavota divpakāpju pieteikšanās iespējas kā YubiKey un Duo." }, "ppremiumSignUpReports": { - "message": "Paroļu higiēnas, kontu veselības un datu pārkāpumu pārskati, lai uzturētu glabātavu drošu." + "message": "Paroļu higiēnas, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu." }, "ppremiumSignUpTotp": { - "message": "TOTP apstiprinājuma kodu (2FA) veidotājs piekļuves ierakstiem glabātavā." + "message": "TOTP apstiprinājuma koda (2FA) veidotājs glabātavas pieteikšanās vienumiem." }, "ppremiumSignUpSupport": { "message": "Priekšrocīgs lietotāju atbalsts." @@ -813,7 +886,7 @@ "message": "Automātiski ievietot TOTP starpliktuvē" }, "disableAutoTotpCopyDesc": { - "message": "Ja pierakstīšanās datiem 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 pierakstīš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" @@ -825,10 +898,10 @@ "message": "Ir nepieciešama Premium dalība, lai izmantotu šo iespēju." }, "enterVerificationCodeApp": { - "message": "Ievadi 6 ciparu apstiprinājuma kodu no autentificētāja lietotnes!" + "message": "Jāievada 6 ciparu apstiprinājuma kods no autentificētāja lietotnes." }, "enterVerificationCodeEmail": { - "message": "Ievadi 6 ciparu apstiprinājuma kodu, kas tika nosūtīts uz $EMAIL$.", + "message": "Jāievada 6 ciparu apstiprinājuma kods, kas tika nosūtīts uz $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -852,7 +925,7 @@ "message": "Sūtīt apstiprinājuma koda e-pastu vēlreiz" }, "useAnotherTwoStepMethod": { - "message": "Izmantot citu divpakāpju pierakstīšanās veidu" + "message": "Izmantot citu divpakāpju pieteikšanās veidu" }, "insertYubiKey": { "message": "Ievieto savu YubiKey datora USB ligzdā un pieskaries tā pogai!" @@ -870,16 +943,16 @@ "message": "Autentificēt WebAuthn" }, "loginUnavailable": { - "message": "Pierakstīšanās nav pieejama" + "message": "Pieteikšanās nav pieejama" }, "noTwoStepProviders": { - "message": "Šim kontam ir iespējota divpakāpju pierakstīšanās, bet šajā pārlūkā netiek atbalstīts neviens no uzstādītajiem divpakāpju pārbaudes nodrošinātājiem." + "message": "Šim kontam ir iespējota divpakāpju pieteikšanās, bet šajā pārlūkā netiek atbalstīts neviens no uzstādītajiem divpakāpju pārbaudes nodrošinātājiem." }, "noTwoStepProviders2": { - "message": "Lūgums izmantot atbalstītu tīmekļa pārlūku (piemēram Chrome) un/vai pievienot papildus nodrošinātājus, kas tiek labāk atbalstīti dažādos pārlūkos (piemēram autentificētāja lietotni)." + "message": "Lūgums izmantot atbalstītu tīmekļa pārlūku (piemēram Chrome) un/vai pievienot papildu nodrošinātājus, kas tiek labāk atbalstīti dažādos pārlūkos (piemēram autentificētāja lietotni)." }, "twoStepOptions": { - "message": "Divpakāpju pierakstīšanās iespējas" + "message": "Divpakāpju pieteikšanās iespējas" }, "recoveryCodeDesc": { "message": "Zaudēta piekļuve visiem divpakāpju nodrošinātājiem? Izmanto atkopšanas kodus, lai atspējotu visus sava konta divpakāpju nodrošinātājus!" @@ -898,21 +971,21 @@ "message": "YubiKey OTP drošības atslēga" }, "yubiKeyDesc": { - "message": "Izmanto YubiKey, lai piekļūtu savam kontam! Darbojas ar YubiKey 4, 4 Nano, 4C un NEO ierīcēm." + "message": "Ir izmantojams YubiKey, lai piekļūtu savam kontam. Darbojas ar YubiKey 4, 4 Nano, 4C un NEO ierīcēm." }, "duoDesc": { - "message": "Apstiprini ar Duo Security, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu!", + "message": "Ar Duo Security apliecināšanu var veikt ar Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Apstiprini ar Duo Security savā apvienībā, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu!", + "message": "Apliecināšana ar savas apvienības Duo Security, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Izmantot jebkuru WebAuthn atbalstošu drošības atslēgu, lai piekļūtu kontam." + "message": "Ir izmantojama jebkura WebAuthn atbalstošu drošības atslēgu, lai piekļūtu kontam." }, "emailTitle": { "message": "E-pasts" @@ -953,23 +1026,48 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Attiecas uz visiem pieslēgtajiem kontiem." + }, + "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" + }, "enableAutoFillOnPageLoad": { "message": "Iespējot aizpildīšanu lapas ielādes brīdī" }, "enableAutoFillOnPageLoadDesc": { - "message": "Ja tiek noteikta pieslēgšanās veidne, tā tiks aizpildīta lapas ielādes brīdī." + "message": "Ja tiek noteikta pieteikšanās veidne, tā tiks aizpildīta lapas ielādes brīdī." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Pārveidotās vai neuzticamās vietnēs automātiskā aizpildīšana lapas ielādes laikā var tikt ļaunprātīgi izmantota." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Uzzināt vairāk par automātisko aizpildīšanu" }, "defaultAutoFillOnPageLoad": { - "message": "Noklusējuma automātiskās aizpildes iestatījums pierakstīšanās vienumiem" + "message": "Noklusējuma automātiskās aizpildes iestatījums pieteikšanās vienumiem" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Pēc automātiskās aizpildes lapas ielādes brīdī iespējošanas šo iespēju var ieslēgt vai izslēgt atsevišķiem pierakstīšanās vienumiem. Šis ir noklusējuma iestatījums visiem ierakstiem, kuriem nav norādīts šis uzstādījums." + "message": "Automātisko aizpildi lapas ielādes brīdī atsevišķiem pieteikšanās vienumiem var atslēgt vienuma labošanas skatā." }, "itemAutoFillOnPageLoad": { "message": "Automātiski aizpildīt lapas ielādes brīdī (ja iespējots iestatījumos)" @@ -990,7 +1088,7 @@ "message": "Atvērt glabātavu sānu joslā" }, "commandAutofillDesc": { - "message": "Automātiski aizpildīt ar iepriekš izmantoto pierakstīšanās vienumu pašreizējā tīmekļa vietnē" + "message": "Automātiski aizpildīt ar iepriekš izmantoto pieteikšanās vienumu pašreizējā tīmekļa vietnē" }, "commandGeneratePasswordDesc": { "message": "Izveidot jaunu nejaušu paroli un ievietot to starpliktuvē" @@ -1034,22 +1132,25 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Klikšķināšana ārpus uznirstošā loga, lai apskatītu e-pastā apstiprinājuma kodu, to aizvērs. Vai atvērt to atsevišķā logā, lai tas netiktu aizvērts?" + "message": "Klikšķināšana ārpus uznirstošā loga, lai e-pastā apskatītu apstiprinājuma kodu, to aizvērs. Vai atvērt to atsevišķā logā, lai tas netiktu aizvērts?" }, "popupU2fCloseMessage": { - "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 pierakstīties, izmantojot U2F?" + "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" }, "faviconDesc": { - "message": "Attēlot atpazīstamu attēlu pie katra pierakstīšanās vienuma." + "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" }, "badgeCounterDesc": { - "message": "Attēlot pašreizējāi tīmekļa vietnei atbilstošo pierakstīšanās vienumu skaitu." + "message": "Attēlot pašreizējāi tīmekļa vietnei atbilstošo pieteikšanās vienumu skaitu." }, "cardholderName": { "message": "Kartes īpašnieka vārds" @@ -1190,10 +1291,10 @@ "message": "Veids" }, "typeLogin": { - "message": "Pierakstīšanās vienums" + "message": "Pieteikšanās vienums" }, "typeLogins": { - "message": "Pierakstīšanās vienumi" + "message": "Pieteikšanās vienumi" }, "typeSecureNote": { "message": "Droša piezīme" @@ -1229,7 +1330,7 @@ "message": "Identitātes" }, "logins": { - "message": "Pierakstīšanās vienumi" + "message": "Pieteikšanās vienumi" }, "secureNotes": { "message": "Drošās piezīmes" @@ -1242,7 +1343,7 @@ "message": "Pārbaudīt, vai parole ir bijusi nopludināta." }, "passwordExposed": { - "message": "Šī parole datu pārkāpumos ir atklāta $VALUE$ reizi(es). To vajag mainīt.", + "message": "Šī parole datu noplūdēs ir atklāta $VALUE$ reizi(es). To vajadzētu nomainīt.", "placeholders": { "value": { "content": "$1", @@ -1251,7 +1352,7 @@ } }, "passwordSafe": { - "message": "Šī parole netika atrasta nevienā no zināmajiem datu pārkāpumiem. Tai vajadzētu būt droši izmantojamai." + "message": "Šī parole netika atrasta nevienā zināmā datu noplūdē. Tai vajadzētu būt droši izmantojamai." }, "baseDomain": { "message": "Pamata domēns", @@ -1366,7 +1467,7 @@ "message": "Atslēgt ar PIN" }, "setYourPinCode": { - "message": "Uzstādīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti, ja jebkad tiks veikta pilnīga izrakstīšanās no lietotnes." + "message": "Iestatīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti pēc pilnīgas izrakstīšanās no lietotnes." }, "pinRequired": { "message": "Ir nepieciešams PIN kods." @@ -1424,14 +1525,11 @@ "restoreItem": { "message": "Atjaunot vienumu" }, - "restoreItemConfirmation": { - "message": "Jūs tiešām atjaunot šo vienumu?" - }, "restoredItem": { "message": "Vienums atjaunots" }, "vaultTimeoutLogOutConfirmation": { - "message": "Izrakstīšanās noņems visu piekļuvi glabātavai un pieprasīs tiešsaistes pieteikšanos pēc noildzes laika. Vai tiešām izmantot šo iestatījumu?" + "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?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Noildzes darbības apstiprināšana" @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Automātiski aizpildīts vienums" }, + "insecurePageWarning": { + "message": "Brīdinājums: šī ir nedroša HTTP lapa, un ir iespējams, ka citi var redzēt vai mainīt visu tajā iesniegto informāciju. Šis pieteikšanās vienums sākotnēji tika saglabāts drošā (HTTPS) lapā." + }, + "insecurePageWarningFillPrompt": { + "message": "Vai tiešām joprojām aizpildīt šo pieteikšanās vienumu?" + }, + "autofillIframeWarning": { + "message": "Veidne ir izvietota citā domēnā, nekā saglabātā pieteikšanās vienuma URI. Jāizvēlas \"Labi\", lai vienalga automātiski aizpildītu, vai \"Atcelt\", lai apturētu." + }, + "autofillIframeWarningTip": { + "message": "Lai novērstu šī brīdinājuma turpmāku rādīšanu, jāsaglabā šis URI, $HOSTNAME$, šīs vietnes Bitwarde pieteikšanās vienumā.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Uzstādīt galveno paroli" }, + "currentMasterPass": { + "message": "Pašreizējā galvenā parole" + }, + "newMasterPass": { + "message": "Jaunā galvenā parole" + }, + "confirmNewMasterPass": { + "message": "Apstiprināt jauno galveno paroli" + }, "masterPasswordPolicyInEffect": { "message": "Viena vai vairākas apvienības nosacījumos ir norādīts, lai galvenā parole atbilst šādām prasībām:" }, @@ -1491,10 +1616,10 @@ "message": "Jaunā galvenā parole neatbilst nosacījumu prasībām." }, "acceptPolicies": { - "message": "Atzīmējot šo rūtiņu, Tu piekrīti sekojošajam:" + "message": "Ar šīs rūtiņas atzīmēšanu tiek piekrists sekojošajam:" }, "acceptPoliciesRequired": { - "message": "Nav apstiprināti izmantošanas nosacījumi un privātuma politika." + "message": "Nav apstiprināti izmantošanas noteikumi un privātuma nosacījumi." }, "termsOfService": { "message": "Izmantošanas nosacījumi" @@ -1539,7 +1664,7 @@ "message": "Darbvirsmas saziņa tika pārtraukta" }, "nativeMessagingWrongUserDesc": { - "message": "Darbvirsmas lietotne ir pierakstījusies atšķirīgā kontā. Lūgums nodrošināt, ka abas lietotnes ir pierakstījušās vienam un tam pašam kontam." + "message": "Darbvirsmas lietotne ir pieteikusies atšķirīgā kontā. Lūgums nodrošināt, ka abas lietotnes ir pieteikušās vienā un tajā pašā kontā." }, "nativeMessagingWrongUserTitle": { "message": "Konta nesaderība" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Šajā ierīcē netiek atbalstīta pārlūka biometrija." }, + "biometricsFailedTitle": { + "message": "Biometrija neizdevās" + }, + "biometricsFailedDesc": { + "message": "Biometriju nevar pabeigt, jāapsver galvenās paroles izmantošana vai atteikšanās. Ja tas turpinās, lūgums sazināties ar Bitwarden atbalstu." + }, "nativeMessaginPermissionErrorTitle": { "message": "Atļauja nav nodrošināta" }, @@ -1566,7 +1697,7 @@ "message": "Atļaujas pieprasījuma kļūda" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Šī darbība nav izpildāma sānjoslā, tāpēc lūgums mēģināt to veikt uznirstošajā vai izlecošajā logā." + "message": "Šī darbība nav izpildāma sānjoslā, tāpēc lūgums mēģināt to veikt uznirstošajā vai jaunā logā." }, "personalOwnershipSubmitError": { "message": "Uzņēmuma nosacījumi liedz saglabāt vienumus privātajā glabātavā. Norādi piederību apvienībai un izvēlies kādu no pieejamajiem krājumiem." @@ -1574,11 +1705,17 @@ "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ā." + }, "excludedDomains": { "message": "Izņēmuma domēni" }, "excludedDomainsDesc": { - "message": "Bitwarden nevaicās saglabāt pierakstīšanās datus šiem domēniem. Ir jāpārlādē lapa, lai izmaiņas iedarbotos." + "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 šiem domēniem visiem pieslēgtajiem kontiem. Ir jāpārlādē lapa, lai iedarbotos izmaiņas." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nav derīgs domēns", @@ -1590,15 +1727,15 @@ } }, "send": { - "message": "\"Send\"", + "message": "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\"", + "message": "Meklēt Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Pievienot \"Send'", + "message": "Pievienot Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -1608,11 +1745,11 @@ "message": "Datne" }, "allSends": { - "message": "Visi \"Send\"", + "message": "Visi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Sasniegts lielākais pieļaujamais piekļuvju skaits", + "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." }, "expired": { @@ -1625,7 +1762,7 @@ "message": "Aizsargāts ar paroli" }, "copySendLink": { - "message": "Ievietot \"Send\" saiti starpliktuvē", + "message": "Ievietot Send saiti starpliktuvē", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -1638,11 +1775,11 @@ "message": "Parole noņemta" }, "deletedSend": { - "message": "\"Send\" izdzēsts", + "message": "Send izdzēsts", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "\"Send\" saite", + "message": "Send saite", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -1652,23 +1789,23 @@ "message": "Vai tiešām noņemt paroli?" }, "deleteSend": { - "message": "Dzēst \"Send\"", + "message": "Izdzēst Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Vai tiešām izdzēst šo \"Send\"?", + "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." }, "editSend": { - "message": "Labot \"Send\"", + "message": "Labot Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "Kāds veids ir šim \"Send\"?", + "message": "Kāds ir šī Send veids?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "Lasāms nosaukums, kas apraksta šo \"Send\".", + "message": "Lasāms nosaukums, kas apraksta šo Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { @@ -1678,14 +1815,14 @@ "message": "Dzēšanas datums" }, "deletionDateDesc": { - "message": "\"Send\" tiks pastāvīgi izdzēsts norādītajā dienā un laikā.", + "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." }, "expirationDate": { "message": "Derīguma beigu datums" }, "expirationDateDesc": { - "message": "Ja uzstādīts, piekļuve šim \"Send\" beigsies norādītajā dienā un laikā.", + "message": "Ja iestatīts, piekļuve šim Send beigsies 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." }, "oneDay": { @@ -1704,59 +1841,59 @@ "message": "Pielāgots" }, "maximumAccessCount": { - "message": "Lielākais pieļaujamais piekļuvju skaits" + "message": "Lielākais pieļaujamais piekļuves reižu skaits" }, "maximumAccessCountDesc": { - "message": "Ja uzstādīts, lietotāji nevarēs piekļūt šim \"Send\", kad tiks sasniegts lielākais pieļaujamais piekļūšanas reižu skaits.", + "message": "Ja iestatīts, lietotāji nevarēs piekļūt šim Send, kad tiks sasniegts lielākais pieļaujamais piekļūšanas reižu skaits.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Pēc izvēles pieprasīt lietotājiem paroli, lai viņi varētu piekļūt šim \"Send\".", + "message": "Pēc izvēles pieprasīt paroli, lai lietotāji varētu piekļūt šim Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Personīgās piezīmes par šo \"Send\".", + "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." }, "sendDisableDesc": { - "message": "Atspējot šo \"Send\", lai neviens tam nevarētu piekļūt.", + "message": "Izslēgt šo Send, lai neviens tam nevarētu piekļūt.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Saglabājot ievietot šī \"Send\" saiti starpliktuvē.", + "message": "Saglabāšanas brīdī ievietot šī Send saiti starpliktuvē.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { "message": "Teksts, kuru ir vēlme nosūtīt." }, "sendHideText": { - "message": "Pēc noklusējuma paslēpt šī \"Send\" tekstu.", + "message": "Pēc noklusējuma paslēpt šī Send tekstu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { "message": "Pašreizējais piekļuvju skaits" }, "createSend": { - "message": "Izveidot jaunu \"Send\"", + "message": "Jauns Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Jauna parole" }, "sendDisabled": { - "message": "\"Send\" atspējots", + "message": "Send noņemts", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Uzņēmuma nosacījumu kopas dēļ ir tikai iespējams dzēst esošu \"Send\".", + "message": "Uzņēmuma nosacījumu dēļ ir iespējams izdzēst tikai esošu Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "\"Send\" izveidots", + "message": "Send izveidots", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "\"Send\" labots", + "message": "Send saglabāts", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1769,18 +1906,18 @@ "message": "Lai izvēlētos datni, ja tiek izmantots Safari, paplašinājums ir jāatver jaunā logā, klikšķinot uz šī paziņojuma." }, "sendFileCalloutHeader": { - "message": "Pirms sākt" + "message": "Pirms sākšanas" }, "sendFirefoxCustomDatePopoutMessage1": { "message": "Lai izmantotu kalendāra veida datumu atlasītāju,", "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": "klikšķināt šeit,", + "message": "klikšķināt šeit", "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": "lai atvērtu jaunā logā.", + "message": ", lai atvērtu jaunā logā.", "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": { @@ -1802,7 +1939,7 @@ "message": "Slēpt e-pasta adresi no saņēmējiem." }, "sendOptionsPolicyInEffect": { - "message": "Viens vai vairāki apvienības nosacījumi ietekmē \"Send\" iestatījumus." + "message": "Viens vai vairāki apvienības nosacījumi ietekmē Send iespējas." }, "passwordPrompt": { "message": "Galvenās paroles pārvaicāšana" @@ -1826,7 +1963,10 @@ "message": "Atjaunināt galveno paroli" }, "updateMasterPasswordWarning": { - "message": "Apvienības pārvaldnieks nesen nomainīja galveno paroli. Lai piekļūtu glabātavai, tā ir jāatjaunina. Turpinot tiks izbeigta pašreizējā sesija un tiks pieprasīta atkārtota pierakstīšanās. Esošās sesijas citās iekārtās var turpināt darboties līdz vienai stundai." + "message": "Apvienības pārvaldnieks nesen nomainīja galveno paroli. Tā ir jāatjaunina, lai varētu piekļūt glabātavai. Turpinot tiks izbeigta pašreizējā sesija un tiks pieprasīta atkārtota pieteikšanās. Esošās sesijas citās ierīcēs var turpināt darboties līdz vienai stundai." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Automātiska ievietošana sarakstā" @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Stundas" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Apvienības nosacījumos kā glabātavas noildzes darbība ir uzstādīta $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Glabātavas noildze pārsniedz apvienības uzstādītos ierobežojumus." }, @@ -1875,7 +2046,7 @@ "message": "Nav atrasts neviens neatkārtojams identifikators" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ izmanto vienoto pieteikšanos ar pašizvietotu atslēgu serveri. Tās dalībniekiem vairs nav nepieciešama galvenā parole, lai pieslēgtos.", + "message": "$ORGANIZATION$ izmanto vienoto pieteikšanos ar pašizvietotu atslēgu serveri. Tās dalībniekiem vairs nav nepieciešama galvenā parole, lai pieteiktos.", "placeholders": { "organization": { "content": "$1", @@ -1902,13 +2073,13 @@ "message": "Pārslēgt rakstzīmju skaita attēlošanu" }, "sessionTimeout": { - "message": "Sesijai iestājās noildze. Lūgums mēģināt pierakstīties vēlreiz." + "message": "Sesijai iestājās noildze. Lūgums mēģināt pieteikties vēlreiz." }, "exportingPersonalVaultTitle": { "message": "Izdod personīgo glabātavu" }, - "exportingPersonalVaultDescription": { - "message": "Tiks izdoti tikai personīgie glabātavas vienumi, kas ir saistīti ar $EMAIL$. Apvienības glabātavas vienumi netiks iekļauti.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,11 +2158,8 @@ "disabledOrganizationFilterError": { "message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { - "message": "Pierakstās $DOMAIN$", + "message": "Piesakās $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Servera versija" }, - "selfHosted": { - "message": "Pašizvietots" + "selfHostedServer": { + "message": "pašizvietots" }, "thirdParty": { "message": "Trešās puses" @@ -2036,10 +2204,10 @@ } }, "loginWithMasterPassword": { - "message": "Pierakstīties ar galveno paroli" + "message": "Pieteikties ar galveno paroli" }, "loggingInAs": { - "message": "Pierakstās kā" + "message": "Piesakās kā" }, "notYou": { "message": "Tas neesi Tu?" @@ -2050,20 +2218,44 @@ "rememberEmail": { "message": "Atcerēties e-pasta adresi" }, + "loginWithDevice": { + "message": "Pieteikties ar ierīci" + }, + "loginWithDeviceEnabledInfo": { + "message": "Ir jāuzstāda pieteikšanās ar ierīci Bitwarden lietotnes iestatījumos. Nepieciešama cita iespēja?" + }, + "fingerprintPhraseHeader": { + "message": "Atpazīšanas vārdkopa" + }, + "fingerprintMatchInfo": { + "message": "Lūgums pārliecināties, ka glabātava ir atslēgta un atpazīšanas vārdkopa ir tāda pati arī citā ierīcē." + }, + "resendNotification": { + "message": "Atkārtoti nosūtīt paziņojumu" + }, + "viewAllLoginOptions": { + "message": "Skatīt visas pieteikšanās iespējas" + }, + "notificationSentDevice": { + "message": "Uz ierīci ir nosūtīts paziņojums." + }, + "loginInitiated": { + "message": "Uzsākta pieteikšanās" + }, "exposedMasterPassword": { "message": "Noplūdusi galvenā parole" }, "exposedMasterPasswordDesc": { - "message": "Parole ir atrasta datu noplūdē. Jāizmanto spēcīga parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" + "message": "Parole atrasta datu noplūdē. Jāizmanto neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot noplūdušu paroli?" }, "weakAndExposedMasterPassword": { "message": "Vāja un noplūdusi galvenā parole" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" + "message": "Noteikta vāja parole, un tā ir atrasta datu noplūdē. Jāizmanto spēcīga un neatkārtojama parole, lai aizsargātu savu kontu. Vai tiešām izmantot šo paroli?" }, "checkForBreaches": { - "message": "Pārbaudīt šo paroli pret zināmām datu noplūdēm" + "message": "Meklēt šo paroli zināmās datu noplūdēs" }, "important": { "message": "Svarīgi:" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Tavas apvienības nosacījumos ir ieslēgta automātiskā aizpildīšana lapas ielādes brīdī." + }, + "howToAutofill": { + "message": "Kā automātiski aizpildīt" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Sapratu" + }, + "autofillSettings": { + "message": "Automātiskās aizpildes iestatījumi" + }, + "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." + }, + "autofillShortcutText": { + "message": "Automātiskās aizpildes īsceļš ir: $COMMAND$. To var mainīt pārlūka iestatījumos.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Automātiskās aizpildes noklusējuma īsceļš: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Piesakās" + }, + "opensInANewWindow": { + "message": "Atver jaunā logā" + }, + "deviceApprovalRequired": { + "message": "Nepieciešams ierīces apstiprinājums. Zemāk jāatlasa apstiprinājuma iespēja:" + }, + "rememberThisDevice": { + "message": "Atcerēties šo ierīci" + }, + "uncheckIfPublicDevice": { + "message": "Jānoņem atzīme, ja tiek izmantota publiska ierīce" + }, + "approveFromYourOtherDevice": { + "message": "Jāapstiprina citā savā ierīcē" + }, + "requestAdminApproval": { + "message": "Pieprasīt pārvaldītāja apstiprinājumu" + }, + "approveWithMasterPassword": { + "message": "Apstiprināt ar galveno paroli" + }, + "ssoIdentifierRequired": { + "message": "Ir nepieciešams apvienības SSO identifikators." + }, + "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." + }, + "general": { + "message": "Vispārīgi" + }, + "display": { + "message": "Attēlojums" + }, + "accountSuccessfullyCreated": { + "message": "Konts ir veiksmīgi izveidots." + }, + "adminApprovalRequested": { + "message": "Pieprasīts pārvaldītāja apstiprinājums" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Pieprasījums tika nosūtīts pārvaldītājam." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Tiks saņemts paziņojums, tiklīdz būs apstiprināts." + }, + "troubleLoggingIn": { + "message": "Neizdodas pieteikties?" + }, + "loginApproved": { + "message": "Pieteikšanās apstiprināta" + }, + "userEmailMissing": { + "message": "Trūkst lietotāja e-pasta adreses" + }, + "deviceTrusted": { + "message": "Ierīce ir uzticama" + }, + "inputRequired": { + "message": "Jāievada vērtība." + }, + "required": { + "message": "nepieciešams" + }, + "search": { + "message": "Meklēt" + }, + "inputMinLength": { + "message": "Ievadītajai vērtībai ir jābūt vismaz $COUNT$ rakstzīmes garai.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Ievadītās vērtības garums nedrīkst pārsniegt $COUNT$ rakstzīmes.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Šādas rakstzīmes nav atļautas: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Ievadītajai vērtībai jābūt vismaz $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Ievadītā vērtība nedrīkst pārsniegt $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 vai vairākas e-pasta adreses nav derīgas" + }, + "inputTrimValidator": { + "message": "Ievadītā vērtība nevar sastāvēt tikai no atstarpēm.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Ievadītā vērtība nav e-pasta adrese." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ augstāk esošajam(iem) laukam(iem) ir jāpievērš uzmanība.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Atlasīt --" + }, + "multiSelectPlaceholder": { + "message": "-- Rakstīt, lai atlasītu --" + }, + "multiSelectLoading": { + "message": "Iegūst iespējas..." + }, + "multiSelectNotFound": { + "message": "Netika atrasti vienumi" + }, + "multiSelectClearAll": { + "message": "Notīrīt visu" + }, + "plusNMore": { + "message": "+ vēl $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Apakšizvēlne" + }, + "toggleCollapse": { + "message": "Pārslēgt sakļaušanu", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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šus pieteikšanās vienumus", + "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." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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 izdošanas datnes izveidošanas brīdī." + }, + "importDestination": { + "message": "Ievietošanas 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "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" + }, + "choosePasskey": { + "message": "Izvēlēties pieteikšanās vienumu, kurā saglabāt šo piekļuves atslēgu" + }, + "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." + }, + "useBrowserName": { + "message": "Izmantot pārlūku" + }, + "multifactorAuthenticationCancelled": { + "message": "Daudzpakāpju pieteikšanās atcelta" + }, + "noLastPassDataFound": { + "message": "Netika atrasti LastPass dati" + }, + "incorrectUsernameOrPassword": { + "message": "Nepareizs lietotājvārds vai parole" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index f40403dabb4f..466c6d519d6f 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "ഓട്ടോഫിൽ" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "പാസ്‌വേഡ് സൃഷ്ടിക്കുക (പകർത്തുക )" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "സഹായവും അഭിപ്രായവും" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "സമന്വയിപ്പിക്കുക" }, @@ -329,6 +362,12 @@ "other": { "message": "മറ്റുള്ളവ" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "എക്സ്റ്റൻഷൻ റേറ്റ് ചെയ്യുക " }, @@ -369,6 +408,9 @@ "lockNow": { "message": "ഇപ്പോൾ ലോക്കുചെയ്യുക" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ഉടന്‍തന്നെ" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സ്ഥിരീകരണം പൊരുത്തപ്പെടുന്നില്ല." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "നിങ്ങൾ ആദ്യമായി സൈറ്റിൽ പ്രവേശിക്കുമ്പോൾ നിങ്ങളുടെ വാൾട്ടിലേക്കു തനിയെ പ്രവേശനം ഉൾപെടുത്താൻ \"പ്രവേശനം ചേർക്കുക എന്ന അറിയിപ്പ്\" ആവശ്യപ്പെടും." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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": "ബിറ്റ്വാർഡനിൽ ഈ പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?" }, "notificationChangeSave": { "message": "ശരി, ഇപ്പോൾ അപ്ഡേറ്റ് ചെയ്യുക" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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 പൊരുത്തം കണ്ടെത്തൽ", @@ -633,6 +703,9 @@ "themeDesc": { "message": "അപ്ലിക്കേഷന്റെ തീമും വർണ്ണങ്ങളും മാറ്റുക." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ഇരുണ്ടത്", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "സവിശേഷത ലഭ്യമല്ല" }, - "updateKey": { - "message": "നിങ്ങളുടെ എൻ‌ക്രിപ്ഷൻ കീ അപ്‌ഡേറ്റ് ചെയ്യുന്നതുവരെ നിങ്ങൾക്ക് ഈ സവിശേഷത ഉപയോഗിക്കാൻ കഴിയില്ല." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "പ്രീമിയം അംഗത്വം" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്‌ത സംഭരണം." }, - "ppremiumSignUpTwoStep": { - "message": "രണ്ട്-ഘട്ട പ്രവേശന ഓപ്ഷനുകളായ Yubikey, FIDO U2F, Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "നിങ്ങളുടെ വാൾട് സൂക്ഷിക്കുന്നതിന്. പാസ്‌വേഡ് ശുചിത്വം, അക്കൗണ്ട് ആരോഗ്യം, ഡാറ്റ ലംഘന റിപ്പോർട്ടുകൾ." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "എന്വിയാണമെന്റ് URL സംരക്ഷിച്ചു." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "പേജ് ലോഡിൽ യാന്ത്രിക-പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "ഇനം വീണ്ടെടുക്കുക " }, - "restoreItemConfirmation": { - "message": "ഈ ഇനം വീണ്ടെടുക്കണമെന്ന് ഉറപ്പാണോ?" - }, "restoredItem": { "message": "വീണ്ടെടുത്ത ഇനം" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "യാന്ത്രികമായി പൂരിപ്പിച്ച ഇനം" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സജ്ജമാക്കുക" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "ഒന്നോ അതിലധികമോ ഓർഗനൈസേഷൻ നയങ്ങൾക്ക് ഇനിപ്പറയുന്ന ആവശ്യകതകൾ നിറവേറ്റുന്നതിന് നിങ്ങളുടെ മാസ്റ്റർ പാസ്‌വേഡ് ആവശ്യമാണ്:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json new file mode 100644 index 000000000000..c3747416e90a --- /dev/null +++ b/apps/browser/src/_locales/mr/messages.json @@ -0,0 +1,2821 @@ +{ + "appName": { + "message": "Bitwarden" + }, + "extName": { + "message": "Bitwarden - विनामूल्य पासवर्ड व्यवस्थापक", + "description": "Extension name, MUST be less than 40 characters (Safari restriction)" + }, + "extDesc": { + "message": "तुमच्या सर्व उपकरणांसाठी एक सुरक्षित व विनामूल्य पासवर्ड व्यवस्थापक.", + "description": "Extension description" + }, + "loginOrCreateNewAccount": { + "message": "तुमच्या सुरक्षित तिजोरीत पोहचण्यासाठी लॉग इन करा किंवा नवीन खाते उघडा." + }, + "createAccount": { + "message": "खाते तयार करा" + }, + "login": { + "message": "प्रवेश करा" + }, + "enterpriseSingleSignOn": { + "message": "Enterprise single sign-on" + }, + "cancel": { + "message": "रद्द" + }, + "close": { + "message": "मिटवा" + }, + "submit": { + "message": "पाठवा" + }, + "emailAddress": { + "message": "ईमेल पत्ता" + }, + "masterPass": { + "message": "मुख्य पासवर्ड" + }, + "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." + }, + "masterPassHintDesc": { + "message": "A master password hint can help you remember your password if you forget it." + }, + "reTypeMasterPass": { + "message": "Re-type master password" + }, + "masterPassHint": { + "message": "मुख्य पासवर्डचा संकेत (पर्यायी)" + }, + "tab": { + "message": "टॅब" + }, + "vault": { + "message": "तिजोरी" + }, + "myVault": { + "message": "माझी तिजोरी" + }, + "allVaults": { + "message": "सर्व तिजोऱ्या" + }, + "tools": { + "message": "साधने" + }, + "settings": { + "message": "मांडणी" + }, + "currentTab": { + "message": "वर्तमान टॅब" + }, + "copyPassword": { + "message": "पासवर्ड कॉपी करा" + }, + "copyNote": { + "message": "टीप कॉपी करा" + }, + "copyUri": { + "message": "URI कॉपी करा" + }, + "copyUsername": { + "message": "वापरकर्तानाव कॉपी करा" + }, + "copyNumber": { + "message": "क्रमांक कॉपी करा" + }, + "copySecurityCode": { + "message": "सुरक्षा कोड कॉपी करा" + }, + "autoFill": { + "message": "स्वयंभरण" + }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, + "generatePasswordCopied": { + "message": "Generate password (copied)" + }, + "copyElementIdentifier": { + "message": "Copy custom field name" + }, + "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": "तिजोरी उघडा" + }, + "loginToVaultMenu": { + "message": "तिजोरीत प्रवेश करा" + }, + "autoFillInfo": { + "message": "There are no logins available to auto-fill for the current browser tab." + }, + "addLogin": { + "message": "लॉगिन जोडा" + }, + "addItem": { + "message": "वस्तू जोडा" + }, + "passwordHint": { + "message": "पासवर्ड संकेत" + }, + "enterEmailToGetHint": { + "message": "Enter your account email address to receive your master password hint." + }, + "getMasterPasswordHint": { + "message": "मुख्य पासवर्ड संकेत मिळवा" + }, + "continue": { + "message": "पुढे" + }, + "sendVerificationCode": { + "message": "तुमच्या ईमेलवर एक सत्यापन कोड पाठवा" + }, + "sendCode": { + "message": "कोड पाठवा" + }, + "codeSent": { + "message": "कोड पाठवला" + }, + "verificationCode": { + "message": "सत्यापन कोड" + }, + "confirmIdentity": { + "message": "पुढे जाण्यासाठी तुमच्या ओळखीची पुष्टी करा." + }, + "account": { + "message": "खाते" + }, + "changeMasterPassword": { + "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." + }, + "yourAccountsFingerprint": { + "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": { + "message": "दोन टप्प्यात लॉगिन" + }, + "logOut": { + "message": "बाहेर पडा" + }, + "about": { + "message": "आमच्या विषयी" + }, + "version": { + "message": "आवृत्ती" + }, + "save": { + "message": "साठवा" + }, + "move": { + "message": "हलवा" + }, + "addFolder": { + "message": "फोल्डर जोडा" + }, + "name": { + "message": "नाव" + }, + "editFolder": { + "message": "फोल्डर संपादित करा" + }, + "deleteFolder": { + "message": "फोल्डर खोडून टाका" + }, + "folders": { + "message": "Folders" + }, + "noFolders": { + "message": "There are no folders to list." + }, + "helpFeedback": { + "message": "Help & feedback" + }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, + "sync": { + "message": "संकालन" + }, + "syncVaultNow": { + "message": "तिजोरी संकालन आता करा" + }, + "lastSync": { + "message": "शेवटचे संकालन:" + }, + "passGen": { + "message": "पासवर्ड जनित्र" + }, + "generator": { + "message": "जनित्र", + "description": "Short for 'Password Generator'." + }, + "passGenInfo": { + "message": "Automatically generate strong, unique passwords for your logins." + }, + "bitWebVault": { + "message": "Bitwarden web vault" + }, + "importItems": { + "message": "वस्तू आयात करा" + }, + "select": { + "message": "Select" + }, + "generatePassword": { + "message": "Generate password" + }, + "regeneratePassword": { + "message": "पासवर्ड पुनर्जनित करा" + }, + "options": { + "message": "पर्याय" + }, + "length": { + "message": "लांबी" + }, + "uppercase": { + "message": "Uppercase (A-Z)" + }, + "lowercase": { + "message": "Lowercase (a-z)" + }, + "numbers": { + "message": "Numbers (0-9)" + }, + "specialCharacters": { + "message": "Special characters (!@#$%^&*)" + }, + "numWords": { + "message": "Number of words" + }, + "wordSeparator": { + "message": "Word separator" + }, + "capitalize": { + "message": "Capitalize", + "description": "Make the first letter of a work uppercase." + }, + "includeNumber": { + "message": "Include number" + }, + "minNumbers": { + "message": "Minimum numbers" + }, + "minSpecial": { + "message": "Minimum special" + }, + "avoidAmbChar": { + "message": "Avoid ambiguous characters" + }, + "searchVault": { + "message": "तिजोरीत शोधा" + }, + "edit": { + "message": "Edit" + }, + "view": { + "message": "View" + }, + "noItemsInList": { + "message": "There are no items to list." + }, + "itemInformation": { + "message": "Item information" + }, + "username": { + "message": "Username" + }, + "password": { + "message": "Password" + }, + "passphrase": { + "message": "वाक्यांश" + }, + "favorite": { + "message": "आवडते" + }, + "notes": { + "message": "टिप" + }, + "note": { + "message": "Note" + }, + "editItem": { + "message": "वस्तू संपादित करा" + }, + "folder": { + "message": "फोल्डर" + }, + "deleteItem": { + "message": "वस्तू खोडून टाका" + }, + "viewItem": { + "message": "वस्तू बघा" + }, + "launch": { + "message": "उघडा" + }, + "website": { + "message": "संकेतस्थळ" + }, + "toggleVisibility": { + "message": "दृश्यात उलटवा" + }, + "manage": { + "message": "व्यवस्थापन" + }, + "other": { + "message": "इतर" + }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "rateExtension": { + "message": "विस्तारकाचे मूल्यांकन करा" + }, + "rateExtensionDesc": { + "message": "चांगला अभिप्राय देऊन आम्हाला मदत करा!" + }, + "browserNotSupportClipboard": { + "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + }, + "verifyIdentity": { + "message": "ओळख सत्यापित करा" + }, + "yourVaultIsLocked": { + "message": "तुमची तिजोरीला कुलूप लावले आहे. पुढे जाण्यासाठी तुमची ओळख सत्यापित करा." + }, + "unlock": { + "message": "कुलूप उघडा" + }, + "loggedInAsOn": { + "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "hostname": { + "content": "$2", + "example": "bitwarden.com" + } + } + }, + "invalidMasterPassword": { + "message": "अवैध मुख्य पासवर्ड" + }, + "vaultTimeout": { + "message": "Vault timeout" + }, + "lockNow": { + "message": "Lock now" + }, + "lockAll": { + "message": "Lock all" + }, + "immediately": { + "message": "Immediately" + }, + "tenSeconds": { + "message": "10 seconds" + }, + "twentySeconds": { + "message": "20 seconds" + }, + "thirtySeconds": { + "message": "30 seconds" + }, + "oneMinute": { + "message": "1 minute" + }, + "twoMinutes": { + "message": "2 minutes" + }, + "fiveMinutes": { + "message": "5 minutes" + }, + "fifteenMinutes": { + "message": "15 minutes" + }, + "thirtyMinutes": { + "message": "30 minutes" + }, + "oneHour": { + "message": "1 hour" + }, + "fourHours": { + "message": "4 hours" + }, + "onLocked": { + "message": "On system lock" + }, + "onRestart": { + "message": "On browser restart" + }, + "never": { + "message": "Never" + }, + "security": { + "message": "Security" + }, + "errorOccurred": { + "message": "An error has occurred" + }, + "emailRequired": { + "message": "Email address is required." + }, + "invalidEmail": { + "message": "Invalid email address." + }, + "masterPasswordRequired": { + "message": "Master password is required." + }, + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } + }, + "masterPassDoesntMatch": { + "message": "Master password confirmation does not match." + }, + "newAccountCreated": { + "message": "Your new account has been created! You may now log in." + }, + "masterPassSent": { + "message": "We've sent you an email with your master password hint." + }, + "verificationCodeRequired": { + "message": "Verification code is required." + }, + "invalidVerificationCode": { + "message": "Invalid verification code" + }, + "valueCopied": { + "message": "$VALUE$ copied", + "description": "Value has been copied to the clipboard.", + "placeholders": { + "value": { + "content": "$1", + "example": "Password" + } + } + }, + "autofillError": { + "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + }, + "loggedOut": { + "message": "Logged out" + }, + "loginExpired": { + "message": "Your login session has expired." + }, + "logOutConfirmation": { + "message": "Are you sure you want to log out?" + }, + "yes": { + "message": "Yes" + }, + "no": { + "message": "No" + }, + "unexpectedError": { + "message": "An unexpected error has occurred." + }, + "nameRequired": { + "message": "Name is required." + }, + "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?" + }, + "editedFolder": { + "message": "Folder saved" + }, + "deleteFolderConfirmation": { + "message": "Are you sure you want to delete this folder?" + }, + "deletedFolder": { + "message": "Folder deleted" + }, + "gettingStartedTutorial": { + "message": "Getting started tutorial" + }, + "gettingStartedTutorialVideo": { + "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + }, + "syncingComplete": { + "message": "Syncing complete" + }, + "syncingFailed": { + "message": "Syncing failed" + }, + "passwordCopied": { + "message": "Password copied" + }, + "uri": { + "message": "URI" + }, + "uriPosition": { + "message": "URI $POSITION$", + "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.", + "placeholders": { + "position": { + "content": "$1", + "example": "2" + } + } + }, + "newUri": { + "message": "New URI" + }, + "addedItem": { + "message": "Item added" + }, + "editedItem": { + "message": "Item saved" + }, + "deleteItemConfirmation": { + "message": "Do you really want to send to the trash?" + }, + "deletedItem": { + "message": "Item sent to trash" + }, + "overwritePassword": { + "message": "Overwrite password" + }, + "overwritePasswordConfirmation": { + "message": "Are you sure you want to overwrite the current password?" + }, + "overwriteUsername": { + "message": "Overwrite username" + }, + "overwriteUsernameConfirmation": { + "message": "Are you sure you want to overwrite the current username?" + }, + "searchFolder": { + "message": "Search folder" + }, + "searchCollection": { + "message": "Search collection" + }, + "searchType": { + "message": "Search type" + }, + "noneFolder": { + "message": "No folder", + "description": "This is the folder for uncategorized items" + }, + "enableAddLoginNotification": { + "message": "Ask to add login" + }, + "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." + }, + "showCardsCurrentTab": { + "message": "Show cards on Tab page" + }, + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." + }, + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" + }, + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." + }, + "clearClipboard": { + "message": "Clear clipboard", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "clearClipboardDesc": { + "message": "Automatically clear copied values from your clipboard.", + "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?" + }, + "notificationAddSave": { + "message": "Save" + }, + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" + }, + "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" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, + "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." + }, + "defaultUriMatchDetectionDesc": { + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + }, + "theme": { + "message": "Theme" + }, + "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" + }, + "light": { + "message": "Light", + "description": "Light color" + }, + "solarizedDark": { + "message": "Solarized dark", + "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." + }, + "exportVault": { + "message": "Export vault" + }, + "fileFormat": { + "message": "File format" + }, + "warning": { + "message": "WARNING", + "description": "WARNING (should stay in capitalized letters if the language permits)" + }, + "confirmVaultExport": { + "message": "Confirm vault export" + }, + "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." + }, + "encExportKeyWarningDesc": { + "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + }, + "encExportAccountWarningDesc": { + "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + }, + "exportMasterPassword": { + "message": "Enter your master password to export your vault data." + }, + "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?" + }, + "moveToOrganization": { + "message": "Move to organization" + }, + "share": { + "message": "Share" + }, + "movedItemToOrg": { + "message": "$ITEMNAME$ moved to $ORGNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "orgname": { + "content": "$2", + "example": "Company Name" + } + } + }, + "moveToOrgDesc": { + "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + }, + "learnMore": { + "message": "Learn more" + }, + "authenticatorKeyTotp": { + "message": "Authenticator key (TOTP)" + }, + "verificationCodeTotp": { + "message": "Verification code (TOTP)" + }, + "copyVerificationCode": { + "message": "Copy verification code" + }, + "attachments": { + "message": "Attachments" + }, + "deleteAttachment": { + "message": "Delete attachment" + }, + "deleteAttachmentConfirmation": { + "message": "Are you sure you want to delete this attachment?" + }, + "deletedAttachment": { + "message": "Attachment deleted" + }, + "newAttachment": { + "message": "Add new attachment" + }, + "noAttachments": { + "message": "No attachments." + }, + "attachmentSaved": { + "message": "Attachment saved" + }, + "file": { + "message": "File" + }, + "selectFile": { + "message": "Select a file" + }, + "maxFileSize": { + "message": "Maximum file size is 500 MB." + }, + "featureUnavailable": { + "message": "Feature unavailable" + }, + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + }, + "premiumMembership": { + "message": "Premium membership" + }, + "premiumManage": { + "message": "Manage membership" + }, + "premiumManageAlert": { + "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumRefresh": { + "message": "Refresh membership" + }, + "premiumNotCurrentMember": { + "message": "You are not currently a Premium member." + }, + "premiumSignUpAndGet": { + "message": "Sign up for a Premium membership and get:" + }, + "ppremiumSignUpStorage": { + "message": "1 GB encrypted storage for file attachments." + }, + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." + }, + "ppremiumSignUpReports": { + "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + }, + "ppremiumSignUpTotp": { + "message": "TOTP verification code (2FA) generator for logins in your vault." + }, + "ppremiumSignUpSupport": { + "message": "Priority customer support." + }, + "ppremiumSignUpFuture": { + "message": "All future Premium features. More coming soon!" + }, + "premiumPurchase": { + "message": "Purchase Premium" + }, + "premiumPurchaseAlert": { + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumCurrentMember": { + "message": "You are a Premium member!" + }, + "premiumCurrentMemberThanks": { + "message": "Thank you for supporting Bitwarden." + }, + "premiumPrice": { + "message": "All for just $PRICE$ /year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "refreshComplete": { + "message": "Refresh complete" + }, + "enableAutoTotpCopy": { + "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." + }, + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" + }, + "premiumRequired": { + "message": "Premium required" + }, + "premiumRequiredDesc": { + "message": "A Premium membership is required to use this feature." + }, + "enterVerificationCodeApp": { + "message": "Enter the 6 digit verification code from your authenticator app." + }, + "enterVerificationCodeEmail": { + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "verificationCodeEmailSent": { + "message": "Verification email sent to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "rememberMe": { + "message": "Remember me" + }, + "sendVerificationCodeEmailAgain": { + "message": "Send verification code email again" + }, + "useAnotherTwoStepMethod": { + "message": "Use another two-step login method" + }, + "insertYubiKey": { + "message": "Insert your YubiKey into your computer's USB port, then touch its button." + }, + "insertU2f": { + "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + }, + "webAuthnNewTab": { + "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" + }, + "webAuthnAuthenticate": { + "message": "Authenticate WebAuthn" + }, + "loginUnavailable": { + "message": "Login unavailable" + }, + "noTwoStepProviders": { + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + }, + "noTwoStepProviders2": { + "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" + }, + "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" + }, + "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." + }, + "yubiKeyTitle": { + "message": "YubiKey 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.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "duoOrganizationDesc": { + "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "webAuthnTitle": { + "message": "FIDO2 WebAuthn" + }, + "webAuthnDesc": { + "message": "Use any WebAuthn compatible security key to access your account." + }, + "emailTitle": { + "message": "Email" + }, + "emailDesc": { + "message": "Verification codes will be emailed to you." + }, + "selfHostedEnvironment": { + "message": "Self-hosted environment" + }, + "selfHostedEnvironmentFooter": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + }, + "customEnvironment": { + "message": "Custom environment" + }, + "customEnvironmentFooter": { + "message": "For advanced users. You can specify the base URL of each service independently." + }, + "baseUrl": { + "message": "Server URL" + }, + "apiUrl": { + "message": "API server URL" + }, + "webVaultUrl": { + "message": "Web vault server URL" + }, + "identityUrl": { + "message": "Identity server URL" + }, + "notificationsUrl": { + "message": "Notifications server URL" + }, + "iconsUrl": { + "message": "Icons server URL" + }, + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, + "enableAutoFillOnPageLoad": { + "message": "Auto-fill on page load" + }, + "enableAutoFillOnPageLoadDesc": { + "message": "If a login form is detected, auto-fill when the web page loads." + }, + "experimentalFeature": { + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofill": { + "message": "Learn more about auto-fill" + }, + "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." + }, + "itemAutoFillOnPageLoad": { + "message": "Auto-fill on page load (if set up in Options)" + }, + "autoFillOnPageLoadUseDefault": { + "message": "Use default setting" + }, + "autoFillOnPageLoadYes": { + "message": "Auto-fill on page load" + }, + "autoFillOnPageLoadNo": { + "message": "Do not auto-fill on page load" + }, + "commandOpenPopup": { + "message": "Open vault popup" + }, + "commandOpenSidebar": { + "message": "Open vault in sidebar" + }, + "commandAutofillDesc": { + "message": "Auto-fill the last used login for the current website" + }, + "commandGeneratePasswordDesc": { + "message": "Generate and copy a new random password to the clipboard" + }, + "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" + }, + "value": { + "message": "Value" + }, + "newCustomField": { + "message": "New custom field" + }, + "dragToSort": { + "message": "Drag to sort" + }, + "cfTypeText": { + "message": "Text" + }, + "cfTypeHidden": { + "message": "Hidden" + }, + "cfTypeBoolean": { + "message": "Boolean" + }, + "cfTypeLinked": { + "message": "Linked", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Linked value", + "description": "This describes a value that is 'linked' (tied) to another value." + }, + "popup2faCloseMessage": { + "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + }, + "popupU2fCloseMessage": { + "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + }, + "enableFavicon": { + "message": "Show website icons" + }, + "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" + }, + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." + }, + "cardholderName": { + "message": "Cardholder name" + }, + "number": { + "message": "Number" + }, + "brand": { + "message": "Brand" + }, + "expirationMonth": { + "message": "Expiration month" + }, + "expirationYear": { + "message": "Expiration year" + }, + "expiration": { + "message": "Expiration" + }, + "january": { + "message": "January" + }, + "february": { + "message": "February" + }, + "march": { + "message": "March" + }, + "april": { + "message": "April" + }, + "may": { + "message": "May" + }, + "june": { + "message": "June" + }, + "july": { + "message": "July" + }, + "august": { + "message": "August" + }, + "september": { + "message": "September" + }, + "october": { + "message": "October" + }, + "november": { + "message": "November" + }, + "december": { + "message": "December" + }, + "securityCode": { + "message": "Security code" + }, + "ex": { + "message": "ex." + }, + "title": { + "message": "Title" + }, + "mr": { + "message": "Mr" + }, + "mrs": { + "message": "Mrs" + }, + "ms": { + "message": "Ms" + }, + "dr": { + "message": "Dr" + }, + "mx": { + "message": "Mx" + }, + "firstName": { + "message": "First name" + }, + "middleName": { + "message": "Middle name" + }, + "lastName": { + "message": "Last name" + }, + "fullName": { + "message": "Full name" + }, + "identityName": { + "message": "Identity name" + }, + "company": { + "message": "Company" + }, + "ssn": { + "message": "Social Security number" + }, + "passportNumber": { + "message": "Passport number" + }, + "licenseNumber": { + "message": "License number" + }, + "email": { + "message": "Email" + }, + "phone": { + "message": "Phone" + }, + "address": { + "message": "Address" + }, + "address1": { + "message": "Address 1" + }, + "address2": { + "message": "Address 2" + }, + "address3": { + "message": "Address 3" + }, + "cityTown": { + "message": "City / Town" + }, + "stateProvince": { + "message": "State / Province" + }, + "zipPostalCode": { + "message": "Zip / Postal code" + }, + "country": { + "message": "Country" + }, + "type": { + "message": "Type" + }, + "typeLogin": { + "message": "Login" + }, + "typeLogins": { + "message": "Logins" + }, + "typeSecureNote": { + "message": "Secure note" + }, + "typeCard": { + "message": "Card" + }, + "typeIdentity": { + "message": "Identity" + }, + "passwordHistory": { + "message": "Password history" + }, + "back": { + "message": "Back" + }, + "collections": { + "message": "Collections" + }, + "favorites": { + "message": "Favorites" + }, + "popOutNewWindow": { + "message": "Pop out to a new window" + }, + "refresh": { + "message": "Refresh" + }, + "cards": { + "message": "Cards" + }, + "identities": { + "message": "Identities" + }, + "logins": { + "message": "Logins" + }, + "secureNotes": { + "message": "Secure notes" + }, + "clear": { + "message": "Clear", + "description": "To clear something out. example: To clear browser history." + }, + "checkPassword": { + "message": "Check if password has been exposed." + }, + "passwordExposed": { + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "placeholders": { + "value": { + "content": "$1", + "example": "2" + } + } + }, + "passwordSafe": { + "message": "This password was not found in any known data breaches. It should be safe to use." + }, + "baseDomain": { + "message": "Base domain", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Domain name", + "description": "Domain name. Ex. website.com" + }, + "host": { + "message": "Host", + "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." + }, + "exact": { + "message": "Exact" + }, + "startsWith": { + "message": "Starts with" + }, + "regEx": { + "message": "Regular expression", + "description": "A programming term, also known as 'RegEx'." + }, + "matchDetection": { + "message": "Match detection", + "description": "URI match detection for auto-fill." + }, + "defaultMatchDetection": { + "message": "Default match detection", + "description": "Default URI match detection for auto-fill." + }, + "toggleOptions": { + "message": "Toggle options" + }, + "toggleCurrentUris": { + "message": "Toggle current URIs", + "description": "Toggle the display of the URIs of the currently open tabs in the browser." + }, + "currentUri": { + "message": "Current URI", + "description": "The URI of one of the current open tabs in the browser." + }, + "organization": { + "message": "Organization", + "description": "An entity of multiple related people (ex. a team or business organization)." + }, + "types": { + "message": "Types" + }, + "allItems": { + "message": "All items" + }, + "noPasswordsInList": { + "message": "There are no passwords to list." + }, + "remove": { + "message": "Remove" + }, + "default": { + "message": "Default" + }, + "dateUpdated": { + "message": "Updated", + "description": "ex. Date this item was updated" + }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, + "datePasswordUpdated": { + "message": "Password updated", + "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." + }, + "noOrganizationsList": { + "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + }, + "noCollectionsInList": { + "message": "There are no collections to list." + }, + "ownership": { + "message": "Ownership" + }, + "whoOwnsThisItem": { + "message": "Who owns this item?" + }, + "strong": { + "message": "Strong", + "description": "ex. A strong password. Scale: Weak -> Good -> Strong" + }, + "good": { + "message": "Good", + "description": "ex. A good password. Scale: Weak -> Good -> Strong" + }, + "weak": { + "message": "Weak", + "description": "ex. A weak password. Scale: Weak -> Good -> Strong" + }, + "weakMasterPassword": { + "message": "Weak master password" + }, + "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?" + }, + "pin": { + "message": "PIN", + "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." + }, + "unlockWithPin": { + "message": "Unlock with 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." + }, + "pinRequired": { + "message": "PIN code is required." + }, + "invalidPin": { + "message": "Invalid PIN code." + }, + "unlockWithBiometrics": { + "message": "Unlock with biometrics" + }, + "awaitDesktop": { + "message": "Awaiting confirmation from desktop" + }, + "awaitDesktopDesc": { + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + }, + "lockWithMasterPassOnRestart": { + "message": "Lock with master password on browser restart" + }, + "selectOneCollection": { + "message": "You must select at least one collection." + }, + "cloneItem": { + "message": "Clone item" + }, + "clone": { + "message": "Clone" + }, + "passwordGeneratorPolicyInEffect": { + "message": "One or more organization policies are affecting your generator settings." + }, + "vaultTimeoutAction": { + "message": "Vault timeout action" + }, + "lock": { + "message": "Lock", + "description": "Verb form: to make secure or inaccesible by" + }, + "trash": { + "message": "Trash", + "description": "Noun: a special folder to hold deleted items" + }, + "searchTrash": { + "message": "Search trash" + }, + "permanentlyDeleteItem": { + "message": "Permanently delete item" + }, + "permanentlyDeleteItemConfirmation": { + "message": "Are you sure you want to permanently delete this item?" + }, + "permanentlyDeletedItem": { + "message": "Item permanently deleted" + }, + "restoreItem": { + "message": "Restore item" + }, + "restoredItem": { + "message": "Item restored" + }, + "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?" + }, + "vaultTimeoutLogOutConfirmationTitle": { + "message": "Timeout action confirmation" + }, + "autoFillAndSave": { + "message": "Auto-fill and save" + }, + "autoFillSuccessAndSavedUri": { + "message": "Item auto-filled and URI saved" + }, + "autoFillSuccess": { + "message": "Item auto-filled " + }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "setMasterPassword": { + "message": "Set master password" + }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, + "masterPasswordPolicyInEffect": { + "message": "One or more organization policies require your master password to meet the following requirements:" + }, + "policyInEffectMinComplexity": { + "message": "Minimum complexity score of $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, + "policyInEffectMinLength": { + "message": "Minimum length of $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "policyInEffectUppercase": { + "message": "Contain one or more uppercase characters" + }, + "policyInEffectLowercase": { + "message": "Contain one or more lowercase characters" + }, + "policyInEffectNumbers": { + "message": "Contain one or more numbers" + }, + "policyInEffectSpecial": { + "message": "Contain one or more of the following special characters $CHARS$", + "placeholders": { + "chars": { + "content": "$1", + "example": "!@#$%^&*" + } + } + }, + "masterPasswordPolicyRequirementsNotMet": { + "message": "Your new master password does not meet the policy requirements." + }, + "acceptPolicies": { + "message": "By checking this box you agree to the following:" + }, + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." + }, + "termsOfService": { + "message": "Terms of Service" + }, + "privacyPolicy": { + "message": "Privacy Policy" + }, + "hintEqualsPassword": { + "message": "Your password hint cannot be the same as your password." + }, + "ok": { + "message": "Ok" + }, + "desktopSyncVerificationTitle": { + "message": "Desktop sync verification" + }, + "desktopIntegrationVerificationText": { + "message": "Please verify that the desktop application shows this fingerprint: " + }, + "desktopIntegrationDisabledTitle": { + "message": "Browser integration is not set up" + }, + "desktopIntegrationDisabledDesc": { + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + }, + "startDesktopTitle": { + "message": "Start the Bitwarden desktop application" + }, + "startDesktopDesc": { + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + }, + "errorEnableBiometricTitle": { + "message": "Unable to set up biometrics" + }, + "errorEnableBiometricDesc": { + "message": "Action was canceled by the desktop application" + }, + "nativeMessagingInvalidEncryptionDesc": { + "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + }, + "nativeMessagingInvalidEncryptionTitle": { + "message": "Desktop communication interrupted" + }, + "nativeMessagingWrongUserDesc": { + "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + }, + "nativeMessagingWrongUserTitle": { + "message": "Account missmatch" + }, + "biometricsNotEnabledTitle": { + "message": "Biometrics not set up" + }, + "biometricsNotEnabledDesc": { + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + }, + "biometricsNotSupportedTitle": { + "message": "Biometrics not supported" + }, + "biometricsNotSupportedDesc": { + "message": "Browser biometrics is not supported on this device." + }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, + "nativeMessaginPermissionErrorTitle": { + "message": "Permission not provided" + }, + "nativeMessaginPermissionErrorDesc": { + "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + }, + "nativeMessaginPermissionSidebarTitle": { + "message": "Permission request error" + }, + "nativeMessaginPermissionSidebarDesc": { + "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + }, + "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." + }, + "personalOwnershipPolicyInEffect": { + "message": "An organization policy is affecting your ownership options." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "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." + }, + "excludedDomainsInvalidDomain": { + "message": "$DOMAIN$ is not a valid domain", + "placeholders": { + "domain": { + "content": "$1", + "example": "googlecom" + } + } + }, + "send": { + "message": "Send", + "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." + }, + "addSend": { + "message": "Add Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeText": { + "message": "Text" + }, + "sendTypeFile": { + "message": "File" + }, + "allSends": { + "message": "All Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "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" + }, + "pendingDeletion": { + "message": "Pending deletion" + }, + "passwordProtected": { + "message": "Password protected" + }, + "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" + }, + "delete": { + "message": "Delete" + }, + "removedPassword": { + "message": "Password removed" + }, + "deletedSend": { + "message": "Send deleted", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLink": { + "message": "Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "disabled": { + "message": "Disabled" + }, + "removePasswordConfirmation": { + "message": "Are you sure you want to remove the password?" + }, + "deleteSend": { + "message": "Delete Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendConfirmation": { + "message": "Are you sure you want to delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editSend": { + "message": "Edit 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?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNameDesc": { + "message": "A friendly name to describe this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFileDesc": { + "message": "The file you want to send." + }, + "deletionDate": { + "message": "Deletion date" + }, + "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." + }, + "expirationDate": { + "message": "Expiration date" + }, + "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" + }, + "days": { + "message": "$DAYS$ days", + "placeholders": { + "days": { + "content": "$1", + "example": "2" + } + } + }, + "custom": { + "message": "Custom" + }, + "maximumAccessCount": { + "message": "Maximum Access Count" + }, + "maximumAccessCountDesc": { + "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDesc": { + "message": "Optionally require a password for users to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNotesDesc": { + "message": "Private notes about this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisableDesc": { + "message": "Deactivate this Send so that no one can access it.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendShareDesc": { + "message": "Copy this Send's link to clipboard upon save.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTextDesc": { + "message": "The text you want to send." + }, + "sendHideText": { + "message": "Hide this Send's text by default.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "currentAccessCount": { + "message": "Current access count" + }, + "createSend": { + "message": "New Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "newPassword": { + "message": "New password" + }, + "sendDisabled": { + "message": "Send removed", + "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.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSend": { + "message": "Send created", + "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." + }, + "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." + }, + "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." + }, + "sendSafariFileWarning": { + "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + }, + "sendFileCalloutHeader": { + "message": "Before you start" + }, + "sendFirefoxCustomDatePopoutMessage1": { + "message": "To use a calendar style date picker", + "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", + "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.", + "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." + }, + "deletionDateIsInvalid": { + "message": "The deletion date provided is not valid." + }, + "expirationDateAndTimeRequired": { + "message": "An expiration date and time are required." + }, + "deletionDateAndTimeRequired": { + "message": "A deletion date and time are required." + }, + "dateParsingError": { + "message": "There was an error saving your deletion and expiration dates." + }, + "hideEmail": { + "message": "Hide my email address from recipients." + }, + "sendOptionsPolicyInEffect": { + "message": "One or more organization policies are affecting your Send options." + }, + "passwordPrompt": { + "message": "Master password re-prompt" + }, + "passwordConfirmation": { + "message": "Master password confirmation" + }, + "passwordConfirmationDesc": { + "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + }, + "emailVerificationRequired": { + "message": "Email verification required" + }, + "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" + }, + "updateMasterPassword": { + "message": "Update master password" + }, + "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." + }, + "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." + }, + "resetPasswordPolicyAutoEnroll": { + "message": "Automatic enrollment" + }, + "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." + }, + "selectFolder": { + "message": "Select folder..." + }, + "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" + }, + "hours": { + "message": "Hours" + }, + "minutes": { + "message": "Minutes" + }, + "vaultTimeoutPolicyInEffect": { + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." + }, + "vaultExportDisabled": { + "message": "Vault export unavailable" + }, + "personalVaultExportPolicyInEffect": { + "message": "One or more organization policies prevents you from exporting your individual vault." + }, + "copyCustomFieldNameInvalidElement": { + "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + }, + "copyCustomFieldNameNotUnique": { + "message": "No unique identifier found." + }, + "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.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Leave organization" + }, + "removeMasterPassword": { + "message": "Remove master password" + }, + "removedMasterPassword": { + "message": "Master password removed" + }, + "leaveOrganizationConfirmation": { + "message": "Are you sure you want to leave this organization?" + }, + "leftOrganization": { + "message": "You have left the organization." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "Your session has timed out. Please go back and try logging in again." + }, + "exportingPersonalVaultTitle": { + "message": "Exporting individual 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.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Error" + }, + "regenerateUsername": { + "message": "Regenerate username" + }, + "generateUsername": { + "message": "Generate username" + }, + "usernameType": { + "message": "Username type" + }, + "plusAddressedEmail": { + "message": "Plus addressed email", + "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." + }, + "catchallEmail": { + "message": "Catch-all email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Random" + }, + "randomWord": { + "message": "Random word" + }, + "websiteName": { + "message": "Website name" + }, + "whatWouldYouLikeToGenerate": { + "message": "What would you like to generate?" + }, + "passwordType": { + "message": "Password type" + }, + "service": { + "message": "Service" + }, + "forwardedEmail": { + "message": "Forwarded email alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "API Access Token" + }, + "apiKey": { + "message": "API Key" + }, + "ssoKeyConnectorError": { + "message": "Key connector error: make sure key connector is available and working correctly." + }, + "premiumSubcriptionRequired": { + "message": "Premium subscription required" + }, + "organizationIsDisabled": { + "message": "Organization suspended." + }, + "disabledOrganizationFilterError": { + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "loggingInTo": { + "message": "Logging in to $DOMAIN$", + "placeholders": { + "domain": { + "content": "$1", + "example": "example.com" + } + } + }, + "settingsEdited": { + "message": "Settings have been edited" + }, + "environmentEditedClick": { + "message": "Click here" + }, + "environmentEditedReset": { + "message": "to reset to pre-configured settings" + }, + "serverVersion": { + "message": "Server version" + }, + "selfHostedServer": { + "message": "self-hosted" + }, + "thirdParty": { + "message": "Third-party" + }, + "thirdPartyServerMessage": { + "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "placeholders": { + "servername": { + "content": "$1", + "example": "ThirdPartyServerName" + } + } + }, + "lastSeenOn": { + "message": "last seen on: $DATE$", + "placeholders": { + "date": { + "content": "$1", + "example": "Jun 15, 2015" + } + } + }, + "loginWithMasterPassword": { + "message": "Log in with master password" + }, + "loggingInAs": { + "message": "Logging in as" + }, + "notYou": { + "message": "Not you?" + }, + "newAroundHere": { + "message": "New around here?" + }, + "rememberEmail": { + "message": "Remember email" + }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, + "exposedMasterPassword": { + "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?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "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?" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "important": { + "message": "Important:" + }, + "masterPasswordHint": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" + } +} diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json new file mode 100644 index 000000000000..ab3933bf5b77 --- /dev/null +++ b/apps/browser/src/_locales/my/messages.json @@ -0,0 +1,2821 @@ +{ + "appName": { + "message": "Bitwarden" + }, + "extName": { + "message": "Bitwarden - Free 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" + }, + "loginOrCreateNewAccount": { + "message": "Log in or create a new account to access your secure vault." + }, + "createAccount": { + "message": "Create account" + }, + "login": { + "message": "Log in" + }, + "enterpriseSingleSignOn": { + "message": "Enterprise single sign-on" + }, + "cancel": { + "message": "Cancel" + }, + "close": { + "message": "Close" + }, + "submit": { + "message": "Submit" + }, + "emailAddress": { + "message": "Email address" + }, + "masterPass": { + "message": "Master password" + }, + "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." + }, + "masterPassHintDesc": { + "message": "A master password hint can help you remember your password if you forget it." + }, + "reTypeMasterPass": { + "message": "Re-type master password" + }, + "masterPassHint": { + "message": "Master password hint (optional)" + }, + "tab": { + "message": "Tab" + }, + "vault": { + "message": "Vault" + }, + "myVault": { + "message": "My vault" + }, + "allVaults": { + "message": "All vaults" + }, + "tools": { + "message": "Tools" + }, + "settings": { + "message": "Settings" + }, + "currentTab": { + "message": "Current tab" + }, + "copyPassword": { + "message": "Copy password" + }, + "copyNote": { + "message": "Copy note" + }, + "copyUri": { + "message": "Copy URI" + }, + "copyUsername": { + "message": "Copy username" + }, + "copyNumber": { + "message": "Copy number" + }, + "copySecurityCode": { + "message": "Copy security code" + }, + "autoFill": { + "message": "Auto-fill" + }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, + "generatePasswordCopied": { + "message": "Generate password (copied)" + }, + "copyElementIdentifier": { + "message": "Copy custom field name" + }, + "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" + }, + "loginToVaultMenu": { + "message": "Log in to your vault" + }, + "autoFillInfo": { + "message": "There are no logins available to auto-fill for the current browser tab." + }, + "addLogin": { + "message": "Add a login" + }, + "addItem": { + "message": "Add item" + }, + "passwordHint": { + "message": "Password hint" + }, + "enterEmailToGetHint": { + "message": "Enter your account email address to receive your master password hint." + }, + "getMasterPasswordHint": { + "message": "Get master password hint" + }, + "continue": { + "message": "Continue" + }, + "sendVerificationCode": { + "message": "Send a verification code to your email" + }, + "sendCode": { + "message": "Send code" + }, + "codeSent": { + "message": "Code sent" + }, + "verificationCode": { + "message": "Verification code" + }, + "confirmIdentity": { + "message": "Confirm your identity to continue." + }, + "account": { + "message": "Account" + }, + "changeMasterPassword": { + "message": "Change master password" + }, + "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." + }, + "yourAccountsFingerprint": { + "message": "Your account's 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." + }, + "twoStepLogin": { + "message": "Two-step login" + }, + "logOut": { + "message": "Log out" + }, + "about": { + "message": "About" + }, + "version": { + "message": "Version" + }, + "save": { + "message": "Save" + }, + "move": { + "message": "Move" + }, + "addFolder": { + "message": "Add folder" + }, + "name": { + "message": "Name" + }, + "editFolder": { + "message": "Edit folder" + }, + "deleteFolder": { + "message": "Delete folder" + }, + "folders": { + "message": "Folders" + }, + "noFolders": { + "message": "There are no folders to list." + }, + "helpFeedback": { + "message": "Help & feedback" + }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, + "sync": { + "message": "Sync" + }, + "syncVaultNow": { + "message": "Sync vault now" + }, + "lastSync": { + "message": "Last sync:" + }, + "passGen": { + "message": "Password generator" + }, + "generator": { + "message": "Generator", + "description": "Short for 'Password Generator'." + }, + "passGenInfo": { + "message": "Automatically generate strong, unique passwords for your logins." + }, + "bitWebVault": { + "message": "Bitwarden web vault" + }, + "importItems": { + "message": "Import items" + }, + "select": { + "message": "Select" + }, + "generatePassword": { + "message": "Generate password" + }, + "regeneratePassword": { + "message": "Regenerate password" + }, + "options": { + "message": "Options" + }, + "length": { + "message": "Length" + }, + "uppercase": { + "message": "Uppercase (A-Z)" + }, + "lowercase": { + "message": "Lowercase (a-z)" + }, + "numbers": { + "message": "Numbers (0-9)" + }, + "specialCharacters": { + "message": "Special characters (!@#$%^&*)" + }, + "numWords": { + "message": "Number of words" + }, + "wordSeparator": { + "message": "Word separator" + }, + "capitalize": { + "message": "Capitalize", + "description": "Make the first letter of a work uppercase." + }, + "includeNumber": { + "message": "Include number" + }, + "minNumbers": { + "message": "Minimum numbers" + }, + "minSpecial": { + "message": "Minimum special" + }, + "avoidAmbChar": { + "message": "Avoid ambiguous characters" + }, + "searchVault": { + "message": "Search vault" + }, + "edit": { + "message": "Edit" + }, + "view": { + "message": "View" + }, + "noItemsInList": { + "message": "There are no items to list." + }, + "itemInformation": { + "message": "Item information" + }, + "username": { + "message": "Username" + }, + "password": { + "message": "Password" + }, + "passphrase": { + "message": "Passphrase" + }, + "favorite": { + "message": "Favorite" + }, + "notes": { + "message": "Notes" + }, + "note": { + "message": "Note" + }, + "editItem": { + "message": "Edit item" + }, + "folder": { + "message": "Folder" + }, + "deleteItem": { + "message": "Delete item" + }, + "viewItem": { + "message": "View item" + }, + "launch": { + "message": "Launch" + }, + "website": { + "message": "Website" + }, + "toggleVisibility": { + "message": "Toggle visibility" + }, + "manage": { + "message": "Manage" + }, + "other": { + "message": "Other" + }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "rateExtension": { + "message": "Rate the extension" + }, + "rateExtensionDesc": { + "message": "Please consider helping us out with a good review!" + }, + "browserNotSupportClipboard": { + "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + }, + "verifyIdentity": { + "message": "Verify identity" + }, + "yourVaultIsLocked": { + "message": "Your vault is locked. Verify your identity to continue." + }, + "unlock": { + "message": "Unlock" + }, + "loggedInAsOn": { + "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "hostname": { + "content": "$2", + "example": "bitwarden.com" + } + } + }, + "invalidMasterPassword": { + "message": "Invalid master password" + }, + "vaultTimeout": { + "message": "Vault timeout" + }, + "lockNow": { + "message": "Lock now" + }, + "lockAll": { + "message": "Lock all" + }, + "immediately": { + "message": "Immediately" + }, + "tenSeconds": { + "message": "10 seconds" + }, + "twentySeconds": { + "message": "20 seconds" + }, + "thirtySeconds": { + "message": "30 seconds" + }, + "oneMinute": { + "message": "1 minute" + }, + "twoMinutes": { + "message": "2 minutes" + }, + "fiveMinutes": { + "message": "5 minutes" + }, + "fifteenMinutes": { + "message": "15 minutes" + }, + "thirtyMinutes": { + "message": "30 minutes" + }, + "oneHour": { + "message": "1 hour" + }, + "fourHours": { + "message": "4 hours" + }, + "onLocked": { + "message": "On system lock" + }, + "onRestart": { + "message": "On browser restart" + }, + "never": { + "message": "Never" + }, + "security": { + "message": "Security" + }, + "errorOccurred": { + "message": "An error has occurred" + }, + "emailRequired": { + "message": "Email address is required." + }, + "invalidEmail": { + "message": "Invalid email address." + }, + "masterPasswordRequired": { + "message": "Master password is required." + }, + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } + }, + "masterPassDoesntMatch": { + "message": "Master password confirmation does not match." + }, + "newAccountCreated": { + "message": "Your new account has been created! You may now log in." + }, + "masterPassSent": { + "message": "We've sent you an email with your master password hint." + }, + "verificationCodeRequired": { + "message": "Verification code is required." + }, + "invalidVerificationCode": { + "message": "Invalid verification code" + }, + "valueCopied": { + "message": "$VALUE$ copied", + "description": "Value has been copied to the clipboard.", + "placeholders": { + "value": { + "content": "$1", + "example": "Password" + } + } + }, + "autofillError": { + "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + }, + "loggedOut": { + "message": "Logged out" + }, + "loginExpired": { + "message": "Your login session has expired." + }, + "logOutConfirmation": { + "message": "Are you sure you want to log out?" + }, + "yes": { + "message": "Yes" + }, + "no": { + "message": "No" + }, + "unexpectedError": { + "message": "An unexpected error has occurred." + }, + "nameRequired": { + "message": "Name is required." + }, + "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?" + }, + "editedFolder": { + "message": "Folder saved" + }, + "deleteFolderConfirmation": { + "message": "Are you sure you want to delete this folder?" + }, + "deletedFolder": { + "message": "Folder deleted" + }, + "gettingStartedTutorial": { + "message": "Getting started tutorial" + }, + "gettingStartedTutorialVideo": { + "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + }, + "syncingComplete": { + "message": "Syncing complete" + }, + "syncingFailed": { + "message": "Syncing failed" + }, + "passwordCopied": { + "message": "Password copied" + }, + "uri": { + "message": "URI" + }, + "uriPosition": { + "message": "URI $POSITION$", + "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.", + "placeholders": { + "position": { + "content": "$1", + "example": "2" + } + } + }, + "newUri": { + "message": "New URI" + }, + "addedItem": { + "message": "Item added" + }, + "editedItem": { + "message": "Item saved" + }, + "deleteItemConfirmation": { + "message": "Do you really want to send to the trash?" + }, + "deletedItem": { + "message": "Item sent to trash" + }, + "overwritePassword": { + "message": "Overwrite password" + }, + "overwritePasswordConfirmation": { + "message": "Are you sure you want to overwrite the current password?" + }, + "overwriteUsername": { + "message": "Overwrite username" + }, + "overwriteUsernameConfirmation": { + "message": "Are you sure you want to overwrite the current username?" + }, + "searchFolder": { + "message": "Search folder" + }, + "searchCollection": { + "message": "Search collection" + }, + "searchType": { + "message": "Search type" + }, + "noneFolder": { + "message": "No folder", + "description": "This is the folder for uncategorized items" + }, + "enableAddLoginNotification": { + "message": "Ask to add login" + }, + "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." + }, + "showCardsCurrentTab": { + "message": "Show cards on Tab page" + }, + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." + }, + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" + }, + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." + }, + "clearClipboard": { + "message": "Clear clipboard", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "clearClipboardDesc": { + "message": "Automatically clear copied values from your clipboard.", + "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?" + }, + "notificationAddSave": { + "message": "Save" + }, + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" + }, + "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" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, + "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." + }, + "defaultUriMatchDetectionDesc": { + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + }, + "theme": { + "message": "Theme" + }, + "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" + }, + "light": { + "message": "Light", + "description": "Light color" + }, + "solarizedDark": { + "message": "Solarized dark", + "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." + }, + "exportVault": { + "message": "Export vault" + }, + "fileFormat": { + "message": "File format" + }, + "warning": { + "message": "WARNING", + "description": "WARNING (should stay in capitalized letters if the language permits)" + }, + "confirmVaultExport": { + "message": "Confirm vault export" + }, + "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." + }, + "encExportKeyWarningDesc": { + "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + }, + "encExportAccountWarningDesc": { + "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + }, + "exportMasterPassword": { + "message": "Enter your master password to export your vault data." + }, + "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?" + }, + "moveToOrganization": { + "message": "Move to organization" + }, + "share": { + "message": "Share" + }, + "movedItemToOrg": { + "message": "$ITEMNAME$ moved to $ORGNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "orgname": { + "content": "$2", + "example": "Company Name" + } + } + }, + "moveToOrgDesc": { + "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + }, + "learnMore": { + "message": "Learn more" + }, + "authenticatorKeyTotp": { + "message": "Authenticator key (TOTP)" + }, + "verificationCodeTotp": { + "message": "Verification code (TOTP)" + }, + "copyVerificationCode": { + "message": "Copy verification code" + }, + "attachments": { + "message": "Attachments" + }, + "deleteAttachment": { + "message": "Delete attachment" + }, + "deleteAttachmentConfirmation": { + "message": "Are you sure you want to delete this attachment?" + }, + "deletedAttachment": { + "message": "Attachment deleted" + }, + "newAttachment": { + "message": "Add new attachment" + }, + "noAttachments": { + "message": "No attachments." + }, + "attachmentSaved": { + "message": "Attachment saved" + }, + "file": { + "message": "File" + }, + "selectFile": { + "message": "Select a file" + }, + "maxFileSize": { + "message": "Maximum file size is 500 MB." + }, + "featureUnavailable": { + "message": "Feature unavailable" + }, + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + }, + "premiumMembership": { + "message": "Premium membership" + }, + "premiumManage": { + "message": "Manage membership" + }, + "premiumManageAlert": { + "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumRefresh": { + "message": "Refresh membership" + }, + "premiumNotCurrentMember": { + "message": "You are not currently a Premium member." + }, + "premiumSignUpAndGet": { + "message": "Sign up for a Premium membership and get:" + }, + "ppremiumSignUpStorage": { + "message": "1 GB encrypted storage for file attachments." + }, + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." + }, + "ppremiumSignUpReports": { + "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + }, + "ppremiumSignUpTotp": { + "message": "TOTP verification code (2FA) generator for logins in your vault." + }, + "ppremiumSignUpSupport": { + "message": "Priority customer support." + }, + "ppremiumSignUpFuture": { + "message": "All future Premium features. More coming soon!" + }, + "premiumPurchase": { + "message": "Purchase Premium" + }, + "premiumPurchaseAlert": { + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumCurrentMember": { + "message": "You are a Premium member!" + }, + "premiumCurrentMemberThanks": { + "message": "Thank you for supporting Bitwarden." + }, + "premiumPrice": { + "message": "All for just $PRICE$ /year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "refreshComplete": { + "message": "Refresh complete" + }, + "enableAutoTotpCopy": { + "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." + }, + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" + }, + "premiumRequired": { + "message": "Premium required" + }, + "premiumRequiredDesc": { + "message": "A Premium membership is required to use this feature." + }, + "enterVerificationCodeApp": { + "message": "Enter the 6 digit verification code from your authenticator app." + }, + "enterVerificationCodeEmail": { + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "verificationCodeEmailSent": { + "message": "Verification email sent to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "rememberMe": { + "message": "Remember me" + }, + "sendVerificationCodeEmailAgain": { + "message": "Send verification code email again" + }, + "useAnotherTwoStepMethod": { + "message": "Use another two-step login method" + }, + "insertYubiKey": { + "message": "Insert your YubiKey into your computer's USB port, then touch its button." + }, + "insertU2f": { + "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + }, + "webAuthnNewTab": { + "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" + }, + "webAuthnAuthenticate": { + "message": "Authenticate WebAuthn" + }, + "loginUnavailable": { + "message": "Login unavailable" + }, + "noTwoStepProviders": { + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + }, + "noTwoStepProviders2": { + "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" + }, + "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" + }, + "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." + }, + "yubiKeyTitle": { + "message": "YubiKey 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.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "duoOrganizationDesc": { + "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "webAuthnTitle": { + "message": "FIDO2 WebAuthn" + }, + "webAuthnDesc": { + "message": "Use any WebAuthn compatible security key to access your account." + }, + "emailTitle": { + "message": "Email" + }, + "emailDesc": { + "message": "Verification codes will be emailed to you." + }, + "selfHostedEnvironment": { + "message": "Self-hosted environment" + }, + "selfHostedEnvironmentFooter": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + }, + "customEnvironment": { + "message": "Custom environment" + }, + "customEnvironmentFooter": { + "message": "For advanced users. You can specify the base URL of each service independently." + }, + "baseUrl": { + "message": "Server URL" + }, + "apiUrl": { + "message": "API server URL" + }, + "webVaultUrl": { + "message": "Web vault server URL" + }, + "identityUrl": { + "message": "Identity server URL" + }, + "notificationsUrl": { + "message": "Notifications server URL" + }, + "iconsUrl": { + "message": "Icons server URL" + }, + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, + "enableAutoFillOnPageLoad": { + "message": "Auto-fill on page load" + }, + "enableAutoFillOnPageLoadDesc": { + "message": "If a login form is detected, auto-fill when the web page loads." + }, + "experimentalFeature": { + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofill": { + "message": "Learn more about auto-fill" + }, + "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." + }, + "itemAutoFillOnPageLoad": { + "message": "Auto-fill on page load (if set up in Options)" + }, + "autoFillOnPageLoadUseDefault": { + "message": "Use default setting" + }, + "autoFillOnPageLoadYes": { + "message": "Auto-fill on page load" + }, + "autoFillOnPageLoadNo": { + "message": "Do not auto-fill on page load" + }, + "commandOpenPopup": { + "message": "Open vault popup" + }, + "commandOpenSidebar": { + "message": "Open vault in sidebar" + }, + "commandAutofillDesc": { + "message": "Auto-fill the last used login for the current website" + }, + "commandGeneratePasswordDesc": { + "message": "Generate and copy a new random password to the clipboard" + }, + "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" + }, + "value": { + "message": "Value" + }, + "newCustomField": { + "message": "New custom field" + }, + "dragToSort": { + "message": "Drag to sort" + }, + "cfTypeText": { + "message": "Text" + }, + "cfTypeHidden": { + "message": "Hidden" + }, + "cfTypeBoolean": { + "message": "Boolean" + }, + "cfTypeLinked": { + "message": "Linked", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Linked value", + "description": "This describes a value that is 'linked' (tied) to another value." + }, + "popup2faCloseMessage": { + "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + }, + "popupU2fCloseMessage": { + "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + }, + "enableFavicon": { + "message": "Show website icons" + }, + "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" + }, + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." + }, + "cardholderName": { + "message": "Cardholder name" + }, + "number": { + "message": "Number" + }, + "brand": { + "message": "Brand" + }, + "expirationMonth": { + "message": "Expiration month" + }, + "expirationYear": { + "message": "Expiration year" + }, + "expiration": { + "message": "Expiration" + }, + "january": { + "message": "January" + }, + "february": { + "message": "February" + }, + "march": { + "message": "March" + }, + "april": { + "message": "April" + }, + "may": { + "message": "May" + }, + "june": { + "message": "June" + }, + "july": { + "message": "July" + }, + "august": { + "message": "August" + }, + "september": { + "message": "September" + }, + "october": { + "message": "October" + }, + "november": { + "message": "November" + }, + "december": { + "message": "December" + }, + "securityCode": { + "message": "Security code" + }, + "ex": { + "message": "ex." + }, + "title": { + "message": "Title" + }, + "mr": { + "message": "Mr" + }, + "mrs": { + "message": "Mrs" + }, + "ms": { + "message": "Ms" + }, + "dr": { + "message": "Dr" + }, + "mx": { + "message": "Mx" + }, + "firstName": { + "message": "First name" + }, + "middleName": { + "message": "Middle name" + }, + "lastName": { + "message": "Last name" + }, + "fullName": { + "message": "Full name" + }, + "identityName": { + "message": "Identity name" + }, + "company": { + "message": "Company" + }, + "ssn": { + "message": "Social Security number" + }, + "passportNumber": { + "message": "Passport number" + }, + "licenseNumber": { + "message": "License number" + }, + "email": { + "message": "Email" + }, + "phone": { + "message": "Phone" + }, + "address": { + "message": "Address" + }, + "address1": { + "message": "Address 1" + }, + "address2": { + "message": "Address 2" + }, + "address3": { + "message": "Address 3" + }, + "cityTown": { + "message": "City / Town" + }, + "stateProvince": { + "message": "State / Province" + }, + "zipPostalCode": { + "message": "Zip / Postal code" + }, + "country": { + "message": "Country" + }, + "type": { + "message": "Type" + }, + "typeLogin": { + "message": "Login" + }, + "typeLogins": { + "message": "Logins" + }, + "typeSecureNote": { + "message": "Secure note" + }, + "typeCard": { + "message": "Card" + }, + "typeIdentity": { + "message": "Identity" + }, + "passwordHistory": { + "message": "Password history" + }, + "back": { + "message": "Back" + }, + "collections": { + "message": "Collections" + }, + "favorites": { + "message": "Favorites" + }, + "popOutNewWindow": { + "message": "Pop out to a new window" + }, + "refresh": { + "message": "Refresh" + }, + "cards": { + "message": "Cards" + }, + "identities": { + "message": "Identities" + }, + "logins": { + "message": "Logins" + }, + "secureNotes": { + "message": "Secure notes" + }, + "clear": { + "message": "Clear", + "description": "To clear something out. example: To clear browser history." + }, + "checkPassword": { + "message": "Check if password has been exposed." + }, + "passwordExposed": { + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "placeholders": { + "value": { + "content": "$1", + "example": "2" + } + } + }, + "passwordSafe": { + "message": "This password was not found in any known data breaches. It should be safe to use." + }, + "baseDomain": { + "message": "Base domain", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Domain name", + "description": "Domain name. Ex. website.com" + }, + "host": { + "message": "Host", + "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." + }, + "exact": { + "message": "Exact" + }, + "startsWith": { + "message": "Starts with" + }, + "regEx": { + "message": "Regular expression", + "description": "A programming term, also known as 'RegEx'." + }, + "matchDetection": { + "message": "Match detection", + "description": "URI match detection for auto-fill." + }, + "defaultMatchDetection": { + "message": "Default match detection", + "description": "Default URI match detection for auto-fill." + }, + "toggleOptions": { + "message": "Toggle options" + }, + "toggleCurrentUris": { + "message": "Toggle current URIs", + "description": "Toggle the display of the URIs of the currently open tabs in the browser." + }, + "currentUri": { + "message": "Current URI", + "description": "The URI of one of the current open tabs in the browser." + }, + "organization": { + "message": "Organization", + "description": "An entity of multiple related people (ex. a team or business organization)." + }, + "types": { + "message": "Types" + }, + "allItems": { + "message": "All items" + }, + "noPasswordsInList": { + "message": "There are no passwords to list." + }, + "remove": { + "message": "Remove" + }, + "default": { + "message": "Default" + }, + "dateUpdated": { + "message": "Updated", + "description": "ex. Date this item was updated" + }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, + "datePasswordUpdated": { + "message": "Password updated", + "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." + }, + "noOrganizationsList": { + "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + }, + "noCollectionsInList": { + "message": "There are no collections to list." + }, + "ownership": { + "message": "Ownership" + }, + "whoOwnsThisItem": { + "message": "Who owns this item?" + }, + "strong": { + "message": "Strong", + "description": "ex. A strong password. Scale: Weak -> Good -> Strong" + }, + "good": { + "message": "Good", + "description": "ex. A good password. Scale: Weak -> Good -> Strong" + }, + "weak": { + "message": "Weak", + "description": "ex. A weak password. Scale: Weak -> Good -> Strong" + }, + "weakMasterPassword": { + "message": "Weak master password" + }, + "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?" + }, + "pin": { + "message": "PIN", + "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." + }, + "unlockWithPin": { + "message": "Unlock with 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." + }, + "pinRequired": { + "message": "PIN code is required." + }, + "invalidPin": { + "message": "Invalid PIN code." + }, + "unlockWithBiometrics": { + "message": "Unlock with biometrics" + }, + "awaitDesktop": { + "message": "Awaiting confirmation from desktop" + }, + "awaitDesktopDesc": { + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + }, + "lockWithMasterPassOnRestart": { + "message": "Lock with master password on browser restart" + }, + "selectOneCollection": { + "message": "You must select at least one collection." + }, + "cloneItem": { + "message": "Clone item" + }, + "clone": { + "message": "Clone" + }, + "passwordGeneratorPolicyInEffect": { + "message": "One or more organization policies are affecting your generator settings." + }, + "vaultTimeoutAction": { + "message": "Vault timeout action" + }, + "lock": { + "message": "Lock", + "description": "Verb form: to make secure or inaccesible by" + }, + "trash": { + "message": "Trash", + "description": "Noun: a special folder to hold deleted items" + }, + "searchTrash": { + "message": "Search trash" + }, + "permanentlyDeleteItem": { + "message": "Permanently delete item" + }, + "permanentlyDeleteItemConfirmation": { + "message": "Are you sure you want to permanently delete this item?" + }, + "permanentlyDeletedItem": { + "message": "Item permanently deleted" + }, + "restoreItem": { + "message": "Restore item" + }, + "restoredItem": { + "message": "Item restored" + }, + "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?" + }, + "vaultTimeoutLogOutConfirmationTitle": { + "message": "Timeout action confirmation" + }, + "autoFillAndSave": { + "message": "Auto-fill and save" + }, + "autoFillSuccessAndSavedUri": { + "message": "Item auto-filled and URI saved" + }, + "autoFillSuccess": { + "message": "Item auto-filled " + }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "setMasterPassword": { + "message": "Set master password" + }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, + "masterPasswordPolicyInEffect": { + "message": "One or more organization policies require your master password to meet the following requirements:" + }, + "policyInEffectMinComplexity": { + "message": "Minimum complexity score of $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, + "policyInEffectMinLength": { + "message": "Minimum length of $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "policyInEffectUppercase": { + "message": "Contain one or more uppercase characters" + }, + "policyInEffectLowercase": { + "message": "Contain one or more lowercase characters" + }, + "policyInEffectNumbers": { + "message": "Contain one or more numbers" + }, + "policyInEffectSpecial": { + "message": "Contain one or more of the following special characters $CHARS$", + "placeholders": { + "chars": { + "content": "$1", + "example": "!@#$%^&*" + } + } + }, + "masterPasswordPolicyRequirementsNotMet": { + "message": "Your new master password does not meet the policy requirements." + }, + "acceptPolicies": { + "message": "By checking this box you agree to the following:" + }, + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." + }, + "termsOfService": { + "message": "Terms of Service" + }, + "privacyPolicy": { + "message": "Privacy Policy" + }, + "hintEqualsPassword": { + "message": "Your password hint cannot be the same as your password." + }, + "ok": { + "message": "Ok" + }, + "desktopSyncVerificationTitle": { + "message": "Desktop sync verification" + }, + "desktopIntegrationVerificationText": { + "message": "Please verify that the desktop application shows this fingerprint: " + }, + "desktopIntegrationDisabledTitle": { + "message": "Browser integration is not set up" + }, + "desktopIntegrationDisabledDesc": { + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + }, + "startDesktopTitle": { + "message": "Start the Bitwarden desktop application" + }, + "startDesktopDesc": { + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + }, + "errorEnableBiometricTitle": { + "message": "Unable to set up biometrics" + }, + "errorEnableBiometricDesc": { + "message": "Action was canceled by the desktop application" + }, + "nativeMessagingInvalidEncryptionDesc": { + "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + }, + "nativeMessagingInvalidEncryptionTitle": { + "message": "Desktop communication interrupted" + }, + "nativeMessagingWrongUserDesc": { + "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + }, + "nativeMessagingWrongUserTitle": { + "message": "Account missmatch" + }, + "biometricsNotEnabledTitle": { + "message": "Biometrics not set up" + }, + "biometricsNotEnabledDesc": { + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + }, + "biometricsNotSupportedTitle": { + "message": "Biometrics not supported" + }, + "biometricsNotSupportedDesc": { + "message": "Browser biometrics is not supported on this device." + }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, + "nativeMessaginPermissionErrorTitle": { + "message": "Permission not provided" + }, + "nativeMessaginPermissionErrorDesc": { + "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + }, + "nativeMessaginPermissionSidebarTitle": { + "message": "Permission request error" + }, + "nativeMessaginPermissionSidebarDesc": { + "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + }, + "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." + }, + "personalOwnershipPolicyInEffect": { + "message": "An organization policy is affecting your ownership options." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "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." + }, + "excludedDomainsInvalidDomain": { + "message": "$DOMAIN$ is not a valid domain", + "placeholders": { + "domain": { + "content": "$1", + "example": "googlecom" + } + } + }, + "send": { + "message": "Send", + "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." + }, + "addSend": { + "message": "Add Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeText": { + "message": "Text" + }, + "sendTypeFile": { + "message": "File" + }, + "allSends": { + "message": "All Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "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" + }, + "pendingDeletion": { + "message": "Pending deletion" + }, + "passwordProtected": { + "message": "Password protected" + }, + "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" + }, + "delete": { + "message": "Delete" + }, + "removedPassword": { + "message": "Password removed" + }, + "deletedSend": { + "message": "Send deleted", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLink": { + "message": "Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "disabled": { + "message": "Disabled" + }, + "removePasswordConfirmation": { + "message": "Are you sure you want to remove the password?" + }, + "deleteSend": { + "message": "Delete Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendConfirmation": { + "message": "Are you sure you want to delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editSend": { + "message": "Edit 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?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNameDesc": { + "message": "A friendly name to describe this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFileDesc": { + "message": "The file you want to send." + }, + "deletionDate": { + "message": "Deletion date" + }, + "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." + }, + "expirationDate": { + "message": "Expiration date" + }, + "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" + }, + "days": { + "message": "$DAYS$ days", + "placeholders": { + "days": { + "content": "$1", + "example": "2" + } + } + }, + "custom": { + "message": "Custom" + }, + "maximumAccessCount": { + "message": "Maximum Access Count" + }, + "maximumAccessCountDesc": { + "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDesc": { + "message": "Optionally require a password for users to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNotesDesc": { + "message": "Private notes about this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisableDesc": { + "message": "Deactivate this Send so that no one can access it.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendShareDesc": { + "message": "Copy this Send's link to clipboard upon save.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTextDesc": { + "message": "The text you want to send." + }, + "sendHideText": { + "message": "Hide this Send's text by default.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "currentAccessCount": { + "message": "Current access count" + }, + "createSend": { + "message": "New Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "newPassword": { + "message": "New password" + }, + "sendDisabled": { + "message": "Send removed", + "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.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSend": { + "message": "Send created", + "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." + }, + "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." + }, + "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." + }, + "sendSafariFileWarning": { + "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + }, + "sendFileCalloutHeader": { + "message": "Before you start" + }, + "sendFirefoxCustomDatePopoutMessage1": { + "message": "To use a calendar style date picker", + "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", + "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.", + "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." + }, + "deletionDateIsInvalid": { + "message": "The deletion date provided is not valid." + }, + "expirationDateAndTimeRequired": { + "message": "An expiration date and time are required." + }, + "deletionDateAndTimeRequired": { + "message": "A deletion date and time are required." + }, + "dateParsingError": { + "message": "There was an error saving your deletion and expiration dates." + }, + "hideEmail": { + "message": "Hide my email address from recipients." + }, + "sendOptionsPolicyInEffect": { + "message": "One or more organization policies are affecting your Send options." + }, + "passwordPrompt": { + "message": "Master password re-prompt" + }, + "passwordConfirmation": { + "message": "Master password confirmation" + }, + "passwordConfirmationDesc": { + "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + }, + "emailVerificationRequired": { + "message": "Email verification required" + }, + "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" + }, + "updateMasterPassword": { + "message": "Update master password" + }, + "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." + }, + "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." + }, + "resetPasswordPolicyAutoEnroll": { + "message": "Automatic enrollment" + }, + "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." + }, + "selectFolder": { + "message": "Select folder..." + }, + "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" + }, + "hours": { + "message": "Hours" + }, + "minutes": { + "message": "Minutes" + }, + "vaultTimeoutPolicyInEffect": { + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." + }, + "vaultExportDisabled": { + "message": "Vault export unavailable" + }, + "personalVaultExportPolicyInEffect": { + "message": "One or more organization policies prevents you from exporting your individual vault." + }, + "copyCustomFieldNameInvalidElement": { + "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + }, + "copyCustomFieldNameNotUnique": { + "message": "No unique identifier found." + }, + "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.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Leave organization" + }, + "removeMasterPassword": { + "message": "Remove master password" + }, + "removedMasterPassword": { + "message": "Master password removed" + }, + "leaveOrganizationConfirmation": { + "message": "Are you sure you want to leave this organization?" + }, + "leftOrganization": { + "message": "You have left the organization." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "Your session has timed out. Please go back and try logging in again." + }, + "exportingPersonalVaultTitle": { + "message": "Exporting individual 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.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Error" + }, + "regenerateUsername": { + "message": "Regenerate username" + }, + "generateUsername": { + "message": "Generate username" + }, + "usernameType": { + "message": "Username type" + }, + "plusAddressedEmail": { + "message": "Plus addressed email", + "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." + }, + "catchallEmail": { + "message": "Catch-all email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Random" + }, + "randomWord": { + "message": "Random word" + }, + "websiteName": { + "message": "Website name" + }, + "whatWouldYouLikeToGenerate": { + "message": "What would you like to generate?" + }, + "passwordType": { + "message": "Password type" + }, + "service": { + "message": "Service" + }, + "forwardedEmail": { + "message": "Forwarded email alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "API Access Token" + }, + "apiKey": { + "message": "API Key" + }, + "ssoKeyConnectorError": { + "message": "Key connector error: make sure key connector is available and working correctly." + }, + "premiumSubcriptionRequired": { + "message": "Premium subscription required" + }, + "organizationIsDisabled": { + "message": "Organization suspended." + }, + "disabledOrganizationFilterError": { + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "loggingInTo": { + "message": "Logging in to $DOMAIN$", + "placeholders": { + "domain": { + "content": "$1", + "example": "example.com" + } + } + }, + "settingsEdited": { + "message": "Settings have been edited" + }, + "environmentEditedClick": { + "message": "Click here" + }, + "environmentEditedReset": { + "message": "to reset to pre-configured settings" + }, + "serverVersion": { + "message": "Server version" + }, + "selfHostedServer": { + "message": "self-hosted" + }, + "thirdParty": { + "message": "Third-party" + }, + "thirdPartyServerMessage": { + "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "placeholders": { + "servername": { + "content": "$1", + "example": "ThirdPartyServerName" + } + } + }, + "lastSeenOn": { + "message": "last seen on: $DATE$", + "placeholders": { + "date": { + "content": "$1", + "example": "Jun 15, 2015" + } + } + }, + "loginWithMasterPassword": { + "message": "Log in with master password" + }, + "loggingInAs": { + "message": "Logging in as" + }, + "notYou": { + "message": "Not you?" + }, + "newAroundHere": { + "message": "New around here?" + }, + "rememberEmail": { + "message": "Remember email" + }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, + "exposedMasterPassword": { + "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?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "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?" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "important": { + "message": "Important:" + }, + "masterPasswordHint": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" + } +} diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index c4e01809b5ce..5bccc8e6fd39 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Auto-utfylling" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generer et passord (kopiert)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Ingen samsvarende innlogginger." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Lås opp hvelvet ditt" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Hjelp og tilbakemelding" }, + "helpCenter": { + "message": "Bitwarden hjelpesenter" + }, + "communityForums": { + "message": "Utforsk Bitwardens community forum" + }, + "contactSupport": { + "message": "Kontakt Bitwarden brukerstøtte" + }, "sync": { "message": "Synkroniser" }, @@ -329,6 +362,12 @@ "other": { "message": "Annet" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Gi denne utvidelsen en vurdering" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lås nå" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Umiddelbart" }, @@ -430,7 +472,14 @@ "message": "Skriv inn hovedpassordet på nytt." }, "masterPasswordMinlength": { - "message": "Hovedpassordet må være minst åtte tegn." + "message": "Hovedpassordet må være minst $VALUE$ tegn.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Superpassord-bekreftelsen er ikke samsvarende." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Vis kort på fanesiden" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Ja, oppdater nå" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Vis alternativer for kontekstmeny" }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Egenskapen er utilgjengelig" }, - "updateKey": { - "message": "Du kan ikke bruke denne funksjonen før du oppdaterer krypteringsnøkkelen din." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium-medlemskap" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB med kryptert fillagring for filvedlegg." }, - "ppremiumSignUpTwoStep": { - "message": "Ytterligere 2-trinnsinnloggingsmuligheter, slik som YubiKey, FIDO U2F, og Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Passordhygiene, kontohelse, og databruddsrapporter som holder hvelvet ditt trygt." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Miljø-nettadressene har blitt lagret." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Aktiver auto-utfylling ved sideinnlastning" }, @@ -960,10 +1058,10 @@ "message": "Dersom et innloggingskjema blir oppdaget, utfør automatisk en auto-utfylling når nettstedet lastes inn." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromitterte eller upålitelige nettsider kan utnytte auto-utfylling når du laster inn siden." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Lær mer om auto-utfylling" }, "defaultAutoFillOnPageLoad": { "message": "Standard autofyll innstilling for innloggingselementer" @@ -1045,6 +1143,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" }, @@ -1127,7 +1228,7 @@ "message": "Dr." }, "mx": { - "message": "Mx" + "message": "Nøytral" }, "firstName": { "message": "Fornavn" @@ -1396,7 +1497,7 @@ "message": "Klon" }, "passwordGeneratorPolicyInEffect": { - "message": "En eller flere av organisasjonens vilkår påvirker generatorinnstillingene dine." + "message": "En eller flere av virksomhetens regler påvirker generatorinnstillingene dine." }, "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Gjenopprett objekt" }, - "restoreItemConfirmation": { - "message": "Er du sikker på at du vil gjenopprette dette elementet?" - }, "restoredItem": { "message": "Gjenopprettet objekt" }, @@ -1445,11 +1543,38 @@ "autoFillSuccess": { "message": "Autoutfylt element" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Angi hovedpassord" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { - "message": "Ett eller flere av organisasjonens vilkår krever at hovedpassordet oppfyller følgende krav:" + "message": "En eller flere av virksomhetens regler krever at hovedpassordet oppfyller følgende krav:" }, "policyInEffectMinComplexity": { "message": "Minimumspoengsum for kompleksistet er $SCORE$", @@ -1488,7 +1613,7 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "Det nye hovedpassordet ditt oppfyller ikke vilkårene." + "message": "Det nye hovedpassordet ditt oppfyller ikke vilkår i virksomhetsreglene." }, "acceptPolicies": { "message": "Ved å merke av denne boksen sier du deg enig i følgende:" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometri i nettleseren støttes ikke på denne enheten." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Tillatelse er ikke gitt" }, @@ -1569,10 +1700,13 @@ "message": "Denne handlingen kan ikke gjøres i sidestolpen, prøv på nytt i sprettoppvinduet eller popvindu." }, "personalOwnershipSubmitError": { - "message": "På grunn av bedrifsretningslinjer er du begrenset fra å lagre objekter til ditt personlige hvelv. Endre alternativ for eierskap til en organisasjon og velg blant tilgjengelige samlinger." + "message": "På grunn av en virksomhetsregel er du begrenset fra å lagre objekter til ditt personlige hvelv. Endre alternativ for eierskap til en organisasjon og velg blant tilgjengelige samlinger." }, "personalOwnershipPolicyInEffect": { - "message": "En bedriftsretningslinje påvirker dine eierskapsinnstillinger." + "message": "En virksomhetsregel påvirker dine eierskapsinnstillinger." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." }, "excludedDomains": { "message": "Ekskluderte domener" @@ -1580,6 +1714,9 @@ "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ er ikke et gyldig domene", "placeholders": { @@ -1802,7 +1939,7 @@ "message": "Skjul min e-postadresse fra mottakere." }, "sendOptionsPolicyInEffect": { - "message": "En eller flere av organisasjons retningslinjer påvirker generatorinnstillingene dine." + "message": "En eller flere av virksomhetens regler påvirker generatorinnstillingene dine." }, "passwordPrompt": { "message": "Forespørsel om hovedpassord på nytt" @@ -1828,17 +1965,25 @@ "updateMasterPasswordWarning": { "message": "Hovedpassordet ditt ble nylig endret av en administrator i organisasjonen din. For å få tilgang til hvelvet, må du oppdatere det nå. Hvis du fortsetter, logges du ut av den nåværende økten, og du må logge på igjen. Aktive økter på andre enheter kan fortsette å være aktive i opptil én time." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatisk registrering" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Denne organisasjonen har en bedriftsoppsettsregel som automatisk innrullerer deg i tilbakestilling av passord. Registrering vil tillate organisasjonsadministratorer å endre hovedpassordet ditt." + "message": "Denne organisasjonen har en virksomhetsregel som automatisk innrullerer deg i tilbakestilling av passord. Registrering vil tillate organisasjonsadministratorer å endre hovedpassordet ditt." }, "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." + "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" }, "hours": { "message": "Åpningstider" @@ -1847,7 +1992,7 @@ "message": "Minutter" }, "vaultTimeoutPolicyInEffect": { - "message": "Organisasjonens retningslinjer påvirker tidsavbruddet for hvelvet ditt. Maksimalt tillatt tidsavbrudd for hvelv er $HOURS$ time(r) og $MINUTES$ minutt(er)", + "message": "Din virksomhets regler påvirker tidsavbruddet for hvelvet ditt. Maksimalt tillatt tidsavbrudd for hvelv er $HOURS$ time(r) og $MINUTES$ minutt(er)", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Tidsavbrudd i hvelvet ditt overskrider restriksjoner fastsatt av din organisasjon." }, @@ -1866,7 +2037,7 @@ "message": "Hvelveksportering er skrudd av" }, "personalVaultExportPolicyInEffect": { - "message": "En eller flere regler i organisasjonsoppsettet forhindrer deg i å eksportere ditt personlige hvelv." + "message": "En eller flere virksomhetsregler forhindrer deg i å eksportere ditt personlige hvelv." }, "copyCustomFieldNameInvalidElement": { "message": "Klarte ikke å identifisere et gyldig skjemaelement. Prøv å inspisere HTML-en i stedet." @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Eksporterer personlig hvelv" }, - "exportingPersonalVaultDescription": { - "message": "Bare de personlige hvelv-elementene som er knyttet til $EMAIL$ vil bli eksportert. Organisasjonshvelvets elementer vil ikke bli inkludert.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Elementer i deaktiverte organisasjoner kan ikke aksesseres. Kontakt organisasjonseier for hjelp." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logger inn på $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server Versjon" }, - "selfHosted": { - "message": "Selvbetjent" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Tredjepart" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Husk e-post" }, + "loginWithDevice": { + "message": "Logg inn med enhet" + }, + "loginWithDeviceEnabledInfo": { + "message": "Logg på med enhet må settes opp i Bitwarden-innstillingene. Trenger du et annet alternativ?" + }, + "fingerprintPhraseHeader": { + "message": "Fingeravtrykksfrase" + }, + "fingerprintMatchInfo": { + "message": "Kontroller at hvelvet ditt er låst opp, og at fingeravtrykksfrasen er lik på den andre enheten." + }, + "resendNotification": { + "message": "Send varslingen på nytt" + }, + "viewAllLoginOptions": { + "message": "Vis alle innloggingsalternativer" + }, + "notificationSentDevice": { + "message": "Et varsel er sendt til enheten din." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Virksomhetsreglene dine har slått på automatisk utfylling av sidene." + }, + "howToAutofill": { + "message": "Hvordan bruke auto-utfylling" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Skjønner" + }, + "autofillSettings": { + "message": "Innstillinger for auto-utfylling" + }, + "autofillShortcut": { + "message": "Auto-utfyll tastatursnarvei" + }, + "autofillShortcutNotSet": { + "message": "Snarveien for automatisk utfylling er ikke angitt. Endre dette i nettleserens innstillinger." + }, + "autofillShortcutText": { + "message": "Snarveien for automatisk utfylling er: $COMMAND$. Endre dette i nettleserens innstillinger.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standard auto-utfyllingssnarvei: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index ddda55bfd0ac..ab3933bf5b77 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index a2b549e48abd..696b808ec866 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & reacties" }, + "helpCenter": { + "message": "Bitwarden Hulpcentrum" + }, + "communityForums": { + "message": "Ontdek Bitwarden community-forums" + }, + "contactSupport": { + "message": "Contacteer Bitwarden support" + }, "sync": { "message": "Synchroniseren" }, @@ -329,6 +362,12 @@ "other": { "message": "Overig" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Stel een ontgrendelingsmethode in om je kluis time-out actie te wijzigen." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Deze extensie beoordelen" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Nu vergrendelen" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Onmiddellijk" }, @@ -430,7 +472,14 @@ "message": "Type je hoofdwachtwoord opnieuw in." }, "masterPasswordMinlength": { - "message": "Het hoofdwachtwoord moet minimaal 8 tekens lang zijn." + "message": "Hoofdwachtwoord moet minstens $VALUE$ tekens lang zijn.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "De hoofdwachtwoorden komen niet overeen." @@ -576,6 +625,9 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Kaarten weergeven op tabpagina" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Vraag om bijwerken van het wachtwoord van een login zodra een wijziging op een website is gedetecteerd." }, + "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": "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?" }, "notificationChangeSave": { "message": "Ja, nu bijwerken" }, + "notificationUnlockDesc": { + "message": "Ontgrendel je Bitwarden-kluis om het auto-invulverzoek te voltooien." + }, + "notificationUnlock": { + "message": "Ontgrendelen" + }, "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": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Standaard URI-overeenkomstdetectie", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Het kleurenthema van de toepassing wijzigen." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Donker", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Functionaliteit niet beschikbaar" }, - "updateKey": { - "message": "Je kunt deze functie pas gebruiken als je je encryptiesleutel bijwerkt." + "encryptionKeyMigrationRequired": { + "message": "Migratie van de encryptiesleutel vereist. Login via de website om je sleutel te bij te werken." }, "premiumMembership": { "message": "Premium-abonnement" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB versleutelde opslag voor bijlagen." }, - "ppremiumSignUpTwoStep": { - "message": "Extra opties voor tweestapsaanmelding zoals YubiKey, FIDO U2F en Duo." + "premiumSignUpTwoStepOptions": { + "message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo." }, "ppremiumSignUpReports": { "message": "Wachtwoordhygiëne, gezondheid van je account en datalekken om je kluis veilig te houden." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in 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" + }, "enableAutoFillOnPageLoad": { "message": "Automatisch invullen bij laden van pagina" }, @@ -960,7 +1058,7 @@ "message": "Als een inlogformulier wordt gedetecteerd, dan worden de inloggegevens automatisch ingevuld." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Gehackte of onbetrouwbare websites kunnen auto-invullen tijdens het laden van de pagina misbruiken." }, "learnMoreAboutAutofill": { "message": "Lees meer over automatisch invullen" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Item herstellen" }, - "restoreItemConfirmation": { - "message": "Weet je zeker dat je dit item wilt herstellen?" - }, "restoredItem": { "message": "Hersteld item" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Automatisch gevuld item" }, + "insecurePageWarning": { + "message": "Waarschuwing: Dit is een onbeveiligde HTTP-pagina waardoor anderen alle informatie die je verstuurt kunnen zien en wijzigen. Deze login is oorspronkelijk opgeslagen op een beveiligde (HTTPS) pagina." + }, + "insecurePageWarningFillPrompt": { + "message": "Wil je je inloggegevens nog steeds invullen?" + }, + "autofillIframeWarning": { + "message": "Dit formulier wordt door een ander domein gehost dan de URI van jouw opgeslagen login. Kies OK voor toch automatisch invullen, of Annuleren om te stoppen." + }, + "autofillIframeWarningTip": { + "message": "Om deze waarschuwing in de toekomst te voorkomen, bewaar je deze URI, $HOSTNAME$, bij je Bitwarden-login voor deze site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Hoofdwachtwoord instellen" }, + "currentMasterPass": { + "message": "Huidig hoofdwachtwoord" + }, + "newMasterPass": { + "message": "Nieuw hoofdwachtwoord" + }, + "confirmNewMasterPass": { + "message": "Nieuw hoofdwachtwoord bevestigen" + }, "masterPasswordPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen verlangen dat je hoofdwachtwoord voldoet aan:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Dit apparaat ondersteunt geen browserbiometrie." }, + "biometricsFailedTitle": { + "message": "Biometrie mislukt" + }, + "biometricsFailedDesc": { + "message": "Kan biometrische authenticatie niet voltooien, gebruik een hoofdwachtwoord of log uit. Neem contact op met de ondersteuning van Bitwarden als dit blijft aanhouden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Toestemming niet verleend" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Een organisatiebeleid heeft invloed op je eigendomsopties." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organisatiebeleid heeft het importeren van items in je persoonlijke kluis geblokkeerd." + }, "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 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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is geen geldig domein", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Je hoofdwachtwoord is onlangs veranderd door een beheerder in jouw organisatie. Om toegang te krijgen tot de kluis, moet je deze nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatische inschrijving" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Map selecteren..." }, - "ssoCompleteRegistration": { - "message": "Voor het inloggen met SSO moet je een hoofdwachtwoord instellen voor toegang tot en bescherming van je kluis." + "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" }, "hours": { "message": "Uren" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "De beleidsinstellingen van je organisatie hebben je kluis time-out ingesteld op $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Je kluis time-out is hoger dan het maximum van jouw organisatie." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Persoonlijke kluis exporteren" }, - "exportingPersonalVaultDescription": { - "message": "Exporteert alleen de persoonlijke kluis-items gerelateerd aan $EMAIL$. Geen kluis-items van de organisatie.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Inloggen op $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Serverversie" }, - "selfHosted": { - "message": "Zelfgehost" + "selfHostedServer": { + "message": "zelfgehost" }, "thirdParty": { "message": "van derden" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "E-mailadres onthouden" }, + "loginWithDevice": { + "message": "Inloggen met apparaat" + }, + "loginWithDeviceEnabledInfo": { + "message": "Inloggen met apparaat moet aangezet worden in de instellingen van de Bitwarden app. Nood aan een andere optie?" + }, + "fingerprintPhraseHeader": { + "message": "Vingerafdrukzin" + }, + "fingerprintMatchInfo": { + "message": "Zorg ervoor dat je kluis is ontgrendeld en de vingerafdrukzin hetzelfde is op het andere apparaat." + }, + "resendNotification": { + "message": "Melding opnieuw verzenden" + }, + "viewAllLoginOptions": { + "message": "Alle loginopties bekijken" + }, + "notificationSentDevice": { + "message": "Er is een melding naar je apparaat verzonden." + }, + "loginInitiated": { + "message": "Inloggen gestart" + }, "exposedMasterPassword": { "message": "Gelekt hoofdwachtwoord" }, @@ -2069,7 +2261,7 @@ "message": "Belangrijk:" }, "masterPasswordHint": { - "message": "Je kunt je hoofdwachtwoord niet herstellen als je het vergeet!" + "message": "Je hoofdwachtwoord kan niet hersteld worden als je het vergeet!" }, "characterMinimum": { "message": "$LENGTH$ tekens minimaal", @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Je organisatiebeleid heeft het automatisch invullen bij laden van pagina ingeschakeld." + }, + "howToAutofill": { + "message": "Hoe automatisch aanvullen" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Ik snap het" + }, + "autofillSettings": { + "message": "Instellingen automatisch invullen" + }, + "autofillShortcut": { + "message": "Snelkoppeling automatisch invullen" + }, + "autofillShortcutNotSet": { + "message": "De sneltoets voor automatisch invullen is niet ingesteld. Wijzig dit in de instellingen van de browser." + }, + "autofillShortcutText": { + "message": "De sneltoets voor automatisch invullen is: $COMMAND$. Wijzig dit in de instellingen van de browser.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standaard snelkoppeling voor automatisch invullen:: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Inloggen op" + }, + "opensInANewWindow": { + "message": "Opent in een nieuw venster" + }, + "deviceApprovalRequired": { + "message": "Apparaattoestemming vereist. Kies een goedkeuringsoptie hieronder:" + }, + "rememberThisDevice": { + "message": "Dit apparaat onthouden" + }, + "uncheckIfPublicDevice": { + "message": "Uitschakelen als je openbaar apparaat gebruikt" + }, + "approveFromYourOtherDevice": { + "message": "Goedkeuren vanaf je andere apparaat" + }, + "requestAdminApproval": { + "message": "Goedkeuring van beheerder vragen" + }, + "approveWithMasterPassword": { + "message": "Goedkeuren met hoofdwachtwoord" + }, + "ssoIdentifierRequired": { + "message": "Organisatie SSO-identificatie vereist." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account succesvol aangemaakt!" + }, + "adminApprovalRequested": { + "message": "Goedkeuring van beheerder aangevraagd" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Je verzoek is naar je beheerder verstuurd." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Je krijgt een melding zodra je bent goedgekeurd." + }, + "troubleLoggingIn": { + "message": "Problemen met inloggen?" + }, + "loginApproved": { + "message": "Inloggen goedgekeurd" + }, + "userEmailMissing": { + "message": "Gebruikerse-mailadres ontbreekt" + }, + "deviceTrusted": { + "message": "Vertrouwd apparaat" + }, + "inputRequired": { + "message": "Invoer vereist." + }, + "required": { + "message": "vereist" + }, + "search": { + "message": "Zoeken" + }, + "inputMinLength": { + "message": "Invoer moet minimaal $COUNT$ tekens lang zijn.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Invoer mag niet meer dan $COUNT$ tekens lang zijn.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "De volgende tekens zijn niet toegestaan: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Invoer moet minimaal $MIN$ zijn.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Invoer mag niet hoger zijn dan $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Een of meer e-mailadressen zijn ongeldig" + }, + "inputTrimValidator": { + "message": "Invoer mag niet alleen witruimte bevatten.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Invoer is geen e-mailadres." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ veld(en) hierboven hebben je aandacht nodig.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Selecteer --" + }, + "multiSelectPlaceholder": { + "message": "-- Type om te filteren --" + }, + "multiSelectLoading": { + "message": "Opties ophalen..." + }, + "multiSelectNotFound": { + "message": "Geen items gevonden" + }, + "multiSelectClearAll": { + "message": "Alles wissen" + }, + "plusNMore": { + "message": "+ $QUANTITY$ meer", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "In-/Uitklappen", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Aliasdomein" + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Account ontgrendelen", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Importbestemming" + }, + "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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Bevestigen" + }, + "savePasskey": { + "message": "Passkey opslaan" + }, + "savePasskeyNewLogin": { + "message": "Passkey als nieuwe login opslaan" + }, + "choosePasskey": { + "message": "Kies een login om deze passkey bij op te slaan" + }, + "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." + }, + "useBrowserName": { + "message": "Browser gebruiken" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor-authenticatie geannuleerd" + }, + "noLastPassDataFound": { + "message": "Geen LastPass-gegevens gevonden" + }, + "incorrectUsernameOrPassword": { + "message": "Onjuiste gebruikersnaam of wachtwoord" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index ddda55bfd0ac..ab3933bf5b77 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json new file mode 100644 index 000000000000..ab3933bf5b77 --- /dev/null +++ b/apps/browser/src/_locales/or/messages.json @@ -0,0 +1,2821 @@ +{ + "appName": { + "message": "Bitwarden" + }, + "extName": { + "message": "Bitwarden - Free 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" + }, + "loginOrCreateNewAccount": { + "message": "Log in or create a new account to access your secure vault." + }, + "createAccount": { + "message": "Create account" + }, + "login": { + "message": "Log in" + }, + "enterpriseSingleSignOn": { + "message": "Enterprise single sign-on" + }, + "cancel": { + "message": "Cancel" + }, + "close": { + "message": "Close" + }, + "submit": { + "message": "Submit" + }, + "emailAddress": { + "message": "Email address" + }, + "masterPass": { + "message": "Master password" + }, + "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." + }, + "masterPassHintDesc": { + "message": "A master password hint can help you remember your password if you forget it." + }, + "reTypeMasterPass": { + "message": "Re-type master password" + }, + "masterPassHint": { + "message": "Master password hint (optional)" + }, + "tab": { + "message": "Tab" + }, + "vault": { + "message": "Vault" + }, + "myVault": { + "message": "My vault" + }, + "allVaults": { + "message": "All vaults" + }, + "tools": { + "message": "Tools" + }, + "settings": { + "message": "Settings" + }, + "currentTab": { + "message": "Current tab" + }, + "copyPassword": { + "message": "Copy password" + }, + "copyNote": { + "message": "Copy note" + }, + "copyUri": { + "message": "Copy URI" + }, + "copyUsername": { + "message": "Copy username" + }, + "copyNumber": { + "message": "Copy number" + }, + "copySecurityCode": { + "message": "Copy security code" + }, + "autoFill": { + "message": "Auto-fill" + }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, + "generatePasswordCopied": { + "message": "Generate password (copied)" + }, + "copyElementIdentifier": { + "message": "Copy custom field name" + }, + "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" + }, + "loginToVaultMenu": { + "message": "Log in to your vault" + }, + "autoFillInfo": { + "message": "There are no logins available to auto-fill for the current browser tab." + }, + "addLogin": { + "message": "Add a login" + }, + "addItem": { + "message": "Add item" + }, + "passwordHint": { + "message": "Password hint" + }, + "enterEmailToGetHint": { + "message": "Enter your account email address to receive your master password hint." + }, + "getMasterPasswordHint": { + "message": "Get master password hint" + }, + "continue": { + "message": "Continue" + }, + "sendVerificationCode": { + "message": "Send a verification code to your email" + }, + "sendCode": { + "message": "Send code" + }, + "codeSent": { + "message": "Code sent" + }, + "verificationCode": { + "message": "Verification code" + }, + "confirmIdentity": { + "message": "Confirm your identity to continue." + }, + "account": { + "message": "Account" + }, + "changeMasterPassword": { + "message": "Change master password" + }, + "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." + }, + "yourAccountsFingerprint": { + "message": "Your account's 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." + }, + "twoStepLogin": { + "message": "Two-step login" + }, + "logOut": { + "message": "Log out" + }, + "about": { + "message": "About" + }, + "version": { + "message": "Version" + }, + "save": { + "message": "Save" + }, + "move": { + "message": "Move" + }, + "addFolder": { + "message": "Add folder" + }, + "name": { + "message": "Name" + }, + "editFolder": { + "message": "Edit folder" + }, + "deleteFolder": { + "message": "Delete folder" + }, + "folders": { + "message": "Folders" + }, + "noFolders": { + "message": "There are no folders to list." + }, + "helpFeedback": { + "message": "Help & feedback" + }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, + "sync": { + "message": "Sync" + }, + "syncVaultNow": { + "message": "Sync vault now" + }, + "lastSync": { + "message": "Last sync:" + }, + "passGen": { + "message": "Password generator" + }, + "generator": { + "message": "Generator", + "description": "Short for 'Password Generator'." + }, + "passGenInfo": { + "message": "Automatically generate strong, unique passwords for your logins." + }, + "bitWebVault": { + "message": "Bitwarden web vault" + }, + "importItems": { + "message": "Import items" + }, + "select": { + "message": "Select" + }, + "generatePassword": { + "message": "Generate password" + }, + "regeneratePassword": { + "message": "Regenerate password" + }, + "options": { + "message": "Options" + }, + "length": { + "message": "Length" + }, + "uppercase": { + "message": "Uppercase (A-Z)" + }, + "lowercase": { + "message": "Lowercase (a-z)" + }, + "numbers": { + "message": "Numbers (0-9)" + }, + "specialCharacters": { + "message": "Special characters (!@#$%^&*)" + }, + "numWords": { + "message": "Number of words" + }, + "wordSeparator": { + "message": "Word separator" + }, + "capitalize": { + "message": "Capitalize", + "description": "Make the first letter of a work uppercase." + }, + "includeNumber": { + "message": "Include number" + }, + "minNumbers": { + "message": "Minimum numbers" + }, + "minSpecial": { + "message": "Minimum special" + }, + "avoidAmbChar": { + "message": "Avoid ambiguous characters" + }, + "searchVault": { + "message": "Search vault" + }, + "edit": { + "message": "Edit" + }, + "view": { + "message": "View" + }, + "noItemsInList": { + "message": "There are no items to list." + }, + "itemInformation": { + "message": "Item information" + }, + "username": { + "message": "Username" + }, + "password": { + "message": "Password" + }, + "passphrase": { + "message": "Passphrase" + }, + "favorite": { + "message": "Favorite" + }, + "notes": { + "message": "Notes" + }, + "note": { + "message": "Note" + }, + "editItem": { + "message": "Edit item" + }, + "folder": { + "message": "Folder" + }, + "deleteItem": { + "message": "Delete item" + }, + "viewItem": { + "message": "View item" + }, + "launch": { + "message": "Launch" + }, + "website": { + "message": "Website" + }, + "toggleVisibility": { + "message": "Toggle visibility" + }, + "manage": { + "message": "Manage" + }, + "other": { + "message": "Other" + }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "rateExtension": { + "message": "Rate the extension" + }, + "rateExtensionDesc": { + "message": "Please consider helping us out with a good review!" + }, + "browserNotSupportClipboard": { + "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + }, + "verifyIdentity": { + "message": "Verify identity" + }, + "yourVaultIsLocked": { + "message": "Your vault is locked. Verify your identity to continue." + }, + "unlock": { + "message": "Unlock" + }, + "loggedInAsOn": { + "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "hostname": { + "content": "$2", + "example": "bitwarden.com" + } + } + }, + "invalidMasterPassword": { + "message": "Invalid master password" + }, + "vaultTimeout": { + "message": "Vault timeout" + }, + "lockNow": { + "message": "Lock now" + }, + "lockAll": { + "message": "Lock all" + }, + "immediately": { + "message": "Immediately" + }, + "tenSeconds": { + "message": "10 seconds" + }, + "twentySeconds": { + "message": "20 seconds" + }, + "thirtySeconds": { + "message": "30 seconds" + }, + "oneMinute": { + "message": "1 minute" + }, + "twoMinutes": { + "message": "2 minutes" + }, + "fiveMinutes": { + "message": "5 minutes" + }, + "fifteenMinutes": { + "message": "15 minutes" + }, + "thirtyMinutes": { + "message": "30 minutes" + }, + "oneHour": { + "message": "1 hour" + }, + "fourHours": { + "message": "4 hours" + }, + "onLocked": { + "message": "On system lock" + }, + "onRestart": { + "message": "On browser restart" + }, + "never": { + "message": "Never" + }, + "security": { + "message": "Security" + }, + "errorOccurred": { + "message": "An error has occurred" + }, + "emailRequired": { + "message": "Email address is required." + }, + "invalidEmail": { + "message": "Invalid email address." + }, + "masterPasswordRequired": { + "message": "Master password is required." + }, + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } + }, + "masterPassDoesntMatch": { + "message": "Master password confirmation does not match." + }, + "newAccountCreated": { + "message": "Your new account has been created! You may now log in." + }, + "masterPassSent": { + "message": "We've sent you an email with your master password hint." + }, + "verificationCodeRequired": { + "message": "Verification code is required." + }, + "invalidVerificationCode": { + "message": "Invalid verification code" + }, + "valueCopied": { + "message": "$VALUE$ copied", + "description": "Value has been copied to the clipboard.", + "placeholders": { + "value": { + "content": "$1", + "example": "Password" + } + } + }, + "autofillError": { + "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + }, + "loggedOut": { + "message": "Logged out" + }, + "loginExpired": { + "message": "Your login session has expired." + }, + "logOutConfirmation": { + "message": "Are you sure you want to log out?" + }, + "yes": { + "message": "Yes" + }, + "no": { + "message": "No" + }, + "unexpectedError": { + "message": "An unexpected error has occurred." + }, + "nameRequired": { + "message": "Name is required." + }, + "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?" + }, + "editedFolder": { + "message": "Folder saved" + }, + "deleteFolderConfirmation": { + "message": "Are you sure you want to delete this folder?" + }, + "deletedFolder": { + "message": "Folder deleted" + }, + "gettingStartedTutorial": { + "message": "Getting started tutorial" + }, + "gettingStartedTutorialVideo": { + "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + }, + "syncingComplete": { + "message": "Syncing complete" + }, + "syncingFailed": { + "message": "Syncing failed" + }, + "passwordCopied": { + "message": "Password copied" + }, + "uri": { + "message": "URI" + }, + "uriPosition": { + "message": "URI $POSITION$", + "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.", + "placeholders": { + "position": { + "content": "$1", + "example": "2" + } + } + }, + "newUri": { + "message": "New URI" + }, + "addedItem": { + "message": "Item added" + }, + "editedItem": { + "message": "Item saved" + }, + "deleteItemConfirmation": { + "message": "Do you really want to send to the trash?" + }, + "deletedItem": { + "message": "Item sent to trash" + }, + "overwritePassword": { + "message": "Overwrite password" + }, + "overwritePasswordConfirmation": { + "message": "Are you sure you want to overwrite the current password?" + }, + "overwriteUsername": { + "message": "Overwrite username" + }, + "overwriteUsernameConfirmation": { + "message": "Are you sure you want to overwrite the current username?" + }, + "searchFolder": { + "message": "Search folder" + }, + "searchCollection": { + "message": "Search collection" + }, + "searchType": { + "message": "Search type" + }, + "noneFolder": { + "message": "No folder", + "description": "This is the folder for uncategorized items" + }, + "enableAddLoginNotification": { + "message": "Ask to add login" + }, + "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." + }, + "showCardsCurrentTab": { + "message": "Show cards on Tab page" + }, + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." + }, + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" + }, + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." + }, + "clearClipboard": { + "message": "Clear clipboard", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "clearClipboardDesc": { + "message": "Automatically clear copied values from your clipboard.", + "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?" + }, + "notificationAddSave": { + "message": "Save" + }, + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" + }, + "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" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, + "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." + }, + "defaultUriMatchDetectionDesc": { + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + }, + "theme": { + "message": "Theme" + }, + "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" + }, + "light": { + "message": "Light", + "description": "Light color" + }, + "solarizedDark": { + "message": "Solarized dark", + "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." + }, + "exportVault": { + "message": "Export vault" + }, + "fileFormat": { + "message": "File format" + }, + "warning": { + "message": "WARNING", + "description": "WARNING (should stay in capitalized letters if the language permits)" + }, + "confirmVaultExport": { + "message": "Confirm vault export" + }, + "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." + }, + "encExportKeyWarningDesc": { + "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + }, + "encExportAccountWarningDesc": { + "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + }, + "exportMasterPassword": { + "message": "Enter your master password to export your vault data." + }, + "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?" + }, + "moveToOrganization": { + "message": "Move to organization" + }, + "share": { + "message": "Share" + }, + "movedItemToOrg": { + "message": "$ITEMNAME$ moved to $ORGNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "orgname": { + "content": "$2", + "example": "Company Name" + } + } + }, + "moveToOrgDesc": { + "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + }, + "learnMore": { + "message": "Learn more" + }, + "authenticatorKeyTotp": { + "message": "Authenticator key (TOTP)" + }, + "verificationCodeTotp": { + "message": "Verification code (TOTP)" + }, + "copyVerificationCode": { + "message": "Copy verification code" + }, + "attachments": { + "message": "Attachments" + }, + "deleteAttachment": { + "message": "Delete attachment" + }, + "deleteAttachmentConfirmation": { + "message": "Are you sure you want to delete this attachment?" + }, + "deletedAttachment": { + "message": "Attachment deleted" + }, + "newAttachment": { + "message": "Add new attachment" + }, + "noAttachments": { + "message": "No attachments." + }, + "attachmentSaved": { + "message": "Attachment saved" + }, + "file": { + "message": "File" + }, + "selectFile": { + "message": "Select a file" + }, + "maxFileSize": { + "message": "Maximum file size is 500 MB." + }, + "featureUnavailable": { + "message": "Feature unavailable" + }, + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + }, + "premiumMembership": { + "message": "Premium membership" + }, + "premiumManage": { + "message": "Manage membership" + }, + "premiumManageAlert": { + "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumRefresh": { + "message": "Refresh membership" + }, + "premiumNotCurrentMember": { + "message": "You are not currently a Premium member." + }, + "premiumSignUpAndGet": { + "message": "Sign up for a Premium membership and get:" + }, + "ppremiumSignUpStorage": { + "message": "1 GB encrypted storage for file attachments." + }, + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." + }, + "ppremiumSignUpReports": { + "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + }, + "ppremiumSignUpTotp": { + "message": "TOTP verification code (2FA) generator for logins in your vault." + }, + "ppremiumSignUpSupport": { + "message": "Priority customer support." + }, + "ppremiumSignUpFuture": { + "message": "All future Premium features. More coming soon!" + }, + "premiumPurchase": { + "message": "Purchase Premium" + }, + "premiumPurchaseAlert": { + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumCurrentMember": { + "message": "You are a Premium member!" + }, + "premiumCurrentMemberThanks": { + "message": "Thank you for supporting Bitwarden." + }, + "premiumPrice": { + "message": "All for just $PRICE$ /year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "refreshComplete": { + "message": "Refresh complete" + }, + "enableAutoTotpCopy": { + "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." + }, + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" + }, + "premiumRequired": { + "message": "Premium required" + }, + "premiumRequiredDesc": { + "message": "A Premium membership is required to use this feature." + }, + "enterVerificationCodeApp": { + "message": "Enter the 6 digit verification code from your authenticator app." + }, + "enterVerificationCodeEmail": { + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "verificationCodeEmailSent": { + "message": "Verification email sent to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "rememberMe": { + "message": "Remember me" + }, + "sendVerificationCodeEmailAgain": { + "message": "Send verification code email again" + }, + "useAnotherTwoStepMethod": { + "message": "Use another two-step login method" + }, + "insertYubiKey": { + "message": "Insert your YubiKey into your computer's USB port, then touch its button." + }, + "insertU2f": { + "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + }, + "webAuthnNewTab": { + "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" + }, + "webAuthnAuthenticate": { + "message": "Authenticate WebAuthn" + }, + "loginUnavailable": { + "message": "Login unavailable" + }, + "noTwoStepProviders": { + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + }, + "noTwoStepProviders2": { + "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" + }, + "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" + }, + "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." + }, + "yubiKeyTitle": { + "message": "YubiKey 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.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "duoOrganizationDesc": { + "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "webAuthnTitle": { + "message": "FIDO2 WebAuthn" + }, + "webAuthnDesc": { + "message": "Use any WebAuthn compatible security key to access your account." + }, + "emailTitle": { + "message": "Email" + }, + "emailDesc": { + "message": "Verification codes will be emailed to you." + }, + "selfHostedEnvironment": { + "message": "Self-hosted environment" + }, + "selfHostedEnvironmentFooter": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + }, + "customEnvironment": { + "message": "Custom environment" + }, + "customEnvironmentFooter": { + "message": "For advanced users. You can specify the base URL of each service independently." + }, + "baseUrl": { + "message": "Server URL" + }, + "apiUrl": { + "message": "API server URL" + }, + "webVaultUrl": { + "message": "Web vault server URL" + }, + "identityUrl": { + "message": "Identity server URL" + }, + "notificationsUrl": { + "message": "Notifications server URL" + }, + "iconsUrl": { + "message": "Icons server URL" + }, + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, + "enableAutoFillOnPageLoad": { + "message": "Auto-fill on page load" + }, + "enableAutoFillOnPageLoadDesc": { + "message": "If a login form is detected, auto-fill when the web page loads." + }, + "experimentalFeature": { + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofill": { + "message": "Learn more about auto-fill" + }, + "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." + }, + "itemAutoFillOnPageLoad": { + "message": "Auto-fill on page load (if set up in Options)" + }, + "autoFillOnPageLoadUseDefault": { + "message": "Use default setting" + }, + "autoFillOnPageLoadYes": { + "message": "Auto-fill on page load" + }, + "autoFillOnPageLoadNo": { + "message": "Do not auto-fill on page load" + }, + "commandOpenPopup": { + "message": "Open vault popup" + }, + "commandOpenSidebar": { + "message": "Open vault in sidebar" + }, + "commandAutofillDesc": { + "message": "Auto-fill the last used login for the current website" + }, + "commandGeneratePasswordDesc": { + "message": "Generate and copy a new random password to the clipboard" + }, + "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" + }, + "value": { + "message": "Value" + }, + "newCustomField": { + "message": "New custom field" + }, + "dragToSort": { + "message": "Drag to sort" + }, + "cfTypeText": { + "message": "Text" + }, + "cfTypeHidden": { + "message": "Hidden" + }, + "cfTypeBoolean": { + "message": "Boolean" + }, + "cfTypeLinked": { + "message": "Linked", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Linked value", + "description": "This describes a value that is 'linked' (tied) to another value." + }, + "popup2faCloseMessage": { + "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + }, + "popupU2fCloseMessage": { + "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + }, + "enableFavicon": { + "message": "Show website icons" + }, + "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" + }, + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." + }, + "cardholderName": { + "message": "Cardholder name" + }, + "number": { + "message": "Number" + }, + "brand": { + "message": "Brand" + }, + "expirationMonth": { + "message": "Expiration month" + }, + "expirationYear": { + "message": "Expiration year" + }, + "expiration": { + "message": "Expiration" + }, + "january": { + "message": "January" + }, + "february": { + "message": "February" + }, + "march": { + "message": "March" + }, + "april": { + "message": "April" + }, + "may": { + "message": "May" + }, + "june": { + "message": "June" + }, + "july": { + "message": "July" + }, + "august": { + "message": "August" + }, + "september": { + "message": "September" + }, + "october": { + "message": "October" + }, + "november": { + "message": "November" + }, + "december": { + "message": "December" + }, + "securityCode": { + "message": "Security code" + }, + "ex": { + "message": "ex." + }, + "title": { + "message": "Title" + }, + "mr": { + "message": "Mr" + }, + "mrs": { + "message": "Mrs" + }, + "ms": { + "message": "Ms" + }, + "dr": { + "message": "Dr" + }, + "mx": { + "message": "Mx" + }, + "firstName": { + "message": "First name" + }, + "middleName": { + "message": "Middle name" + }, + "lastName": { + "message": "Last name" + }, + "fullName": { + "message": "Full name" + }, + "identityName": { + "message": "Identity name" + }, + "company": { + "message": "Company" + }, + "ssn": { + "message": "Social Security number" + }, + "passportNumber": { + "message": "Passport number" + }, + "licenseNumber": { + "message": "License number" + }, + "email": { + "message": "Email" + }, + "phone": { + "message": "Phone" + }, + "address": { + "message": "Address" + }, + "address1": { + "message": "Address 1" + }, + "address2": { + "message": "Address 2" + }, + "address3": { + "message": "Address 3" + }, + "cityTown": { + "message": "City / Town" + }, + "stateProvince": { + "message": "State / Province" + }, + "zipPostalCode": { + "message": "Zip / Postal code" + }, + "country": { + "message": "Country" + }, + "type": { + "message": "Type" + }, + "typeLogin": { + "message": "Login" + }, + "typeLogins": { + "message": "Logins" + }, + "typeSecureNote": { + "message": "Secure note" + }, + "typeCard": { + "message": "Card" + }, + "typeIdentity": { + "message": "Identity" + }, + "passwordHistory": { + "message": "Password history" + }, + "back": { + "message": "Back" + }, + "collections": { + "message": "Collections" + }, + "favorites": { + "message": "Favorites" + }, + "popOutNewWindow": { + "message": "Pop out to a new window" + }, + "refresh": { + "message": "Refresh" + }, + "cards": { + "message": "Cards" + }, + "identities": { + "message": "Identities" + }, + "logins": { + "message": "Logins" + }, + "secureNotes": { + "message": "Secure notes" + }, + "clear": { + "message": "Clear", + "description": "To clear something out. example: To clear browser history." + }, + "checkPassword": { + "message": "Check if password has been exposed." + }, + "passwordExposed": { + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "placeholders": { + "value": { + "content": "$1", + "example": "2" + } + } + }, + "passwordSafe": { + "message": "This password was not found in any known data breaches. It should be safe to use." + }, + "baseDomain": { + "message": "Base domain", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Domain name", + "description": "Domain name. Ex. website.com" + }, + "host": { + "message": "Host", + "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." + }, + "exact": { + "message": "Exact" + }, + "startsWith": { + "message": "Starts with" + }, + "regEx": { + "message": "Regular expression", + "description": "A programming term, also known as 'RegEx'." + }, + "matchDetection": { + "message": "Match detection", + "description": "URI match detection for auto-fill." + }, + "defaultMatchDetection": { + "message": "Default match detection", + "description": "Default URI match detection for auto-fill." + }, + "toggleOptions": { + "message": "Toggle options" + }, + "toggleCurrentUris": { + "message": "Toggle current URIs", + "description": "Toggle the display of the URIs of the currently open tabs in the browser." + }, + "currentUri": { + "message": "Current URI", + "description": "The URI of one of the current open tabs in the browser." + }, + "organization": { + "message": "Organization", + "description": "An entity of multiple related people (ex. a team or business organization)." + }, + "types": { + "message": "Types" + }, + "allItems": { + "message": "All items" + }, + "noPasswordsInList": { + "message": "There are no passwords to list." + }, + "remove": { + "message": "Remove" + }, + "default": { + "message": "Default" + }, + "dateUpdated": { + "message": "Updated", + "description": "ex. Date this item was updated" + }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, + "datePasswordUpdated": { + "message": "Password updated", + "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." + }, + "noOrganizationsList": { + "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + }, + "noCollectionsInList": { + "message": "There are no collections to list." + }, + "ownership": { + "message": "Ownership" + }, + "whoOwnsThisItem": { + "message": "Who owns this item?" + }, + "strong": { + "message": "Strong", + "description": "ex. A strong password. Scale: Weak -> Good -> Strong" + }, + "good": { + "message": "Good", + "description": "ex. A good password. Scale: Weak -> Good -> Strong" + }, + "weak": { + "message": "Weak", + "description": "ex. A weak password. Scale: Weak -> Good -> Strong" + }, + "weakMasterPassword": { + "message": "Weak master password" + }, + "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?" + }, + "pin": { + "message": "PIN", + "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." + }, + "unlockWithPin": { + "message": "Unlock with 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." + }, + "pinRequired": { + "message": "PIN code is required." + }, + "invalidPin": { + "message": "Invalid PIN code." + }, + "unlockWithBiometrics": { + "message": "Unlock with biometrics" + }, + "awaitDesktop": { + "message": "Awaiting confirmation from desktop" + }, + "awaitDesktopDesc": { + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + }, + "lockWithMasterPassOnRestart": { + "message": "Lock with master password on browser restart" + }, + "selectOneCollection": { + "message": "You must select at least one collection." + }, + "cloneItem": { + "message": "Clone item" + }, + "clone": { + "message": "Clone" + }, + "passwordGeneratorPolicyInEffect": { + "message": "One or more organization policies are affecting your generator settings." + }, + "vaultTimeoutAction": { + "message": "Vault timeout action" + }, + "lock": { + "message": "Lock", + "description": "Verb form: to make secure or inaccesible by" + }, + "trash": { + "message": "Trash", + "description": "Noun: a special folder to hold deleted items" + }, + "searchTrash": { + "message": "Search trash" + }, + "permanentlyDeleteItem": { + "message": "Permanently delete item" + }, + "permanentlyDeleteItemConfirmation": { + "message": "Are you sure you want to permanently delete this item?" + }, + "permanentlyDeletedItem": { + "message": "Item permanently deleted" + }, + "restoreItem": { + "message": "Restore item" + }, + "restoredItem": { + "message": "Item restored" + }, + "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?" + }, + "vaultTimeoutLogOutConfirmationTitle": { + "message": "Timeout action confirmation" + }, + "autoFillAndSave": { + "message": "Auto-fill and save" + }, + "autoFillSuccessAndSavedUri": { + "message": "Item auto-filled and URI saved" + }, + "autoFillSuccess": { + "message": "Item auto-filled " + }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "setMasterPassword": { + "message": "Set master password" + }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, + "masterPasswordPolicyInEffect": { + "message": "One or more organization policies require your master password to meet the following requirements:" + }, + "policyInEffectMinComplexity": { + "message": "Minimum complexity score of $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, + "policyInEffectMinLength": { + "message": "Minimum length of $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "policyInEffectUppercase": { + "message": "Contain one or more uppercase characters" + }, + "policyInEffectLowercase": { + "message": "Contain one or more lowercase characters" + }, + "policyInEffectNumbers": { + "message": "Contain one or more numbers" + }, + "policyInEffectSpecial": { + "message": "Contain one or more of the following special characters $CHARS$", + "placeholders": { + "chars": { + "content": "$1", + "example": "!@#$%^&*" + } + } + }, + "masterPasswordPolicyRequirementsNotMet": { + "message": "Your new master password does not meet the policy requirements." + }, + "acceptPolicies": { + "message": "By checking this box you agree to the following:" + }, + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." + }, + "termsOfService": { + "message": "Terms of Service" + }, + "privacyPolicy": { + "message": "Privacy Policy" + }, + "hintEqualsPassword": { + "message": "Your password hint cannot be the same as your password." + }, + "ok": { + "message": "Ok" + }, + "desktopSyncVerificationTitle": { + "message": "Desktop sync verification" + }, + "desktopIntegrationVerificationText": { + "message": "Please verify that the desktop application shows this fingerprint: " + }, + "desktopIntegrationDisabledTitle": { + "message": "Browser integration is not set up" + }, + "desktopIntegrationDisabledDesc": { + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + }, + "startDesktopTitle": { + "message": "Start the Bitwarden desktop application" + }, + "startDesktopDesc": { + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + }, + "errorEnableBiometricTitle": { + "message": "Unable to set up biometrics" + }, + "errorEnableBiometricDesc": { + "message": "Action was canceled by the desktop application" + }, + "nativeMessagingInvalidEncryptionDesc": { + "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + }, + "nativeMessagingInvalidEncryptionTitle": { + "message": "Desktop communication interrupted" + }, + "nativeMessagingWrongUserDesc": { + "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + }, + "nativeMessagingWrongUserTitle": { + "message": "Account missmatch" + }, + "biometricsNotEnabledTitle": { + "message": "Biometrics not set up" + }, + "biometricsNotEnabledDesc": { + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + }, + "biometricsNotSupportedTitle": { + "message": "Biometrics not supported" + }, + "biometricsNotSupportedDesc": { + "message": "Browser biometrics is not supported on this device." + }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, + "nativeMessaginPermissionErrorTitle": { + "message": "Permission not provided" + }, + "nativeMessaginPermissionErrorDesc": { + "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + }, + "nativeMessaginPermissionSidebarTitle": { + "message": "Permission request error" + }, + "nativeMessaginPermissionSidebarDesc": { + "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + }, + "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." + }, + "personalOwnershipPolicyInEffect": { + "message": "An organization policy is affecting your ownership options." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "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." + }, + "excludedDomainsInvalidDomain": { + "message": "$DOMAIN$ is not a valid domain", + "placeholders": { + "domain": { + "content": "$1", + "example": "googlecom" + } + } + }, + "send": { + "message": "Send", + "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." + }, + "addSend": { + "message": "Add Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeText": { + "message": "Text" + }, + "sendTypeFile": { + "message": "File" + }, + "allSends": { + "message": "All Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "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" + }, + "pendingDeletion": { + "message": "Pending deletion" + }, + "passwordProtected": { + "message": "Password protected" + }, + "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" + }, + "delete": { + "message": "Delete" + }, + "removedPassword": { + "message": "Password removed" + }, + "deletedSend": { + "message": "Send deleted", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLink": { + "message": "Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "disabled": { + "message": "Disabled" + }, + "removePasswordConfirmation": { + "message": "Are you sure you want to remove the password?" + }, + "deleteSend": { + "message": "Delete Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendConfirmation": { + "message": "Are you sure you want to delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editSend": { + "message": "Edit 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?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNameDesc": { + "message": "A friendly name to describe this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFileDesc": { + "message": "The file you want to send." + }, + "deletionDate": { + "message": "Deletion date" + }, + "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." + }, + "expirationDate": { + "message": "Expiration date" + }, + "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" + }, + "days": { + "message": "$DAYS$ days", + "placeholders": { + "days": { + "content": "$1", + "example": "2" + } + } + }, + "custom": { + "message": "Custom" + }, + "maximumAccessCount": { + "message": "Maximum Access Count" + }, + "maximumAccessCountDesc": { + "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDesc": { + "message": "Optionally require a password for users to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNotesDesc": { + "message": "Private notes about this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisableDesc": { + "message": "Deactivate this Send so that no one can access it.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendShareDesc": { + "message": "Copy this Send's link to clipboard upon save.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTextDesc": { + "message": "The text you want to send." + }, + "sendHideText": { + "message": "Hide this Send's text by default.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "currentAccessCount": { + "message": "Current access count" + }, + "createSend": { + "message": "New Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "newPassword": { + "message": "New password" + }, + "sendDisabled": { + "message": "Send removed", + "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.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSend": { + "message": "Send created", + "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." + }, + "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." + }, + "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." + }, + "sendSafariFileWarning": { + "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + }, + "sendFileCalloutHeader": { + "message": "Before you start" + }, + "sendFirefoxCustomDatePopoutMessage1": { + "message": "To use a calendar style date picker", + "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", + "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.", + "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." + }, + "deletionDateIsInvalid": { + "message": "The deletion date provided is not valid." + }, + "expirationDateAndTimeRequired": { + "message": "An expiration date and time are required." + }, + "deletionDateAndTimeRequired": { + "message": "A deletion date and time are required." + }, + "dateParsingError": { + "message": "There was an error saving your deletion and expiration dates." + }, + "hideEmail": { + "message": "Hide my email address from recipients." + }, + "sendOptionsPolicyInEffect": { + "message": "One or more organization policies are affecting your Send options." + }, + "passwordPrompt": { + "message": "Master password re-prompt" + }, + "passwordConfirmation": { + "message": "Master password confirmation" + }, + "passwordConfirmationDesc": { + "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + }, + "emailVerificationRequired": { + "message": "Email verification required" + }, + "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" + }, + "updateMasterPassword": { + "message": "Update master password" + }, + "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." + }, + "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." + }, + "resetPasswordPolicyAutoEnroll": { + "message": "Automatic enrollment" + }, + "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." + }, + "selectFolder": { + "message": "Select folder..." + }, + "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" + }, + "hours": { + "message": "Hours" + }, + "minutes": { + "message": "Minutes" + }, + "vaultTimeoutPolicyInEffect": { + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." + }, + "vaultExportDisabled": { + "message": "Vault export unavailable" + }, + "personalVaultExportPolicyInEffect": { + "message": "One or more organization policies prevents you from exporting your individual vault." + }, + "copyCustomFieldNameInvalidElement": { + "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + }, + "copyCustomFieldNameNotUnique": { + "message": "No unique identifier found." + }, + "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.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Leave organization" + }, + "removeMasterPassword": { + "message": "Remove master password" + }, + "removedMasterPassword": { + "message": "Master password removed" + }, + "leaveOrganizationConfirmation": { + "message": "Are you sure you want to leave this organization?" + }, + "leftOrganization": { + "message": "You have left the organization." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "Your session has timed out. Please go back and try logging in again." + }, + "exportingPersonalVaultTitle": { + "message": "Exporting individual 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.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Error" + }, + "regenerateUsername": { + "message": "Regenerate username" + }, + "generateUsername": { + "message": "Generate username" + }, + "usernameType": { + "message": "Username type" + }, + "plusAddressedEmail": { + "message": "Plus addressed email", + "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." + }, + "catchallEmail": { + "message": "Catch-all email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Random" + }, + "randomWord": { + "message": "Random word" + }, + "websiteName": { + "message": "Website name" + }, + "whatWouldYouLikeToGenerate": { + "message": "What would you like to generate?" + }, + "passwordType": { + "message": "Password type" + }, + "service": { + "message": "Service" + }, + "forwardedEmail": { + "message": "Forwarded email alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "API Access Token" + }, + "apiKey": { + "message": "API Key" + }, + "ssoKeyConnectorError": { + "message": "Key connector error: make sure key connector is available and working correctly." + }, + "premiumSubcriptionRequired": { + "message": "Premium subscription required" + }, + "organizationIsDisabled": { + "message": "Organization suspended." + }, + "disabledOrganizationFilterError": { + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "loggingInTo": { + "message": "Logging in to $DOMAIN$", + "placeholders": { + "domain": { + "content": "$1", + "example": "example.com" + } + } + }, + "settingsEdited": { + "message": "Settings have been edited" + }, + "environmentEditedClick": { + "message": "Click here" + }, + "environmentEditedReset": { + "message": "to reset to pre-configured settings" + }, + "serverVersion": { + "message": "Server version" + }, + "selfHostedServer": { + "message": "self-hosted" + }, + "thirdParty": { + "message": "Third-party" + }, + "thirdPartyServerMessage": { + "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "placeholders": { + "servername": { + "content": "$1", + "example": "ThirdPartyServerName" + } + } + }, + "lastSeenOn": { + "message": "last seen on: $DATE$", + "placeholders": { + "date": { + "content": "$1", + "example": "Jun 15, 2015" + } + } + }, + "loginWithMasterPassword": { + "message": "Log in with master password" + }, + "loggingInAs": { + "message": "Logging in as" + }, + "notYou": { + "message": "Not you?" + }, + "newAroundHere": { + "message": "New around here?" + }, + "rememberEmail": { + "message": "Remember email" + }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, + "exposedMasterPassword": { + "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?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "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?" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "important": { + "message": "Important:" + }, + "masterPasswordHint": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" + } +} diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 671f43341344..7ffe729d9519 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Pomoc i opinie" }, + "helpCenter": { + "message": "Centrum pomocy Bitwarden" + }, + "communityForums": { + "message": "Przeglądaj fora społeczności Bitwarden" + }, + "contactSupport": { + "message": "Skontaktuj się z pomocą techniczną Bitwarden" + }, "sync": { "message": "Synchronizacja" }, @@ -329,6 +362,12 @@ "other": { "message": "Inne" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Ustaw metodę odblokowania, aby zmienić czas blokowania sejfu." + }, + "unlockMethodNeeded": { + "message": "Ustaw metodę odblokowania w Ustawieniach" + }, "rateExtension": { "message": "Oceń rozszerzenie" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Zablokuj" }, + "lockAll": { + "message": "Zablokuj wszystko" + }, "immediately": { "message": "Natychmiast" }, @@ -430,7 +472,14 @@ "message": "Wymagane jest ponowne wpisanie hasła głównego." }, "masterPasswordMinlength": { - "message": "Hasło główne musi zawierać co najmniej 8 znaków." + "message": "Hasło główne musi zawierać co najmniej $VALUE$ znaki(-ów).", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Hasła nie pasują do siebie." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Pokaż karty na stronie głównej" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Zaktualizuj" }, + "notificationUnlockDesc": { + "message": "Odblokuj swój sejf Bitwarden, aby ukończyć żądanie autouzupełniania." + }, + "notificationUnlock": { + "message": "Odblokuj" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Zmień motyw kolorystyczny aplikacji." }, + "themeDescAlt": { + "message": "Zmień kolor motywu aplikacji. Dotyczy wszystkich zalogowanych kont." + }, "dark": { "message": "Ciemny", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funkcja jest niedostępna" }, - "updateKey": { - "message": "Nie możesz używać tej funkcji, dopóki nie zaktualizujesz klucza szyfrowania." + "encryptionKeyMigrationRequired": { + "message": "Wymagana jest migracja klucza szyfrowania. Zaloguj się przez sejf internetowy, aby zaktualizować klucz szyfrowania." }, "premiumMembership": { "message": "Konto Premium" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB miejsca na zaszyfrowane załączniki." }, - "ppremiumSignUpTwoStep": { - "message": "Dodatkowe opcje logowania dwustopniowego, takie jak klucze YubiKey, FIDO U2F oraz Duo." + "premiumSignUpTwoStepOptions": { + "message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo." }, "ppremiumSignUpReports": { "message": "Raporty bezpieczeństwa haseł, stanu konta i raporty wycieków danych, aby Twoje dane były bezpieczne." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Włącz autouzupełnianie po załadowaniu strony" }, @@ -960,7 +1058,7 @@ "message": "Jeśli zostanie wykryty formularz logowania, automatycznie uzupełnij dane logowania po załadowaniu strony." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Zaatakowane lub niezaufane witryny internetowe mogą wykorzystać funkcję autouzupełniania podczas wczytywania strony, aby wyrządzić szkody." }, "learnMoreAboutAutofill": { "message": "Dowiedz się więcej o autouzupełnianiu" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Przywróć element" }, - "restoreItemConfirmation": { - "message": "Czy na pewno chcesz przywrócić ten element?" - }, "restoredItem": { "message": "Element został przywrócony" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Element został automatycznie uzupełniony" }, + "insecurePageWarning": { + "message": "Ostrzeżenie: Jest to niezabezpieczona strona HTTP i wszelkie przekazane informacje mogą być potencjalnie widoczne i zmienione przez innych. Ten login został pierwotnie zapisany na stronie bezpiecznej (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Nadal chcesz uzupełnić ten login?" + }, + "autofillIframeWarning": { + "message": "Formularz jest hostowany przez inną domenę niż zapisany adres URI dla tego loginu. Wybierz OK, aby i tak automatycznie wypełnić lub anuluj aby zatrzymać." + }, + "autofillIframeWarningTip": { + "message": "Aby zapobiec temu ostrzeżeniu w przyszłości, zapisz ten URI, $HOSTNAME$, dla tej witryny.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Ustaw hasło główne" }, + "currentMasterPass": { + "message": "Aktualne hasło główne" + }, + "newMasterPass": { + "message": "Nowe hasło główne" + }, + "confirmNewMasterPass": { + "message": "Potwierdź nowe hasło główne" + }, "masterPasswordPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wymaga, aby hasło główne spełniało następujące wymagania:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Dane biometryczne przeglądarki nie są obsługiwane na tym urządzeniu." }, + "biometricsFailedTitle": { + "message": "Dane biometryczne są błędne" + }, + "biometricsFailedDesc": { + "message": "Dane biometryczne nie mogę być użyte, rozważ użycie hasła głównego lub wylogowanie. Jeśli się to powtarza, skontaktuj się z pomocą techniczną Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Uprawnienie nie zostało przyznane" }, @@ -1574,12 +1705,18 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nie jest prawidłową nazwą domeny", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Musisz je zaktualizować, aby uzyskać dostęp do sejfu. Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." }, + "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ę." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatyczne rejestrowanie użytkowników" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Wybierz folder..." }, - "ssoCompleteRegistration": { - "message": "W celu zakończenia jednokrotnego logowania SSO, ustaw hasło główne, aby uzyskać dostęp do sejfu." + "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" }, "hours": { "message": "Godziny" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Zasady organizacji ustawiły czas blokowania sejfu na $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Czas blokowania sejfu przekracza limit określony przez organizację." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Eksportowanie osobistego sejfu" }, - "exportingPersonalVaultDescription": { - "message": "Tylko osobiste elementy sejfu powiązane z adresem $EMAIL$ zostaną wyeksportowane. Elementy sejfu należące do organizacji nie będą uwzględnione.", + "exportingIndividualVaultDescription": { + "message": "Z sejfu zostaną wyeksportowane tylko elementy powiązane z $EMAIL$. Elementy z sejfu organizacji nie będą uwzględnione. Tylko informacje o elemencie zostaną wyeksportowane i nie będą zawierać powiązanych załączników.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Nie można uzyskać dostępu do elementów w zawieszonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logowanie do $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Wersja serwera" }, - "selfHosted": { - "message": "Samodzielnie hostowany" + "selfHostedServer": { + "message": "samodzielnie hostowany" }, "thirdParty": { "message": "Inny dostawca" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Zapamiętaj adres e-mail" }, + "loginWithDevice": { + "message": "Zaloguj się za pomocą urządzenia" + }, + "loginWithDeviceEnabledInfo": { + "message": "Logowanie za pomocą urządzenia musi być włączone w ustawieniach aplikacji Bitwarden. Potrzebujesz innej opcji?" + }, + "fingerprintPhraseHeader": { + "message": "Unikalny identyfikator konta" + }, + "fingerprintMatchInfo": { + "message": "Upewnij się, że sejf jest odblokowany, a unikalny identyfikator konta pasuje do drugiego urządzenia." + }, + "resendNotification": { + "message": "Wyślij ponownie powiadomienie" + }, + "viewAllLoginOptions": { + "message": "Zobacz wszystkie sposoby logowania" + }, + "notificationSentDevice": { + "message": "Powiadomienie zostało wysłane na urządzenie." + }, + "loginInitiated": { + "message": "Logowanie rozpoczęte" + }, "exposedMasterPassword": { "message": "Ujawnione hasło główne" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Twoja organizacji włączyła autouzupełnianie podczas wczytywania strony." + }, + "howToAutofill": { + "message": "Jak autouzupełniać" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Rozumiem" + }, + "autofillSettings": { + "message": "Ustawienia autouzupełniania" + }, + "autofillShortcut": { + "message": "Skrót klawiaturowy autouzupełniania" + }, + "autofillShortcutNotSet": { + "message": "Skrót autouzupełniania nie jest ustawiony. Zmień to w ustawieniach przeglądarki." + }, + "autofillShortcutText": { + "message": "Skrót autouzupełniania to: $COMMAND$. Zmień to w ustawieniach przeglądarki.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Domyślny skrót autouzupełniania: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logowanie do" + }, + "opensInANewWindow": { + "message": "Otwiera w nowym oknie" + }, + "deviceApprovalRequired": { + "message": "Wymagane zatwierdzenie urządzenia. Wybierz opcję zatwierdzenia poniżej:" + }, + "rememberThisDevice": { + "message": "Zapamiętaj to urządzenie" + }, + "uncheckIfPublicDevice": { + "message": "Odznacz jeśli używasz publicznego urządzenia" + }, + "approveFromYourOtherDevice": { + "message": "Zatwierdź z innego twojego urządzenia" + }, + "requestAdminApproval": { + "message": "Poproś administratora o zatwierdzenie" + }, + "approveWithMasterPassword": { + "message": "Zatwierdź przy użyciu hasła głównego" + }, + "ssoIdentifierRequired": { + "message": "Identyfikator organizacji jest wymagany." + }, + "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." + }, + "general": { + "message": "Ogólne" + }, + "display": { + "message": "Wyświetl" + }, + "accountSuccessfullyCreated": { + "message": "Konto pomyślnie utworzone!" + }, + "adminApprovalRequested": { + "message": "Poproszono administratora o zatwierdzenie" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Twoja prośba została wysłana do Twojego administratora." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Zostaniesz powiadomiony po zatwierdzeniu." + }, + "troubleLoggingIn": { + "message": "Problem z zalogowaniem?" + }, + "loginApproved": { + "message": "Logowanie zatwierdzone" + }, + "userEmailMissing": { + "message": "Brak adresu e-mail użytkownika" + }, + "deviceTrusted": { + "message": "Zaufano urządzeniu" + }, + "inputRequired": { + "message": "Dane wejściowe są wymagane." + }, + "required": { + "message": "wymagane" + }, + "search": { + "message": "Szukaj" + }, + "inputMinLength": { + "message": "Dane wejściowe muszą zawierać co najmniej $COUNT$ znaki(-ów).", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Dane wejściowe nie mogą przekraczać długości $COUNT$ znaków.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Następujące znaki są niedozwolone: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Wartość wejściowa musi wynosić co najmniej $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Wartość wejściowa nie może przekraczać $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Co najmniej 1 e-mail jest nieprawidłowy" + }, + "inputTrimValidator": { + "message": "Tekst nie może zawierać tylko spacji.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Dane wejściowe nie są adresem e-mail." + }, + "fieldsNeedAttention": { + "message": "Pola powyżej wymagające Twojej uwagi: $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Wybierz --" + }, + "multiSelectPlaceholder": { + "message": "-- Pisz, aby filtrować --" + }, + "multiSelectLoading": { + "message": "Pobieranie opcji..." + }, + "multiSelectNotFound": { + "message": "Nie znaleziono żadnych pozycji" + }, + "multiSelectClearAll": { + "message": "Wyczyść wszystko" + }, + "plusNMore": { + "message": "+ $QUANTITY$ więcej", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Podmenu" + }, + "toggleCollapse": { + "message": "Zwiń/rozwiń", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Odblokuj konto", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Miejsce docelowe importu" + }, + "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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Potwierdź" + }, + "savePasskey": { + "message": "Zapisz passkey" + }, + "savePasskeyNewLogin": { + "message": "Zapisz passkey jako nowe dane logowania" + }, + "choosePasskey": { + "message": "Wybierz dane logowania do których przypisać passkey" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "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ć." + }, + "useBrowserName": { + "message": "Użyj przeglądarki" + }, + "multifactorAuthenticationCancelled": { + "message": "Uwierzytelnianie wieloskładnikowe zostało anulowane" + }, + "noLastPassDataFound": { + "message": "Nie znaleziono danych LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Nieprawidłowa nazwa użytkownika lub hasło" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index f4dde8252cdb..0658070feeb5 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Autopreencher" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Gerar Senha (copiada)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Sem credenciais correspondentes." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Desbloqueie seu cofre" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Ajuda & Feedback" }, + "helpCenter": { + "message": "Central de Ajuda" + }, + "communityForums": { + "message": "Explore os fóruns da comunidade" + }, + "contactSupport": { + "message": "Contate o suporte Bitwarden" + }, "sync": { "message": "Sincronizar" }, @@ -245,7 +278,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { "message": "Número de Palavras" @@ -329,6 +362,12 @@ "other": { "message": "Outros" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Avaliar a Extensão" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Bloquear Agora" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Imediatamente" }, @@ -424,13 +466,20 @@ "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A senha mestre é obrigatória." + "message": "A senha mestra é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "É necessário redigitar a senha mestre." + "message": "É necessário redigitar a senha mestra." }, "masterPasswordMinlength": { - "message": "A senha mestre deve ter pelo menos 8 caracteres." + "message": "A senha mestra deve ter pelo menos $VALUE$ caracteres.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "A confirmação da senha mestra não corresponde." @@ -576,6 +625,9 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Mostrar cartões em páginas com guias." }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Peça para atualizar a senha de login quando uma mudança for detectada em um site." }, + "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": "Você quer atualizar esta senha no Bitwarden?" }, "notificationChangeSave": { "message": "Atualizar" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostrar opções de menu de contexto" }, "contextMenuItemDesc": { "message": "Use um duplo clique para acessar a geração de usuários e senhas correspondentes para o site. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Detecção de Correspondência de URI Padrão", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Altere o tema de cores do aplicativo." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Escuro", "description": "Dark color" @@ -649,7 +722,7 @@ "message": "Exportar Cofre" }, "fileFormat": { - "message": "Formato do Arquivo" + "message": "Formato de arquivo" }, "warning": { "message": "AVISO", @@ -744,10 +817,10 @@ "message": "O tamanho máximo do arquivo é de 500 MB." }, "featureUnavailable": { - "message": "Recurso Indisponível" + "message": "Funcionalidade Indisponível" }, - "updateKey": { - "message": "Você não pode usar este recurso, até você atualizar sua chave de criptografia." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Assinatura Premium" @@ -762,16 +835,16 @@ "message": "Atualizar Assinatura" }, "premiumNotCurrentMember": { - "message": "Você não é atualmente um membro premium." + "message": "Você não é um membro Premium atualmente." }, "premiumSignUpAndGet": { - "message": "Registe-se para uma assinatura premium e obtenha:" + "message": "Registre-se para uma assinatura Premium e obtenha:" }, "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." }, - "ppremiumSignUpTwoStep": { - "message": "Opções de autenticação de duas etapas adicionais como YubiKey, FIDO U2F, e Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." @@ -783,7 +856,7 @@ "message": "Prioridade no suporte ao cliente." }, "ppremiumSignUpFuture": { - "message": "Todos os recursos premium no futuro. Mais em breve!" + "message": "Todas as funcionalidades Premium no futuro. Mais em breve!" }, "premiumPurchase": { "message": "Comprar Premium" @@ -813,7 +886,7 @@ "message": "Copiar TOTP automaticamente" }, "disableAutoTotpCopyDesc": { - "message": "Se a sua credencial tiver uma chave de autenticação anexada, o código de verificação TOTP será copiado automaticamente para a área de transferência quando você autopreencher a credencial." + "message": "Se sua credencial tiver uma chave de autenticação, copie o código de verificação TOTP quando for autopreenchê-la." }, "enableAutoBiometricsPrompt": { "message": "Pedir biometria ao iniciar" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "As URLs do ambiente foram salvas." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Ativar o Autopreenchimento ao Carregar a Página" }, @@ -960,10 +1058,10 @@ "message": "Se um formulário de login for detectado, realizar automaticamente um auto-preenchimento quando a página web carregar." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Sites comprometidos ou não confiáveis podem tomar vantagem do autopreenchimento ao carregar a página." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Saiba mais sobre preenchimento automático" }, "defaultAutoFillOnPageLoad": { "message": "Configuração de autopreenchimento padrão para itens de credenciais" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Mostrar uma imagem reconhecível ao lado de cada login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Mostrar contador de insígnia" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restaurar Item" }, - "restoreItemConfirmation": { - "message": "Você tem certeza que deseja restaurar esse item?" - }, "restoredItem": { "message": "Item Restaurado" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item Auto-Preenchido" }, + "insecurePageWarning": { + "message": "Aviso: Esta é uma página HTTP não segura, e qualquer informação que você enviar poderá ser interceptada e modificada por outras pessoas. Este login foi originalmente salvo em uma página segura (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Você ainda deseja preencher esse login?" + }, + "autofillIframeWarning": { + "message": "O formulário está hospedado em um domínio diferente do URI do seu login salvo. Escolha OK para preencher automaticamente mesmo assim ou Cancelar para parar." + }, + "autofillIframeWarningTip": { + "message": "Para evitar este aviso no futuro, salve este URI, $HOSTNAME$, no seu item de login no Bitwarden para este site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Definir Senha Mestra" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirme a nova senha mestre" + }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "A biometria com o navegador não é suportada neste dispositivo." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permissão não fornecida" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Uma política de organização está afetando suas opções de propriedade." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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": "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ não é um domínio válido", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Inscrição Automática" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Selecionar pasta..." }, - "ssoCompleteRegistration": { - "message": "Para concluir o login com o SSO, defina uma senha mestra para acessar e proteger o seu cofre." + "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" }, "hours": { "message": "Horas" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Seu tempo de espera no cofre excede as restrições estabelecidas por sua organização." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exportando o Cofre Pessoal" }, - "exportingPersonalVaultDescription": { - "message": "Apenas os itens pessoais do cofre associados com $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "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." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Fazendo login em $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Versão do servidor" }, - "selfHosted": { - "message": "Auto-hospedado" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Terceiros" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Lembrar e-mail" }, + "loginWithDevice": { + "message": "Fazer login com dispositivo" + }, + "loginWithDeviceEnabledInfo": { + "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" + }, + "fingerprintPhraseHeader": { + "message": "Frase de impressão digital" + }, + "fingerprintMatchInfo": { + "message": "Certifique-se que o cofre esteja desbloqueado e que a frase de impressão digital corresponda à do outro dispositivo." + }, + "resendNotification": { + "message": "Reenviar notificação" + }, + "viewAllLoginOptions": { + "message": "Ver todas as opções de login" + }, + "notificationSentDevice": { + "message": "Uma notificação foi enviada para seu dispositivo." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Senha Mestra comprometida" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "Como autopreencher" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Entendi" + }, + "autofillSettings": { + "message": "Configurações de autopreenchimento" + }, + "autofillShortcut": { + "message": "Atalho para autopreenchimento" + }, + "autofillShortcutNotSet": { + "message": "O atalho de preenchimento automático não está definido. Altere-o nas configurações do navegador." + }, + "autofillShortcutText": { + "message": "O atalho de preenchimento automático é: $COMMAND$. Altere-o nas configurações do navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Atalho padrão de autopreenchimento: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Abrir em uma nova janela" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "eu": { + "message": "EU", + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index cdc2836bc47c..1467ee0b1470 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden - Gestor de Palavras-passe", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -20,7 +20,7 @@ "message": "Iniciar sessão" }, "enterpriseSingleSignOn": { - "message": "Início de Sessão Único da Empresa" + "message": "Início de sessão único para empresas" }, "cancel": { "message": "Cancelar" @@ -32,22 +32,22 @@ "message": "Submeter" }, "emailAddress": { - "message": "Endereço de Email" + "message": "Endereço de e-mail" }, "masterPass": { - "message": "Palavra-passe Mestra" + "message": "Palavra-passe mestra" }, "masterPassDesc": { - "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." + "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não há forma de recuperar a palavra-passe no caso de a esquecer." }, "masterPassHintDesc": { - "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." + "message": "Uma dica da palavra-passe mestra pode ajudá-lo a lembrar-se da sua palavra-passe, caso se esqueça dela." }, "reTypeMasterPass": { - "message": "Re-digite a palavra-passe mestra" + "message": "Reintroduza a palavra-passe mestra" }, "masterPassHint": { - "message": "Dica da Palavra-passe Mestra (opcional)" + "message": "Dica da palavra-passe mestra (opcional)" }, "tab": { "message": "Separador" @@ -56,10 +56,10 @@ "message": "Cofre" }, "myVault": { - "message": "O meu Cofre" + "message": "O meu cofre" }, "allVaults": { - "message": "Todos os Cofres" + "message": "Todos os cofres" }, "tools": { "message": "Ferramentas" @@ -68,10 +68,10 @@ "message": "Definições" }, "currentTab": { - "message": "Separador Atual" + "message": "Separador atual" }, "copyPassword": { - "message": "Copiar Palavra-passe" + "message": "Copiar palavra-passe" }, "copyNote": { "message": "Copiar nota" @@ -80,46 +80,70 @@ "message": "Copiar URI" }, "copyUsername": { - "message": "Copiar Nome de Utilizador" + "message": "Copiar nome de utilizador" }, "copyNumber": { - "message": "Copiar Número" + "message": "Copiar número" }, "copySecurityCode": { "message": "Copiar código de segurança" }, "autoFill": { - "message": "Auto-preencher" + "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)" + "message": "Gerar palavra-passe (copiada)" }, "copyElementIdentifier": { "message": "Copiar nome do campo personalizado" }, "noMatchingLogins": { - "message": "Sem credencias correspondidas." + "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": "Desbloqueie o seu cofre" + "message": "Desbloquear o cofre" }, "loginToVaultMenu": { "message": "Inicie sessão para abrir o seu cofre" }, "autoFillInfo": { - "message": "Não existem credenciais disponíveis para auto-preencher para o separador de navegador atual." + "message": "Não existem credenciais disponíveis para preenchimento automático no separador atual do navegador." }, "addLogin": { "message": "Adicionar uma credencial" }, "addItem": { - "message": "Adicionar Item" + "message": "Adicionar item" }, "passwordHint": { "message": "Dica da palavra-passe" }, "enterEmailToGetHint": { - "message": "Introduza o endereço de email da sua conta para receber a dica da sua palavra-passe mestra." + "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" @@ -128,16 +152,16 @@ "message": "Continuar" }, "sendVerificationCode": { - "message": "Envie um código de verificação para o seu e-mail" + "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { - "message": "Enviar o código" + "message": "Enviar código" }, "codeSent": { "message": "Código enviado" }, "verificationCode": { - "message": "Código de Verificação" + "message": "Código de verificação" }, "confirmIdentity": { "message": "Confirme a sua identidade para continuar." @@ -146,24 +170,24 @@ "message": "Conta" }, "changeMasterPassword": { - "message": "Alterar Palavra-passe Mestra" + "message": "Alterar palavra-passe mestra" }, "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." }, "yourAccountsFingerprint": { - "message": "A frase de impressão digital da sua conta", + "message": "Frase de impressão digital da sua 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": "Início de Sessão de Dois Passos" + "message": "Verificação de dois passos" }, "logOut": { - "message": "Terminar Sessão" + "message": "Terminar sessão" }, "about": { - "message": "Acerca" + "message": "Acerca de" }, "version": { "message": "Versão" @@ -175,13 +199,13 @@ "message": "Mover" }, "addFolder": { - "message": "Adicionar Pasta" + "message": "Adicionar pasta" }, "name": { "message": "Nome" }, "editFolder": { - "message": "Editar Pasta" + "message": "Editar pasta" }, "deleteFolder": { "message": "Eliminar pasta" @@ -195,11 +219,20 @@ "helpFeedback": { "message": "Ajuda e feedback" }, + "helpCenter": { + "message": "Centro de ajuda do Bitwarden" + }, + "communityForums": { + "message": "Explorar os fóruns da comunidade do Bitwarden" + }, + "contactSupport": { + "message": "Contactar o suporte do Bitwarden" + }, "sync": { "message": "Sincronizar" }, "syncVaultNow": { - "message": "Sincronizar cofre agora" + "message": "Sincronizar o cofre agora" }, "lastSync": { "message": "Última sincronização:" @@ -245,7 +278,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { "message": "Número de palavras" @@ -264,13 +297,13 @@ "message": "Números mínimos" }, "minSpecial": { - "message": "Especiais minímos" + "message": "Caracteres especiais minímos" }, "avoidAmbChar": { "message": "Evitar caracteres ambíguos" }, "searchVault": { - "message": "Pesquisar cofre" + "message": "Procurar no cofre" }, "edit": { "message": "Editar" @@ -282,7 +315,7 @@ "message": "Não existem itens para listar." }, "itemInformation": { - "message": "Informação do item" + "message": "Informações do item" }, "username": { "message": "Nome de utilizador" @@ -291,7 +324,7 @@ "message": "Palavra-passe" }, "passphrase": { - "message": "Frase-passe" + "message": "Frase de acesso" }, "favorite": { "message": "Favorito" @@ -309,7 +342,7 @@ "message": "Pasta" }, "deleteItem": { - "message": "Apagar item" + "message": "Eliminar item" }, "viewItem": { "message": "Ver item" @@ -318,7 +351,7 @@ "message": "Iniciar" }, "website": { - "message": "Website" + "message": "Site" }, "toggleVisibility": { "message": "Alternar visibilidade" @@ -329,20 +362,26 @@ "other": { "message": "Outros" }, + "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" + }, "rateExtension": { "message": "Avaliar a extensão" }, "rateExtensionDesc": { - "message": "Por favor considere ajudar-nos com uma boa análise!" + "message": "Por favor, considere ajudar-nos com uma boa avaliação!" }, "browserNotSupportClipboard": { - "message": "O seu navegador web não suporta cópia fácil da área de transferência. Em alternativa, copie manualmente." + "message": "O seu navegador Web não suporta a cópia fácil da área de transferência. Em vez disso, copie manualmente." }, "verifyIdentity": { - "message": "Verificar Identidade" + "message": "Verificar identidade" }, "yourVaultIsLocked": { - "message": "O seu cofre está bloqueado. Verifique a sua palavra-passe mestra para continuar." + "message": "O seu cofre está bloqueado. Verifique a sua identidade para continuar." }, "unlock": { "message": "Desbloquear" @@ -364,11 +403,14 @@ "message": "Palavra-passe mestra inválida" }, "vaultTimeout": { - "message": "Expiração do cofre" + "message": "Tempo limite do cofre" }, "lockNow": { "message": "Bloquear agora" }, + "lockAll": { + "message": "Bloquear tudo" + }, "immediately": { "message": "Imediatamente" }, @@ -403,10 +445,10 @@ "message": "4 horas" }, "onLocked": { - "message": "Quando o sistema está bloqueado" + "message": "No bloqueio do sistema" }, "onRestart": { - "message": "Ao reiniciar o sistema" + "message": "Ao reiniciar o navegador" }, "never": { "message": "Nunca" @@ -418,37 +460,44 @@ "message": "Ocorreu um erro" }, "emailRequired": { - "message": "O endereço de email é requerido." + "message": "É necessário o endereço de e-mail." }, "invalidEmail": { - "message": "Endereço de email inválido." + "message": "Endereço de e-mail inválido." }, "masterPasswordRequired": { - "message": "A palavra-passe mestra é necessária." + "message": "É necessária a palavra-passe mestra." }, "confirmMasterPasswordRequired": { "message": "É necessário reescrever a palavra-passe mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "A palavra-passe mestra deve ter pelo menos $VALUE$ caracteres.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "A confirmação da palavra-passe mestra não corresponde." }, "newAccountCreated": { - "message": "A sua nova conta foi criada! Agora pode iniciar sessão." + "message": "A sua nova conta foi criada! Pode agora iniciar sessão." }, "masterPassSent": { - "message": "Enviámos-lhe um email com a dica da sua palavra-passe mestra." + "message": "Enviámos-lhe um e-mail com a dica da sua palavra-passe mestra." }, "verificationCodeRequired": { - "message": "O código de verificação é requerido." + "message": "É necessário o código de verificação." }, "invalidVerificationCode": { "message": "Código de verificação inválido" }, "valueCopied": { - "message": "$VALUE$ copiado(a)", + "message": "$VALUE$ copiado", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -458,7 +507,7 @@ } }, "autofillError": { - "message": "Não é possível auto-preencher o item selecionado nesta página. Em alternativa, copie e cole a informação." + "message": "Não é possível preencher automaticamente o item selecionado nesta página. Em vez disso, copie e cole as informações." }, "loggedOut": { "message": "Sessão terminada" @@ -479,7 +528,7 @@ "message": "Ocorreu um erro inesperado." }, "nameRequired": { - "message": "O nome é requerido." + "message": "É necessário o nome." }, "addedFolder": { "message": "Pasta adicionada" @@ -488,13 +537,13 @@ "message": "Alterar palavra-passe mestra" }, "changeMasterPasswordConfirmation": { - "message": "Pode alterar a sua palavra-passe mestra no cofre web bitwarden.com. Pretende visitar o website agora?" + "message": "Pode alterar o seu endereço de e-mail no cofre do site bitwarden.com. Deseja visitar o site agora?" }, "twoStepLoginConfirmation": { - "message": "O início de sessão de dois passos torna a sua conta mais segura ao requerer 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 email. O início de sessão de dois passos pode ser ativado no cofre web bitwarden.com. Pretende visitar o website agora?" + "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?" }, "editedFolder": { - "message": "Pasta editada" + "message": "Pasta guardada" }, "deleteFolderConfirmation": { "message": "Tem a certeza de que pretende eliminar esta pasta?" @@ -506,13 +555,13 @@ "message": "Tutorial de introdução" }, "gettingStartedTutorialVideo": { - "message": "Veja o nosso tutorial de introdução e saiba como tirar o máximo partido da extensão de navegador." + "message": "Veja o nosso tutorial de introdução para saber como tirar o máximo partido da extensão do navegador." }, "syncingComplete": { - "message": "Sincronização completada" + "message": "Sincronização concluída" }, "syncingFailed": { - "message": "Sincronização falhada" + "message": "Falha na sincronização" }, "passwordCopied": { "message": "Palavra-passe copiada" @@ -537,101 +586,125 @@ "message": "Item adicionado" }, "editedItem": { - "message": "Item editado" + "message": "Item guardado" }, "deleteItemConfirmation": { - "message": "Tem a certeza de que pretende apagar este item?" + "message": "Tem a certeza de que pretende eliminar este item?" }, "deletedItem": { - "message": "Item enviado para o lixo" + "message": "Item movido para o lixo" }, "overwritePassword": { - "message": "Sobreescrever palavra-passe" + "message": "Substituir palavra-passe" }, "overwritePasswordConfirmation": { - "message": "Tem a certeza de que pretende sobreescrever a palavra-passe atual?" + "message": "Tem a certeza de que pretende substituir a palavra-passe atual?" }, "overwriteUsername": { - "message": "Sobrescrever Nome de Utilizador" + "message": "Substituir nome de utilizador" }, "overwriteUsernameConfirmation": { - "message": "Tem a certeza de que deseja sobrescrever o nome de utilizador atual?" + "message": "Tem a certeza de que pretende substituir o nome de utilizador atual?" }, "searchFolder": { - "message": "Pesquisar pasta" + "message": "Procurar na pasta" }, "searchCollection": { - "message": "Pesquisar coleção" + "message": "Procurar na coleção" }, "searchType": { - "message": "Pesquisar tipo" + "message": "Procurar no tipo" }, "noneFolder": { - "message": "Nenhuma pasta", + "message": "Sem pasta", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Pedir para adicionar credencial" }, "addLoginNotificationDesc": { - "message": "A \"notificação de adicionar credencial\" solicita-lhe automaticamente a guardar novas credenciais para o seu cofre quando inicia sessão nas mesmas pela primeira vez." + "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." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Mostrar cartões na página Separador" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Listar itens de cartões na página Separador para facilitar o preenchimento automático." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostrar identidades na página Separador" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Listar itens de identidades na página Separador para facilitar o preenchimento automático." }, "clearClipboard": { "message": "Limpar área de transferência", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Limpar automaticamente valores copiados da sua área de transferência.", + "message": "Limpar automaticamente os valores copiados da sua área de transferência.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Deve o Bitwarden memorizar esta palavra-passe para si?" + "message": "Deve o Bitwarden memorizar esta palavra-passe por si?" }, "notificationAddSave": { - "message": "Sim, guardar agora" + "message": "Guardar" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Pedir para atualizar credencial existente" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "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?" }, "notificationChangeSave": { - "message": "Sim, atualizar agora" + "message": "Atualizar" + }, + "notificationUnlockDesc": { + "message": "Desbloqueie o seu cofre Bitwarden para completar o pedido de preenchimento automático." + }, + "notificationUnlock": { + "message": "Desbloquear" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Mostrar opções do menu de contexto" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "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." }, "defaultUriMatchDetectionDesc": { - "message": "Escolha a maneira predefinida pela qual a deteção de correspondência de URI é manuseada para credenciais ao realizar ações como auto-preenchimento." + "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." }, "theme": { "message": "Tema" }, "themeDesc": { - "message": "Altere o tema de cor da aplicação." + "message": "Alterar 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", @@ -642,7 +715,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized escuro", + "message": "Solarized (escuro)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -656,16 +729,16 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirmar exportação de cofre" + "message": "Confirmar a exportação do cofre" }, "exportWarningDesc": { - "message": "Esta exportação contém os seus dados do cofre num formato desencriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais inseguros (como email). Apague-a imediatamente após a utilizar." + "message": "Esta exportação contém os dados do seu cofre num formato não encriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais não seguros (como o e-mail). Elimine-o imediatamente após terminar a sua utilização." }, "encExportKeyWarningDesc": { - "message": "Esta exportação cifra os seus dados utilizando a chave de cifragem da sua conta. Se alguma vez mudar a chave de cifragem da sua conta, deve fazer a exportação novamente, já que não conseguirá decifrar este ficheiro de exportação." + "message": "Esta exportação encripta os seus dados utilizando a chave de encriptação da sua conta. Se alguma vez regenerar a chave de encriptação da sua conta, deve exportar novamente, uma vez que não conseguirá desencriptar este ficheiro de exportação." }, "encExportAccountWarningDesc": { - "message": "As chaves de encriptação de conta são únicas para cada conta de utilizador Bitwarden, pelo que não se pode importar uma exportação encriptada para uma conta diferente." + "message": "As chaves de encriptação da conta são únicas para cada conta de utilizador Bitwarden, pelo que não é possível importar uma exportação encriptada para uma conta diferente." }, "exportMasterPassword": { "message": "Introduza a sua palavra-passe mestra para exportar os dados do seu cofre." @@ -674,13 +747,13 @@ "message": "Partilhado" }, "learnOrg": { - "message": "Saiba mais sobre as Organizações" + "message": "Saiba mais sobre as organizações" }, "learnOrgConfirmation": { - "message": "O Bitwarden permite que você compartilhe os itens do seu cofre com outras pessoas usando uma organização. Gostaria de visitar o site bitwarden.com para saber mais?" + "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?" }, "moveToOrganization": { - "message": "Mudança para Organização" + "message": "Mover para a organização" }, "share": { "message": "Partilhar" @@ -699,13 +772,13 @@ } }, "moveToOrgDesc": { - "message": "Escolha uma organização para a qual deseja mover este item. A mudança para uma organização transfere a propriedade do item para essa organização. Deixará de ser o proprietário directo deste item uma vez que tenha sido movido." + "message": "Escolha uma organização para a qual pretende mover este item. Mover para uma organização transfere a propriedade do item para essa organização. Deixará de ser o proprietário direto deste item depois de este ter sido movido." }, "learnMore": { "message": "Saber mais" }, "authenticatorKeyTotp": { - "message": "Chave de autenticador (TOTP)" + "message": "Chave de autenticação (TOTP)" }, "verificationCodeTotp": { "message": "Código de verificação (TOTP)" @@ -720,10 +793,10 @@ "message": "Eliminar anexo" }, "deleteAttachmentConfirmation": { - "message": "Tem a certeza de que deseja eliminar este anexo?" + "message": "Tem a certeza de que pretende eliminar este anexo?" }, "deletedAttachment": { - "message": "Anexo apagado" + "message": "Anexo eliminado" }, "newAttachment": { "message": "Adicionar novo anexo" @@ -732,13 +805,13 @@ "message": "Sem anexos." }, "attachmentSaved": { - "message": "O anexo foi guardado." + "message": "Anexo guardado" }, "file": { "message": "Ficheiro" }, "selectFile": { - "message": "Selecione um ficheiro." + "message": "Selecionar um ficheiro" }, "maxFileSize": { "message": "O tamanho máximo do ficheiro é de 500 MB." @@ -746,35 +819,35 @@ "featureUnavailable": { "message": "Funcionalidade indisponível" }, - "updateKey": { - "message": "Não pode utilizar esta funcionalidade até atualizar a sua chave de encriptação." + "encryptionKeyMigrationRequired": { + "message": "É necessária a migração da chave de encriptação. Inicie sessão através do cofre Web para atualizar a sua chave de encriptação." }, "premiumMembership": { - "message": "Adesão Premium" + "message": "Subscrição Premium" }, "premiumManage": { - "message": "Gerir adesão" + "message": "Gerir subscrição" }, "premiumManageAlert": { - "message": "Pode gerir a sua adesão premium no cofre web bitwarden.com. Pretende visitar o website agora?" + "message": "Pode gerir a sua subscrição no cofre web em bitwarden.com. Pretende visitar o site agora?" }, "premiumRefresh": { - "message": "Atualizar adesão" + "message": "Atualizar subscrição" }, "premiumNotCurrentMember": { - "message": "Não é atualmente um membro premium." + "message": "Atualmente, não é um membro Premium." }, "premiumSignUpAndGet": { - "message": "Registe-se para uma adesão premium e obtenha:" + "message": "Subscreva uma subscrição Premium e obtenha:" }, "ppremiumSignUpStorage": { "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, - "ppremiumSignUpTwoStep": { - "message": "Opções de início de sessão de dois passos adicionais como YubiKey, FIDO U2F, e Duo." + "premiumSignUpTwoStepOptions": { + "message": "Opções proprietárias de verificação de dois passos, como YubiKey e Duo." }, "ppremiumSignUpReports": { - "message": "Higiene de palavras-passe, saúde das contas, e relatórios de brechas de dados para manter o seu cofre seguro." + "message": "Higiene de palavras-passe, saúde da conta e relatórios de violação de dados para manter o seu cofre seguro." }, "ppremiumSignUpTotp": { "message": "Gerador de códigos de verificação TOTP (2FA) para credenciais no seu cofre." @@ -783,16 +856,16 @@ "message": "Prioridade no apoio ao cliente." }, "ppremiumSignUpFuture": { - "message": "Todas as funcionalidades premium futuras. Mais a chegar brevemente!" + "message": "Todas as futuras funcionalidades Premium. Mais em breve!" }, "premiumPurchase": { - "message": "Comprar Premium" + "message": "Adquirir Premium" }, "premiumPurchaseAlert": { - "message": "Pode comprar adesão premium no cofre web bitwarden.com. Pretende visitar o website agora?" + "message": "Pode adquirir uma subscrição Premium no cofre web em bitwarden.com. Pretende visitar o site agora?" }, "premiumCurrentMember": { - "message": "É um membro premium!" + "message": "É um membro Premium!" }, "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." @@ -807,28 +880,28 @@ } }, "refreshComplete": { - "message": "Atualização completada" + "message": "Atualização concluída" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Copiar TOTP automaticamente" }, "disableAutoTotpCopyDesc": { - "message": "Se o seu início de sessão tem uma chave de autenticador anexada ao mesmo, o código de verificação TOTP é copiado automaticamente para a sua área de transferência quando quer que auto-preencha o início de sessão." + "message": "Se uma credencial tiver uma chave de autenticação, copie o código de verificação TOTP para a sua área de transferência quando preencher automaticamente o início de sessão." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Pedir biometria ao iniciar" }, "premiumRequired": { - "message": "Premium requerido" + "message": "É necessária uma subscrição Premium" }, "premiumRequiredDesc": { - "message": "É requerida uma adesão premium para utilizar esta funcionalidade." + "message": "É necessária uma subscrição Premium para utilizar esta funcionalidade." }, "enterVerificationCodeApp": { - "message": "Introduza o código de verificação de 6 dígitos da sua aplicação de autenticador." + "message": "Introduza o código de verificação de 6 dígitos da sua aplicação de autenticação." }, "enterVerificationCodeEmail": { - "message": "Introduza o código de verificação de 6 dígitos que foi enviado por email para $EMAIL$.", + "message": "Introduza o código de verificação de 6 dígitos que foi enviado por e-mail para $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -837,7 +910,7 @@ } }, "verificationCodeEmailSent": { - "message": "Email de verificação enviado para $EMAIL$.", + "message": "E-mail de verificação enviado para $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -846,13 +919,13 @@ } }, "rememberMe": { - "message": "Memorizar-me" + "message": "Memorizar" }, "sendVerificationCodeEmailAgain": { - "message": "Enviar código de verificação novamente" + "message": "Enviar e-mail com o código de verificação novamente" }, "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de início de sessão de dois passos" + "message": "Utilizar outro método de verificação de dois passos" }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." @@ -861,7 +934,7 @@ "message": "Introduza a sua chave de segurança na porta USB do seu computador. Se tiver um botão, toque no mesmo." }, "webAuthnNewTab": { - "message": "Para iniciar a verificação WebAuthn 2FA. Clique no botão abaixo para abrir um novo separador e siga as instruções fornecidas no novo separador." + "message": "Para iniciar a verificação do WebAuthn 2FA, clique no botão abaixo para abrir um novo separador e siga as instruções fornecidas no novo separador." }, "webAuthnNewTabOpen": { "message": "Abrir novo separador" @@ -873,64 +946,64 @@ "message": "Início de sessão indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem o início de sessão de dois passos ativado, no entanto, nenhum dos provedores de início de sessão de dois passos configurados são suportados por este navegador web." + "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores da verificação de dois passos configurada é suportado por este navegador Web." }, "noTwoStepProviders2": { - "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou adicione provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicação de autenticador)." + "message": "Por favor, utilize um navegador Web suportado (como o Chrome) e/ou adicione fornecedores adicionais que sejam mais bem suportados nos navegadores web (como uma aplicação de autenticação)." }, "twoStepOptions": { - "message": "Opções de início de sessão de dois passos" + "message": "Opções de verificação de dois passos" }, "recoveryCodeDesc": { - "message": "Perdeu o acesso a todos os seus provedores de dois passos? Utilize o seu código de recuperação para desativar todos os provedores de dois passos da sua conta." + "message": "Perdeu o acesso a todos os seus fornecedores de verificação de dois passos? Utilize o seu código de recuperação para desativar todos os fornecedores de verificação de dois passos da sua conta." }, "recoveryCodeTitle": { "message": "Código de recuperação" }, "authenticatorAppTitle": { - "message": "Aplicação de autenticador" + "message": "Aplicação de autenticação" }, "authenticatorAppDesc": { - "message": "Utilize uma aplicação de autenticador (tal como Authy ou Google Authenticator) para gerar códigos de verificação baseados na hora.", + "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." }, "yubiKeyTitle": { "message": "Chave de segurança YubiKey OTP" }, "yubiKeyDesc": { - "message": "Utilize uma YubiKey para aceder à sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." + "message": "Utilize uma YubiKey para aceder à sua conta. Funciona com os dispositivos YubiKey 4, 4 Nano, 4C e NEO." }, "duoDesc": { - "message": "Verifique com Duo Security utilizando a aplicação Duo Mobile, SMS, chamada telefónica, ou chave de segurança U2F.", + "message": "Verifique com a Duo Security utilizando a aplicação Duo Mobile, SMS, chamada telefónica ou chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verifique com 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": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Utilize qualquer chave de segurança ativada pela WebAuthn para aceder à sua conta." + "message": "Utilize qualquer chave de segurança compatível com o WebAuthn para aceder à sua conta." }, "emailTitle": { - "message": "Email" + "message": "E-mail" }, "emailDesc": { - "message": "Os códigos de verificação vão ser enviados para si." + "message": "Os códigos de verificação ser-lhe-ão enviados por e-mail." }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, "selfHostedEnvironmentFooter": { - "message": "Especifique o URL de base da sua instalação local do Bitwarden alojada nas suas premissas." + "message": "Especifique o URL de base da sua instalação Bitwarden hospedada no local." }, "customEnvironment": { "message": "Ambiente personalizado" }, "customEnvironmentFooter": { - "message": "Para utilizadores avançados. Pode especificar o URL de base de cada serviço independentemente." + "message": "Para utilizadores avançados. Pode especificar o URL de base de cada serviço de forma independente." }, "baseUrl": { "message": "URL do servidor" @@ -939,7 +1012,7 @@ "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "URL do servidor do cofre web" + "message": "URL do servidor do cofre Web" }, "identityUrl": { "message": "URL do servidor de identidade" @@ -951,46 +1024,71 @@ "message": "URL do servidor de ícones" }, "environmentSaved": { - "message": "Os URLs de ambiente foram guardados." + "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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": "Desligado", + "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" }, "enableAutoFillOnPageLoad": { - "message": "Ativar auto-preenchimento no carregar da página" + "message": "Preencher automaticamente ao carregar a página" }, "enableAutoFillOnPageLoadDesc": { - "message": "Se um formulário de início de sessão foram detetado, realizar automaticamente um auto-preenchimento quando a página web carregar." + "message": "Se for detetado um formulário de início de sessão, o preenchimento automático é efetuado quando a página Web é carregada." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Os sites comprometidos ou não confiáveis podem explorar o preenchimento automático ao carregar a página." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Saber mais sobre o preenchimento automático" }, "defaultAutoFillOnPageLoad": { - "message": "Predefinição padrão de preenchimento automático para itens de login" + "message": "Definição de preenchimento automático predefinido para itens de início de sessão" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Depois de activar o preenchimento automático no carregamento da página, pode activar ou desactivar a função de itens de início de sessão individuais. Esta é a configuração padrão para os itens de início de sessão que não estão configurados separadamente." + "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 no carregamento da página (se ativado em Opções)" + "message": "Preencher automaticamente ao carregar a página (se configurado nas Opções)" }, "autoFillOnPageLoadUseDefault": { - "message": "Usar padrão" + "message": "Utilizar a predefinição" }, "autoFillOnPageLoadYes": { - "message": "Preenchimento automático na carga da página" + "message": "Preencher automaticamente ao carregar a página" }, "autoFillOnPageLoadNo": { - "message": "Não preencher automaticamente no carregamento da página" + "message": "Não preencher automaticamente ao carregar a página" }, "commandOpenPopup": { - "message": "Abrir popup do cofre" + "message": "Abrir o pop-up do cofre" }, "commandOpenSidebar": { - "message": "Abrir cofre na barra lateral" + "message": "Abrir o cofre na barra lateral" }, "commandAutofillDesc": { - "message": "Auto-preencher o último início de sessão utilizado para o website atual" + "message": "Preencher automaticamente com a última credencial utilizada no site atual" }, "commandGeneratePasswordDesc": { "message": "Gerar e copiar uma nova palavra-passe aleatória para a área de transferência" @@ -999,7 +1097,7 @@ "message": "Bloquear o cofre" }, "privateModeWarning": { - "message": "O suporte do modo privado é experimental e alguns recursos são limitados." + "message": "O suporte do modo privado é experimental e algumas funcionalidades são limitadas." }, "customFields": { "message": "Campos personalizados" @@ -1020,36 +1118,39 @@ "message": "Texto" }, "cfTypeHidden": { - "message": "Ocultado" + "message": "Oculto" }, "cfTypeBoolean": { "message": "Booleano" }, "cfTypeLinked": { - "message": "Ligado", + "message": "Associado", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Valor vinculado", + "message": "Valor associado", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Clicar fora da janela popup para verificar o seu email pelo código de verificação irá causar com que este popup feche. Deseja abrir este popup numa nova janela para que este não se feche?" + "message": "Ao clicar fora da janela pop-up para verificar o código de verificação no seu e-mail fará com que este pop-up se feche. Pretende abrir esta janela pop-up numa nova janela para que não se feche?" }, "popupU2fCloseMessage": { - "message": "Este navegador não pode processar solicitações U2F nesta janela popup. Pretende abrir este popup numa nova janela para que inicie sessão utilizando U2F?" + "message": "Este navegador não pode processar pedidos U2F nesta janela pop-up. Pretende abrir este pop-up numa nova janela para poder iniciar sessão utilizando o U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostrar ícones do site" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "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": "Show badge counter" + "message": "Mostrar distintivo de contador" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Indica quantas credenciais tem para a página Web atual." }, "cardholderName": { "message": "Titular do cartão" @@ -1061,10 +1162,10 @@ "message": "Marca" }, "expirationMonth": { - "message": "Mês de expiração" + "message": "Mês de validade" }, "expirationYear": { - "message": "Ano de expiração" + "message": "Ano de validade" }, "expiration": { "message": "Expiração" @@ -1115,31 +1216,31 @@ "message": "Título" }, "mr": { - "message": "Sr" + "message": "Sr." }, "mrs": { - "message": "Sra" + "message": "Sr.ª" }, "ms": { - "message": "Sra" + "message": "Menina" }, "dr": { - "message": "Dr" + "message": "Dr." }, "mx": { - "message": "Mx" + "message": "Neutro" }, "firstName": { - "message": "Primeiro nome" + "message": "Nome próprio" }, "middleName": { - "message": "Nome do meio" + "message": "Segundo nome" }, "lastName": { - "message": "Último nome" + "message": "Apelido" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "identityName": { "message": "Nome de identidade" @@ -1157,7 +1258,7 @@ "message": "Número da licença" }, "email": { - "message": "Email" + "message": "E-mail" }, "phone": { "message": "Telefone" @@ -1175,10 +1276,10 @@ "message": "Endereço 3" }, "cityTown": { - "message": "Cidade / localidade" + "message": "Cidade / Localidade" }, "stateProvince": { - "message": "Estado / província" + "message": "Estado / Província" }, "zipPostalCode": { "message": "Código postal" @@ -1217,7 +1318,7 @@ "message": "Favoritos" }, "popOutNewWindow": { - "message": "Enviar para uma nova janela" + "message": "Abrir numa nova janela" }, "refresh": { "message": "Atualizar" @@ -1239,10 +1340,10 @@ "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Verifica se a palavra-passe foi exposta." + "message": "Verificar se a palavra-passe foi exposta." }, "passwordExposed": { - "message": "Esta palavra-passe foi exposta $VALUE$ vez(es) em brechas de dados. Deve alterá-la.", + "message": "Esta palavra-passe foi exposta $VALUE$ vez(es) em violações de dados. Deve alterá-la.", "placeholders": { "value": { "content": "$1", @@ -1251,18 +1352,18 @@ } }, "passwordSafe": { - "message": "Esta palavra-passe não foi encontrada em nenhuma brecha de dados conhecida. Esta deve ser segura de utilizar." + "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" }, "domainName": { - "message": "Nome do Domínio", + "message": "Nome do domínio", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Servidor", + "message": "Domínio", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1318,18 +1419,18 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Criado", + "message": "Criado a", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Palavra-passe atualizada", + "message": "Palavra-passe atualizada a", "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Tem a certeza de que pretende utilizar a opção \"Nunca\"? Definir as suas opções de bloqueio para \"Nunca\" armazena a chave de encriptação do seu cofre no seu dispositivo. Se utilizar esta opção deve assegurar-se de que mantém o seu dispositivo devidamente protegido." + "message": "Tem a certeza de que deseja utilizar a opção \"Nunca\"? Ao definir as opções de bloqueio para \"Nunca\" armazena a chave de encriptação do seu cofre no seu dispositivo. Se utilizar esta opção deve assegurar-se de que mantém o seu dispositivo devidamente protegido." }, "noOrganizationsList": { - "message": "Você não pertence a nenhuma organização. Organizações permitem-lhe partilhar itens em segurança com outros utilizadores." + "message": "Não pertence a nenhuma organização. As organizações permitem-lhe partilhar itens em segurança com outros utilizadores." }, "noCollectionsInList": { "message": "Não existem coleções para listar." @@ -1356,7 +1457,7 @@ "message": "Palavra-passe mestra fraca" }, "weakMasterPasswordDesc": { - "message": "A palavra-passe mestra que escolheu é fraca. Deve utilizar uma palavra-passe mestra forte (ou uma frase-passe) para proteger adequadamente a sua conta Bitwarden. Tem a certeza de que pretende utilizar esta palavra-passe mestra?" + "message": "A palavra-passe mestra que escolheu é fraca. Deve utilizar uma palavra-passe mestra forte (ou uma frase de acesso) para proteger adequadamente a sua conta Bitwarden. Tem a certeza de que pretende utilizar esta palavra-passe mestra?" }, "pin": { "message": "PIN", @@ -1366,40 +1467,40 @@ "message": "Desbloquear com PIN" }, "setYourPinCode": { - "message": "Defina o seu código PIN para desbloquear o Bitwarden. As suas definições PIN serão redefinidas se 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 completamente da aplicação." }, "pinRequired": { - "message": "O código PIN é requerido." + "message": "É necessário o código PIN." }, "invalidPin": { "message": "Código PIN inválido." }, "unlockWithBiometrics": { - "message": "Desbloquear com biométricos" + "message": "Desbloquear com biometria" }, "awaitDesktop": { - "message": "A aguardar confirmação do seu computador" + "message": "A aguardar confirmação da aplicação para computador" }, "awaitDesktopDesc": { - "message": "Por favor, confirme o uso de dados biométricos na aplicação Bitwarden Desktop para habilitar os dados biométricos do navegador." + "message": "Por favor, confirme a utilização da biometria na aplicação para computador Bitwarden para configurar a biometria no navegador." }, "lockWithMasterPassOnRestart": { - "message": "Bloquear com palavra-passe mestra quando reiniciar o navegador" + "message": "Bloquear com a palavra-passe mestra ao reiniciar o navegador" }, "selectOneCollection": { - "message": "Tem de selecionar pelo menos uma coleção." + "message": "Deve selecionar pelo menos uma coleção." }, "cloneItem": { - "message": "Clonar item" + "message": "Duplicar item" }, "clone": { - "message": "Clonar" + "message": "Duplicar" }, "passwordGeneratorPolicyInEffect": { - "message": "Uma ou mais políticas de organização estão a afetar as suas definições do gerador." + "message": "Uma ou mais políticas da organização estão a afetar as suas definições do gerador." }, "vaultTimeoutAction": { - "message": "Ação de expiração do cofre" + "message": "Ação de tempo limite do cofre" }, "lock": { "message": "Bloquear", @@ -1410,13 +1511,13 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Pesquisar lixo" + "message": "Procurar no lixo" }, "permanentlyDeleteItem": { "message": "Eliminar item permanentemente" }, "permanentlyDeleteItemConfirmation": { - "message": "Tem a certeza de que pretende eliminar este item permanentemente?" + "message": "Tem a certeza de que pretende eliminar permanentemente este item?" }, "permanentlyDeletedItem": { "message": "Item eliminado permanentemente" @@ -1424,32 +1525,56 @@ "restoreItem": { "message": "Restaurar item" }, - "restoreItemConfirmation": { - "message": "Tem a certeza de que pretende restaurar este item?" - }, "restoredItem": { "message": "Item restaurado" }, "vaultTimeoutLogOutConfirmation": { - "message": "Terminar sessão irá remover todos os acessos ao seu cofre e requer autenticação online após o período de expiração. Tem a certeza de que pretende utilizar esta definição?" + "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?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de expiração do cofre" + "message": "Confirmação da ação de tempo limite" }, "autoFillAndSave": { - "message": "Auto-preencher e guardar" + "message": "Preencher automaticamente e guardar" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-preenchido e URI guardado" + "message": "Item preenchido automaticamente e URI guardado" }, "autoFillSuccess": { - "message": "Item auto-preenchido" + "message": "Item preenchido automaticamente " + }, + "insecurePageWarning": { + "message": "Aviso: Esta é uma página HTTP não segura, e qualquer informação que submeta pode ser vista e alterada por outros. Esta credencial foi originalmente guardada numa página segura (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Ainda deseja preencher este início de sessão?" + }, + "autofillIframeWarning": { + "message": "O formulário está alojado num domínio diferente do URI da sua credencial guardada. Selecione OK para preencher automaticamente na mesma ou Cancelar para parar." + }, + "autofillIframeWarningTip": { + "message": "Para evitar este aviso no futuro, guarde este URI, $HOSTNAME$, no seu item de início de sessão do Bitwarden deste site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { "message": "Definir palavra-passe mestra" }, + "currentMasterPass": { + "message": "Palavra-passe mestra atual" + }, + "newMasterPass": { + "message": "Nova palavra-passe mestra" + }, + "confirmNewMasterPass": { + "message": "Confirmar a nova palavra-passe mestra" + }, "masterPasswordPolicyInEffect": { - "message": "Uma ou mais políticas da organização requerem que a sua palavra-passe mestra cumpra aos seguintes requisitos:" + "message": "Uma ou mais políticas da organização exigem que a sua palavra-passe mestra cumpra os seguintes requisitos:" }, "policyInEffectMinComplexity": { "message": "Pontuação mínima de complexidade de $SCORE$", @@ -1494,91 +1619,103 @@ "message": "Ao marcar esta caixa concorda com o seguinte:" }, "acceptPoliciesRequired": { - "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos." + "message": "Os Termos de utilização e a Política de privacidade não foram aceites." }, "termsOfService": { - "message": "Termos de serviço" + "message": "Termos de utilização" }, "privacyPolicy": { "message": "Política de privacidade" }, "hintEqualsPassword": { - "message": "A dica da sua senha não pode ser igual à senha." + "message": "A dica da sua palavra-passe não pode ser igual à sua palavra-passe." }, "ok": { "message": "Ok" }, "desktopSyncVerificationTitle": { - "message": "Verificação de sincronização do ambiente de trabalho" + "message": "Verificação da sincronização da aplicação para computador" }, "desktopIntegrationVerificationText": { - "message": "Por favor, verifique se a aplicação no computador mostra esta impressão digital: " + "message": "Verifique se a aplicação para computador apresenta esta impressão digital: " }, "desktopIntegrationDisabledTitle": { - "message": "Integração com o navegador não está ativada" + "message": "A integração do navegador não está configurada" }, "desktopIntegrationDisabledDesc": { - "message": "A integração com o navegador não está habilitada no aplicativo Bitwarden Desktop. Por favor, habilite-o nas configurações da aplicação para computador." + "message": "A integração do navegador não está configurada na aplicação para computador Bitwarden. Por favor, configure-a nas definições da aplicação para computador." }, "startDesktopTitle": { - "message": "Iniciar a aplicação Bitwarden Desktop" + "message": "Iniciar a aplicação para computador Bitwarden" }, "startDesktopDesc": { - "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + "message": "A aplicação para computador do Bitwarden tem de ser iniciada antes de se poder utilizar o desbloqueio com biometria." }, "errorEnableBiometricTitle": { - "message": "Unable to set up biometrics" + "message": "Não é possível configurar a biometria" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "A ação foi cancelada pela aplicação para computador" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "A aplicação para computador invalidou o canal de comunicação seguro. Por favor, tente novamente esta operação" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Interrupção da comunicação com o computador" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "A aplicação para computador tem a sessão iniciada numa conta diferente. Por favor, certifique-se de que ambas as aplicações têm a sessão iniciada na mesma conta." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "Incompatibilidade de contas" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not set up" + "message": "Biometria não configurada" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + "message": "A biometria do navegador requer que a biometria do computador seja primeiro configurada nas definições." }, "biometricsNotSupportedTitle": { - "message": "Biometrics not supported" + "message": "Biometria não suportada" }, "biometricsNotSupportedDesc": { - "message": "Browser biometrics is not supported on this device." + "message": "A biometria do navegador não é suportada neste dispositivo." + }, + "biometricsFailedTitle": { + "message": "Falha na biometria" + }, + "biometricsFailedDesc": { + "message": "A biometria não pode ser concluída, considere a possibilidade de utilizar uma palavra-passe mestra ou terminar a sessão. Se o problema persistir, contacte a assistência do Bitwarden." }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Autorização não concedida" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Sem autorização para comunicar com a aplicação para computador do Bitwarden, não podemos fornecer dados biométricos na extensão do navegador. Por favor, tente novamente." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "Erro no pedido de autorização" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Esta ação não pode ser realizada na barra lateral. Por favor, repita a ação no pop-up ou no popout." }, "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": "Devido a uma política empresarial, está impedido de guardar itens no seu cofre pessoal. Altere a opção Propriedade para uma organização e escolha entre as coleções disponíveis." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "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." }, "excludedDomains": { - "message": "Excluded domains" + "message": "Domínios excluídos" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "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." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ não é um domínio válido", @@ -1590,15 +1727,15 @@ } }, "send": { - "message": "Envio", + "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Pesquisar Envios", + "message": "Procurar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Adicionar Envio", + "message": "Adicionar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -1608,24 +1745,24 @@ "message": "Ficheiro" }, "allSends": { - "message": "Todos os Envios", + "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Número de acessos máximo atingido", + "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." }, "expired": { "message": "Expirado" }, "pendingDeletion": { - "message": "Remoção pendente" + "message": "Eliminação pendente" }, "passwordProtected": { - "message": "Protegido por senha" + "message": "Protegido por palavra-passe" }, "copySendLink": { - "message": "Copiar Send link", + "message": "Copiar link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -1635,40 +1772,40 @@ "message": "Eliminar" }, "removedPassword": { - "message": "Senha removida" + "message": "Palavra-passe removida" }, "deletedSend": { - "message": "Envio eliminado", + "message": "Send eliminado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Link de Envio", + "message": "Link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Desabilitado" + "message": "Desativado" }, "removePasswordConfirmation": { - "message": "Tem a certeza que pretende remover a senha?" + "message": "Tem a certeza de que pretende remover a palavra-passe?" }, "deleteSend": { - "message": "Eliminar Envio", + "message": "Eliminar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Tem a certeza que pretende eliminar este Envio?", + "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." }, "editSend": { - "message": "Editar Envio", + "message": "Editar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "Que tipo de Envio é este?", + "message": "Que tipo de Send é este?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "Um nome amigável para descrever este Envio.", + "message": "Um nome simpático para descrever este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { @@ -1678,21 +1815,21 @@ "message": "Data de eliminação" }, "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "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." }, "expirationDate": { - "message": "Expiration date" + "message": "Data de validade" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Se definido, o acesso a este Send expirará na data e hora especificadas.", "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 dia" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ dias", "placeholders": { "days": { "content": "$1", @@ -1701,78 +1838,78 @@ } }, "custom": { - "message": "Custom" + "message": "Personalizado" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Número máximo de acessos" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Se definido, os utilizadores deixarão de poder aceder a este Send quando a contagem máxima de acessos for atingida.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "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." }, "sendDisableDesc": { - "message": "Deactivate this Send so that no one can access it.", + "message": "Desative este Send para que ninguém possa aceder ao mesmo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copy this Send's link to clipboard upon save.", + "message": "Copiar o link deste Send para a área de transferência ao guardar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "O texto que deseja enviar." }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Ocultar o texto deste Send por defeito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current access count" + "message": "Número de acessos atual" }, "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": "Nova palavra-passe" }, "sendDisabled": { - "message": "Send removed", + "message": "Send removido", "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": "Devido a uma política da empresa, só é possível eliminar um Send existente.", "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 criado", "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 editado", "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": "Para escolher um ficheiro, abra a extensão na barra lateral (se possível) ou abra uma nova janela clicando neste banner." }, "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": "Para escolher um ficheiro utilizando o Firefox, abra a extensão na barra lateral ou abra uma nova janela clicando neste banner." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Para escolher um ficheiro utilizando o Safari, abra uma nova janela clicando neste banner." }, "sendFileCalloutHeader": { "message": "Antes de começar" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "Para usar um seletor de data no estilo de calendário", + "message": "Para utilizar um seletor de datas do tipo calendário,", "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": { @@ -1780,65 +1917,73 @@ "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": "Para abrir em janela.", + "message": "para abrir a janela.", "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": "A data de validade fornecida não é válida." + "message": "São necessárias uma data e uma hora de validade." }, "deletionDateIsInvalid": { "message": "A data de eliminação fornecida não é válida." }, "expirationDateAndTimeRequired": { - "message": "Uma data de validade e uma hora são obrigatórias." + "message": "São necessárias uma data e uma hora de validade." }, "deletionDateAndTimeRequired": { - "message": "Uma data de eliminação e uma hora são obrigatórias." + "message": "São necessárias uma data e uma hora de eliminação." }, "dateParsingError": { - "message": "Ocorreu um erro ao guardar a sua exclusão e datas de validade." + "message": "Ocorreu um erro ao guardar as suas datas de eliminação e validade." }, "hideEmail": { - "message": "Ocultar o meu endereço de correio eletrónico dos destinatários." + "message": "Ocultar o meu endereço de e-mail dos destinatários." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Uma ou mais políticas da organização estão a afetar as suas opções do Send." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Pedir novamente a palavra-passe mestra" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "Confirmação da palavra-passe mestra" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "Esta ação está protegida. Para continuar, por favor, reintroduza a sua palavra-passe mestra para verificar a sua identidade." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "Verificação de e-mail necessária" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Tem de verificar o seu e-mail para utilizar esta funcionalidade. Pode verificar o seu e-mail no cofre Web." }, "updatedMasterPassword": { - "message": "Palavra-passe Mestra Atualizada" + "message": "Palavra-passe mestra atualizada" }, "updateMasterPassword": { - "message": "Atualizar Senha Mestra" + "message": "Atualizar palavra-passe mestra" }, "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": "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." + }, + "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Inscrição Automática" + "message": "Inscrição automática" }, "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": "Esta organização tem uma política empresarial que o inscreverá automaticamente na redefinição de palavra-passe. A inscrição permitirá que os administradores da organização alterem a sua palavra-passe mestra." }, "selectFolder": { - "message": "Seleccionar pasta..." + "message": "Selecionar pasta..." + }, + "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" }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "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" }, "hours": { "message": "Horas" @@ -1847,7 +1992,20 @@ "message": "Minutos" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "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": { + "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": { "hours": { "content": "$1", @@ -1856,26 +2014,39 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "As políticas da sua organização definiram a ação de tempo limite do cofre para $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "O tempo limite do seu cofre excede as restrições definidas pela sua organização." }, "vaultExportDisabled": { - "message": "Vault export unavailable" + "message": "Exportação de cofre indisponível" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "Uma ou mais políticas da organização impedem-no de exportar o seu cofre pessoal." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Não foi possível identificar um elemento de formulário válido. Em alternativa, tente inspecionar o HTML." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Não foi encontrado um identificador único." }, "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": "A $ORGANIZATION$ está a utilizar o SSO com um servidor de chaves auto-hospedado. Já não é necessária uma palavra-passe mestra para iniciar sessão para os membros desta organização.", "placeholders": { "organization": { "content": "$1", @@ -1884,31 +2055,31 @@ } }, "leaveOrganization": { - "message": "Deixar a Organização" + "message": "Deixar a organização" }, "removeMasterPassword": { - "message": "Remover Senha Mestra" + "message": "Remover palavra-passe mestra" }, "removedMasterPassword": { - "message": "Senha mestra removida." + "message": "Palavra-passe mestra removida" }, "leaveOrganizationConfirmation": { - "message": "Tem a certeza de que pretende sair desta organização?" + "message": "Tem a certeza de que pretende deixar esta organização?" }, "leftOrganization": { "message": "Saiu da organização." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Mostrar/ocultar contagem de caracteres" }, "sessionTimeout": { "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." }, "exportingPersonalVaultTitle": { - "message": "A Exportar Cofre Pessoal" + "message": "A exportar o cofre pessoal" }, - "exportingPersonalVaultDescription": { - "message": "Apenas os itens do cofre pessoal associado ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "exportingIndividualVaultDescription": { + "message": "Apenas os itens de cofre individuais associados a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas serão exportadas as informações do item do cofre e não serão incluídos os anexos associados.", "placeholders": { "email": { "content": "$1", @@ -1920,75 +2091,72 @@ "message": "Erro" }, "regenerateUsername": { - "message": "Regerar Nome de Utilizador" + "message": "Regenerar nome de utilizador" }, "generateUsername": { - "message": "Gerar Nome de Utilizador" + "message": "Gerar nome de utilizador" }, "usernameType": { - "message": "Tipo de Nome de Utilizador" + "message": "Tipo de nome de utilizador" }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "E-mail com subendereço", "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": "Utilize as capacidades de subendereçamento do seu fornecedor de e-mail." }, "catchallEmail": { - "message": "Catch-all email" + "message": "E-mail de captura geral" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Utilize a caixa de entrada de captura geral configurada para o seu domínio." }, "random": { "message": "Aleatório" }, "randomWord": { - "message": "Palavra Aleatória" + "message": "Palavra aleatória" }, "websiteName": { - "message": "Nome do Site" + "message": "Nome do site" }, "whatWouldYouLikeToGenerate": { - "message": "O que desejaria de gerar?" + "message": "O que é que gostaria de gerar?" }, "passwordType": { - "message": "Tipo de Palavra-passe" + "message": "Tipo de palavra-passe" }, "service": { "message": "Serviço" }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "Alias de e-mail reencaminhado" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Gerar um alias de e-mail com um serviço de reencaminhamento externo." }, "hostname": { - "message": "Hostname", + "message": "Nome de domínio", "description": "Part of a URL." }, "apiAccessToken": { - "message": "Token de acesso da API" + "message": "Token de acesso à API" }, "apiKey": { "message": "Chave da API" }, "ssoKeyConnectorError": { - "message": "Key connector error: make sure key connector is available and working correctly." + "message": "Erro no Key Connector: certifique-se de que o Key Connector está disponível e a funcionar corretamente." }, "premiumSubcriptionRequired": { - "message": "Subscrição premium necessária" + "message": "É necessária uma subscrição Premium" }, "organizationIsDisabled": { - "message": "Organization suspended." + "message": "Organização suspensa." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." - }, - "cardBrandMir": { - "message": "Mir" + "message": "Não é possível aceder aos itens de organizações suspensas. Contacte o proprietário da organização para obter assistência." }, "loggingInTo": { "message": "A iniciar sessão em $DOMAIN$", @@ -2009,16 +2177,16 @@ "message": "para voltar às definições predefinidas" }, "serverVersion": { - "message": "Server version" + "message": "Versão do servidor" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "auto-hospedado" }, "thirdParty": { - "message": "Third-party" + "message": "De terceiros" }, "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": "Ligado à implementação de um servidor de terceiros, $SERVERNAME$. Por favor, verifique os erros utilizando o servidor oficial ou reporte-os ao servidor de terceiros.", "placeholders": { "servername": { "content": "$1", @@ -2027,7 +2195,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "visto pela última vez em: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2045,39 +2213,609 @@ "message": "Utilizador incorreto?" }, "newAroundHere": { - "message": "Novo por aqui?" + "message": "É novo por cá?" }, "rememberEmail": { - "message": "Relembrar e-mail" + "message": "Memorizar e-mail" + }, + "loginWithDevice": { + "message": "Iniciar sessão com o dispositivo" + }, + "loginWithDeviceEnabledInfo": { + "message": "O início de sessão com o dispositivo deve ser ativado nas definições da aplicação Bitwarden. Precisa de outra opção?" + }, + "fingerprintPhraseHeader": { + "message": "Frase de impressão digital" + }, + "fingerprintMatchInfo": { + "message": "Por favor, certifique-se de que o cofre está desbloqueado e que a frase de impressão digital corresponde à do outro dispositivo." + }, + "resendNotification": { + "message": "Reenviar notificação" + }, + "viewAllLoginOptions": { + "message": "Ver todas as opções de início de sessão" + }, + "notificationSentDevice": { + "message": "Foi enviada uma notificação para o seu dispositivo." + }, + "loginInitiated": { + "message": "A preparar o início de sessão" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Palavra-passe mestra exposta" }, "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": "Palavra-passe encontrada numa violação de dados. Utilize uma palavra-passe única para proteger a sua conta. Tem a certeza de que pretende utilizar uma palavra-passe exposta?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Palavra-passe mestra fraca e exposta" }, "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": "Palavra-passe fraca identificada e encontrada numa violação de dados. Utilize uma palavra-passe forte e única para proteger a sua conta. Tem a certeza de que pretende utilizar esta palavra-passe?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Verificar violações de dados conhecidas para esta palavra-passe" }, "important": { - "message": "Important:" + "message": "Importante:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "A sua palavra-passe mestra não pode ser recuperada se a esquecer!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ caracteres no mínimo", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "As políticas da sua organização ativaram o preenchimento automático ao carregar a página." + }, + "howToAutofill": { + "message": "Como preencher automaticamente" + }, + "autofillSelectInfoWithCommand": { + "message": "Selecione um item a partir deste ecrã, utilize o atalho $COMMAND$ ou explore outras opções nas definições.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Selecione um item a partir deste ecrã ou explore outras opções nas definições." + }, + "gotIt": { + "message": "Percebido" + }, + "autofillSettings": { + "message": "Definições de preenchimento automático" + }, + "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." + }, + "autofillShortcutText": { + "message": "O atalho de preenchimento automático é: $COMMAND$. Altere-o nas definições do navegador.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Atalho de preenchimento automático predefinido: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "A iniciar sessão em" + }, + "opensInANewWindow": { + "message": "Abrir numa nova janela" + }, + "deviceApprovalRequired": { + "message": "É necessária a aprovação do dispositivo. Selecione uma opção de aprovação abaixo:" + }, + "rememberThisDevice": { + "message": "Lembrar este dispositivo" + }, + "uncheckIfPublicDevice": { + "message": "Desmarcar se estiver a utilizar um dispositivo público" + }, + "approveFromYourOtherDevice": { + "message": "Aprovar a partir do seu outro dispositivo" + }, + "requestAdminApproval": { + "message": "Pedir aprovação do administrador" + }, + "approveWithMasterPassword": { + "message": "Aprovar com a palavra-passe mestra" + }, + "ssoIdentifierRequired": { + "message": "É necessário o identificador de SSO da organização." + }, + "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." + }, + "general": { + "message": "Geral" + }, + "display": { + "message": "Ecrã" + }, + "accountSuccessfullyCreated": { + "message": "Conta criada com sucesso!" + }, + "adminApprovalRequested": { + "message": "Aprovação do administrador pedida" + }, + "adminApprovalRequestSentToAdmins": { + "message": "O seu pedido foi enviado ao seu administrador." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Será notificado quando for aprovado." + }, + "troubleLoggingIn": { + "message": "Problemas a iniciar sessão?" + }, + "loginApproved": { + "message": "Início de sessão aprovado" + }, + "userEmailMissing": { + "message": "E-mail do utilizador em falta" + }, + "deviceTrusted": { + "message": "Dispositivo de confiança" + }, + "inputRequired": { + "message": "Campo necessário." + }, + "required": { + "message": "necessário" + }, + "search": { + "message": "Procurar" + }, + "inputMinLength": { + "message": "O campo deve ter pelo menos $COUNT$ caracteres.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "O campo não pode exceder os $COUNT$ caracteres de comprimento.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Não são permitidos os seguintes caracteres: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "O valor do campo tem de ser, pelo menos, $MIN$ caracteres.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "O valor do campo não pode exceder os $MAX$ caracteres.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 ou mais e-mails são inválidos" + }, + "inputTrimValidator": { + "message": "O campo não deve conter apenas espaços em branco.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "O campo não é um endereço de e-mail." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ campo(s) acima precisa(m) da sua atenção.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Selecionar --" + }, + "multiSelectPlaceholder": { + "message": "-- Escreva para filtrar --" + }, + "multiSelectLoading": { + "message": "A recuperar opções..." + }, + "multiSelectNotFound": { + "message": "Nenhum item encontrado" + }, + "multiSelectClearAll": { + "message": "Limpar tudo" + }, + "plusNMore": { + "message": "+ $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Alternar colapso", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "bitwardenOverlayButton": { + "message": "Botão de menu de preenchimento automático 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." + }, + "unlockAccount": { + "message": "Desbloquear a conta", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Menu de preenchimento automático 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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Destino da importação" + }, + "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" + }, + "typePasskey": { + "message": "Chave de acesso" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirmar" + }, + "savePasskey": { + "message": "Guardar a chave de acesso" + }, + "savePasskeyNewLogin": { + "message": "Guardar a chave de acesso como uma nova credencial" + }, + "choosePasskey": { + "message": "Escolha uma credencial para guardar esta chave de acesso" + }, + "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." + }, + "useBrowserName": { + "message": "Utilizar o navegador" + }, + "multifactorAuthenticationCancelled": { + "message": "Autenticação multifator cancelada" + }, + "noLastPassDataFound": { + "message": "Não foram encontrados dados do LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Nome de utilizador ou palavra-passe incorretos" + }, + "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 contas" + }, + "switchToAccount": { + "message": "Mudar para conta" + }, + "activeAccount": { + "message": "Conta ativa" + }, + "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": "hosted at" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 452ec3dbe7b7..20848362c2f6 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Auto-completare" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generare parolă (s-a copiat)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Nu există potrivire de autentificări" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Deblocați-vă seiful" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Ajutor și feedback" }, + "helpCenter": { + "message": "Centrul de Ajutor Bitwarden" + }, + "communityForums": { + "message": "Explorați forumurile comunității Bitwarden" + }, + "contactSupport": { + "message": "Contactați asistența Bitwarden" + }, "sync": { "message": "Sincronizare" }, @@ -329,6 +362,12 @@ "other": { "message": "Altele" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Configurați metoda de deblocare care să schimbe acțiunea de expirare a seifului." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Evaluare extensie" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Blocare imediată" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Imediat" }, @@ -430,7 +472,14 @@ "message": "Este necesară rescrierea parolei principale." }, "masterPasswordMinlength": { - "message": "Parola principală trebuie să aibă cel puțin 8 caractere." + "message": "Parola principală trebuie să aibă cel puțin $VALUE$ caractere.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Parola principală și confirmarea ei nu coincid!" @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Afișați cardurile pe pagina Filă" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Actualizare" }, + "notificationUnlockDesc": { + "message": "Deblocați seiful Bitwarden pentru a finaliza solicitarea de auto-completare." + }, + "notificationUnlock": { + "message": "Deblocare" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funcție indisponibilă" }, - "updateKey": { - "message": "Nu puteți utiliza această caracteristică înainte de a actualiza cheia de criptare." + "encryptionKeyMigrationRequired": { + "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" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere." }, - "ppremiumSignUpTwoStep": { - "message": "Opțiuni adiționale de conectare în două etape, cum ar fi YubiKey, FIDO U2F și Duo." + "premiumSignUpTwoStepOptions": { + "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ță." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "URL-urile mediului au fost salvate" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Completare automată la încărcarea paginii" }, @@ -960,10 +1058,10 @@ "message": "Dacă se detectează un formular de autentificare, completați-l automat la încărcarea paginii web." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Site-urile web compromise sau nesigure pot profita de auto-completarea la încărcare." }, "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" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restabilire articol" }, - "restoreItemConfirmation": { - "message": "Sigur doriți să restabiliți acest articol?" - }, "restoredItem": { "message": "Articol restabilit" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Articolul s-a completat automat " }, + "insecurePageWarning": { + "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": "Încă mai doriți să completați acest login?" + }, + "autofillIframeWarning": { + "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": "Pe viitor, pentru a evita acest avertisment, înregistrați acest URI, $HOSTNAME$, în login-ul Bitwarden pentru acest site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Setare parolă principală" }, + "currentMasterPass": { + "message": "Parola principală actuală" + }, + "newMasterPass": { + "message": "Noua parolă principală" + }, + "confirmNewMasterPass": { + "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:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometria browserului nu este acceptată pe acest dispozitiv." }, + "biometricsFailedTitle": { + "message": "Biometrica a eșuat" + }, + "biometricsFailedDesc": { + "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ă" }, @@ -1574,12 +1705,18 @@ "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." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nu este un domeniu valid", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "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": "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ă." + }, "resetPasswordPolicyAutoEnroll": { "message": "Înscrierea automată" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Ore" @@ -1847,7 +1992,7 @@ "message": "Minute" }, "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", @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "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", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Politicile organizației dvs. au setat acțiunea de expirare a seifului la $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Timpul de expirare al seifului depășește restricțiile stabilite de organizația dvs." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exportul seifului individual" }, - "exportingPersonalVaultDescription": { - "message": "Numai articolele de seif individuale asociate cu $EMAIL$ vor fi exportate. Articolele de seif ale organizației nu vor fi incluse.", + "exportingIndividualVaultDescription": { + "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", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Articolele din Organizații suspendate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Conectarea la $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Versiune server" }, - "selfHosted": { - "message": "Autogăzduit" + "selfHostedServer": { + "message": "auto-găzduit" }, "thirdParty": { "message": "Parte terță" @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "Memorare e-mail" }, + "loginWithDevice": { + "message": "Conectați-vă cu dispozitivul" + }, + "loginWithDeviceEnabledInfo": { + "message": "Conectarea cu dispozitivul trebuie să fie configurată în setările aplicației Bitwarden. Aveți nevoie de o altă opțiune?" + }, + "fingerprintPhraseHeader": { + "message": "Fraza amprentă" + }, + "fingerprintMatchInfo": { + "message": "Asigurați-vă că seiful este deblocat și că fraza amprentă se potrivește cu cea de pe celălalt dispozitiv." + }, + "resendNotification": { + "message": "Reîntoarceți notificarea" + }, + "viewAllLoginOptions": { + "message": "Afișați toate opțiunile de conectare" + }, + "notificationSentDevice": { + "message": "O notificare a fost trimisă pe dispozitivul dvs." + }, + "loginInitiated": { + "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", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Politicile organizației dvs. au activat auto-completarea la încărcarea paginii." + }, + "howToAutofill": { + "message": "Instrucțiuni de auto-completare" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Am înțeles" + }, + "autofillSettings": { + "message": "Setări de auto-completare" + }, + "autofillShortcut": { + "message": "Scurtătură de tastatură pentru auto-completare" + }, + "autofillShortcutNotSet": { + "message": "Scurtătura de auto-completare nu este setată. Modificați acest lucru în setările browserului." + }, + "autofillShortcutText": { + "message": "Scurtătura de auto-completare este: $COMMAND$. Modificați acest lucru în setările browserului.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Scurtătură implicită de auto-completare: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Conectare la" + }, + "opensInANewWindow": { + "message": "Se deschide într-o nouă fereastră" + }, + "deviceApprovalRequired": { + "message": "Este necesară aprobarea dispozitivului. Selectați o opțiune de autorizare de mai jos:" + }, + "rememberThisDevice": { + "message": "Memorizează acest dispozitiv" + }, + "uncheckIfPublicDevice": { + "message": "Debifați dacă utilizați un dispozitiv public" + }, + "approveFromYourOtherDevice": { + "message": "Aprobați de pe celălalt dispozitiv" + }, + "requestAdminApproval": { + "message": "Cereți aprobarea administratorului" + }, + "approveWithMasterPassword": { + "message": "Aprobați cu parola principală" + }, + "ssoIdentifierRequired": { + "message": "Identificatorul SSO al organizației este necesar." + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Acces refuzat. Nu aveți permisiunea de a vizualiza această pagină." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Afișare" + }, + "accountSuccessfullyCreated": { + "message": "Cont creat cu succes!" + }, + "adminApprovalRequested": { + "message": "Autorizație administrativă solicitată" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Cererea dvs. a fost trimisă administratorului." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Veți primi o notificare după aprobare." + }, + "troubleLoggingIn": { + "message": "Aveți probleme la logare?" + }, + "loginApproved": { + "message": "Autentificare aprobată" + }, + "userEmailMissing": { + "message": "Lipsește e-mailul utilizatorului" + }, + "deviceTrusted": { + "message": "Dispozitiv de încredere" + }, + "inputRequired": { + "message": "Este necesară o intrare." + }, + "required": { + "message": "necesar" + }, + "search": { + "message": "Căutare" + }, + "inputMinLength": { + "message": "Intrarea trebuie să aibă o lungime de cel puțin $COUNT$ caractere.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Intrarea nu trebuie să fie mai lungă de $COUNT$ caractere.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Următoarele caractere nu sunt permise: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Valoarea de intrare trebuie să fie cel puțin $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Valoarea de intrare nu trebuie să depășească $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 sau mai multe e-mailuri sunt invalide" + }, + "inputTrimValidator": { + "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": "Intrarea nu este o adresă de e-mail." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ câmp(uri) de mai sus necesită atenție.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Selectați --" + }, + "multiSelectPlaceholder": { + "message": "-- Scrieți pentru a filtra --" + }, + "multiSelectLoading": { + "message": "Recuperarea opțiunilor..." + }, + "multiSelectNotFound": { + "message": "Niciun element găsit" + }, + "multiSelectClearAll": { + "message": "Ștergeți tot" + }, + "plusNMore": { + "message": "+ $QUANTITY$ mai mult", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submeniu" + }, + "toggleCollapse": { + "message": "Comutare restrângere", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Completarea automată la încărcarea paginii este setată la valoarea implicită.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index e13384c75f0b..4db426571f12 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Автозаполнение" }, + "autoFillLogin": { + "message": "Автозаполнение логина" + }, + "autoFillCard": { + "message": "Автозаполнение карты" + }, + "autoFillIdentity": { + "message": "Автозаполнение личности" + }, "generatePasswordCopied": { "message": "Сгенерировать пароль (с копированием)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Нет подходящих логинов." }, + "noCards": { + "message": "Нет карт" + }, + "noIdentities": { + "message": "Нет личностей" + }, + "addLoginMenu": { + "message": "Добавить логин" + }, + "addCardMenu": { + "message": "Добавить карту" + }, + "addIdentityMenu": { + "message": "Добавить личность" + }, "unlockVaultMenu": { "message": "Разблокировать хранилище" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Помощь и обратная связь" }, + "helpCenter": { + "message": "Справочный центр Bitwarden" + }, + "communityForums": { + "message": "Посетите форумы сообщества Bitwarden" + }, + "contactSupport": { + "message": "Свяжитесь со службой поддержки Bitwarden" + }, "sync": { "message": "Синхронизация" }, @@ -309,7 +342,7 @@ "message": "Папка" }, "deleteItem": { - "message": "Удаление элемента" + "message": "Удалить элемент" }, "viewItem": { "message": "Просмотр элемента" @@ -329,6 +362,12 @@ "other": { "message": "Прочее" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Настройте способ разблокировки для изменения действия по тайм-ауту хранилища." + }, + "unlockMethodNeeded": { + "message": "Установите способ разблокировки в настройках" + }, "rateExtension": { "message": "Оценить расширение" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Заблокировать" }, + "lockAll": { + "message": "Заблокировать все" + }, "immediately": { "message": "Немедленно" }, @@ -430,7 +472,14 @@ "message": "Необходимо повторно ввести мастер-пароль." }, "masterPasswordMinlength": { - "message": "Мастер-пароль должен содержать не менее 8 символов." + "message": "Мастер-пароль должен содержать не менее $VALUE$ символов.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Мастер-пароли не совпадают." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Запросить добавление элемента, если его нет в вашем хранилище." }, + "addLoginNotificationDescAlt": { + "message": "Запрос на добавление элемента, если он отсутствует в вашем хранилище. Применяется ко всем авторизованным аккаунтам." + }, "showCardsCurrentTab": { "message": "Показывать карты на вкладке" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Спрашивать обновление пароля логина при обнаружении изменения на сайте." }, + "changedPasswordNotificationDescAlt": { + "message": "Запрос на обновление пароля логина при обнаружении изменений на сайте. Применяется ко всем авторизованным аккаунтам." + }, + "enableUsePasskeys": { + "message": "Запрос на сохранение и использование ключей доступа" + }, + "usePasskeysDesc": { + "message": "Запрос на сохранение новых ключей или в авторизация с ключами, хранящимися в вашем хранилище. Применяется ко всем авторизованным аккаунтам." + }, "notificationChangeDesc": { "message": "Обновить этот пароль в Bitwarden?" }, "notificationChangeSave": { "message": "Обновить" }, + "notificationUnlockDesc": { + "message": "Разблокируйте свое хранилище Bitwarden чтобы выполнить автозаполнение." + }, + "notificationUnlock": { + "message": "Разблокировать" + }, "enableContextMenuItem": { "message": "Показать опции контекстного меню" }, "contextMenuItemDesc": { "message": "С помощью двойного щелчка можно получить доступ к генерации паролей и сопоставлению логинов для сайта." }, + "contextMenuItemDescAlt": { + "message": "Использовать двойной щелчок для доступа к генерации паролей и сопоставлению логинов для сайта. Применяется ко всем авторизованным аккаунтам." + }, "defaultUriMatchDetection": { "message": "Обнаружение совпадения URI по умолчанию", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Изменение цветовой темы приложения." }, + "themeDescAlt": { + "message": "Изменение цветовой темы приложения. Применяется ко всем авторизованным аккаунтам." + }, "dark": { "message": "Темная", "description": "Dark color" @@ -646,7 +719,7 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Экспортировать хранилище" + "message": "Экспорт хранилища" }, "fileFormat": { "message": "Формат файла" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Функция недоступна" }, - "updateKey": { - "message": "Вы не можете использовать эту функцию, пока не обновите свой ключ шифрования." + "encryptionKeyMigrationRequired": { + "message": "Требуется миграция ключа шифрования. Чтобы обновить ключ шифрования, войдите через веб-хранилище." }, "premiumMembership": { "message": "Премиум" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованного хранилища для вложенных файлов." }, - "ppremiumSignUpTwoStep": { - "message": "Дополнительные варианты двухэтапной аутентификации, такие как YubiKey, FIDO U2F и Duo." + "premiumSignUpTwoStepOptions": { + "message": "Проприетарные варианты двухэтапной аутентификации, такие как YubiKey или Duo." }, "ppremiumSignUpReports": { "message": "Гигиена паролей, здоровье аккаунта и отчеты об утечках данных для обеспечения безопасности вашего хранилища." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "URL окружения сохранены" }, + "showAutoFillMenuOnFormFields": { + "message": "Показывать меню автозаполнения в полях формы", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Применяется ко всем авторизованным аккаунтам." + }, + "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": "Когда поле выбрано (в фокусе)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "Автозаполнение при загрузке страницы" }, @@ -960,10 +1058,10 @@ "message": "Если обнаружена форма входа, автозаполнение выполняется при загрузке веб-страницы." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Взломанные или недоверенные сайты могут внедрить вредоносный код во время автозаполнения при загрузке страницы." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Узнать больше об автозаполнении" }, "defaultAutoFillOnPageLoad": { "message": "Настройка автозаполнения по умолчанию для логинов" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Отображать узнаваемое изображение рядом с каждым логином." }, + "faviconDescAlt": { + "message": "Показывать узнаваемое изображение рядом с каждым логином. Применяется ко всем авторизованным аккаунтам." + }, "enableBadgeCounter": { "message": "Показать счетчик на значке" }, @@ -1127,7 +1228,7 @@ "message": "Тов." }, "mx": { - "message": "Mx" + "message": "Микстер" }, "firstName": { "message": "Имя" @@ -1329,7 +1430,7 @@ "message": "Вы действительно хотите отключить блокировку хранилища? В этом случае ключ шифрования вашего хранилища будет сохранен на вашем устройстве. Отключая блокировку, вы должны убедиться, что ваше устройство надежно защищено." }, "noOrganizationsList": { - "message": "Вы не являетесь членом какой-либо организации. Организации позволяют безопасно обмениваться элементами с другими пользователями." + "message": "Вы не являетесь участником какой-либо организации. Организации позволяют безопасно обмениваться элементами с другими пользователями." }, "noCollectionsInList": { "message": "Нет коллекций для отображения." @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Восстановить элемент" }, - "restoreItemConfirmation": { - "message": "Вы уверены, что хотите восстановить этот элемент?" - }, "restoredItem": { "message": "Элемент восстановлен" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Элемент заполнен " }, + "insecurePageWarning": { + "message": "Предупреждение: это незащищенная HTTP-страница, и любая информация, которую вы отправляете, потенциально может быть просмотрена и изменена кем угодно. Этот логин изначально был сохранен на защищенной (HTTPS) странице." + }, + "insecurePageWarningFillPrompt": { + "message": "Вы по-прежнему хотите заполнить этот логин?" + }, + "autofillIframeWarning": { + "message": "Форма размещена в домене, отличном от URI вашего сохраненного логина. Выберите OK для автозаполнения в любом случае или Отмена для остановки действия." + }, + "autofillIframeWarningTip": { + "message": "Чтобы больше не получать это предупреждение, сохраните этот URI, $HOSTNAME$, в соответствующем логине.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Задать мастер-пароль" }, + "currentMasterPass": { + "message": "Текущий мастер-пароль" + }, + "newMasterPass": { + "message": "Новый мастер-пароль" + }, + "confirmNewMasterPass": { + "message": "Подтвердите новый мастер-пароль" + }, "masterPasswordPolicyInEffect": { "message": "Согласно одной или нескольким политикам организации необходимо, чтобы ваш мастер-пароль отвечал следующим требованиям:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Биометрия в браузере не поддерживается этом устройстве." }, + "biometricsFailedTitle": { + "message": "Сбой биометрии" + }, + "biometricsFailedDesc": { + "message": "Не удалось выполнить биометрическую идентификацию, попробуйте использовать мастер-пароль или выполнить выход. Если ситуация не изменится, обратитесь в службу поддержки Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Разрешение не представлено" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Политика организации влияет на ваши варианты владения." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Импорт элементов в ваше личное хранилище отключен политикой организации." + }, "excludedDomains": { "message": "Исключенные домены" }, "excludedDomainsDesc": { "message": "Bitwarden не будет предлагать сохранить логины для этих доменов. Для вступления изменений в силу необходимо обновить страницу." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden не будет предлагать сохранение логинов для этих доменов для всех авторизованных аккаунтов. Для вступления изменений в силу необходимо обновить страницу." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ – некорректно указанный домен", "placeholders": { @@ -1811,7 +1948,7 @@ "message": "Подтверждение мастер-пароля" }, "passwordConfirmationDesc": { - "message": "Это действие защищено. Для продолжения введите свой мастер-пароль, чтобы подтвердить свою личность." + "message": "Это действие защищено. Чтобы продолжить, введите ваш мастер-пароль для подтверждения личности." }, "emailVerificationRequired": { "message": "Требуется подтверждение электронной почты" @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Мастер-пароль недавно был изменен администратором вашей организации. Чтобы получить доступ к хранилищу, вы должны обновить его сейчас. В результате текущий сеанс будет завершен, потребуется повторный вход. Сеансы на других устройствах могут оставаться активными в течение одного часа." }, + "updateWeakMasterPasswordWarning": { + "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущий сеанс будет завершен и потребуется повторная авторизация. Сеансы на других устройствах могут оставаться активными в течение часа." + }, "resetPasswordPolicyAutoEnroll": { "message": "Автоматическое развертывание" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Выберите папку..." }, - "ssoCompleteRegistration": { - "message": "Для завершения процесса авторизации при помощи SSO, установите мастер-пароль для доступа к вашему хранилищу и его защиты." + "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" }, "hours": { "message": "Час." @@ -1847,7 +1992,20 @@ "message": "Мин." }, "vaultTimeoutPolicyInEffect": { - "message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.", + "message": "В соответствии с политиками вашей организации максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин. Для вашего хранилища задан тайм-аут $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Политики вашей организации установили тайм-аут хранилища на $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1875,7 +2046,7 @@ "message": "Уникальный идентификатор не найден." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ использует SSO с собственным сервером ключей. Для авторизации членам этой организации больше не требуется мастер-пароль.", + "message": "$ORGANIZATION$ использует SSO с собственным сервером ключей. Для авторизации пользователям этой организации больше не требуется мастер-пароль.", "placeholders": { "organization": { "content": "$1", @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Экспорт личного хранилища" }, - "exportingPersonalVaultDescription": { - "message": "Будут экспортированы только личные элементы хранилища, связанные с $EMAIL$. Элементы хранилища организации включены не будут.", + "exportingIndividualVaultDescription": { + "message": "Будут экспортированы только отдельные элементы хранилища, связанные с $EMAIL$. Элементы хранилища организации включены не будут. Экспортируется только информация об элементах хранилища, не включая связанные вложения.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Вход в $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Версия сервера" }, - "selfHosted": { - "message": "Собственный хостинг" + "selfHostedServer": { + "message": "собственный хостинг" }, "thirdParty": { "message": "Сторонний" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Запомнить email" }, + "loginWithDevice": { + "message": "Войти с помощью устройства" + }, + "loginWithDeviceEnabledInfo": { + "message": "Вход с устройства должен быть настроен в настройках мобильного приложения Bitwarden. Нужен другой вариант?" + }, + "fingerprintPhraseHeader": { + "message": "Фраза отпечатка" + }, + "fingerprintMatchInfo": { + "message": "Убедитесь, что ваше хранилище разблокировано и фраза отпечатка совпадает на другом устройстве." + }, + "resendNotification": { + "message": "Отправить уведомление повторно" + }, + "viewAllLoginOptions": { + "message": "Посмотреть все варианты авторизации" + }, + "notificationSentDevice": { + "message": "На ваше устройство отправлено уведомление." + }, + "loginInitiated": { + "message": "Вход инициирован" + }, "exposedMasterPassword": { "message": "Мастер-пароль скомпрометирован" }, @@ -2060,10 +2252,10 @@ "message": "Слабый и скомпрометированный мастер-пароль" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Обнаружен слабый пароль, найденный в утечке данных. Используйте надежный и уникальный пароль для защиты своего аккаунта. Вы уверены, что хотите использовать этот пароль?" + "message": "Обнаружен слабый пароль, найденный в утечке данных. Используйте надежный и уникальный пароль для защиты вашего аккаунта. Вы уверены, что хотите использовать этот пароль?" }, "checkForBreaches": { - "message": "Проверьте известные случаи утечки данных для этого пароля" + "message": "Проверять известные случаи утечки данных для этого пароля" }, "important": { "message": "Важно:" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Автозаполнение при загрузке страницы было активировано политиками вашей организации." + }, + "howToAutofill": { + "message": "Как использовать автозаполнение" + }, + "autofillSelectInfoWithCommand": { + "message": "Выберите элемент на этой странице, используйте сочетание клавиш: $COMMAND$ или ознакомьтесь с другими параметрами в настройках.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Выберите элемент на этой странице или изучите другие параметры в настройках." + }, + "gotIt": { + "message": "Понятно" + }, + "autofillSettings": { + "message": "Настройки автозаполнения" + }, + "autofillShortcut": { + "message": "Сочетание клавиш для автозаполнения" + }, + "autofillShortcutNotSet": { + "message": "Сочетание клавиш для автозаполнения не установлено. Установите его в настройках браузера." + }, + "autofillShortcutText": { + "message": "Сочетание клавиш для автозаполнения: $COMMAND$. Измените его в настройках браузера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Сочетание клавиш для автозаполнения по умолчанию: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Войти на" + }, + "opensInANewWindow": { + "message": "Откроется в новом окне" + }, + "deviceApprovalRequired": { + "message": "Требуется одобрение устройства. Выберите вариант ниже:" + }, + "rememberThisDevice": { + "message": "Запомнить это устройство" + }, + "uncheckIfPublicDevice": { + "message": "Снимите флажок, если используете общедоступное устройство" + }, + "approveFromYourOtherDevice": { + "message": "Одобрить с другого устройства" + }, + "requestAdminApproval": { + "message": "Запросить одобрение администратора" + }, + "approveWithMasterPassword": { + "message": "Одобрить с мастер-паролем" + }, + "ssoIdentifierRequired": { + "message": "Требуется идентификатор SSO организации." + }, + "eu": { + "message": "Европа", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ запрещен. У вас нет разрешения на просмотр этой страницы." + }, + "general": { + "message": "Основное" + }, + "display": { + "message": "Отображение" + }, + "accountSuccessfullyCreated": { + "message": "Аккаунт успешно создан!" + }, + "adminApprovalRequested": { + "message": "Запрошено одобрение администратора" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Ваш запрос был отправлен администратору." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Вас уведомят об одобрении." + }, + "troubleLoggingIn": { + "message": "Не удалось войти?" + }, + "loginApproved": { + "message": "Вход одобрен" + }, + "userEmailMissing": { + "message": "Отсутствует email пользователя" + }, + "deviceTrusted": { + "message": "Доверенное устройство" + }, + "inputRequired": { + "message": "Необходимо ввести данные." + }, + "required": { + "message": "обязательно" + }, + "search": { + "message": "Поиск" + }, + "inputMinLength": { + "message": "Вводимые данные должны содержать не менее $COUNT$ символов.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Длина вводимых данных не должна превышать $COUNT$ символов.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Не допускаются следующие символы: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Вводимое значение должно быть не менее $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Вводимое значение не должно превышать $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Один или несколько адресов email недействительны" + }, + "inputTrimValidator": { + "message": "Введенные данные не должны содержать только пробелы.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Введенные данные не являются адресом email." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поля(ей) выше требуют вашего внимания.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Выбрать --" + }, + "multiSelectPlaceholder": { + "message": "-- Введите для фильтрации --" + }, + "multiSelectLoading": { + "message": "Получение параметров..." + }, + "multiSelectNotFound": { + "message": "Элементов не найдено" + }, + "multiSelectClearAll": { + "message": "Очистить все" + }, + "plusNMore": { + "message": "еще + $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Подменю" + }, + "toggleCollapse": { + "message": "Свернуть/развернуть", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Псевдоним домена" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Элементы с повторным запросом мастер-пароля не могут быть автоматически заполнены при загрузке страницы. Автозаполнение при загрузке страницы выключено.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Автозаполнение при загрузке страницы использует настройку по умолчанию.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Разблокировать аккаунт", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "Всего" + }, + "importWarning": { + "message": "Вы импортируете данные в $ORGANIZATION$. Пользователи этой организации могут получить к ним доступ. Продолжить?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "Формат данных некорректен. Проверьте импортируемый файл и повторите попытку." + }, + "importNothingError": { + "message": "Ничего не было импортировано." + }, + "importEncKeyError": { + "message": "Ошибка при расшифровке экспортированного файла. Ваш ключ шифрования не совпадает с ключом шифрования, использованным при экспорте данных." + }, + "invalidFilePassword": { + "message": "Неверный пароль к файлу. Используйте пароль, введенный при создании файла экспорта." + }, + "importDestination": { + "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": "Подтвердите пароль к файлу" + }, + "typePasskey": { + "message": "Ключ доступа" + }, + "passkeyNotCopied": { + "message": "Ключ доступа не будет скопирован" + }, + "passkeyNotCopiedAlert": { + "message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована." + }, + "logInWithPasskey": { + "message": "Войти с ключом доступа?" + }, + "passkeyAlreadyExists": { + "message": "Для данного приложения уже существует ключ доступа." + }, + "noPasskeysFoundForThisApplication": { + "message": "Для данного приложения ключей доступа не найдено." + }, + "noMatchingPasskeyLogin": { + "message": "У вас нет подходящего логина для этого сайта." + }, + "confirm": { + "message": "Подтвердить" + }, + "savePasskey": { + "message": "Сохранить ключ доступа" + }, + "savePasskeyNewLogin": { + "message": "Сохранить ключ доступа как новый логин" + }, + "choosePasskey": { + "message": "Выберите логин, для которого будет сохранен данный ключ доступа" + }, + "passkeyItem": { + "message": "Ключ доступа элемента" + }, + "overwritePasskey": { + "message": "Перезаписать ключ доступа?" + }, + "overwritePasskeyAlert": { + "message": "Этот элемент уже содержит ключ доступа. Вы уверены, что хотите перезаписать текущий ключ?" + }, + "featureNotSupported": { + "message": "Функция пока не поддерживается" + }, + "yourPasskeyIsLocked": { + "message": "Для использования ключа доступа необходима аутентификация. Для продолжения работы подтвердите свою личность." + }, + "useBrowserName": { + "message": "Использовать браузер" + }, + "multifactorAuthenticationCancelled": { + "message": "Многофакторная аутентификация отменена" + }, + "noLastPassDataFound": { + "message": "Данные LastPass не найдены" + }, + "incorrectUsernameOrPassword": { + "message": "Неверное имя пользователя или пароль" + }, + "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": "Активный аккаунт" + }, + "accountLimitReached": { + "message": "Достигнут лимит аккаунтов. Выйдите, чтобы добавить другой." + }, + "active": { + "message": "активный" + }, + "locked": { + "message": "заблокирован" + }, + "unlocked": { + "message": "разблокирован" + }, + "server": { + "message": "сервер" + }, + "hostedAt": { + "message": "под управлением" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index da882f919264..f0ca959e3b89 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "ස්වයං-පිරවීම" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "මුරපදය ජනනය (පිටපත්)" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "උදව් සහ ප්රතිපෝෂණ" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "සමමුහූර්තනය" }, @@ -329,6 +362,12 @@ "other": { "message": "වෙනත්" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "දිගුව අනුපාතය" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "දැන් අගුලුදමන්න" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "වහාම" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "ප්රධාන මුරපදය තහවුරු කිරීම නොගැලපේ." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "මෙම “ලොගින් වන්න නිවේදනය එකතු කරන්න” ස්වයංක්රීයව ඔබ පළමු වරට ඔවුන් තුලට ප්රවිෂ්ට සෑම අවස්ථාවකදීම ඔබගේ සුරක්ෂිතාගාරය නව පිවිසුම් බේරා ගැනීමට ඔබෙන් විමසනු." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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 හි මෙම මුරපදය යාවත්කාලීන කිරීමට ඔබට අවශ්යද?" }, "notificationChangeSave": { "message": "යාවත්කාල" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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 තරග හඳුනා", @@ -633,6 +703,9 @@ "themeDesc": { "message": "යෙදුමේ වර්ණ තේමාව වෙනස් කරන්න." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "අඳුරු", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "විශේෂාංගය ලබාගත නොහැක" }, - "updateKey": { - "message": "ඔබ ඔබේ සංකේතාංකන යතුර යාවත්කාලීන කරන තුරු ඔබට මෙම අංගය භාවිතා කළ නොහැක." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "වාරික සාමාජිකත්වය" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "ගොනු ඇමුණුම් සඳහා 1 GB සංකේතාත්මක ගබඩා." }, - "ppremiumSignUpTwoStep": { - "message": "එවැනි YuBiKey, FIDO U2F, සහ Duo ලෙස අතිරේක පියවර දෙකක් පිවිසුම් විකල්ප." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "ඔබගේ සුරක්ෂිතාගාරය ආරක්ෂිතව තබා ගැනීම සඳහා මුරපදය සනීපාරක්ෂාව, ගිණුම් සෞඛ්යය සහ දත්ත උල්ලං ach නය වාර්තා කරයි." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "පරිසර URL සුරකිනු ඇත." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "පිටු පැටවුම් මත ස්වයංක්රීය-පිරවීම සක්රීය" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "අයිතමය යළි පිහිටුවන්න" }, - "restoreItemConfirmation": { - "message": "ඔබට මෙම අයිතමය යථා තත්වයට පත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද?" - }, "restoredItem": { "message": "ප්රතිෂ්ඨාපනය අයිතමය" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "ස්වයංක්රීය-පිරවූ අයිතමය" }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "මාස්ටර් මුරපදය සකසන්න" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "සංවිධාන ප්රතිපත්ති එකක් හෝ වැඩි ගණනක් පහත සඳහන් අවශ්යතා සපුරාලීම සඳහා ඔබේ ප්රධාන මුරපදය අවශ්ය වේ:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "බ්රව්සර් biometrics මෙම උපාංගය මත සහය නොදක්වයි." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "අවසර ලබා දී නැත" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "සංවිධාන ප්රතිපත්තියක් ඔබේ හිමිකාරිත්ව විකල්පයන් කෙරෙහි බලපායි." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ වලංගු වසමක් නොවේ", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "ඔබේ ප්රධාන මුරපදය මෑතකදී ඔබේ සංවිධානයේ පරිපාලක විසින් වෙනස් කරන ලදී. සුරක්ෂිතාගාරය වෙත ප්රවේශ වීම සඳහා, ඔබ දැන් එය යාවත්කාලීන කළ යුතුය. ඔබගේ වර්තමාන සැසියෙන් ඔබව ප්රවිෂ්ට වනු ඇත, ඔබ නැවත ප්රවිෂ්ට වීමට අවශ්ය. වෙනත් උපාංගවල ක්රියාකාරී සැසි පැයක් දක්වා ක්රියාකාරීව පැවතිය හැකිය." }, + "updateWeakMasterPasswordWarning": { + "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, "resetPasswordPolicyAutoEnroll": { "message": "ස්වයංක්රීය බඳවා ගැනීම" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "ෆෝල්ඩරය තෝරන්න..." }, - "ssoCompleteRegistration": { - "message": "SSG සමග ලොග් වීම සම්පූර්ණ කිරීම සඳහා, කරුණාකර ඔබේ සුරක්ෂිතාගාරය වෙත ප්රවේශ වීමට සහ ආරක්ෂා කිරීමට ප්රධාන මුරපදයක් සකසන්න." + "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" }, "hours": { "message": "පැය" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index ed8f666d9db3..c120c23dd528 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -91,6 +91,15 @@ "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é)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Pomoc a spätná väzba" }, + "helpCenter": { + "message": "Centrum pomoci Bitwarden" + }, + "communityForums": { + "message": "Prehliadať komunitné fóra Bitwardenu" + }, + "contactSupport": { + "message": "Kontaktovať podporu Bitwardenu" + }, "sync": { "message": "Synchronizácia" }, @@ -329,6 +362,12 @@ "other": { "message": "Ostatné" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Nastavte metódu odomknutia, aby ste zmenili akciu pri vypršaní času trezoru." + }, + "unlockMethodNeeded": { + "message": "Nastavte metódu odomknutia v Nastaveniach" + }, "rateExtension": { "message": "Ohodnotiť rozšírenie" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Uzamknúť teraz" }, + "lockAll": { + "message": "Uzamknúť všetky" + }, "immediately": { "message": "Okamžite" }, @@ -430,7 +472,14 @@ "message": "Vyžaduje sa opätovné zadanie hlavného hesla." }, "masterPasswordMinlength": { - "message": "Hlavné heslo musí obsahovať aspoň 8 znakov." + "message": "Hlavné heslo musí mať aspoň $VALUE$ znakov.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Potvrdenie hlavného hesla sa nezhoduje." @@ -543,7 +592,7 @@ "message": "Naozaj chcete odstrániť túto položku?" }, "deletedItem": { - "message": "Odstránená položka" + "message": "Položka odstránená" }, "overwritePassword": { "message": "Prepísať heslo" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "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." + }, "showCardsCurrentTab": { "message": "Zobraziť karty na stránke \"Aktuálna karta\"" }, @@ -608,18 +660,36 @@ "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?" }, "notificationChangeSave": { "message": "Aktualizovať" }, + "notificationUnlockDesc": { + "message": "Odomknite svoj Bitwarden trezor a dokončite žiadosť o automatické vyplnenie." + }, + "notificationUnlock": { + "message": "Odomknúť" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funkcia nie je k dispozícii" }, - "updateKey": { - "message": "Túto funkciu nemožno použiť, pokým neaktualizujete svoj šifrovací kľúč." + "encryptionKeyMigrationRequired": { + "message": "Vyžaduje sa migrácia šifrovacieho kľúča. Na aktualizáciu šifrovacieho kľúča sa prihláste cez webový trezor." }, "premiumMembership": { "message": "Prémiové členstvo" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB šifrovaného úložiska." }, - "ppremiumSignUpTwoStep": { - "message": "Ďalšie možnosti dvojstupňového prihlásenia ako YubiKey, FIDO U2F a Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietárne možnosti dvojstupňového prihlásenia ako napríklad YubiKey a Duo." }, "ppremiumSignUpReports": { "message": "Správy o sile hesla, zabezpečení účtov a únikoch dát ktoré vám pomôžu udržať vaše kontá v bezpečí." @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Platí pre všetky prihlásené účty." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "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" + }, "enableAutoFillOnPageLoad": { "message": "Povoliť automatické vypĺňanie pri načítaní stránky" }, @@ -960,7 +1058,7 @@ "message": "Ak je detekovaný prihlasovací formulár, automaticky vykonať vypĺňanie pri načítaní stránky." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Skompromitované alebo nedôveryhodné stránky môžu pri svojom načítaní zneužiť automatické dopĺňanie." }, "learnMoreAboutAutofill": { "message": "Dozvedieť sa viac o automatickom dopĺňaní" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Obnoviť položku" }, - "restoreItemConfirmation": { - "message": "Naozaj chcete obnoviť túto položku?" - }, "restoredItem": { "message": "Obnovená položka" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Automaticky vyplnené" }, + "insecurePageWarning": { + "message": "Upozornenie: Toto je nezabezpečená HTTP stránka a akékoľvek informácie, ktoré odošlete, môžu potenciálne vidieť a zmeniť ostatní. Toto prihlásenie bolo pôvodne uložené na zabezpečenej stránke (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Prajete si napriek tomu vyplniť prihlasovacie údaje?" + }, + "autofillIframeWarning": { + "message": "Formulár je hosťovaný inou doménou ako má URI uložených prihlasovacích údajov. Zvoľte OK ak chcete aj tak automaticky vyplniť údaje, alebo Zrušiť pre zastavenie." + }, + "autofillIframeWarningTip": { + "message": "Ak chcete tomuto upozorneniu v budúcnosti zabrániť, uložte URI, $HOSTNAME$, do položky prihlásenia Bitwardenu pre túto stránku.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Nastaviť hlavné heslo" }, + "currentMasterPass": { + "message": "Súčasné hlavné heslo" + }, + "newMasterPass": { + "message": "Nové hlavné heslo" + }, + "confirmNewMasterPass": { + "message": "Potvrďte nové hlavné heslo" + }, "masterPasswordPolicyInEffect": { "message": "Jedno alebo viac pravidiel organizácie požadujú aby vaše hlavné heslo spĺňalo nasledujúce požiadavky:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometria v prehliadači nie je podporovaná na tomto zariadení." }, + "biometricsFailedTitle": { + "message": "Biometria zlyhala" + }, + "biometricsFailedDesc": { + "message": "Biometria nebola vykonaná. Zvážte použitie hlavného hesla, alebo sa odhláste. Ak tento problém pretrváva, kontaktujte podporu Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Povolenie nebolo udelené" }, @@ -1574,12 +1705,18 @@ "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." + }, "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ť." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nie je platná doména", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Vaše hlavné heslo nedávno zmenil správca vo vašej organizácii. Ak chcete získať prístup k trezoru, musíte ho teraz aktualizovať. 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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatická registrácia" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hodiny" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Zásady vašej organizácie nastavili akciu pri vypršaní časového limitu trezora na $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Časový limit vášho trezora prekračuje obmedzenia nastavené vašou organizáciou." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exportovanie osobného trezora" }, - "exportingPersonalVaultDescription": { - "message": "Exportované budú iba položy osobného trezora spojené s $EMAIL$. Položky trezora organizácie nebudú zahrnuté.", + "exportingIndividualVaultDescription": { + "message": "Exportované budú iba položky súvisiace s $EMAIL$. Položky z trezora organizácie nebudú zahrnuté v exporte. Export bude obsahovať iba informácie z položiek v trezore, súvisiace prílohy nebudú súčasťou exportu.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Prihlásenie do $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Verzia servera" }, - "selfHosted": { - "message": "Vlastný hosting" + "selfHostedServer": { + "message": "vlastný hosting" }, "thirdParty": { "message": "Tretia strana" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Zapamätať si e-mail" }, + "loginWithDevice": { + "message": "Prihlásiť pomocou zariadenia" + }, + "loginWithDeviceEnabledInfo": { + "message": "Prihlásenie pomocou zariadenia musí byť nastavené v nastaveniach aplikácie Bitwarden. Potrebujete inú možnosť?" + }, + "fingerprintPhraseHeader": { + "message": "Fráza odtlačku prsta" + }, + "fingerprintMatchInfo": { + "message": "Uistite sa, že je váš trezor odomknutý a fráza odtlačku prsta sa zhoduje s frázou na druhom zariadení." + }, + "resendNotification": { + "message": "Znova odoslať upozornenie" + }, + "viewAllLoginOptions": { + "message": "Zobraziť všetky možnosti prihlásenia" + }, + "notificationSentDevice": { + "message": "Do vášho zariadenia bolo odoslané upozornenie." + }, + "loginInitiated": { + "message": "Iniciované prihlásenie" + }, "exposedMasterPassword": { "message": "Odhalené hlavné heslo" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "V pravidlách vašej organizácie je zapnuté automatické vypĺňanie pri načítaní stránky." + }, + "howToAutofill": { + "message": "Ako používať automatické vypĺňanie" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Chápem" + }, + "autofillSettings": { + "message": "Nastavenia automatického vypĺňania" + }, + "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." + }, + "autofillShortcutText": { + "message": "Skratka automatického vypĺňania je: $COMMAND$. Zmeníte ju v nastaveniach prehliadača.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Predvolená skratka automatického vypĺňania: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Prihlásenie na" + }, + "opensInANewWindow": { + "message": "Otvárať v novom okne" + }, + "deviceApprovalRequired": { + "message": "Vyžaduje sa schválenie zariadenia. Vyberte možnosť schválenia nižšie:" + }, + "rememberThisDevice": { + "message": "Zapamätať si toto zariadenie" + }, + "uncheckIfPublicDevice": { + "message": "Odčiarknite, ak používate verejné zariadenie" + }, + "approveFromYourOtherDevice": { + "message": "Schváliť z iného zariadenia" + }, + "requestAdminApproval": { + "message": "Žiadosť o schválenie správcom" + }, + "approveWithMasterPassword": { + "message": "Schváliť pomocou hlavného hesla" + }, + "ssoIdentifierRequired": { + "message": "Pole identifikátora SSO je povinné." + }, + "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." + }, + "general": { + "message": "Všeobecné" + }, + "display": { + "message": "Zobrazenie" + }, + "accountSuccessfullyCreated": { + "message": "Účet bol úspešne vytvorený!" + }, + "adminApprovalRequested": { + "message": "Vyžaduje sa schválenie správcom" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Vaša žiadosť bola odoslaná správcovi." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Po schválení budete informovaný." + }, + "troubleLoggingIn": { + "message": "Máte problémy s prihlásením?" + }, + "loginApproved": { + "message": "Schválené prihlásenie" + }, + "userEmailMissing": { + "message": "Chýba e-mail používateľa" + }, + "deviceTrusted": { + "message": "Dôveryhodné zariadenie" + }, + "inputRequired": { + "message": "Vstup je povinný." + }, + "required": { + "message": "povinné" + }, + "search": { + "message": "Hladať" + }, + "inputMinLength": { + "message": "Vstup musí mať aspoň $COUNT$ znakov.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Nemôžete zadať viac než $COUNT$ znakov.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Tieto znaky nie sú povolené: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Hodnota musí byť aspoň $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Zadaná hodnota nesmie prekročiť $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 alebo viac e-mailov je neplatných" + }, + "inputTrimValidator": { + "message": "Vstup nesmie obsahovať iba prázdne znaky.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Vstupom nie je e-mailová adresa." + }, + "fieldsNeedAttention": { + "message": "Niektoré polia ($COUNT$) vyžadujú vašu pozornosť.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Vyberte --" + }, + "multiSelectPlaceholder": { + "message": "-- Začnite písať na filtrovanie --" + }, + "multiSelectLoading": { + "message": "Načítavajú sa možnosti..." + }, + "multiSelectNotFound": { + "message": "Nenašli sa žiadne položky" + }, + "multiSelectClearAll": { + "message": "Vyčistiť všetko" + }, + "plusNMore": { + "message": "+ $QUANTITY$ ďalších", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Podponuka" + }, + "toggleCollapse": { + "message": "Prepnúť zbalenie", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Odomknúť účet", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Cieľ importu" + }, + "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" + }, + "typePasskey": { + "message": "Prístupový kľúč" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Potvrdiť" + }, + "savePasskey": { + "message": "Uložiť prístupový kľúč" + }, + "savePasskeyNewLogin": { + "message": "Uložiť prístupový kľúč ako nové prihlasovacie údaje" + }, + "choosePasskey": { + "message": "Vyberte prihlasovacie údaje, do ktorých chcete uložiť prístupový kľúč" + }, + "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ť." + }, + "useBrowserName": { + "message": "Použiť webový prehliadač" + }, + "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" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 348643c2b9da..dc9f1b554e80 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Brezplačen upravitelj gesel", + "message": "Bitwarden - Brezplačni upravitelj gesel", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Prijavite se ali ustvarite nov račun za dostop do vašega varnega trezorja." + "message": "Prijavite se ali ustvarite nov račun za dostop do svojega varnega trezorja." }, "createAccount": { "message": "Ustvari račun" @@ -38,10 +38,10 @@ "message": "Glavno geslo" }, "masterPassDesc": { - "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do vašega trezorja. Zelo pomembno je, da ne pozabite vaše glavno geslo. Gesla ni mogoče obnoviti v primeru, če ga pozabite." + "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do svojega trezorja. Zelo pomembno je, da ga ne pozabite. Če pozabite glavno geslo, ga ne bo mogoče obnoviti." }, "masterPassHintDesc": { - "message": "Namig glavnega gesla vam lahko pomaga, da se spomnite vašega gesla, če ga pozabite." + "message": "Če pozabite glavno geslo, boste prejeli ta namig, da bi se gesla laže spomnili." }, "reTypeMasterPass": { "message": "Ponovno vnesite glavno geslo" @@ -77,7 +77,7 @@ "message": "Kopiraj opombo" }, "copyUri": { - "message": "Kopiraj URL" + "message": "Kopiraj URI" }, "copyUsername": { "message": "Kopiraj uporabniško ime" @@ -89,37 +89,61 @@ "message": "Kopiraj varnostno kodo" }, "autoFill": { - "message": "samodejno zapolni" + "message": "Samodejno izpolnjevanje" + }, + "autoFillLogin": { + "message": "Samodejno izpolni prijavo" + }, + "autoFillCard": { + "message": "Samodejno izpolni kartico" + }, + "autoFillIdentity": { + "message": "Samodejno izpolni identiteto" }, "generatePasswordCopied": { "message": "Generiraj geslo (kopirano)" }, "copyElementIdentifier": { - "message": "Copy custom field name" + "message": "Kopiraj naziv polja po meri" }, "noMatchingLogins": { - "message": "Nobenih ujemajočih prijav." + "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" }, "loginToVaultMenu": { - "message": "Log in to your vault" + "message": "Prijavi se v svoj trezor" }, "autoFillInfo": { - "message": "Nobene prijave ni na voljo za auto-izpolnitev za trenutni zavihek." + "message": "Za samodejno izpolnjevanje v trenutnem zavihku ni na voljo nobena prijava." }, "addLogin": { "message": "Dodaj prijavo" }, "addItem": { - "message": "Dodal element" + "message": "Dodaj element" }, "passwordHint": { "message": "Namig za geslo" }, "enterEmailToGetHint": { - "message": "Vnesite epoštni naslov vašega računa, da prejmete namig za vaše glavno geslo." + "message": "Vnesite e-poštni naslov svojega računa in poslali vam bomo namig za vaše glavno geslo." }, "getMasterPasswordHint": { "message": "Pridobi namig za glavno geslo" @@ -128,7 +152,7 @@ "message": "Nadaljuj" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Pošlji kodo za preverjanje po e-pošti" }, "sendCode": { "message": "Pošlji kodo" @@ -137,10 +161,10 @@ "message": "Koda poslana" }, "verificationCode": { - "message": "Verifikacijska koda" + "message": "Koda za preverjanje" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "Za nadaljevanje potrdite svojo istovetnost." }, "account": { "message": "Račun" @@ -149,11 +173,11 @@ "message": "Spremeni glavno geslo" }, "fingerprintPhrase": { - "message": "Fingerprint fraza", + "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." }, "yourAccountsFingerprint": { - "message": "Fingerprint fraza vašega računa", + "message": "Identifikacijsko geslo vašega računa", "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": { @@ -190,11 +214,20 @@ "message": "Mape" }, "noFolders": { - "message": "Ni map za prikazat." + "message": "Nobene takšne mape ni." }, "helpFeedback": { "message": "Pomoč in povratne informacije" }, + "helpCenter": { + "message": "Bitwardnov center za pomoč" + }, + "communityForums": { + "message": "Prebrskajte Bitwardnove skupnostne forume" + }, + "contactSupport": { + "message": "Kontaktirajte podporo uporabnikom" + }, "sync": { "message": "Sinhronizacija" }, @@ -218,7 +251,7 @@ "message": "Bitwarden spletni trezor" }, "importItems": { - "message": "Uvozi predmete" + "message": "Uvozi elemente" }, "select": { "message": "Izberi" @@ -227,7 +260,7 @@ "message": "Generiraj geslo" }, "regeneratePassword": { - "message": "Regeneriraj geslo" + "message": "Ponovno ustvari geslo" }, "options": { "message": "Možnosti" @@ -236,13 +269,13 @@ "message": "Dolžina" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Velike črke (A-Z)" }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Male črke (a-z)" }, "numbers": { - "message": "Številke (0-9)" + "message": "Števke (0-9)" }, "specialCharacters": { "message": "Posebni znaki (!@#$%^&*)" @@ -258,10 +291,10 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Vključi številko" + "message": "Vključi števko" }, "minNumbers": { - "message": "Minimalno števil" + "message": "Minimalno števk" }, "minSpecial": { "message": "Minimalno posebnih znakov" @@ -279,10 +312,10 @@ "message": "Pogled" }, "noItemsInList": { - "message": "Ni predmetov za prikazat." + "message": "Tukaj ni ničesar." }, "itemInformation": { - "message": "Informacije o izdelku" + "message": "Informacije o elementu" }, "username": { "message": "Uporabniško ime" @@ -291,7 +324,7 @@ "message": "Geslo" }, "passphrase": { - "message": "Parafraza" + "message": "Večbesedno geslo" }, "favorite": { "message": "Priljubljeni" @@ -303,16 +336,16 @@ "message": "Opomba" }, "editItem": { - "message": "Uredi vnos" + "message": "Uredi element" }, "folder": { "message": "Mapa" }, "deleteItem": { - "message": "Izbiši vnos" + "message": "Izbiši element" }, "viewItem": { - "message": "Ogled vnosa" + "message": "Ogled elementa" }, "launch": { "message": "Zaženi" @@ -321,34 +354,40 @@ "message": "Spletna stran" }, "toggleVisibility": { - "message": "Preklopi vidljivost" + "message": "Preklopi vidnost" }, "manage": { - "message": "Upravljaj" + "message": "Upravljanje" }, "other": { "message": "Drugo" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Da spremenite časovne omejitve trezorja, nastavite metodo odklepanja." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Ocenite to razširitev" }, "rateExtensionDesc": { - "message": "Premislite če nam želite pomagati z dobro oceno!" + "message": "Premislite, ali bi nam želeli pomagati z dobro oceno!" }, "browserNotSupportClipboard": { - "message": "Vaš spletni brskalnik ne podpira enostavno kopiranje odložišča. Kopirajte ročno." + "message": "Vaš brskalnik ne podpira enostavnega kopiranja na odložišče. Prosimo, kopirajte ročno." }, "verifyIdentity": { - "message": "Verify identity" + "message": "Preverjanje istovetnosti" }, "yourVaultIsLocked": { - "message": "Vaš trezor je zaklenjen. Potrdite vaše glavno geslo za nadaljevanje." + "message": "Vaš trezor je zaklenjen. Za nadaljevanje potrdite svojo identiteto." }, "unlock": { "message": "Odkleni" }, "loggedInAsOn": { - "message": "Prijavljeni kot $EMAIL$ na $HOSTNAME$.", + "message": "Prijavljeni ste kot $EMAIL$ na $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -364,11 +403,14 @@ "message": "Napačno glavno geslo" }, "vaultTimeout": { - "message": "Časovna omejitev trezorja" + "message": "Zakleni trezor, ko preteče toliko časa:" }, "lockNow": { "message": "Zakleni zdaj" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Takoj" }, @@ -403,10 +445,10 @@ "message": "4 ure" }, "onLocked": { - "message": "Ob sistemskem zaklepu" + "message": "Ob zaklepu sistema" }, "onRestart": { - "message": "Ob ponovnem zagonu spletnega brskalnika" + "message": "Ob ponovnem zagonu brskalnika" }, "never": { "message": "Nikoli" @@ -424,31 +466,38 @@ "message": "Neveljaven epoštni naslov." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "Glavno geslo je obvezno." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Ponoven vnos glavnega gesla je obvezen." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Glavno geslo mora vsebovati vsaj $VALUE$ znakov.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Potrditev glavnega gesla se ne ujema." }, "newAccountCreated": { - "message": "Vaš nov račun je bil ustvarjen! Sedaj se lahko prijavite." + "message": "Vaš račun je ustvarjen. Lahko se prijavite." }, "masterPassSent": { - "message": "Poslali smo vam epoštno spročilo z namigom za vaše glavno geslo." + "message": "Poslali smo vam e-poštno spročilo z namigom za vaše glavno geslo." }, "verificationCodeRequired": { - "message": "Verifikacijska koda je obvezna." + "message": "Koda za preverjanje je obvezna." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "Neveljavna koda za preverjanje" }, "valueCopied": { - "message": "$VALUE$ kopirano", + "message": "$VALUE$ kopirana", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -458,7 +507,7 @@ } }, "autofillError": { - "message": "Ni mogoče avto-izpolniti izbrazno prijavo na tej spletni strani. Namesto tega kopirajte in prilepite podatke." + "message": "Izbrane prijave na tej strani ni mogoče samodejno izpolniti. Namesto tega podatke kopirajte in prilepite." }, "loggedOut": { "message": "Odjavljen" @@ -482,31 +531,31 @@ "message": "Ime je obvezno." }, "addedFolder": { - "message": "Dodana mapa" + "message": "Mapa dodana" }, "changeMasterPass": { "message": "Spremeni glavno geslo" }, "changeMasterPasswordConfirmation": { - "message": "Svoje glavno geslo lahko spremenite v bitwarden.com spletnem trezorju. Želite obiskati spletno stran zdaj?" + "message": "Svoje glavno geslo lahko spremenite v Bitwardnovem spletnem trezorju. Želite zdaj obiskati Bitwardnovo spletno stran?" }, "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?" + "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?" }, "editedFolder": { - "message": "Urejena mapa" + "message": "Mapa shranjena" }, "deleteFolderConfirmation": { "message": "Ste prepričani, da želite izbrisati to mapo?" }, "deletedFolder": { - "message": "Izbrisana mapa" + "message": "Mapa izbrisana" }, "gettingStartedTutorial": { - "message": "Getting started tutorial" + "message": "Vodič za začetnike" }, "gettingStartedTutorialVideo": { - "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + "message": "Naš vodič za začtenike vam pokaže, kako najbolje izkoristiti Bitwardnovo razširitev za brskalnik." }, "syncingComplete": { "message": "Sinhronizacija končana" @@ -518,7 +567,7 @@ "message": "Geslo je bilo kopirano" }, "uri": { - "message": "URL" + "message": "URI" }, "uriPosition": { "message": "URI $POSITION$", @@ -531,31 +580,31 @@ } }, "newUri": { - "message": "Nov URL" + "message": "Nov URI" }, "addedItem": { - "message": "Dodan vnos" + "message": "Element dodan" }, "editedItem": { - "message": "Urejen vnos" + "message": "Element shranjen" }, "deleteItemConfirmation": { - "message": "Ali ste prepričani, da želite izbrisati?" + "message": "Ali ste prepričani, da želite to izbrisati?" }, "deletedItem": { - "message": "Pošlji vnos v smeti" + "message": "Element poslan v smeti" }, "overwritePassword": { "message": "Prepiši geslo" }, "overwritePasswordConfirmation": { - "message": "Ali ste prepričani, da želite prepisati vaše trenutno geslo?" + "message": "Ali ste prepričani, da želite prepisati trenutno geslo?" }, "overwriteUsername": { - "message": "Overwrite username" + "message": "Prepiši uporabniško ime" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "Ste prepričani, da želite prepisati trenutno uporabniško ime?" }, "searchFolder": { "message": "Preišči mapo" @@ -564,68 +613,89 @@ "message": "Preišči zbirko" }, "searchType": { - "message": "Search type" + "message": "Išči med tipi" }, "noneFolder": { "message": "Brez mape", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Predlagaj dodajanje prijave" }, "addLoginNotificationDesc": { - "message": "Ask to add an item if one isn't found in your vault." + "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." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Prikaži kartice na strani Zavihek" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Na strani Zavihek prikaži kartice za lažje samodejno izpoljnjevanje." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Prikaži identitete na strani Zavihek" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Na strani Zavihek prikaži elemente identitete za lažje samodejno izpolnjevanje." }, "clearClipboard": { "message": "Počisti odložišče", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Automatically clear copied values from your clipboard.", + "message": "Samodejno izbriši kopirane vrednosti z odložišča.", "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": "Naj si Bitwarden zapomni to geslo?" }, "notificationAddSave": { "message": "Da, shrani zdaj" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Predlagaj posodobitev obstoječe prijave" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "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": "Do you want to update this password in Bitwarden?" + "message": "Želite, da Bitwarden shrani spremembo tega gesla?" }, "notificationChangeSave": { "message": "Da, posodobi zdaj" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Prikaži možnosti kontekstnega menuja" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "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": "Default URI match detection", + "message": "Privzet način preverjanja ujemanja URI-ja", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Izberite privzeti način preverjanja ujemanja URI-ja pri samodejnem izpolnjevanju in drugih dejanjih." }, "theme": { "message": "Tema" @@ -633,6 +703,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" @@ -659,34 +732,34 @@ "message": "Potrdite izvoz trezorja" }, "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": "Ta datoteka z izvoženimi podatki vsebuje podatke iz vašega trezorja v nešifrirani obliki. Ne shranjujte in ne pošiljajte je po nezavarovanih kanalih, kot je elektronska pošta. Po uporabi jo takoj izbrišite." }, "encExportKeyWarningDesc": { - "message": "Ta izvoz šifrira vaše podatke z uporabo ključa za šifriranje. Če boste kdaj zamenjali ključ za šifriranje, je potrebno, da ponovno naredite izvoz, ker ne boste mogli dešifrirati to izvoženo datoteko." + "message": "Ta izvoz šifrira vaše podatke z uporabo ključa za šifriranje. Če boste kdaj zamenjali ključ za šifriranje, boste morali podatke izvoziti ponovno, saj pričujočega izvoza ne boste mogli več dešifrirati." }, "encExportAccountWarningDesc": { "message": "Ključ za šifriranje je edinstven za vsak Bitwarden račun, zato ni mogoče da se uvozi šifrirana datoteka v drugi račun." }, "exportMasterPassword": { - "message": "Vnesite vaše glavno geslo za izvoz podatkov iz vašega trezorja." + "message": "Za izvoz podatkov iz trezorja vnesite svoje glavno geslo." }, "shared": { "message": "V skupni rabi" }, "learnOrg": { - "message": "Learn about organizations" + "message": "Preberite več o organizacijah" }, "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?" + "message": "Bitwarden omogoča, da elemente v svojem trezorju delite z drugimi z uporabo organizacije. Želite obskati spletišče bitwarden.com za več informacij?" }, "moveToOrganization": { - "message": "Move to organization" + "message": "Premakni v organizacijo" }, "share": { "message": "Deli" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "Element $ITEMNAME$ premaknjen v $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -699,7 +772,7 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Izberite organizacijo, v katero želite premakniti ta element. S tem boste prenesli lastništvo elementa na organizacijo in ne boste več njegov neposredni lastnik." }, "learnMore": { "message": "Več o tem" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funkcija ni na voljo." }, - "updateKey": { - "message": "Ne morete koristiti to funkcijo dokler ne posodobite vaš ključ za šifriranje." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium članstvo" @@ -756,28 +829,28 @@ "message": "Upravljanje članstva" }, "premiumManageAlert": { - "message": "S svojim članstvom lahko upravljate na bitwarden.com spletnem trezorju. Želite obiskati spletno stran zdaj?" + "message": "S svojim članstvom lahko upravljate na spletnem trezorju bitwarden.com. Želite obiskati to spletno stran zdaj?" }, "premiumRefresh": { - "message": "Osvežite članstvo" + "message": "Osveži status članstva" }, "premiumNotCurrentMember": { "message": "Trenutno niste premium član." }, "premiumSignUpAndGet": { - "message": "Prijavite se za premium članstvo in dobite:" + "message": "Če postanete premium član, dobite:" }, "ppremiumSignUpStorage": { - "message": "1 GB šifriranog prostora za shrambo podatkov." + "message": "1 GB šifriranega prostora za shrambo podatkov." }, - "ppremiumSignUpTwoStep": { - "message": "Dodatne možnosti za prijavo v dveh korakih kot so YubiKey, FIDO U2F in Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { - "message": "Higiena gesel, zdravje računa in poročila o kraji podatkov, da lahko ohranite vaš trezor varen." + "message": "Higiena gesel, zdravje računa in poročila o kraji podatkov, ki vam pomagajo ohraniti varnost vašega trezorja." }, "ppremiumSignUpTotp": { - "message": "TOTP verifikacijska koda (2FA) generator za prijave v vašem trezorju." + "message": "Generator TOTP verifikacijskih kod (2FA) za prijave v vašem trezorju." }, "ppremiumSignUpSupport": { "message": "Prioritetna podpora strankam." @@ -789,13 +862,13 @@ "message": "Kupite premium članstvo" }, "premiumPurchaseAlert": { - "message": "Premium članstvo lahko kupite na bitwarden.com spletnem trezoju. Želite obiskati spletno stran zdaj?" + "message": "Premium članstvo lahko kupite na spletnem trezoju bitwarden.com. Želite obiskati spletno stran zdaj?" }, "premiumCurrentMember": { "message": "Ste premium član!" }, "premiumCurrentMemberThanks": { - "message": "Hvala da podpirate Bitwarden." + "message": "Hvala, ker podpirate Bitwarden." }, "premiumPrice": { "message": "Vse za samo $PRICE$ /leto!", @@ -810,22 +883,22 @@ "message": "Osveževanje zaključeno" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Samodejno kopiraj TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Če za prijavo uporabljate avtentikacijski ključ je TOTP verifikacijska koda avtomatično kopirana v vaše odložišče kadarkoli avto-izpolnite prijavo." + "message": "Če za prijavo uporabljate avtentikacijski ključ, se verifikacijska koda TOTP samodejno kopira v odložišče, kadar uporabite samodejno izpolnjevanje." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Ob zagonu zahtevaj biometrično preverjanje" }, "premiumRequired": { - "message": "Premium članstvo je potrebno" + "message": "Potrebno je premium članstvo" }, "premiumRequiredDesc": { "message": "Premium članstvo je potrebno za uporabo te funkcije." }, "enterVerificationCodeApp": { - "message": "Vnesite 6-mestno verifikacijsko kodo iz vaše verifikacijske aplikacije." + "message": "Vnesite 6-mestno verifikacijsko kodo iz svoje aplikacije za avtentikacijo." }, "enterVerificationCodeEmail": { "message": "Vnesite 6-mestno verifikacijsko kodo, ki vam je bila poslana na $EMAIL$.", @@ -837,7 +910,7 @@ } }, "verificationCodeEmailSent": { - "message": "Verification email sent to $EMAIL$.", + "message": "Potrditveno sporočilo poslano na $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -876,13 +949,13 @@ "message": "Ta račun ima omogočemo prijavo v dveh korakih, ampak, nobena izmed konfiguriranih prijav v dveh korakih ni podprta v teb spletnem brskalniku." }, "noTwoStepProviders2": { - "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)." + "message": "Uporabite enega izmed podprtih spletnih brskalnikov (npr. Chrome) in/ali dodajte ponudnika, ki je bolje podprt na različnih brskalnikih (npr. aplikacija za avtentikacijo)." }, "twoStepOptions": { "message": "Možnosti dvostopenjske prijave" }, "recoveryCodeDesc": { - "message": "Ste izgubili dostop do vseh vaših ponudnikov dvostopenjske prijave? Uporabite svojo kodo za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." + "message": "Ste izgubili dostop do vseh ponudnikov dvostopenjske prijave? Uporabite svojo kodo za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." }, "recoveryCodeTitle": { "message": "Koda za obnovitev" @@ -891,14 +964,14 @@ "message": "Aplikacija za avtentikacijo" }, "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "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." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "Varnostni ključ YubiKey za enkratna gesla" }, "yubiKeyDesc": { - "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." + "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.", @@ -953,35 +1026,60 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Samodejno izpolni, ko se stran naloži" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Če Bitwarden na strani zazna prijavni obrazec, ga samodejno izpolni takoj, ko se stran naloži." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Spletne strani, ki jim ne zaupate ali v katere so vdrli, lahko zlorabijo samodejno izpolnjevanje ob naložitvi strani." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Preberite več o samodejnem izpolnjevanju" }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Privzeta nastavitev samodejnega izpolnjevanja za prijavne elemente" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "Samodejno izpolnjevanje ob naložitvi strani lahko izklopite za posamčne prijave, ko jih urejate." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Samodejno izpolni ob naložitvi strani (če je omogočeno v Možnostih)" }, "autoFillOnPageLoadUseDefault": { "message": "Uporabi privzete nastavitve" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Samodejno izpolni ob naložitvi strani" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Ne izpolnjuj samodejno ob naložitvi strani" }, "commandOpenPopup": { "message": "Open vault popup" @@ -990,10 +1088,10 @@ "message": "Open vault in sidebar" }, "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "message": "Samodejno izpolni s prijavo, ki je bila na tej strani uporabljena zadnja" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "Ustvari novo naključno geslo in ga kopiraj v odložišče" }, "commandLockVaultDesc": { "message": "Zakleni trezor" @@ -1002,7 +1100,7 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom fields" + "message": "Polja po meri" }, "copyValue": { "message": "Kopiraj vrednost" @@ -1011,10 +1109,10 @@ "message": "Vrednost" }, "newCustomField": { - "message": "New custom field" + "message": "Novo polje po meri" }, "dragToSort": { - "message": "Drag to sort" + "message": "Sortirajte z vlečenjem" }, "cfTypeText": { "message": "Besedilo" @@ -1026,15 +1124,15 @@ "message": "Logična vrednost" }, "cfTypeLinked": { - "message": "Linked", + "message": "Povezano polje", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Povezana vrednost", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Če kliknete izven pojavnega okna, da preverite vašo epošto za vašo verifikacijsko kodo, bo to povročilo, da se je pojavno okno zapre. Želite odpreti to pojavno okno v novem oknu, tako, da se ne bo zaprlo?" + "message": "Če kliknete izven tega pojavnega okna, da bi preverili pošto, se to pojavno okno zaprlo. Želite odpreti to pojavno okno v novem oknu, da se ne bo zaprlo?" }, "popupU2fCloseMessage": { "message": "Ta spletni brskalnik ne more obdelati U2F zahteve v tem pojavnem oknu. Želite odpreti to pojavno okno v novem oknu, tako, da se lahko prijavite z U2F?" @@ -1045,6 +1143,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" }, @@ -1067,7 +1168,7 @@ "message": "Leto poteka" }, "expiration": { - "message": "Potek" + "message": "Veljavna do" }, "january": { "message": "Januar" @@ -1127,7 +1228,7 @@ "message": "Dr." }, "mx": { - "message": "Mx" + "message": "Gx" }, "firstName": { "message": "Ime" @@ -1196,7 +1297,7 @@ "message": "Prijave" }, "typeSecureNote": { - "message": "Varni zapisek" + "message": "Zavarovan zapisek" }, "typeCard": { "message": "Kartica" @@ -1217,7 +1318,7 @@ "message": "Priljubljeno" }, "popOutNewWindow": { - "message": "Pop out to a new window" + "message": "Odpri v svojem oknu" }, "refresh": { "message": "Osveži" @@ -1232,17 +1333,17 @@ "message": "Prijave" }, "secureNotes": { - "message": "Varni zapiski" + "message": "Zavarovani zapiski" }, "clear": { "message": "Počisti", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Check if password has been exposed." + "message": "Preveri, ali je bilo geslo izpostavljeno" }, "passwordExposed": { - "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "message": "To geslo je bilo že $VALUE$-krat razkrito med raznimi ukradenimi podatki. Morali bi ga zamenjati.", "placeholders": { "value": { "content": "$1", @@ -1251,43 +1352,43 @@ } }, "passwordSafe": { - "message": "This password was not found in any known data breaches. It should be safe to use." + "message": "Tega gesla ni najti med znanimi ukradenimi podatki. Najbrž je varno, da ga uporabljate." }, "baseDomain": { - "message": "Base domain", + "message": "Bazna domena", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Ime domene", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "Gostitelj", "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": "Dobesedno ujemanje" }, "startsWith": { - "message": "Starts with" + "message": "Ujemanje začetka" }, "regEx": { - "message": "Regular expression", + "message": "Regularni izraz", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match detection", + "message": "Preverjanje ujemanja", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Default match detection", + "message": "Privzeto preverjanje ujemanja", "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle options" + "message": "Prikaži/skrij možnosti" }, "toggleCurrentUris": { - "message": "Toggle current URIs", + "message": "Prikaži/skrij URI-je odprtih zavihkov", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1299,13 +1400,13 @@ "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Tipi" + "message": "Vrste" }, "allItems": { - "message": "All items" + "message": "Vsi elementi" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Ni takšnih gesel." }, "remove": { "message": "Odstrani" @@ -1318,27 +1419,27 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "Ustvarjeno", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Geslo posodobljeno.", "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": "Ste prepričani, da vam možnost Nikoli ustreza? Pri nastavitvi Nikoli se šifrirni ključ vašega trezorja shrani v vaši napravi. Ob uporabi te možnosti morate skrbeti za ustrezno varnost svoje naprave." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "Niste član nobene organizacije. Organizacije vam omogočajo varno skupno rabo elementov z drugimi uporabniki." }, "noCollectionsInList": { - "message": "There are no collections to list." + "message": "Ni zbirk za prikaz." }, "ownership": { "message": "Lastništvo" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Kdo je lastnik tega elementa?" }, "strong": { "message": "Močno", @@ -1356,53 +1457,53 @@ "message": "Šibko glavno geslo" }, "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": "Glavno geslo, ki ste ga izbrali, je šibko. Za primerno zaščito svojega Bitwarden računa morate uporabiti močno glavno geslo. Ste prepričani, da želite uporabiti izbrano glavno geslo?" }, "pin": { "message": "PIN", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Odkleni s PIN kodo" + "message": "Odkleni s PIN-kodo" }, "setYourPinCode": { - "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." + "message": "Za odklep Bitwardna si nastavite PIN-kodo. PIN-koda bo ponastavljena, če se boste popolnoma odjavili iz aplikacije." }, "pinRequired": { - "message": "Potrebna je PIN koda." + "message": "Potrebna je PIN-koda." }, "invalidPin": { - "message": "Nepravilna PIN koda." + "message": "Nepravilna PIN-koda." }, "unlockWithBiometrics": { "message": "Prijava z biometriko" }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "Čakam na potrditev z namizja" }, "awaitDesktopDesc": { "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { - "message": "Lock with master password on browser restart" + "message": "Zakleni z glavnim geslom ob ponovnem zagonu brskalnika" }, "selectOneCollection": { - "message": "You must select at least one collection." + "message": "Izbrati morate vsaj eno zbirko." }, "cloneItem": { - "message": "Clone item" + "message": "Podvoji element" }, "clone": { - "message": "Kloniraj" + "message": "Podvoji" }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "Dejanje ob poteku roka" }, "lock": { - "message": "Zakleni", + "message": "Zaklepanje", "description": "Verb form: to make secure or inaccesible by" }, "trash": { @@ -1413,41 +1514,65 @@ "message": "Preišči koš" }, "permanentlyDeleteItem": { - "message": "Permanently delete item" + "message": "Trajno izbriši element" }, "permanentlyDeleteItemConfirmation": { - "message": "Are you sure you want to permanently delete this item?" + "message": "Ste prepričani, da želite ta element trajno izbrisati?" }, "permanentlyDeletedItem": { - "message": "Item permanently deleted" + "message": "Element trajno izbrisan" }, "restoreItem": { - "message": "Restore item" - }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" + "message": "Obnovi element" }, "restoredItem": { - "message": "Item restored" + "message": "Element obnovljen" }, "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?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "Potrditev dejanja ob poteku roka" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Samodejno izpolni in shrani" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Element je bil samodejno izpolnjen in shranjen" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Element je bil samodejno izpolnjen" + }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } }, "setMasterPassword": { "message": "Nastavi glavno geslo" }, + "currentMasterPass": { + "message": "Trenutno glavno geslo" + }, + "newMasterPass": { + "message": "Novo glavno geslo" + }, + "confirmNewMasterPass": { + "message": "Ponovitev glavnega gesla" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1488,22 +1613,22 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "Your new master password does not meet the policy requirements." + "message": "Vaše novo glavno geslo ne ustreza zahtevam." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "Strinjam se z naslednjim:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Niste sprejeli Pogojev uporabe in Pravilnika o zasebnosti." }, "termsOfService": { - "message": "Terms of Service" + "message": "Pogoji uporabe" }, "privacyPolicy": { "message": "Pravilnik o zasebnosti" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "Namig za geslo ne sme biti enak geslu." }, "ok": { "message": "V redu" @@ -1512,7 +1637,7 @@ "message": "Desktop sync verification" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Prosimo, preverite, da namizna aplikacija prikazuje naslednje identifikacijsko geslo: " }, "desktopIntegrationDisabledTitle": { "message": "Browser integration is not set up" @@ -1556,32 +1681,44 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Dovoljenje manjka" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Brez dovoljenja za komunikacijo z Bitwardnovo namizno aplikacijo ni mogoče uporabljati bimetričnega preverjanja v razširitvi brskalnika. Prosimo, poskusite ponovno." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "Napaka pri zahtevku za dovoljenje" }, "nativeMessaginPermissionSidebarDesc": { "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "Politika podjetja določa, da ne morete shranjevati elementov v svoj osebni trezor. Spremenite lastništvo na organizacijo in izberite izmed zbirk na voljo." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "excludedDomains": { - "message": "Excluded domains" + "message": "Izključene domene" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "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." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ ni veljavna domena", "placeholders": { "domain": { "content": "$1", @@ -1590,15 +1727,15 @@ } }, "send": { - "message": "Pošlji", + "message": "Pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Išči pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Dodaj pošiljko", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -1608,7 +1745,7 @@ "message": "Datoteka" }, "allSends": { - "message": "All Sends", + "message": "Vse pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { @@ -1625,67 +1762,67 @@ "message": "Password protected" }, "copySendLink": { - "message": "Copy Send link", + "message": "Kopiraj povezavo pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "Odstrani geslo" }, "delete": { "message": "Izbriši" }, "removedPassword": { - "message": "Password removed" + "message": "Geslo odstranjeno" }, "deletedSend": { - "message": "Send deleted", + "message": "Pošiljka izbrisana", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Pošlji povezavo", + "message": "Povezava pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { "message": "Onemogočeno" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Ste prepričani, da želite odstraniti geslo?" }, "deleteSend": { - "message": "Delete Send", + "message": "Izbriši pošiljko", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "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." }, "editSend": { - "message": "Edit Send", + "message": "Uredi pošiljko", "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": "Kakšna vrsta pošiljke je to?", "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": "Prijazno ime, ki opisuje to pošiljko", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "Datoteka, ki jo želite poslati" }, "deletionDate": { - "message": "Deletion date" + "message": "Datum izbrisa" }, "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "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." }, "expirationDate": { - "message": "Expiration date" + "message": "Datum poteka" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Če to nastavite, bo pošiljka potekla ob izbranem času.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { @@ -1701,62 +1838,62 @@ } }, "custom": { - "message": "Custom" + "message": "Po meri" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Največje dovoljeno število dostopov" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Če to nastavite, uporabniki po določenem številu dostopov ne bodo mogli več dostopati do pošiljke.", "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": "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." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "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." }, "sendDisableDesc": { - "message": "Deactivate this Send so that no one can access it.", + "message": "Onemogoči to pošiljko, da nihče ne more dostopati do nje.", "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": "Kopiraj povezavo te pošiljke v odložišče, ko shranim.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "Besedilo, ki ga želite poslati" }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Privzeto skrij besedilo te pošiljke.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current access count" + "message": "Trenutno število dstopov" }, "createSend": { - "message": "New Send", + "message": "Nova pošiljka", "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 geslo" }, "sendDisabled": { - "message": "Send removed", + "message": "Pošiljka odstranjena", "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": "Pravila podjetja določajo, da lahko izbrišete le obstoječo pošiljko.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "Pošiljka ustvarjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send saved", + "message": "Pošiljka shranjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1769,65 +1906,68 @@ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Preden pričnete" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Za vnos datuma s pomočjo koledarčka", "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": "kliknite tukaj", "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": "za prikaz v lastnem oknu.", "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": "Datum poteka ni veljaven." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Datum izbrisa ni veljaven." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Datum in čas poteka sta obvezna." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Datum in čas izbrisa sta obvezna." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "Pri shranjevanju datumov poteka in izbrisa je prišlo do napake." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Skrij moj e-naslov pred prejemniki." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Nekatere nastavitve organizacije vplivajo na možnosti, ki jih imate v zvezi s pošiljkami." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Ponovno zahtevaj glavno geslo" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "Potrditev glavnega gesla" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "To dejanje je zaščiteno. Za nadaljevanje vpišite svoje glavno geslo, da potrdite svojo istovetnost." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "Potrebna je potrditev e-naslova" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Za uporabo te funkcionalnosti morate potrditi svoj e-naslov. To lahko storite v spletnem trezorju." }, "updatedMasterPassword": { - "message": "Updated master password" + "message": "Posodobi glavno geslo" }, "updateMasterPassword": { - "message": "Update master password" + "message": "Spremeni glavno geslo" }, "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1835,10 +1975,15 @@ "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": "Izberi mapo..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "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" }, "hours": { "message": "Ur" @@ -1847,7 +1992,20 @@ "message": "Minut" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(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$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1899,7 +2070,7 @@ "message": "You have left the organization." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Prikaži/skrij št. znakov" }, "sessionTimeout": { "message": "Your session has timed out. Please go back and try logging in again." @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1920,13 +2091,13 @@ "message": "Napaka" }, "regenerateUsername": { - "message": "Regenerate username" + "message": "Ponovno ustvari uporabniško ime" }, "generateUsername": { - "message": "Generate username" + "message": "Ustvari uporabniško ime" }, "usernameType": { - "message": "Username type" + "message": "Vrsta uporabniškega imena" }, "plusAddressedEmail": { "message": "Plus addressed email", @@ -1951,10 +2122,10 @@ "message": "Ime spletne strani" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Kaj želite generirati?" }, "passwordType": { - "message": "Password type" + "message": "Vrsta gesla" }, "service": { "message": "Service" @@ -1979,16 +2150,13 @@ "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Potrebno je premium članstvo" }, "organizationIsDisabled": { "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." - }, - "cardBrandMir": { - "message": "Mir" + "message": "Do elementov v suspendiranih organizacijah ne morete dostopati. Za pomoč se obrnite na lastnika svoje organizacije." }, "loggingInTo": { "message": "Logging in to $DOMAIN$", @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Verzija strežnika" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Zapomni si e-pošto" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Identifikacijsko geslo" + }, + "fingerprintMatchInfo": { + "message": "Prosimo, preverite, da je vaš trezor odklenjem in da se identifikacijski gesli na tej in drugi napravi ujemata." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2063,13 +2255,13 @@ "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?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Preverite, ali je bilo geslo izpostavljeno v krajah podatkov" }, "important": { - "message": "Important:" + "message": "Pomembno:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Če pozabite glavno geslo, ga ne bo mogoče povrniti!" }, "characterMinimum": { "message": "$LENGTH$ character minimum", @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "V pravilih vaše organizacije je vklopljeno samodejno izpolnjevanje." + }, + "howToAutofill": { + "message": "Kako uporabljati samodejno izpolnjevanje" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Razumem" + }, + "autofillSettings": { + "message": "Nastavitve" + }, + "autofillShortcut": { + "message": "Bližnjica za samodejno izpolnjevanje" + }, + "autofillShortcutNotSet": { + "message": "Bližnjična tipka za samodejno izpolnjevanje ni nastavljena. Nastavite jo lahko v nastavitvah brskalnika." + }, + "autofillShortcutText": { + "message": "Bližnjična tipka za samodejno izpolnjevanje je $COMMAND$. Spremenite jo lahko v nastavitvah brskalnika.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Privzeta bližnjica za samodejno izpolnjevanje: $COMMAND$", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Odpre se v novem oknu" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 34693d1fa407..bf4280cee90e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -3,15 +3,15 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Бесплатни Менаџер Лозинки", + "message": "Bitwarden - бесплатни менаџер лозинки", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Сигурни и бесплатни менаџер лозинке за све ваше уређаје.", + "message": "Сигурни и бесплатни менаџер лозинки за све ваше уређаје.", "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Пријавите се или креирајте нови налог за приступ Сефу." + "message": "Пријавите се или креирајте нови налог за приступ сефу." }, "createAccount": { "message": "Креирај налог" @@ -91,6 +91,15 @@ "autoFill": { "message": "Аутоматско допуњавање" }, + "autoFillLogin": { + "message": "Ауто-пуњење пријаве" + }, + "autoFillCard": { + "message": "Ауто-пуњење картице" + }, + "autoFillIdentity": { + "message": "Ауто-пуњење идентитета" + }, "generatePasswordCopied": { "message": "Генериши Лозинку (копирано)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Нема одговарајућих пријављивања." }, + "noCards": { + "message": "Нема карте" + }, + "noIdentities": { + "message": "Нема идентитета" + }, + "addLoginMenu": { + "message": "Нема пријаве" + }, + "addCardMenu": { + "message": "Додати картицу" + }, + "addIdentityMenu": { + "message": "Додати идентитет" + }, "unlockVaultMenu": { "message": "Откључај свој сеф" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Помоћ и подршка" }, + "helpCenter": { + "message": "Bitwarden помоћни центар" + }, + "communityForums": { + "message": "Претражити форуми заједнице Bitwarden-а" + }, + "contactSupport": { + "message": "Контактирајте подршку Bitwarden-а" + }, "sync": { "message": "Синхронизација" }, @@ -329,6 +362,12 @@ "other": { "message": "Остало" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Оцени овај додатак" }, @@ -336,7 +375,7 @@ "message": "Молимо вас да размотрите да нам помогнете уз добру оцену!" }, "browserNotSupportClipboard": { - "message": "Ваш прегледач не подржава једноставно копирање у привремену меморију. Уместо тога копирајте га ручно." + "message": "Ваш прегледач не подржава једноставно копирање у клипборду. Уместо тога копирајте га ручно." }, "verifyIdentity": { "message": "Потврдите идентитет" @@ -369,6 +408,9 @@ "lockNow": { "message": "Закључај одмах" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Одмах" }, @@ -430,7 +472,14 @@ "message": "Поновно уписивање главне лозинке је неопходно." }, "masterPasswordMinlength": { - "message": "Главна лозинка треба имати барем 8 карактера." + "message": "Главна лозинка мора бити дужине најмање $VALUE$ карактера.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Потврда главне лозинке се не подудара." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "„Нотификације Додај Лозинку“ аутоматски тражи да сачувате нове пријаве у сефу кад год се први пут пријавите на њих." }, + "addLoginNotificationDescAlt": { + "message": "Затражите да додате ставку ако она није пронађена у вашем сефу. Односи се на све пријављене налоге." + }, "showCardsCurrentTab": { "message": "Прикажи кредитне картице на страници картице" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Прикажи потврду за ажурирање тренутне лозинке за пријаву када се промена препозна на Web страници." }, + "changedPasswordNotificationDescAlt": { + "message": "Затражите ажурирање лозинке за пријаву када се открије промена на веб локацији. Односи се на све пријављене налоге." + }, + "enableUsePasskeys": { + "message": "Затражите за сачувавање и коришћење приступне кључеве" + }, + "usePasskeysDesc": { + "message": "Затражите да сачувате нове приступне кључеве или се пријавите са приступним кључевима ускладиштеним у вашем сефу. Односи се на све пријављене налоге." + }, "notificationChangeDesc": { "message": "Да ли желите да ажурирате ову лозинку за Bitwarden?" }, "notificationChangeSave": { "message": "Ажурирај" }, + "notificationUnlockDesc": { + "message": "Откључати Bitwarden сеф да би извршили ауто-пуњење." + }, + "notificationUnlock": { + "message": "Откључај" + }, "enableContextMenuItem": { "message": "Прикажи контекстни мени" }, "contextMenuItemDesc": { "message": "Користите други клик за приступање генерисању лозинки и пријавама за тренутну web страницу. " }, + "contextMenuItemDescAlt": { + "message": "Користите други клик за приступање генерисању лозинки и пријавама за тренутну web страницу. Односи се на све пријављене налоге." + }, "defaultUriMatchDetection": { "message": "Стандардно налажење УРЛ", "description": "Default URI match detection for auto-fill." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Промени боје апликације" }, + "themeDescAlt": { + "message": "Промените тему боје апликације. Односи се на све пријављене налоге." + }, "dark": { "message": "Тамна", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Функција је недоступна" }, - "updateKey": { - "message": "Не можете да користите ову способност док не промените Ваш кључ за шифровање." + "encryptionKeyMigrationRequired": { + "message": "Потребна је миграција кључа за шифровање. Пријавите се преко веб сефа да бисте ажурирали кључ за шифровање." }, "premiumMembership": { "message": "Премијум чланство" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1ГБ шифровано складиште за прилоге." }, - "ppremiumSignUpTwoStep": { - "message": "Додатне опције пријаве у два корака као што су YubiKey, FIDO U2F, и Duo." + "premiumSignUpTwoStepOptions": { + "message": "Приоритарне опције пријаве у два корака као што су YubiKey и Duo." }, "ppremiumSignUpReports": { "message": "Извештаји о хигијени лозинки, здравственом стању налога и кршењу података да бисте заштитили сеф." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "УРЛ адресе окружења су сачуване." }, + "showAutoFillMenuOnFormFields": { + "message": "Прикажи мени за ауто-попуњавање на пољима обрасца", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Односи се на све пријављене налоге." + }, + "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": "Када је поље изабрано (у фокусу)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "Омогући аутоматско попуњавање након учитавања странице" }, @@ -960,10 +1058,10 @@ "message": "Ако се открије образац за пријаву, извршите аутоматско попуњавање када се веб страница учита." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Компромитоване или непоуздане веб локације могу да искористе ауто-пуњење при учитавању странице." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Сазнајте више о ауто-пуњење" }, "defaultAutoFillOnPageLoad": { "message": "Подразумевано подешавање аутопуњења за пријаве" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Прикажи препознатљиву слику поред сваке ставке за пријаву." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Прикажи бедж са бројачем" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Врати ставку" }, - "restoreItemConfirmation": { - "message": "Да ли сте сигурни да желите да вратите ову ставку?" - }, "restoredItem": { "message": "Ставка враћена" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Ставка ауто-попуњена" }, + "insecurePageWarning": { + "message": "Упозорење: ово је необезбеђена ХТТП страница и све информације које пошаљете потенцијално могу други да виде и промене. Ова пријава је првобитно била сачувана на безбедној (ХТТПС) страници." + }, + "insecurePageWarningFillPrompt": { + "message": "Да ли и даље желите да попуните ову пријаву?" + }, + "autofillIframeWarning": { + "message": "Образац је хостован на другом домену од УРЛ-а ваше сачуване пријаве. Изаберите ОК да бисте ипак аутоматски попунили или Откажи да бисте зауставили." + }, + "autofillIframeWarningTip": { + "message": "Да бисте спречили ово упозорење у будућности, сачувајте ову УРЛ, $HOSTNAME$, у Bitwarden пријавју за овај сајт.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Постави Главну Лозинку" }, + "currentMasterPass": { + "message": "Тренутна главна лозинка" + }, + "newMasterPass": { + "message": "Нова главна лозинка" + }, + "confirmNewMasterPass": { + "message": "Потрдити нову главну лозинку" + }, "masterPasswordPolicyInEffect": { "message": "Једна или више смерница организације захтевају да ваша главна лозинка испуни следеће захтеве:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Биометрија прегледача није подржана на овом уређају." }, + "biometricsFailedTitle": { + "message": "Биометрија није успела" + }, + "biometricsFailedDesc": { + "message": "Биометрија се не може завршити, размислите о коришћењу главне лозинке или одјавите се. Ако се ово настави, контактирајте подршку Bitwarden-а." + }, "nativeMessaginPermissionErrorTitle": { "message": "Дозвола није дата" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "смернице организације утичу на ваше могућности власништва." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Политика организације је блокирала увоз ставки у ваш појединачни сеф." + }, "excludedDomains": { "message": "Изузети домени" }, "excludedDomainsDesc": { "message": "Bitwarden неће тражити да сачува податке за пријављивање за ове домене. Морате освежити страницу да би промене ступиле на снагу." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden неће тражити да сачува податке за пријављивање за ове домене за све пријављене налоге. Морате освежити страницу да би промене ступиле на снагу." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ није важећи домен", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Ваша главна лозинка је недавно промењена од стране администратора организације. Како бисте приступили сефу, морате да је ажурирате. Ако наставите бићете одјављени из ваше тренутне сесије, што ће захтевати да се поново пријавите. Активне сесије на другим уређајима ће можда наставити да раде до сат времена." }, + "updateWeakMasterPasswordWarning": { + "message": "Ваша главна лозинка не испуњава једну или више смерница ваше организације. Да бисте приступили сефу, морате одмах да ажурирате главну лозинку. Ако наставите, одјавићете се са ваше тренутне сесије, што захтева да се поново пријавите. Активне сесије на другим уређајима могу да остану активне до један сат." + }, "resetPasswordPolicyAutoEnroll": { "message": "Ауто пријављивање" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Изаберите фасциклу..." }, - "ssoCompleteRegistration": { - "message": "Да бисте довршили пријављивање помоћу SSO, молимо да поставите главну лозинку за приступ и заштиту вашег сефа." + "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" }, "hours": { "message": "Сата" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Смернице ваше организације утичу на временско ограничење сефа. Максимално дозвољено ограничење сефа је $HOURS$ сат(и) и $MINUTES$ минут(а). Ваша радња временског ограничења сефа је подешена на $ACTION$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Смернице ваше организације су поставиле вашу радњу временског ограничења сефа на $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Извоз личног сефа" }, - "exportingPersonalVaultDescription": { - "message": "Само предмети личног сефа повезани са $EMAIL$ биће извезени. Ставке организационог сефа неће бити укључене.", + "exportingIndividualVaultDescription": { + "message": "Само појединачне ставке сефа повезане са $EMAIL$ ће бити извењене. Ставке организационог сефа неће бити укључене. Само информације о ставкама из сефа ће бити извезене и неће укључивати повезане прилоге.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Није могуће приступити ставкама у онемогућене организације. Обратите се власнику организације за помоћ." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Пријављивање на $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Верзија сервера" }, - "selfHosted": { - "message": "Личан хостинг" + "selfHostedServer": { + "message": "личан хостинг" }, "thirdParty": { "message": "Трећа страна" @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "Запамти имејл" }, + "loginWithDevice": { + "message": "Пријавите се са уређајем" + }, + "loginWithDeviceEnabledInfo": { + "message": "Пријава помоћу уређаја мора бити подешена у подешавањима Bitwarden апликације. Потребна је друга опција?" + }, + "fingerprintPhraseHeader": { + "message": "Сигурносна фраза сефа" + }, + "fingerprintMatchInfo": { + "message": "Уверите се да је ваш сеф откључан и да се фраза отиска прста подудара на другом уређају." + }, + "resendNotification": { + "message": "Поново послати обавештење" + }, + "viewAllLoginOptions": { + "message": "Погледајте сав извештај у опције" + }, + "notificationSentDevice": { + "message": "Обавештење је послато на ваш уређај." + }, + "loginInitiated": { + "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", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Смернице ваше организације су укључиле ауто-пуњење при учитавању странице." + }, + "howToAutofill": { + "message": "Како ауто-попуњавати" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Разумем" + }, + "autofillSettings": { + "message": "Подешавања Ауто-пуњења" + }, + "autofillShortcut": { + "message": "Пречице Ауто-пуњења" + }, + "autofillShortcutNotSet": { + "message": "Пречица за ауто-попуњавање није подешена. Промените ово у подешавањима претраживача." + }, + "autofillShortcutText": { + "message": "Пречица ауто-пуњења је: $COMMAND$. Промените ово у подешавањима претраживача.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Подразумевана пречица за ауто-пуњење: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Пријављено на" + }, + "opensInANewWindow": { + "message": "Отвара се у новом прозору" + }, + "deviceApprovalRequired": { + "message": "Потребно је одобрење уређаја. Изаберите опцију одобрења испод:" + }, + "rememberThisDevice": { + "message": "Запамти овај уређај" + }, + "uncheckIfPublicDevice": { + "message": "Искључите ако се користи јавни уређај" + }, + "approveFromYourOtherDevice": { + "message": "Одобри са мојим другим уређајем" + }, + "requestAdminApproval": { + "message": "Затражити одобрење администратора" + }, + "approveWithMasterPassword": { + "message": "Одобрити са главном лозинком" + }, + "ssoIdentifierRequired": { + "message": "Потребан је SSO идентификатор организације." + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Одбијен приступ. Немате дозволу да видите ову страницу." + }, + "general": { + "message": "Опште" + }, + "display": { + "message": "Приказ" + }, + "accountSuccessfullyCreated": { + "message": "Налог је успешно креиран!" + }, + "adminApprovalRequested": { + "message": "Захтевано је одобрење администратора" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Ваш захтев је послат вашем администратору." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Бићете обавештени када буде одобрено." + }, + "troubleLoggingIn": { + "message": "Имате проблема са пријављивањем?" + }, + "loginApproved": { + "message": "Пријава је одобрена" + }, + "userEmailMissing": { + "message": "Недостаје имејл корисника" + }, + "deviceTrusted": { + "message": "Уређај поуздан" + }, + "inputRequired": { + "message": "Унос је потребан." + }, + "required": { + "message": "обавезно" + }, + "search": { + "message": "Тражи" + }, + "inputMinLength": { + "message": "Унос трба имати најмање $COUNT$ слова.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Унос не сме бити већи од $COUNT$ карактера.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Следећи знакови нису дозвољени: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Вредност мора бити најмање $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Вредност не сме бити већа од $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 или више имејлова су неважећи" + }, + "inputTrimValidator": { + "message": "Унос не сме да садржи само размак.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Унос није имејл." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поље(а) изнад захтевај(у) вашу пажњу.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Одабрати --" + }, + "multiSelectPlaceholder": { + "message": "-- Тип за филтрирање --" + }, + "multiSelectLoading": { + "message": "Преузимање опција..." + }, + "multiSelectNotFound": { + "message": "Нема предмета" + }, + "multiSelectClearAll": { + "message": "Обриши све" + }, + "plusNMore": { + "message": "+ још $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Под-мени" + }, + "toggleCollapse": { + "message": "Промени проширење", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Домен алијаса" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Ставке са упитом за поновно постављање главне лозинке не могу се ауто-попунити при учитавању странице. Ауто-попуњавање при учитавању странице је искључено.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Ауто-попуњавање при учитавању странице је подешено да користи подразумевано подешавање.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Откључај налог", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "Збир" + }, + "importWarning": { + "message": "Увозите податке у $ORGANIZATION$. Ваши подаци могу бити подељени са члановима ове организације. Да ли желите да наставите?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "Подаци нису правилно форматирани. Проверите датотеку за увоз и покушајте поново." + }, + "importNothingError": { + "message": "Ништа није увежено." + }, + "importEncKeyError": { + "message": "Грешка у дешифрирању извозне датотеке. Ваш кључ за шифровање не одговара кључу који се користио за извоз података." + }, + "invalidFilePassword": { + "message": "Неважећа лозинка за датотеку, користите лозинку коју сте унели када сте креирали датотеку за извоз." + }, + "importDestination": { + "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": "Потврдити лозинку датотеке" + }, + "typePasskey": { + "message": "Приступачни кључ" + }, + "passkeyNotCopied": { + "message": "Приступачни кључ неће бити копиран" + }, + "passkeyNotCopiedAlert": { + "message": "Приступачни кључ неће бити копиран на клонирану ставку. Да ли желите да наставите са клонирањем ставке?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Верификацију захтева сајт који покреће. Ова функција још увек није имплементирана за налоге без главне лозинке." + }, + "logInWithPasskey": { + "message": "Пријавите се са приступачним кључем?" + }, + "passkeyAlreadyExists": { + "message": "За ову апликацију већ постоји приступачни кључ." + }, + "noPasskeysFoundForThisApplication": { + "message": "Нису пронађени приступни кључеви за ову апликацију." + }, + "noMatchingPasskeyLogin": { + "message": "Немате одговарајућу пријаву за овај сајт." + }, + "confirm": { + "message": "Потврди" + }, + "savePasskey": { + "message": "Сачувати приступни кључ" + }, + "savePasskeyNewLogin": { + "message": "Сачувати приступни кључ као нову пријаву" + }, + "choosePasskey": { + "message": "Изаберите пријаву да бисте сачували овај приступни кључ" + }, + "passkeyItem": { + "message": "Ставка приступачног кључа" + }, + "overwritePasskey": { + "message": "Заменити приступни кључ?" + }, + "overwritePasskeyAlert": { + "message": "Ова ставка већ садржи приступни кључ. Да ли сте сигурни да желите да замените тренутни приступни кључ?" + }, + "featureNotSupported": { + "message": "Функција још није подржана" + }, + "yourPasskeyIsLocked": { + "message": "За коришћење приступног кључа је потребна аутентификација. Потврдите свој идентитет да бисте наставили." + }, + "useBrowserName": { + "message": "Користите претраживач" + }, + "multifactorAuthenticationCancelled": { + "message": "Вишефакторска аутентификација је отказана" + }, + "noLastPassDataFound": { + "message": "Нема LastPass податке" + }, + "incorrectUsernameOrPassword": { + "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": "Чекање 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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 6e15b67437e3..a4cda54c0737 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Logga in eller skapa ett nytt konto för att komma åt dina lösenord." + "message": "Logga in eller skapa ett nytt konto för att komma åt ditt säkra valv." }, "createAccount": { "message": "Skapa konto" @@ -91,6 +91,15 @@ "autoFill": { "message": "Fyll i automatiskt" }, + "autoFillLogin": { + "message": "Autofyll inloggning" + }, + "autoFillCard": { + "message": "Autofyll kort" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Skapa lösenord (kopierad)" }, @@ -100,6 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Hjälp & Feedback" }, + "helpCenter": { + "message": "Bitwarden Hjälpcenter" + }, + "communityForums": { + "message": "Utforska Bitwardens communityforum" + }, + "contactSupport": { + "message": "Kontakta Bitwarden support" + }, "sync": { "message": "Synkronisera" }, @@ -329,11 +362,17 @@ "other": { "message": "Annat" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Betygsätt tillägget" }, "rateExtensionDesc": { - "message": "Överväg gärna att hjälpa oss genom att ge oss en bra recension!" + "message": "Överväg gärna att skriva en recension om oss!" }, "browserNotSupportClipboard": { "message": "Din webbläsare har inte stöd för att enkelt kopiera till urklipp. Kopiera till urklipp manuellt istället." @@ -361,7 +400,7 @@ } }, "invalidMasterPassword": { - "message": "Felaktigt huvudlösenord" + "message": "Ogiltigt huvudlösenord" }, "vaultTimeout": { "message": "Valvets tidsgräns" @@ -369,6 +408,9 @@ "lockNow": { "message": "Lås nu" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Omedelbart" }, @@ -430,7 +472,14 @@ "message": "Huvudlösenord måste anges igen." }, "masterPasswordMinlength": { - "message": "Huvudlösenordet måste vara minst 8 tecken långt." + "message": "Huvudlösenordet måste vara minst $VALUE$ tecken långt.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Bekräftelsen för huvudlösenordet stämde ej." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Visa kort på fliksida" }, @@ -608,18 +660,36 @@ "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": "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": "Vill du uppdatera det här lösenordet i Bitwarden?" }, "notificationChangeSave": { "message": "Uppdatera" }, + "notificationUnlockDesc": { + "message": "Lås upp ditt Bitwarden-valv för att slutföra begäran om automatisk ifyllnad." + }, + "notificationUnlock": { + "message": "Lås upp" + }, "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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Ändra programmets färgtema." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Mörkt", "description": "Dark color" @@ -714,7 +787,7 @@ "message": "Kopiera verifieringskod" }, "attachments": { - "message": "Bifogade filer" + "message": "Bilagor" }, "deleteAttachment": { "message": "Radera bilaga" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Funktion ej tillgänglig" }, - "updateKey": { - "message": "Du kan inte använda denna funktion förrän du uppdaterar din krypteringsnyckel." + "encryptionKeyMigrationRequired": { + "message": "Migrering av krypteringsnyckel krävs. Logga in på webbvalvet för att uppdatera din krypteringsnyckel." }, "premiumMembership": { "message": "Premium-medlemskap" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB lagring av krypterade filer." }, - "ppremiumSignUpTwoStep": { - "message": "Ytterligare alternativ för tvåstegsverifiering såsom YubiKey, FIDO U2F och Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Lösenordshygien, kontohälsa och dataintrångsrapporter för att hålla ditt valv säkert." @@ -936,7 +1009,7 @@ "message": "Server-URL" }, "apiUrl": { - "message": "API server-URL" + "message": "API-server-URL" }, "webVaultUrl": { "message": "Webbvalvsserver-URL" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Miljö-URL:erna har sparats" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Aktivera automatisk ifyllnad vid sidhämtning" }, @@ -960,10 +1058,10 @@ "message": "Utför automatisk ifyllnad om ett inloggningsformulär upptäcks när webbsidan laddas." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Komprometterade eller ej betrodda webbplatser kan utnyttja automatisk ifyllnad vid sidladdning." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Läs mer om automatisk ifyllnad" }, "defaultAutoFillOnPageLoad": { "message": "Standardinställning för autofyll för inloggningsobjekt" @@ -1045,6 +1143,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" }, @@ -1109,7 +1210,7 @@ "message": "Säkerhetskod" }, "ex": { - "message": "t.ex." + "message": "t. ex." }, "title": { "message": "Titel" @@ -1127,7 +1228,7 @@ "message": "Dr" }, "mx": { - "message": "Mx" + "message": "Vederbörande" }, "firstName": { "message": "Förnamn" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Återställ objekt" }, - "restoreItemConfirmation": { - "message": "Är du säker på att du vill återställa detta objekt?" - }, "restoredItem": { "message": "Återställde objekt" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Fyllde i objektet automatiskt" }, + "insecurePageWarning": { + "message": "Varning: Detta är en icke säkrad HTTP-sida, och all information du skickar kan potentiellt ses och ändras av andra. Denna inloggning sparades ursprungligen på en säker (HTTPS) sida." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "För att förhindra denna varning i framtiden, spara denna URI, $HOSTNAME$, till ditt Bitwarden inloggningsobjekt för denna webbplats.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Ange huvudlösenord" }, + "currentMasterPass": { + "message": "Nuvarande huvudlösenord" + }, + "newMasterPass": { + "message": "Nytt huvudlösenord" + }, + "confirmNewMasterPass": { + "message": "Bekräfta nytt huvudlösenord" + }, "masterPasswordPolicyInEffect": { "message": "En eller flera organisationspolicyer kräver att ditt huvudlösenord uppfyller följande krav:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Biometri i webbläsaren stöds inte på den här enheten." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Behörighet ej beviljad" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "En organisationspolicy påverkar dina ägarskapsalternativ." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ är inte en giltig domän", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatiskt deltagande" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Timmar" @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Ditt valvs tidsgräns överskrider de begränsningar som fastställts av din organisation." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporterar individuellt valv" }, - "exportingPersonalVaultDescription": { - "message": "Endast de personliga valvobjekt som är associerade med $EMAIL$ kommer att exporteras. Organisationens valvobjekt kommer inte att inkluderas.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Objekt i inaktiverade organisationer är inte åtkomliga. Kontakta organisationens ägare för att få hjälp." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Loggar in på $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Serverversion" }, - "selfHosted": { - "message": "Lokalt installerad" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Tredje part" @@ -2050,14 +2218,38 @@ "rememberEmail": { "message": "Kom ihåg e-postadress" }, + "loginWithDevice": { + "message": "Logga in med enhet" + }, + "loginWithDeviceEnabledInfo": { + "message": "\"Logga in med enhet\" måste ställas in i inställningarna i Bitwardens app. Behöver du ett annat alternativ?" + }, + "fingerprintPhraseHeader": { + "message": "Fingeravtrycksfras" + }, + "fingerprintMatchInfo": { + "message": "Se till att ditt valv är upplåst och att fingeravtrycksfrasen matchar på den andra enheten." + }, + "resendNotification": { + "message": "Skicka avisering igen" + }, + "viewAllLoginOptions": { + "message": "Visa alla inloggningsalternativ" + }, + "notificationSentDevice": { + "message": "En avisering har skickats till din enhet." + }, + "loginInitiated": { + "message": "Inloggning påbörjad" + }, "exposedMasterPassword": { - "message": "Huvudlösenordet har avslöjats" + "message": "Huvudlösenordet har exponerats" }, "exposedMasterPasswordDesc": { "message": "Lösenordet avslöjades vid ett dataintrång. Använd ett unikt lösenord för att skydda ditt konto. Är du säker på att du vill använda ett lösenord som avslöjats?" }, "weakAndExposedMasterPassword": { - "message": "Huvudlösenordet är svagt och har avslöjats" + "message": "Huvudlösenordet är svagt och har exponerats" }, "weakAndBreachedMasterPasswordDesc": { "message": "Lösenordet är svagt och avslöjades vid ett dataintrång. Använd ett starkt och unikt lösenord för att skydda ditt konto. Är det säkert att du vill använda detta lösenord?" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Dina organisationspolicyer har aktiverat automatisk ifyllnad vid sidladdning." + }, + "howToAutofill": { + "message": "Hur du fyller i automatiskt" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Förstått" + }, + "autofillSettings": { + "message": "Inställningar för automatisk ifyllnad" + }, + "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." + }, + "autofillShortcutText": { + "message": "Genvägen för automatisk ifyllnad är: $COMMAND$. Ändra detta i webbläsarens inställningar.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Standardgenväg för automatisk ifyllnad: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logga in på" + }, + "opensInANewWindow": { + "message": "Öppnas i ett nytt fönster" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Kom ihåg denna enhet" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Godkänn med huvudlösenord" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Du kommer att meddelas vid godkännande." + }, + "troubleLoggingIn": { + "message": "Problem med att logga in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "obligatoriskt" + }, + "search": { + "message": "Sök" + }, + "inputMinLength": { + "message": "Inmatningen måste innehålla minst $COUNT$ tecken.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Följande tecken är inte tillåtna: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "En eller flera e-postadresser är ogiltiga" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Inmatningen är inte en e-postadress." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ fält ovan kräver din uppmärksamhet.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Välj --" + }, + "multiSelectPlaceholder": { + "message": "-- Skriv för att filtrera --" + }, + "multiSelectLoading": { + "message": "Hämtar alternativ..." + }, + "multiSelectNotFound": { + "message": "Inga objekt hittades" + }, + "multiSelectClearAll": { + "message": "Rensa alla" + }, + "plusNMore": { + "message": "+ $QUANTITY$ till", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Undermeny" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Aliasdomän" + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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": "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" + }, + "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": "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": "Import error" + }, + "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 successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "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" + } + } + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Ingenting har importerats." + }, + "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." + }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "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": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Välj fil" + }, + "noFileChosen": { + "message": "Ingen fil vald" + }, + "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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Bekräfta" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Använd webbläsare" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Felaktigt användarnamn eller lösenord" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Inkludera delade mappar" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importerar ditt konto..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Ange din engångskod från din autentiseringsapp" + }, + "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": "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": "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index ddda55bfd0ac..ab3933bf5b77 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "Sync" }, @@ -329,6 +362,12 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -430,7 +472,14 @@ "message": "Master password retype is required." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Master password confirmation does not match." @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, @@ -608,17 +660,35 @@ "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" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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", @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "updateKey": { - "message": "You cannot use this feature until you update your encryption key." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, - "ppremiumSignUpTwoStep": { - "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -936,7 +1009,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" }, @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Item auto-filled " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Set master password" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index dfeb5f232026..938a206a62cc 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "กรอกข้อมูลอัตโนมัติ" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generate Password (copied)" }, @@ -100,6 +109,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": "ปลดล็อกกตู้นิรภัยของคุณ" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Help & Feedback" }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, "sync": { "message": "ซิงค์" }, @@ -329,6 +362,12 @@ "other": { "message": "อื่น ๆ" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Rate the Extension" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Lock Now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ทันที" }, @@ -430,7 +472,14 @@ "message": "ต้องพิมพ์รหัสผ่านหลักอีกครั้ง" }, "masterPasswordMinlength": { - "message": "รหัสผ่านหลักต้องมีความยาวอย่างน้อย 8 ตัวอักษร" + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "การยืนยันรหัสผ่านหลักไม่ตรงกัน" @@ -448,7 +497,7 @@ "message": "โค้ดยืนยันไม่ถูกต้อง" }, "valueCopied": { - "message": " copied", + "message": "$VALUE$ copied", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -576,6 +625,9 @@ "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." + }, "showCardsCurrentTab": { "message": "แสดงการ์ดบนหน้าแท็บ" }, @@ -608,18 +660,36 @@ "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 หรือไม่?" }, "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "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." @@ -633,6 +703,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" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Feature Unavailable" }, - "updateKey": { - "message": "คุณไม่สามารถใช้คุณลักษณะนี้ได้จนกว่าคุณจะปรับปรุงคีย์การเข้ารหัสลับของคุณ" + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Premium Membership" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, - "ppremiumSignUpTwoStep": { - "message": "ตัวเลือกการเข้าสู่ระบบแบบสองขั้นตอนเพิ่มเติม เช่น YubiKey, FIDO U2F และ Duo" + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and Duo." }, "ppremiumSignUpReports": { "message": "สุขอนามัยของรหัสผ่าน ความสมบูรณ์ของบัญชี และรายงานการละเมิดข้อมูลเพื่อให้ตู้นิรภัยของคุณปลอดภัย" @@ -798,7 +871,7 @@ "message": "Thank you for supporting bitwarden." }, "premiumPrice": { - "message": "All for just %price% /year!", + "message": "All for just $PRICE$ /year!", "placeholders": { "price": { "content": "$1", @@ -828,7 +901,7 @@ "message": "Enter the 6 digit verification code from your authenticator app." }, "enterVerificationCodeEmail": { - "message": "Enter the 6 digit verification code that was emailed to", + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -953,6 +1026,31 @@ "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 auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Enable Auto-fill On Page Load." }, @@ -1045,6 +1143,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" }, @@ -1242,7 +1343,7 @@ "message": "ตรวจสอบว่ารหัสผ่านถูกเปิดเผยหรือไม่" }, "passwordExposed": { - "message": "This password has been exposed in data breaches. You should change it.", + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", "placeholders": { "value": { "content": "$1", @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "กู้คืนรายการ" }, - "restoreItemConfirmation": { - "message": "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนรายการนี้" - }, "restoredItem": { "message": "คืนค่ารายการแล้ว" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "รายการเติมอัตโนมัติ " }, + "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." + }, + "insecurePageWarningFillPrompt": { + "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." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "ตั้งรหัสผ่านหลัก" }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, "masterPasswordPolicyInEffect": { "message": "นโยบายองค์กรอย่างน้อยหนึ่งนโยบายกำหนดให้รหัสผ่านหลักของคุณเป็นไปตามข้อกำหนดต่อไปนี้:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, "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." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Hours" @@ -1847,7 +1992,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Logging in to $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Server version" }, - "selfHosted": { - "message": "Self-hosted" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Third-party" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Remember email" }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill 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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index e36fb56bff0b..04ec9976bf4b 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -91,6 +91,15 @@ "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 +109,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" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Yardım ve geribildirim" }, + "helpCenter": { + "message": "Bitwarden yardım merkezi" + }, + "communityForums": { + "message": "Bitwarden forumlarını keşfedin" + }, + "contactSupport": { + "message": "Bitwarden destek ekibiyle iletişime geçin" + }, "sync": { "message": "Eşitle" }, @@ -329,6 +362,12 @@ "other": { "message": "Diğer" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "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" + }, "rateExtension": { "message": "Uzantıyı değerlendirin" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Şimdi kilitle" }, + "lockAll": { + "message": "Tümünü kilitle" + }, "immediately": { "message": "Hemen" }, @@ -430,7 +472,14 @@ "message": "Ana parolayı yeniden yazmalısınız." }, "masterPasswordMinlength": { - "message": "Ana parola en az 8 karakter uzunluğunda olmalıdır." + "message": "Ana parola en az $VALUE$ karakter uzunluğunda olmalıdır.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Ana parola onayı eşleşmiyor." @@ -576,6 +625,9 @@ "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 bir öğenin eklenmesini isteyin. Oturum açmış tüm hesaplar için geçerlidir." + }, "showCardsCurrentTab": { "message": "Sekme sayfasında kartları göster" }, @@ -608,18 +660,36 @@ "changedPasswordNotificationDesc": { "message": "Sitede bir değişiklik tespit edildiğinde hesap parolasını güncellemeyi öner." }, + "changedPasswordNotificationDescAlt": { + "message": "Bir web sitesinde bir değişiklik tespit edildiğinde oturum açma şifresinin güncellenmesini isteyin. 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?" }, "notificationChangeSave": { "message": "Güncelle" }, + "notificationUnlockDesc": { + "message": "Otomatik doldurma isteğini tamamlamak için Bitwarden kasanızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "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." }, + "contextMenuItemDescAlt": { + "message": "Web sitesi için şifre oluşturmaya ve eşleşen oturum açma bilgilerine erişmek için ikincil bir tıklama kullanın. 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." @@ -633,6 +703,9 @@ "themeDesc": { "message": "Uygulamanın renk temasını değiştir." }, + "themeDescAlt": { + "message": "Uygulamanın renk temasını değiştirin. Oturum açmış tüm hesaplar için geçerlidir." + }, "dark": { "message": "Koyu", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Özellik kullanılamıyor" }, - "updateKey": { - "message": "Şifreleme anahtarınızı güncellemeden bu özelliği kullanamazsınız." + "encryptionKeyMigrationRequired": { + "message": "Şifreleme anahtarınızın güncellenmesi gerekiyor. Şifreleme anahtarınızı güncellemek için lütfen web kasasına giriş yapın." }, "premiumMembership": { "message": "Premium üyelik" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "Dosya ekleri için 1 GB şifrelenmiş depolama." }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey, FIDO U2F ve Duo gibi iki aşamalı giriş seçenekleri." + "premiumSignUpTwoStepOptions": { + "message": "YubiKey ve Duo gibi marka bazlı iki aşamalı giriş seçenekleri." }, "ppremiumSignUpReports": { "message": "Kasanızı güvende tutmak için parola hijyeni, hesap sağlığı ve veri ihlali raporları." @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Ortam URL'leri kaydedildi" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Oturum açmış tüm hesaplara uygulanır." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Kapalı", + "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": "Otomatik doldurma simgesi seçildiğinde", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, "enableAutoFillOnPageLoad": { "message": "Sayfa yüklendiğinde otomatik doldur" }, @@ -960,7 +1058,7 @@ "message": "Sayfa yüklendiğinde giriş formu tespit edilirse otomatik olarak formu doldur." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Ele geçirilmiş veya güvenilmeyen web siteleri sayfa yüklenirken otomatik doldurmayı suistimal edebilir." }, "learnMoreAboutAutofill": { "message": "Otomatik doldurma hakkında bilgi alın" @@ -1045,6 +1143,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" }, @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Kaydı geri yükle" }, - "restoreItemConfirmation": { - "message": "Bu kaydı geri yüklemek istediğinizden emin misiniz?" - }, "restoredItem": { "message": "Kayıt geri yüklendi" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Kayıt otomatik dolduruldu " }, + "insecurePageWarning": { + "message": "Uyarı: Güvenli olmayan bir HTTP sayfasındasınız. Gönderdiğiniz bilgiler potansiyel olarak başkaları tarafından görülebilir ve değiştirilebilir. Bu hesabı güvenli (HTTPS) bir sayfa üzerinden kaydetmiştiniz." + }, + "insecurePageWarningFillPrompt": { + "message": "Yine de bu hesabı doldurmak istiyor musunuz?" + }, + "autofillIframeWarning": { + "message": "Bu form, kayıtlı hesabınızın URI'sinden farklı bir alan adında yer alıyor. Yine de otomatik doldurmak isterseniz \"Tamam\"ı, durdurmak için \"İptal\"i seçin." + }, + "autofillIframeWarningTip": { + "message": "İleride bu uyarıyı görmek istemiyorsanız bu siteye ait Bitwarden hesap kaydınıza $HOSTNAME$ URI'sini ekleyin.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Ana parolayı belirle" }, + "currentMasterPass": { + "message": "Mevcut ana parola" + }, + "newMasterPass": { + "message": "Yeni ana parola" + }, + "confirmNewMasterPass": { + "message": "Yeni ana parolayı onaylayın" + }, "masterPasswordPolicyInEffect": { "message": "Bir veya daha fazla kuruluş ilkesi gereğince ana parolanız aşağıdaki gereksinimleri karşılamalıdır:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Tarayıcı biyometrisi bu cihazda desteklenmiyor." }, + "biometricsFailedTitle": { + "message": "Biyometri doğrulanamadı" + }, + "biometricsFailedDesc": { + "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" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Bir kuruluş ilkesi sahiplik seçeneklerinizi etkiliyor." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Bir kuruluş ilkesi, kayıtları kişisel kasanıza içe aktarmayı engelledi." + }, "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 oturum açma ayrıntılarını kaydetmeyi istemeyecektir. Değişikliklerin etkili olması için sayfayı yenilemeniz gerekir." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ geçerli bir alan adı değil", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Ana parolanız kuruluşunuzdaki bir yönetici tarafından yakın zamanda değiştirildi. Kasanıza erişmek için 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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Otomatik eklenme" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Saat" @@ -1847,7 +1992,20 @@ "message": "Dakika" }, "vaultTimeoutPolicyInEffect": { - "message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum kasa zaman aşımı $HOURS$ saat $MINUTES$ dakikadır", + "message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", + "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": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Kuruluş ilkeleriniz, kasa zaman aşımı eyleminizi $ACTION$ olarak ayarladı.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Kişisel kasa dışa aktarılıyor" }, - "exportingPersonalVaultDescription": { - "message": "Yalnızca $EMAIL$ ile ilişkili kişisel kasadaki kayıtlar dışa aktarılacaktır. Kuruluş kasasındaki kayıtlar dahil edilmeyecektir.", + "exportingIndividualVaultDescription": { + "message": "Yalnızca $EMAIL$ ile ilişkili kasa kayıtları dışa aktarılacaktır. Kuruluş kasasındaki kayıtlar dahil edilmeyecektir. Yalnızca kasa kayıt bilgileri dışa aktarılacak, kayıtlara eklenen dosyalar aktarılmayacaktır.", "placeholders": { "email": { "content": "$1", @@ -1970,7 +2141,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API erişim anahtarı" + "message": "API erişim token'ı" }, "apiKey": { "message": "API anahtarı" @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Askıya alınmış kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "$DOMAIN$ sitesine giriş yapılıyor", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Sunucu sürümü" }, - "selfHosted": { - "message": "Barındırılan" + "selfHostedServer": { + "message": "şirket içinde barındırılan" }, "thirdParty": { "message": "Üçüncü taraf" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "E-postayı hatırla" }, + "loginWithDevice": { + "message": "Cihazla giriş yap" + }, + "loginWithDeviceEnabledInfo": { + "message": "Cihazla girişi Bitwarden mobil uygulamasının ayarlarından etkinleştirmelisiniz. Başka bir seçeneğe mi ihtiyacınız var?" + }, + "fingerprintPhraseHeader": { + "message": "Parmak izi ifadesi" + }, + "fingerprintMatchInfo": { + "message": "Lütfen kasanızın kilidinin açık olduğundan ve parmak izi ifadesinin diğer cihazla eşleştiğinden emin olun." + }, + "resendNotification": { + "message": "Bildirimi yeniden gönder" + }, + "viewAllLoginOptions": { + "message": "Tüm giriş seçeneklerini gör" + }, + "notificationSentDevice": { + "message": "Cihazınıza bir bildirim gönderildi." + }, + "loginInitiated": { + "message": "Giriş başlatıldı" + }, "exposedMasterPassword": { "message": "Açığa Çıkmış Ana Parola" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Kuruluş ilkeleriniz, sayfa yüklendiğinde otomatik doldurmayı etkinleştirdi." + }, + "howToAutofill": { + "message": "Otomatik doldurma nasıl yapılır?" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Anladım" + }, + "autofillSettings": { + "message": "Otomatik doldurma ayarları" + }, + "autofillShortcut": { + "message": "Otomatik doldurma klavye kısayolu" + }, + "autofillShortcutNotSet": { + "message": "Otomatik doldurma kısayolu ayarlanmamış. Bunu tarayıcının ayarlarından değiştirebilirsiniz." + }, + "autofillShortcutText": { + "message": "Otomatik doldurma kısayolu: $COMMAND$. Bunu tarayıcının ayarlarından değiştirebilirsiniz.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Varsayılan otomatik doldurma kısayolu: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Giriş yapılan konum" + }, + "opensInANewWindow": { + "message": "Yeni pencerede açılır" + }, + "deviceApprovalRequired": { + "message": "Cihaz onayı gerekiyor. Lütfen onay yönteminizi seçin:" + }, + "rememberThisDevice": { + "message": "Bu cihazı hatırla" + }, + "uncheckIfPublicDevice": { + "message": "Paylaşılan bir cihaz kullanıyorsanız işaretlemeyin" + }, + "approveFromYourOtherDevice": { + "message": "Diğer cihazımdan onayla" + }, + "requestAdminApproval": { + "message": "Yönetici onayı iste" + }, + "approveWithMasterPassword": { + "message": "Ana parola ile onayla" + }, + "ssoIdentifierRequired": { + "message": "Kuruluş SSO tanımlayıcısı gereklidir." + }, + "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." + }, + "general": { + "message": "Genel" + }, + "display": { + "message": "Görünüm" + }, + "accountSuccessfullyCreated": { + "message": "Hesap başarıyla oluşturuldu!" + }, + "adminApprovalRequested": { + "message": "Yönetici onayı istendi" + }, + "adminApprovalRequestSentToAdmins": { + "message": "İsteğiniz yöneticinize gönderildi." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Onaylandıktan sonra bilgilendirileceksiniz." + }, + "troubleLoggingIn": { + "message": "Giriş yaparken sorun mu yaşıyorsunuz?" + }, + "loginApproved": { + "message": "Giriş onaylandı" + }, + "userEmailMissing": { + "message": "Kullanıcının e-postası eksik" + }, + "deviceTrusted": { + "message": "Cihaza güvenildi" + }, + "inputRequired": { + "message": "Girdi gerekli." + }, + "required": { + "message": "gerekli" + }, + "search": { + "message": "Ara" + }, + "inputMinLength": { + "message": "Girdi en az $COUNT$ karakter uzunluğunda olmalıdır.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Girdi $COUNT$ karakter uzunluğunu geçmemelidir.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Şu karakterlere izin verilmez: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Girdi değeri en az $MIN$ olmalı.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Girdi değeri en fazla $MAX$ olmalı.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "Bir veya daha fazla e-posta geçersiz" + }, + "inputTrimValidator": { + "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": "Girdi bir e-posta adresi değil." + }, + "fieldsNeedAttention": { + "message": "Yukarıdaki $COUNT$ alanla ilgilenmeniz gerekiyor.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Seçin --" + }, + "multiSelectPlaceholder": { + "message": "-- Filtrelemek için yazın --" + }, + "multiSelectLoading": { + "message": "Seçenekler alınıyor..." + }, + "multiSelectNotFound": { + "message": "Hiç kayıt bulunamadı" + }, + "multiSelectClearAll": { + "message": "Tümünü temizle" + }, + "plusNMore": { + "message": "+ $QUANTITY$ tane daha", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Alt menü" + }, + "toggleCollapse": { + "message": "Daraltmayı aç/kapat", + "description": "Toggling an expand/collapse state." + }, + "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 auto-filled 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 auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Hesap kilidini aç", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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": "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "İçe aktarma hedefi" + }, + "learnAboutImportOptions": { + "message": "İçe aktarma seçeneklerinizi öğrenin" + }, + "selectImportFolder": { + "message": "Bir klasör seçin" + }, + "selectImportCollection": { + "message": "Bir koleksiyon seçin" + }, + "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": "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" + }, + "typePasskey": { + "message": "Geçiş anahtarı" + }, + "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." + }, + "logInWithPasskey": { + "message": "Geçiş Anahtarı ile giriş yap?" + }, + "passkeyAlreadyExists": { + "message": "Bu uygulama için bir Geçiş Anahtarı zaten bulunmakta." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Çok faktörlü kimlik doğrulama iptal edildi" + }, + "noLastPassDataFound": { + "message": "LastPass verisi bulunamadı" + }, + "incorrectUsernameOrPassword": { + "message": "Kullanıcı adı veya parola yanlış" + }, + "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 bağlantı noktasına takın ve ardından düğmesine dokunun." + }, + "switchAccount": { + "message": "Hesabı değiştir" + }, + "switchAccounts": { + "message": "Hesapları değiştir" + }, + "switchToAccount": { + "message": "Hesaba geç" + }, + "activeAccount": { + "message": "Aktif hesap" + }, + "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" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 68f4f7779620..279bd8c28bad 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Автозаповнення" }, + "autoFillLogin": { + "message": "Автозаповнення входу" + }, + "autoFillCard": { + "message": "Автозаповнення картки" + }, + "autoFillIdentity": { + "message": "Автозаповнення особистих даних" + }, "generatePasswordCopied": { "message": "Генерувати пароль (з копіюванням)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Немає відповідних записів" }, + "noCards": { + "message": "Немає карток" + }, + "noIdentities": { + "message": "Немає особистих даних" + }, + "addLoginMenu": { + "message": "Додати запис входу" + }, + "addCardMenu": { + "message": "Додати картку" + }, + "addIdentityMenu": { + "message": "Додати особисті дані" + }, "unlockVaultMenu": { "message": "Розблокуйте сховище" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Допомога і зворотний зв'язок" }, + "helpCenter": { + "message": "Центр допомоги Bitwarden" + }, + "communityForums": { + "message": "Форуми спільноти Bitwarden" + }, + "contactSupport": { + "message": "Звернутися в службу підтримки Bitwarden" + }, "sync": { "message": "Синхронізація" }, @@ -276,7 +309,7 @@ "message": "Змінити" }, "view": { - "message": "Перегляд" + "message": "Переглянути" }, "noItemsInList": { "message": "Немає записів." @@ -312,7 +345,7 @@ "message": "Видалити запис" }, "viewItem": { - "message": "Перегляд запису" + "message": "Переглянути запис" }, "launch": { "message": "Перейти" @@ -329,6 +362,12 @@ "other": { "message": "Інше" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Налаштуйте спосіб розблокування, щоб змінити час очікування сховища." + }, + "unlockMethodNeeded": { + "message": "Встановіть спосіб розблокування в налаштуваннях" + }, "rateExtension": { "message": "Оцінити розширення" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Блокувати зараз" }, + "lockAll": { + "message": "Заблокувати все" + }, "immediately": { "message": "Негайно" }, @@ -430,7 +472,14 @@ "message": "Необхідно повторно ввести головний пароль." }, "masterPasswordMinlength": { - "message": "Довжина головного пароля має бути принаймні 8 символів." + "message": "Довжина головного пароля має бути принаймні $VALUE$ символів.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Підтвердження головного пароля не збігається." @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "Запитувати про додавання запису, якщо його немає у вашому сховищі." }, + "addLoginNotificationDescAlt": { + "message": "Запитувати про додавання запису, якщо такого не знайдено у вашому сховищі. Застосовується для всіх облікових записів, до яких виконано вхід." + }, "showCardsCurrentTab": { "message": "Показувати картки на вкладці" }, @@ -608,17 +660,35 @@ "changedPasswordNotificationDesc": { "message": "Запитувати про оновлення пароля запису, якщо на вебсайті виявлено його зміну." }, + "changedPasswordNotificationDescAlt": { + "message": "Запитувати про оновлення пароля для запису, якщо виявлено його зміну на вебсайті. Застосовується для всіх облікових записів, до яких виконано вхід." + }, + "enableUsePasskeys": { + "message": "Запитувати про збереження та використання ключів доступу" + }, + "usePasskeysDesc": { + "message": "Запитувати про збереження нових ключів доступу та використання збережених ключів доступу. Застосовується для всіх облікових записів, до яких виконано вхід." + }, "notificationChangeDesc": { "message": "Ви хочете оновити цей пароль в Bitwarden?" }, "notificationChangeSave": { "message": "Оновити" }, + "notificationUnlockDesc": { + "message": "Розблокуйте своє сховище Bitwarden, щоб завершити запит автозаповнення." + }, + "notificationUnlock": { + "message": "Розблокувати" + }, "enableContextMenuItem": { "message": "Показувати в контекстному меню" }, "contextMenuItemDesc": { - "message": "Використовувати доступ до генератора паролів та відповідних записів для вебсайту через контекстне меню." + "message": "Використовувати контекстне меню для доступу до генератора паролів та відповідних записів для вебсайту." + }, + "contextMenuItemDescAlt": { + "message": "Використовувати контекстне меню для доступу до генератора паролів та відповідних записів для вебсайту. Застосовується для всіх облікових записів, до яких виконано вхід." }, "defaultUriMatchDetection": { "message": "Типове виявлення збігів URI", @@ -633,6 +703,9 @@ "themeDesc": { "message": "Змінити колірну тему додатка." }, + "themeDescAlt": { + "message": "Змінити колірну тему програми. Застосовується для всіх облікових записів, до яких виконано вхід." + }, "dark": { "message": "Темна", "description": "Dark color" @@ -659,7 +732,7 @@ "message": "Підтвердити експорт сховища" }, "exportWarningDesc": { - "message": "Експортовані дані вашого сховища знаходяться в незашифрованому вигляді. Вам не слід зберігати чи надсилати їх через незахищені канали (наприклад, е-поштою). Після використання негайно видаліть їх." + "message": "Ваші експортовані дані сховища незашифровані. Не зберігайте і не надсилайте їх незахищеними каналами (як-от електронна пошта). Після використання негайно видаліть їх." }, "encExportKeyWarningDesc": { "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, необхідно виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Функція недоступна" }, - "updateKey": { - "message": "Ви не можете використовувати цю функцію доки не оновите свій ключ шифрування." + "encryptionKeyMigrationRequired": { + "message": "Потрібно перенести ключ шифрування. Увійдіть у вебсховище та оновіть свій ключ шифрування." }, "premiumMembership": { "message": "Преміум статус" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованого сховища для файлів." }, - "ppremiumSignUpTwoStep": { - "message": "Додаткові можливості двоетапної перевірки, наприклад, YubiKey, FIDO U2F та Duo." + "premiumSignUpTwoStepOptions": { + "message": "Додаткові можливості двоетапної авторизації, як-от YubiKey та Duo." }, "ppremiumSignUpReports": { "message": "Гігієна паролів, здоров'я облікового запису, а також звіти про вразливості даних, щоб зберігати ваше сховище в безпеці." @@ -924,7 +997,7 @@ "message": "Середовище власного хостингу" }, "selfHostedEnvironmentFooter": { - "message": "Вкажіть основну URL-адресу Bitwarden на вашому сервері." + "message": "Вкажіть основну URL-адресу Bitwarden, встановленого на локальному хостингу." }, "customEnvironment": { "message": "Власне середовище" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "URL-адреси середовища збережено" }, + "showAutoFillMenuOnFormFields": { + "message": "Меню автозаповнення на полях форм", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "Застосовується для всіх облікових записів, до яких виконано вхід." + }, + "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": "Якщо вибрано поле (у фокусі)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "Автозаповнення на сторінці" }, @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "Показувати впізнаване зображення біля кожного запису." }, + "faviconDescAlt": { + "message": "Показати впізнаване зображення поруч з кожним записом. Застосовується для всіх облікових записів, до яких виконано вхід." + }, "enableBadgeCounter": { "message": "Показувати лічильник" }, @@ -1130,7 +1231,7 @@ "message": "Mx" }, "firstName": { - "message": "Ім’я" + "message": "Ім'я" }, "middleName": { "message": "По батькові" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Відновити запис" }, - "restoreItemConfirmation": { - "message": "Ви дійсно хочете відновити цей запис?" - }, "restoredItem": { "message": "Запис відновлено" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "Запис заповнено" }, + "insecurePageWarning": { + "message": "Попередження: це незахищена сторінка HTTP, тому будь-яка інформація, яку ви передаєте, потенційно може бути переглянута чи змінена сторонніми. Ці облікові дані було збережено на безпечній сторінці (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Ви все ще бажаєте заповнити поля для входу?" + }, + "autofillIframeWarning": { + "message": "Домен форми входу відрізняється від URL-адреси, за якою його було збережено. Оберіть OK, якщо ви все одно хочете її заповнити, або Скасувати для зупинки." + }, + "autofillIframeWarningTip": { + "message": "Щоб надалі не бачити таке попередження, збережіть цей URI, $HOSTNAME$ у записі входу Bitwarden для цього сайту.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Встановити головний пароль" }, + "currentMasterPass": { + "message": "Поточний головний пароль" + }, + "newMasterPass": { + "message": "Новий головний пароль" + }, + "confirmNewMasterPass": { + "message": "Підтвердьте новий головний пароль" + }, "masterPasswordPolicyInEffect": { "message": "Одна або декілька політик організації вимагають дотримання таких вимог для головного пароля:" }, @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "Біометрія в браузері не підтримується на цьому пристрої." }, + "biometricsFailedTitle": { + "message": "Збій біометрії" + }, + "biometricsFailedDesc": { + "message": "Неможливо виконати біометрію. Скористайтеся головним паролем або вийдіть із системи. Якщо проблема не зникне, зверніться до служби підтримки Bitwarden." + }, "nativeMessaginPermissionErrorTitle": { "message": "Дозвіл не надано" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "Політика організації впливає на ваші параметри власності." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Політика організації заблокувала імпортування елементів до вашого особистого сховища." + }, "excludedDomains": { "message": "Виключені домени" }, "excludedDomainsDesc": { "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів. Потрібно оновити сторінку для застосування змін." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів для всіх облікових записів, до яких виконано вхід. Потрібно оновити сторінку для застосування змін." + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ не є дійсним доменом", "placeholders": { @@ -1612,7 +1749,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Досягнуто максимальну кількість доступів", + "message": "Досягнуто максимальної кількості доступів", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { @@ -1675,7 +1812,7 @@ "message": "Файл, який ви хочете відправити." }, "deletionDate": { - "message": "Дата видалення" + "message": "Термін дії" }, "deletionDateDesc": { "message": "Відправлення буде остаточно видалено у вказаний час.", @@ -1701,7 +1838,7 @@ } }, "custom": { - "message": "Спеціальний" + "message": "Власний" }, "maximumAccessCount": { "message": "Максимальна кількість доступів" @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, вам необхідно оновити його зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." }, + "updateWeakMasterPasswordWarning": { + "message": "Ваш головний пароль не відповідає одній або більше політикам вашої організації. Щоб отримати доступ до сховища, вам необхідно оновити свій головний пароль зараз. Продовживши, ви вийдете з поточного сеансу, після чого потрібно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години." + }, "resetPasswordPolicyAutoEnroll": { "message": "Автоматичне розгортання" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "Обрати теку..." }, - "ssoCompleteRegistration": { - "message": "Щоб завершити налаштування входу з SSO, встановіть головний пароль для доступу і захисту сховища." + "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" }, "hours": { "message": "Годин" @@ -1847,7 +1992,20 @@ "message": "Хвилин" }, "vaultTimeoutPolicyInEffect": { - "message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин", + "message": "Політикою вашої організації встановлено максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин. Для часу очікування вашого сховища встановлена дія $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Політикою вашої організації встановлено дію для часу очікування сховища $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Експортування особистого сховища" }, - "exportingPersonalVaultDescription": { - "message": "Будуть експортовані лише записи особистого сховища, пов'язані з $EMAIL$. Записи сховища організації не буде включено.", + "exportingIndividualVaultDescription": { + "message": "Будуть експортовані лише записи особистого сховища, пов'язані з $EMAIL$. Записи сховища організації не буде включено. Експортуються лише дані записів сховища без пов'язаних вкладень.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Записи у вимкнених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Вхід до $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Версія сервера" }, - "selfHosted": { - "message": "Власне розміщення" + "selfHostedServer": { + "message": "власне розміщення" }, "thirdParty": { "message": "Сторонній" @@ -2050,6 +2218,30 @@ "rememberEmail": { "message": "Запам'ятати е-пошту" }, + "loginWithDevice": { + "message": "Увійти з пристроєм" + }, + "loginWithDeviceEnabledInfo": { + "message": "Потрібно увімкнути схвалення запитів на вхід у налаштуваннях програми Bitwarden. Потрібен інший варіант?" + }, + "fingerprintPhraseHeader": { + "message": "Фраза відбитка" + }, + "fingerprintMatchInfo": { + "message": "Переконайтеся, що ваше сховище розблоковане, а фраза відбитка збігається з іншим пристроєм." + }, + "resendNotification": { + "message": "Надіслати сповіщення ще раз" + }, + "viewAllLoginOptions": { + "message": "Переглянути всі варіанти входу" + }, + "notificationSentDevice": { + "message": "Сповіщення було надіслано на ваш пристрій." + }, + "loginInitiated": { + "message": "Ініційовано вхід" + }, "exposedMasterPassword": { "message": "Головний пароль викрито" }, @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Політикою вашої організації було увімкнено автозаповнення на сторінці." + }, + "howToAutofill": { + "message": "Як працює автозаповнення" + }, + "autofillSelectInfoWithCommand": { + "message": "Виберіть елемент із цього екрану, скористайтеся комбінацією клавіш $COMMAND$, або дізнайтеся про інші можливості в налаштуваннях.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Виберіть елемент із цього екрану або дізнайтеся про інші можливості в налаштуваннях." + }, + "gotIt": { + "message": "Зрозуміло" + }, + "autofillSettings": { + "message": "Налаштування автозаповнення" + }, + "autofillShortcut": { + "message": "Комбінації клавіш автозаповнення" + }, + "autofillShortcutNotSet": { + "message": "Комбінацію клавіш для автозаповнення не встановлено. Змініть це в налаштуваннях браузера." + }, + "autofillShortcutText": { + "message": "Комбінація клавіш автозаповнення: $COMMAND$. Змініть це в налаштуваннях браузера.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Типова комбінація клавіш автозаповнення: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Увійти на" + }, + "opensInANewWindow": { + "message": "Відкривається у новому вікні" + }, + "deviceApprovalRequired": { + "message": "Необхідне підтвердження пристрою. Виберіть варіант підтвердження нижче:" + }, + "rememberThisDevice": { + "message": "Запам'ятати цей пристрій" + }, + "uncheckIfPublicDevice": { + "message": "Зніміть позначку, якщо використовуєте загальнодоступний пристрій" + }, + "approveFromYourOtherDevice": { + "message": "Затвердіть з іншого пристрою" + }, + "requestAdminApproval": { + "message": "Запит підтвердження адміністратора" + }, + "approveWithMasterPassword": { + "message": "Затвердити з головним паролем" + }, + "ssoIdentifierRequired": { + "message": "Потрібен SSO-ідентифікатор організації." + }, + "eu": { + "message": "ЄС", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ заборонено. У вас немає дозволу на перегляд цієї сторінки." + }, + "general": { + "message": "Загальні" + }, + "display": { + "message": "Екран" + }, + "accountSuccessfullyCreated": { + "message": "Обліковий запис успішно створено!" + }, + "adminApprovalRequested": { + "message": "Запитано затвердження адміністратором" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Ваш запит відправлено адміністратору." + }, + "youWillBeNotifiedOnceApproved": { + "message": "Ви отримаєте сповіщення після затвердження." + }, + "troubleLoggingIn": { + "message": "Проблема під час входу?" + }, + "loginApproved": { + "message": "Вхід затверджено" + }, + "userEmailMissing": { + "message": "Немає адреси електронної пошти" + }, + "deviceTrusted": { + "message": "Довірений пристрій" + }, + "inputRequired": { + "message": "Необхідно ввести дані." + }, + "required": { + "message": "обов'язково" + }, + "search": { + "message": "Пошук" + }, + "inputMinLength": { + "message": "Введені дані мають бути довжиною принаймні $COUNT$ символів.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Вхідне значення не повинно перевищувати $COUNT$ символів.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "Вказані символи заборонені: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Значення має бути принаймні $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Значення не може перевищувати $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 або більше адрес е-пошти недійсні" + }, + "inputTrimValidator": { + "message": "Введене значення не повинно містити лише пробіл.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Введені дані не є адресою е-пошти." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ поле (поля) вище потребують вашої уваги.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Оберіть--" + }, + "multiSelectPlaceholder": { + "message": "-- Введіть для фільтрування --" + }, + "multiSelectLoading": { + "message": "Параметри отримання..." + }, + "multiSelectNotFound": { + "message": "Нічого не знайдено" + }, + "multiSelectClearAll": { + "message": "Очистити все" + }, + "plusNMore": { + "message": "+ ще $QUANTITY$", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Підменю" + }, + "toggleCollapse": { + "message": "Згорнути/розгорнути", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "Псевдонім домену" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Записи з повторним запитом головного пароля не можна автоматично заповнювати під час завантаження сторінки. Автозаповнення на сторінці вимкнено.", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Автозаповнення на сторінці налаштовано з типовими параметрами.", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "Розблокувати обліковий запис", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "Всього" + }, + "importWarning": { + "message": "Ви імпортуєте дані до $ORGANIZATION$. Ваші дані можуть бути доступні учасникам цієї організації. Хочете продовжити?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "Дані мають некоректне форматування. Перевірте файл імпорту і спробуйте знову." + }, + "importNothingError": { + "message": "Нічого не імпортовано." + }, + "importEncKeyError": { + "message": "Помилка розшифрування експортованого файлу. Ваш ключ шифрування відрізняється від ключа, використаного для експортування даних." + }, + "invalidFilePassword": { + "message": "Неправильний пароль файлу. Використайте пароль, який ви вводили під час створення експортованого файлу." + }, + "importDestination": { + "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": "Підтвердьте пароль файлу" + }, + "typePasskey": { + "message": "Ключ доступу" + }, + "passkeyNotCopied": { + "message": "Ключ доступу не буде скопійовано" + }, + "passkeyNotCopiedAlert": { + "message": "Ключ доступу не буде скопійовано до клонованого запису. Хочете продовжити клонування цього запису?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Сайт ініціює обов'язкову верифікацію. Ця функція ще не реалізована для облікових записів без головного пароля." + }, + "logInWithPasskey": { + "message": "Увійти з ключем доступу?" + }, + "passkeyAlreadyExists": { + "message": "Ключ доступу для цієї програми вже існує." + }, + "noPasskeysFoundForThisApplication": { + "message": "Для цієї програми не знайдено ключів доступу." + }, + "noMatchingPasskeyLogin": { + "message": "У вас немає відповідних записів для цього сайту." + }, + "confirm": { + "message": "Підтвердити" + }, + "savePasskey": { + "message": "Зберегти ключ доступу" + }, + "savePasskeyNewLogin": { + "message": "Зберегти ключ доступу як новий запис" + }, + "choosePasskey": { + "message": "Виберіть запис для збереження цього ключа доступу" + }, + "passkeyItem": { + "message": "Ключ доступу" + }, + "overwritePasskey": { + "message": "Перезаписати ключ доступу?" + }, + "overwritePasskeyAlert": { + "message": "Цей елемент вже містить ключ доступу. Ви впевнені, що хочете перезаписати поточний ключ доступу?" + }, + "featureNotSupported": { + "message": "Функція ще не підтримується" + }, + "yourPasskeyIsLocked": { + "message": "Для використання ключа доступу потрібна автентифікація. Пройдіть перевірку, щоб продовжити." + }, + "useBrowserName": { + "message": "Скористатися браузером" + }, + "multifactorAuthenticationCancelled": { + "message": "Багатофакторну автентифікацію скасовано" + }, + "noLastPassDataFound": { + "message": "Дані LastPass не знайдено" + }, + "incorrectUsernameOrPassword": { + "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": "Очікується автентифікація 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": "Активний обліковий запис" + }, + "accountLimitReached": { + "message": "Досягнуто обмеження облікового запису. Вийдіть, щоб додати інший обліковий запис." + }, + "active": { + "message": "активний" + }, + "locked": { + "message": "заблокований" + }, + "unlocked": { + "message": "розблокований" + }, + "server": { + "message": "сервер" + }, + "hostedAt": { + "message": "розміщений на" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 821328b3f4af..4aa9aca6d4df 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "Tự động điền" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Tạo mật khẩu (đã sao chép)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "Không có thông tin đăng nhập phù hợp." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Mở khoá kho lưu trữ của bạn" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "Trợ giúp & phản hồi" }, + "helpCenter": { + "message": "Trung tâm hỗ trợ Bitwarden" + }, + "communityForums": { + "message": "Khám phá diễn đàn cộng đồng Bitwarden" + }, + "contactSupport": { + "message": "Liên hệ với bộ phận hỗ trợ Bitwarden" + }, "sync": { "message": "Đồng bộ" }, @@ -329,6 +362,12 @@ "other": { "message": "Khác" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "Đánh giá tiện ích mở rộng" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "Khóa ngay" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Ngay lập tức" }, @@ -430,7 +472,14 @@ "message": "Yêu cầu nhập lại mật khẩu chính." }, "masterPasswordMinlength": { - "message": "Mật khẩu chính phải có ít nhất 8 kí tự." + "message": "Mật khẩu chính phải có ít nhất $VALUE$ kí tự.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "Xác nhận mật khẩu chính không khớp." @@ -576,6 +625,9 @@ "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": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, "showCardsCurrentTab": { "message": "Hiển thị thẻ trên trang Tab" }, @@ -606,7 +658,16 @@ "message": "Hỏi để cập nhật đăng nhập hiện có" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "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": "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": "Bạn có muốn cập nhật mật khẩu này trên Bitwarden không?" @@ -614,11 +675,20 @@ "notificationChangeSave": { "message": "Cập nhật" }, + "notificationUnlockDesc": { + "message": "Vui lòng mở khóa Kho Bitwarden của bạn để hoàn thành quá trình tự động điền." + }, + "notificationUnlock": { + "message": "Mở khóa" + }, "enableContextMenuItem": { "message": "Hiển thị tuỳ chọn menu ngữ cảnh" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "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": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Phương thức kiểm tra URI mặc định", @@ -633,6 +703,9 @@ "themeDesc": { "message": "Thay đổi màu sắc ứng dụng." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Tối", "description": "Dark color" @@ -662,10 +735,10 @@ "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." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "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." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "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." }, "exportMasterPassword": { "message": "Nhập mật khẩu chính để xuất kho lưu trữ của bạn." @@ -677,7 +750,7 @@ "message": "Xem tổ chức của bạn" }, "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?" + "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?" }, "moveToOrganization": { "message": "Di chuyển đến tổ chức" @@ -699,7 +772,7 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Chọn một tổ chức mà bạn muốn chuyển mục này tới. Việc di chuyển đến một tổ chức sẽ chuyển quyền sở hữu của mục sang tổ chức mà bạn chọn. Bạn sẽ không còn là chủ sở hữu trực tiếp của mục này một khi nó đã được chuyển." }, "learnMore": { "message": "Tìm hiểu thêm" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "Tính năng không có sẵn" }, - "updateKey": { - "message": "Bạn không thể sử dụng tính năng này cho đến khi bạn cập nhật khoá mã hóa." + "encryptionKeyMigrationRequired": { + "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { "message": "Thành viên Cao Cấp" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1GB bộ nhớ lưu trữ tập tin được mã hóa." }, - "ppremiumSignUpTwoStep": { - "message": "Tuỳ chọn đăng nhập 2 bước bổ sung như YubiKey, FIDO U2F, và Duo." + "premiumSignUpTwoStepOptions": { + "message": "Proprietary two-step login options such as YubiKey and 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." @@ -861,7 +934,7 @@ "message": "Lắp khóa bảo mật vào cổng USB máy tính của bạn. Nếu nó có một nút, hãy nhấn vào nó." }, "webAuthnNewTab": { - "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." + "message": "Để bắt đầu xác minh WebAuthn 2FA. Nhấp vào nút bên dưới để mở tab mới và làm theo hướng dẫn được cung cấp trong tab mới." }, "webAuthnNewTabOpen": { "message": "Mở thẻ mới" @@ -912,7 +985,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn compatible security key to access your account." + "message": "Sử dụng bất kỳ khóa bảo mật tương thích với WebAuthn nào để truy cập vào tài khoản của bạn." }, "emailTitle": { "message": "Email" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "Địa chỉ môi trường đã được lưu." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "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" + }, "enableAutoFillOnPageLoad": { "message": "Tự động điền khi tải trang" }, @@ -960,10 +1058,10 @@ "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." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "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." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Tìm hiểu thêm về tự động điền" }, "defaultAutoFillOnPageLoad": { "message": "Cài đặt tự động điền mặc định cho mục đăng nhập" @@ -1045,11 +1143,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": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Hiển thị biểu tượng bộ đếm" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Cho biết bạn có bao nhiêu lần đăng nhập cho trang web hiện tại." }, "cardholderName": { "message": "Tên chủ thẻ" @@ -1353,7 +1454,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Mật khẩu chính đơn giản" + "message": "Mật khẩu chính yếu" }, "weakMasterPasswordDesc": { "message": "Mật khẩu chính bạn vừa chọn có vẻ yếu. Bạn nên chọn mật khẩu chính (hoặc cụm từ mật khẩu) mạnh để bảo vệ đúng cách tài khoản Bitwarden của bạn. Bạn có thực sự muốn dùng mật khẩu chính này?" @@ -1390,7 +1491,7 @@ "message": "Bạn phải chọn ít nhất một bộ sưu tập." }, "cloneItem": { - "message": "Tại bản sao của mục" + "message": "Tạo bản sao của mục" }, "clone": { "message": "Tạo bản sao" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "Khôi phục mục" }, - "restoreItemConfirmation": { - "message": "Bạn có chắc chắn muốn khôi phục mục này không?" - }, "restoredItem": { "message": "Mục đã được khôi phục" }, @@ -1445,14 +1543,41 @@ "autoFillSuccess": { "message": "Đã tự động điền mục " }, + "insecurePageWarning": { + "message": "Cảnh báo: Đây là một trang HTTP không an toàn, và mọi thông tin bạn nhập ở đây có khả năng được xem & thay đổi bởi người khác. Thông tin Đăng nhập này ban đầu được lưu ở một trang an toàn (HTTPS)." + }, + "insecurePageWarningFillPrompt": { + "message": "Bạn vẫn muốn điền thông tin đăng nhập?" + }, + "autofillIframeWarning": { + "message": "Mẫu điền thông tin này được lưu tại một tên miền khác với URI lưu tại thông tin đăng nhập của bạn. Hãy chọn OK để tiếp tục tự động điền, hoặc Hủy bỏ để dừng lại." + }, + "autofillIframeWarningTip": { + "message": "Để chặn cảnh báo này trong tương lai, hãy lưu URI này, $HOSTNAME$, vào thông tin đăng nhập của bạn cho trang này ở Kho Bitwarden.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "Đặt mật khẩu chính" }, + "currentMasterPass": { + "message": "Mật khẩu chính hiện tại" + }, + "newMasterPass": { + "message": "Mật khẩu chính mới" + }, + "confirmNewMasterPass": { + "message": "Xác nhận mật khẩu chính mới" + }, "masterPasswordPolicyInEffect": { "message": "Tổ chức của bạn yêu cầu mật khẩu chính của bạn phải đáp ứng các yêu cầu sau:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "Điểm phức tạp tối thiểu của $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1494,7 +1619,7 @@ "message": "Bạn đồng ý với những điều sau khi nhấn chọn ô này:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Điều khoản sử dụng và Chính sách quyền riêng tư chưa được đồng ý." }, "termsOfService": { "message": "Điều khoản sử dụng" @@ -1518,28 +1643,28 @@ "message": "Tích hợp trình duyệt chưa được kích hoạt" }, "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": "Tích hợp trình duyệt không được thiết lập trong ứng dụng máy tính để bàn Bitwarden. Vui lòng thiết lập nó trong cài đặt trong ứng dụng máy tính để bàn." }, "startDesktopTitle": { "message": "Mở ứng dụng Bitwarden trên máy tính" }, "startDesktopDesc": { - "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + "message": "Ứng dụng máy tính để bàn Bitwarden cần được khởi động trước khi có thể sử dụng tính năng mở khóa bằng sinh trắc học." }, "errorEnableBiometricTitle": { "message": "Không thể bật nhận dạng sinh trắc học" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "Hành động đã bị hủy bởi ứng dụng máy tính để bàn" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "Ứng dụng máy tính để bàn đã vô hiệu hóa kênh liên lạc an toàn. Vui lòng thử lại thao tác này" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Giao tiếp máy tính để bàn bị gián đoạn" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "Ứng dụng máy tính để bàn được đăng nhập vào một tài khoản khác. Hãy đảm bảo cả hai ứng dụng được đăng nhập vào cùng một tài khoản." }, "nativeMessagingWrongUserTitle": { "message": "Tài khoản không đúng" @@ -1556,29 +1681,41 @@ "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" }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Quyền chưa được cấp" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Nếu không được phép giao tiếp với Ứng dụng máy tính để bàn Bitwarden, chúng tôi không thể cung cấp sinh trắc học trong tiện ích mở rộng trình duyệt. Vui lòng thử lại." }, "nativeMessaginPermissionSidebarTitle": { "message": "Lỗi yêu cầu quyền" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Không thể thực hiện hành động này trong thanh bên, vui lòng thử lại hành động trong cửa sổ bật lên hoặc cửa sổ bật ra." }, "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": "Do Chính sách doanh nghiệp, bạn bị hạn chế lưu các mục vào kho tiền cá nhân của mình. Thay đổi tùy chọn Quyền sở hữu thành một tổ chức và chọn từ các bộ sưu tập có sẵn." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "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": "An organization policy has blocked importing items into your individual vault." }, "excludedDomains": { "message": "Tên miền đã loại trừ" }, "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 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 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." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ không phải là tên miền hợp lệ", @@ -1612,7 +1749,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Đã đạt đến số lượng truy cập tối đa", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { @@ -1711,7 +1848,7 @@ "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": "Tùy chọn yêu cầu mật khẩu để người dùng truy cập Gửi này.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { @@ -1828,6 +1965,9 @@ "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." }, + "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." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1837,8 +1977,13 @@ "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." + "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" }, "hours": { "message": "Giờ" @@ -1847,7 +1992,7 @@ "message": "Phút" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { "hours": { "content": "$1", @@ -1859,6 +2004,32 @@ } } }, + "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": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "Your vault timeout exceeds the restrictions set by your organization." }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "Exporting individual vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "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.", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "Đang đăng nhập vào $DOMAIN$", "placeholders": { @@ -2011,8 +2179,8 @@ "serverVersion": { "message": "Phiên bản máy chủ" }, - "selfHosted": { - "message": "Tự lưu trữ" + "selfHostedServer": { + "message": "self-hosted" }, "thirdParty": { "message": "Bên thứ ba" @@ -2050,8 +2218,32 @@ "rememberEmail": { "message": "Ghi nhớ email" }, + "loginWithDevice": { + "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?" + }, + "fingerprintPhraseHeader": { + "message": "Cụm từ dấu vân tay" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Gửi lại thông báo" + }, + "viewAllLoginOptions": { + "message": "Xem tất cả tùy chọn đăng nhập" + }, + "notificationSentDevice": { + "message": "Một thông báo đã được gửi đến thiết bị của bạn." + }, + "loginInitiated": { + "message": "Login initiated" + }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "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?" @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "Chính sách quản lí của bạn đã bật chức năng tự động điền khi tải trang." + }, + "howToAutofill": { + "message": "Cách tự đồng điền" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Cài đặt tự động điền" + }, + "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." + }, + "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.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Phím tắt mặc định cho chức năng tự động điền: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "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" + }, + "display": { + "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" + }, + "inputRequired": { + "message": "Input is required." + }, + "required": { + "message": "required" + }, + "search": { + "message": "Search" + }, + "inputMinLength": { + "message": "Input must be at least $COUNT$ characters long.", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "Input must not exceed $COUNT$ characters in length.", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "The following characters are not allowed: $CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "Input value must be at least $MIN$.", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "Input value must not exceed $MAX$.", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "1 or more emails are invalid" + }, + "inputTrimValidator": { + "message": "Input must not contain only whitespace.", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "Input is not an email address." + }, + "fieldsNeedAttention": { + "message": "$COUNT$ field(s) above need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- Select --" + }, + "multiSelectPlaceholder": { + "message": "-- Type to filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "Submenu" + }, + "toggleCollapse": { + "message": "Toggle collapse", + "description": "Toggling an expand/collapse state." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "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" + } + } + }, + "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." + }, + "importDestination": { + "message": "Import 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" + }, + "typePasskey": { + "message": "Passkey" + }, + "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." + }, + "logInWithPasskey": { + "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." + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "choosePasskey": { + "message": "Choose a login to save this passkey to" + }, + "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." + }, + "useBrowserName": { + "message": "Use browser" + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "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" + }, + "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" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index e985eccbeb33..8db5c7fb35c3 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -41,7 +41,7 @@ "message": "主密码是您访问密码库的唯一密码。它非常重要,请您不要忘记。一旦忘记,无任何办法恢复此密码。" }, "masterPassHintDesc": { - "message": "主密码提示可以在你忘记密码时帮你回忆起来。" + "message": "主密码提示可以在您忘记密码时帮您回忆起来。" }, "reTypeMasterPass": { "message": "再次输入主密码" @@ -91,6 +91,15 @@ "autoFill": { "message": "自动填充" }, + "autoFillLogin": { + "message": "自动填充登录" + }, + "autoFillCard": { + "message": "自动填充支付卡" + }, + "autoFillIdentity": { + "message": "自动填充身份" + }, "generatePasswordCopied": { "message": "生成密码(并复制)" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "无匹配的登录项目" }, + "noCards": { + "message": "无支付卡" + }, + "noIdentities": { + "message": "无身份" + }, + "addLoginMenu": { + "message": "添加登录项目" + }, + "addCardMenu": { + "message": "添加支付卡" + }, + "addIdentityMenu": { + "message": "添加身份" + }, "unlockVaultMenu": { "message": "解锁您的密码库" }, @@ -153,7 +177,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "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": { @@ -195,6 +219,15 @@ "helpFeedback": { "message": "帮助与反馈" }, + "helpCenter": { + "message": "Bitwarden 帮助中心" + }, + "communityForums": { + "message": "探索 Bitwarden 社区论坛" + }, + "contactSupport": { + "message": "联系 Bitwarden 支持" + }, "sync": { "message": "同步" }, @@ -254,7 +287,7 @@ "message": "单词分隔符" }, "capitalize": { - "message": "大写", + "message": "首字母大写", "description": "Make the first letter of a work uppercase." }, "includeNumber": { @@ -329,6 +362,12 @@ "other": { "message": "其他" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "设置一个解锁方式以更改您的密码库超时动作。" + }, + "unlockMethodNeeded": { + "message": "在设置中设置解锁方法" + }, "rateExtension": { "message": "为本扩展打分" }, @@ -348,7 +387,7 @@ "message": "解锁" }, "loggedInAsOn": { - "message": "以 $EMAIL$ 在 $HOSTNAME$ 上登录。", + "message": "已在 $HOSTNAME$ 上以 $EMAIL$ 身份登录。", "placeholders": { "email": { "content": "$1", @@ -369,6 +408,9 @@ "lockNow": { "message": "立即锁定" }, + "lockAll": { + "message": "全部锁定" + }, "immediately": { "message": "立即" }, @@ -430,7 +472,14 @@ "message": "必须填写确认主密码。" }, "masterPasswordMinlength": { - "message": "主密码至少需要 8 个字符。" + "message": "主密码必须至少 $VALUE$ 个字符长度。", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "两次填写的主密码不一致。" @@ -461,13 +510,13 @@ "message": "无法在此页面上自动填充所选项目。请改为手工复制并粘贴。" }, "loggedOut": { - "message": "已退出账户" + "message": "已注销" }, "loginExpired": { "message": "您的登录会话已过期。" }, "logOutConfirmation": { - "message": "您确定要退出账户吗?" + "message": "确定要注销吗?" }, "yes": { "message": "是" @@ -491,13 +540,13 @@ "message": "您可以在 bitwarden.com 网页版密码库修改主密码。您现在要访问这个网站吗?" }, "twoStepLoginConfirmation": { - "message": "两步登录要求您从其他设备(例如安全钥匙、验证器应用、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码中设置。您现在要访问这个网站吗?" + "message": "两步登录要求您从其他设备(例如安全钥匙、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" }, "editedFolder": { "message": "文件夹已保存" }, "deleteFolderConfirmation": { - "message": "您确定要删除此文件夹吗?" + "message": "确定要删除此文件夹吗?" }, "deletedFolder": { "message": "文件夹已删除" @@ -549,13 +598,13 @@ "message": "覆盖密码" }, "overwritePasswordConfirmation": { - "message": "您确定要覆盖当前密码吗?" + "message": "确定要覆盖当前密码吗?" }, "overwriteUsername": { "message": "覆盖用户名" }, "overwriteUsernameConfirmation": { - "message": "您确定要覆盖当前用户名吗?" + "message": "确定要覆盖当前用户名吗?" }, "searchFolder": { "message": "搜索文件夹" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "在密码库中找不到匹配项目时询问添加一个。" }, + "addLoginNotificationDescAlt": { + "message": "如果在密码库中找不到项目,询问添加一个。适用于所有已登录的账户。" + }, "showCardsCurrentTab": { "message": "在标签页上显示支付卡" }, @@ -608,17 +660,35 @@ "changedPasswordNotificationDesc": { "message": "在网站上检测到更改时询问更新登录密码。" }, + "changedPasswordNotificationDescAlt": { + "message": "当在网站上检测到更改时,询问更新登录项目的密码。适用于所有已登录的账户。" + }, + "enableUsePasskeys": { + "message": "询问保存和使用通行密钥" + }, + "usePasskeysDesc": { + "message": "询问保存新的通行密钥或使用存储在密码库中的通行密钥登录。适用于所有已登录的账户。" + }, "notificationChangeDesc": { "message": "是否要在 Bitwarden 中更新此密码?" }, "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "解锁 Bitwarden 密码库以完成自动填充请求。" + }, + "notificationUnlock": { + "message": "解锁​​​​" + }, "enableContextMenuItem": { "message": "显示上下文菜单选项" }, "contextMenuItemDesc": { - "message": "使用辅助点击来访问密码生成和匹配的网站登录项目。 " + "message": "使用辅助点击来访问密码生成和匹配的网站登录项目。" + }, + "contextMenuItemDescAlt": { + "message": "使用辅助点击来访问密码生成和匹配的网站登录项目。适用于所有已登录的账户。" }, "defaultUriMatchDetection": { "message": "默认 URI 匹配检测", @@ -633,6 +703,9 @@ "themeDesc": { "message": "更改本应用程序的颜色主题。" }, + "themeDescAlt": { + "message": "更改应用程序的颜色主题。适用于所有已登录的账户。" + }, "dark": { "message": "深色", "description": "Dark color" @@ -662,13 +735,13 @@ "message": "导出的密码库数据包含未加密格式。您不应该通过不安全的渠道(例如电子邮件)来存储或发送导出的文件。用完后请立即将其删除。" }, "encExportKeyWarningDesc": { - "message": "此导出将使用您账户的加密密钥来加密您的数据。 如果您曾经轮换过账户的加密密钥,您应将其重新导出,否则您将无法解密导出的文件。" + "message": "此导出将使用您账户的加密密钥来加密您的数据。如果您曾经轮换过账户的加密密钥,您应将其重新导出,否则您将无法解密导出的文件。" }, "encExportAccountWarningDesc": { - "message": "账户加密密钥对每个 Bitwarden 用户账户都是唯一的,所以您不能将加密的导出导入到另一个账户。" + "message": "每个 Bitwarden 用户账户的账户加密密钥都是唯一的,因此您无法将加密的导出导入到另一个账户。" }, "exportMasterPassword": { - "message": "输入主密码来导出你的密码库。" + "message": "输入您的主密码以导出你的密码库数据。" }, "shared": { "message": "已共享" @@ -720,13 +793,13 @@ "message": "删除附件" }, "deleteAttachmentConfirmation": { - "message": "您确定要删除此附件吗?" + "message": "确定要删除此附件吗?" }, "deletedAttachment": { "message": "附件已删除" }, "newAttachment": { - "message": "添加新的附件" + "message": "添加新附件" }, "noAttachments": { "message": "没有附件。" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "功能不可用" }, - "updateKey": { - "message": "在您更新加密密钥前,您不能使用此功能。" + "encryptionKeyMigrationRequired": { + "message": "需要迁移加密密钥。请登录网页版密码库来更新您的加密密钥。" }, "premiumMembership": { "message": "高级会员" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "1 GB 文件附件加密存储。" }, - "ppremiumSignUpTwoStep": { - "message": "额外的两步登录选项,如 YubiKey、FIDO U2F 和 Duo。" + "premiumSignUpTwoStepOptions": { + "message": "专有的两步登录选项,如 YubiKey 和 Duo。" }, "ppremiumSignUpReports": { "message": "密码健康、账户体检以及数据泄露报告,保障您的密码库安全。" @@ -825,10 +898,10 @@ "message": "使用此功能需要高级会员资格。" }, "enterVerificationCodeApp": { - "message": "请输入您的验证器应用中的 6 位验证码。" + "message": "请输入您的验证器 App 中的 6 位数验证码。" }, "enterVerificationCodeEmail": { - "message": "请输入通过电子邮件发送给 $EMAIL$ 的 6 位验证码。", + "message": "请输入发送给电子邮件 $EMAIL$ 的 6 位数验证码。", "placeholders": { "email": { "content": "$1", @@ -855,10 +928,10 @@ "message": "使用其他两步登录方式" }, "insertYubiKey": { - "message": "将您的 YubiKey 插入计算机的 USB 端口,然后按下按钮。" + "message": "将您的 YubiKey 插入计算机的 USB 端口,然后触摸其按钮。" }, "insertU2f": { - "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有按钮,请按下它。" + "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有按钮,请触摸它。" }, "webAuthnNewTab": { "message": "要开始 WebAuthn 2FA 验证,请点击下面的按钮打开一个新标签页,并按照新标签页中提供的说明操作。" @@ -876,7 +949,7 @@ "message": "此账户已设置两步登录,但此浏览器不支持任何已配置的两步登录提供程序。" }, "noTwoStepProviders2": { - "message": "请使用支持的网页浏览器(例如 Chrome),和/或添加其他对跨浏览器支持更广泛的提供程序(例如验证器应用)。" + "message": "请使用支持的网页浏览器(例如 Chrome)和/或添加其他支持更广泛的提供程序(例如验证器 App)。" }, "twoStepOptions": { "message": "两步登录选项" @@ -888,7 +961,7 @@ "message": "恢复代码" }, "authenticatorAppTitle": { - "message": "验证器应用" + "message": "验证器 App" }, "authenticatorAppDesc": { "message": "使用验证器应用(例如 Authy 或 Google Authenticator)来生成基于时间的验证码。", @@ -930,7 +1003,7 @@ "message": "自定义环境" }, "customEnvironmentFooter": { - "message": "适用于高级用户。你可以分别指定各个服务的基础 URL。" + "message": "适用于高级用户。您可以分别指定各个服务的基础 URL。" }, "baseUrl": { "message": "服务器 URL" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "环境 URL 已保存" }, + "showAutoFillMenuOnFormFields": { + "message": "在表单字段上显示自动填充菜单", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "适用于所有已登录的账户。" + }, + "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": "选中字段时(焦点上)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "页面加载时自动填充" }, @@ -960,7 +1058,7 @@ "message": "网页加载时如果检测到登录表单,则执行自动填充。" }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "不完整或不信任的网站可以在页面加载时自动填充。" }, "learnMoreAboutAutofill": { "message": "了解更多关于自动填充的信息" @@ -1011,7 +1109,7 @@ "message": "值" }, "newCustomField": { - "message": "新建自定义字段" + "message": "新增自定义字段" }, "dragToSort": { "message": "拖动排序" @@ -1034,7 +1132,7 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "如果您点击弹窗外的任何区域,将导致弹窗关闭。您想在新窗口中打开此弹窗,以便它不会关闭吗?" + "message": "如果您点击弹窗外的区域以检查您的验证码电子邮件,将导致弹窗关闭。您想在新窗口中打开此弹窗,以便它不会关闭吗?" }, "popupU2fCloseMessage": { "message": "此浏览器无法处理此弹出窗口中的 U2F 请求。您想要在新窗口中打开此弹出窗口吗?" @@ -1043,7 +1141,10 @@ "message": "显示网站图标" }, "faviconDesc": { - "message": "在每个登录旁显示一个可识别的图像。" + "message": "在每个登录项目旁边显示一个可识别的图像。" + }, + "faviconDescAlt": { + "message": "在每个登录的旁边显示一个可识别的图像。适用于所有已登录的账户。" }, "enableBadgeCounter": { "message": "显示角标计数器" @@ -1061,13 +1162,13 @@ "message": "品牌" }, "expirationMonth": { - "message": "到期月份" + "message": "过期月份" }, "expirationYear": { - "message": "到期年份" + "message": "过期年份" }, "expiration": { - "message": "到期" + "message": "有效期" }, "january": { "message": "一月" @@ -1157,7 +1258,7 @@ "message": "许可证号码" }, "email": { - "message": "Email" + "message": "电子邮件" }, "phone": { "message": "电话" @@ -1214,7 +1315,7 @@ "message": "集合" }, "favorites": { - "message": "收藏" + "message": "收藏夹" }, "popOutNewWindow": { "message": "弹出到新窗口" @@ -1326,7 +1427,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "您确定要使用「从不」选项吗?将锁定选项设置为「从不」会将密码库的加密密钥存储在您的设备上。如果使用此选项,您必须确保您的设备安全。" + "message": "确定要使用「从不」选项吗?将锁定选项设置为「从不」会将密码库的加密密钥存储在您的设备上。如果使用此选项,您必须确保您的设备安全。" }, "noOrganizationsList": { "message": "您没有加入任何组织。组织允许您与其他用户安全地共享项目。" @@ -1366,7 +1467,7 @@ "message": "使用 PIN 码解锁" }, "setYourPinCode": { - "message": "设置您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您退出账户时被重置。" + "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销此应用程序时被重置。" }, "pinRequired": { "message": "需要 PIN 码。" @@ -1416,7 +1517,7 @@ "message": "永久删除项目" }, "permanentlyDeleteItemConfirmation": { - "message": "您确定要永久删除此项目吗?" + "message": "确定要永久删除此项目吗?" }, "permanentlyDeletedItem": { "message": "项目已永久删除" @@ -1424,14 +1525,11 @@ "restoreItem": { "message": "恢复项目" }, - "restoreItemConfirmation": { - "message": "您确定要恢复此项目吗?" - }, "restoredItem": { "message": "项目已恢复" }, "vaultTimeoutLogOutConfirmation": { - "message": "超时后退出账户将解除对密码库的所有访问权限,并需要进行在线身份验证。确定使用此设置吗?" + "message": "超时后注销账户将解除对密码库的所有访问权限,并需要进行在线身份验证。确定使用此设置吗?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "超时动作确认" @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "项目已自动填充 " }, + "insecurePageWarning": { + "message": "警告:这是一个不安全的 HTTP 页面,您提交的任何信息都可能被其他人看到和更改。此登录信息最初保存在安全 (HTTPS) 页面上。" + }, + "insecurePageWarningFillPrompt": { + "message": "您仍然想要填充此登录信息吗?" + }, + "autofillIframeWarning": { + "message": "该表单由不同于您保存的登录的 URI 域名托管。选择「确定」以自动填充,或选择「取消」停止填充。" + }, + "autofillIframeWarningTip": { + "message": "要防止以后出现此警告,请将此站点的 URI $HOSTNAME$ 保存到您的 Bitwarden 登录项目中。", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "设置主密码" }, + "currentMasterPass": { + "message": "当前主密码" + }, + "newMasterPass": { + "message": "新主密码" + }, + "confirmNewMasterPass": { + "message": "确认新主密码" + }, "masterPasswordPolicyInEffect": { "message": "一个或多个组织策略要求您的主密码满足下列要求:" }, @@ -1479,7 +1604,7 @@ "message": "至少包含一个数字" }, "policyInEffectSpecial": { - "message": "至少包含一个下列的特殊字符:$CHARS$", + "message": "至少包含一个以下特殊字符 $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -1556,11 +1681,17 @@ "biometricsNotSupportedDesc": { "message": "此设备不支持浏览器生物识别。" }, + "biometricsFailedTitle": { + "message": "生物识别失败" + }, + "biometricsFailedDesc": { + "message": "生物识别无法完成,请尝试使用主密码或注销。如果仍无法解决,请联系 Bitwarden 支持。" + }, "nativeMessaginPermissionErrorTitle": { "message": "未提供权限" }, "nativeMessaginPermissionErrorDesc": { - "message": "没有与 Bitwarden 桌面应用程序通信的权限,我们无法在浏览器扩展中提供生物识别。请再试一次。" + "message": "没有与 Bitwarden 桌面应用程序通信的权限,我们无法在浏览器扩展中提供生物识别。请重试。" }, "nativeMessaginPermissionSidebarTitle": { "message": "权限请求错误" @@ -1569,17 +1700,23 @@ "message": "此操作不能在侧边栏中完成,请在弹出窗口或弹出对话框中重试。" }, "personalOwnershipSubmitError": { - "message": "由于某个企业策略,您被限制为保存项目到您的个人密码库。将所有权选项更改为组织,然后从可用的集合中选择。" + "message": "由于某个企业策略,您不能将项目保存到您的个人密码库。将所有权选项更改为组织,并从可用的集合中选择。" }, "personalOwnershipPolicyInEffect": { "message": "一个组织策略正影响您的所有权选项。" }, + "personalOwnershipPolicyInEffectImports": { + "message": "组织策略已阻止将项目导入您的个人密码库。" + }, "excludedDomains": { "message": "排除域名" }, "excludedDomainsDesc": { "message": "Bitwarden 将不会询问是否为这些域名保存登录信息。您必须刷新页面才能使更改生效。" }, + "excludedDomainsDescAlt": { + "message": "Bitwarden 不会询问保存所有已登录的账户的这些域名的登录信息。您必须刷新页面才能使更改生效。" + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ 不是一个有效的域名", "placeholders": { @@ -1682,7 +1819,7 @@ "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 的访问将在指定的日期和时间后过期。", @@ -1741,14 +1878,14 @@ "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 已禁用", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "由于企业策略,您只能删除现有的 Send。", + "message": "由于某个企业策略,您只能删除现有的 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -1784,19 +1921,19 @@ "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": "所提供的到期日期无效。" + "message": "所提供的过期日期无效。" }, "deletionDateIsInvalid": { "message": "所提供的删除日期无效。" }, "expirationDateAndTimeRequired": { - "message": "需要到期日期和时间。" + "message": "需要过期日期和时间。" }, "deletionDateAndTimeRequired": { "message": "需要删除日期和时间。" }, "dateParsingError": { - "message": "保存您的删除和到期日期时出错。" + "message": "保存您的删除和过期日期时出错。" }, "hideEmail": { "message": "对收件人隐藏我的电子邮件地址。" @@ -1805,7 +1942,7 @@ "message": "一个或多个组织策略正在影响您的 Send 选项。" }, "passwordPrompt": { - "message": "重新询问主密码" + "message": "主密码重新提示" }, "passwordConfirmation": { "message": "确认主密码" @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "您的主密码最近被您组织的管理员更改过。要访问密码库,您必须立即更新它。继续操作将使您退出当前会话并要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。" }, + "updateWeakMasterPasswordWarning": { + "message": "您的主密码不符合某一项或多项组织策略要求。要访问密码库,必须立即更新您的主密码。继续操作将使您退出当前会话,并要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。" + }, "resetPasswordPolicyAutoEnroll": { "message": "自动注册" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "选择文件夹..." }, - "ssoCompleteRegistration": { - "message": "要完成 SSO 登陆配置,请设置一个主密码以访问和保护您的密码库。" + "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" }, "hours": { "message": "小时" @@ -1847,7 +1992,20 @@ "message": "分钟" }, "vaultTimeoutPolicyInEffect": { - "message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间是 $HOURS$ 小时 $MINUTES$ 分钟。", + "message": "您的组织策略已将您最大允许的密码库超时时间设置为 $HOURS$ 小时 $MINUTES$ 分钟。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间是 $HOURS$ 小时 $MINUTES$ 分钟。您的密码库超时动作被设置为 $ACTION$。", "placeholders": { "hours": { "content": "$1", @@ -1856,6 +2014,19 @@ "minutes": { "content": "$2", "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "您的组织策略已将您的密码库超时动作设置为 $ACTION$。", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" } } }, @@ -1893,7 +2064,7 @@ "message": "主密码已移除" }, "leaveOrganizationConfirmation": { - "message": "您确定要退出该组织吗?" + "message": "确定要退出该组织吗?" }, "leftOrganization": { "message": "您已经退出该组织。" @@ -1902,13 +2073,13 @@ "message": "字符计数开关" }, "sessionTimeout": { - "message": "您的会话已超时。请返回并尝试重新登录。" + "message": "您的会话已超时。请返回然后尝试重新登录。" }, "exportingPersonalVaultTitle": { "message": "导出个人密码库" }, - "exportingPersonalVaultDescription": { - "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目。组织密码库的项目不会导出。", + "exportingIndividualVaultDescription": { + "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目,不包括组织密码库项目。仅会导出密码库项目信息,不包括关联的附件。", "placeholders": { "email": { "content": "$1", @@ -1982,13 +2153,10 @@ "message": "需要高级版订阅" }, "organizationIsDisabled": { - "message": "组织已暂停。" + "message": "组织已停用。" }, "disabledOrganizationFilterError": { - "message": "无法访问已暂停组织中的项目。请联系您的组织所有者获取帮助。" - }, - "cardBrandMir": { - "message": "Mir" + "message": "无法访问已停用组织中的项目。请联系您的组织所有者获取协助。" }, "loggingInTo": { "message": "正在登录到 $DOMAIN$", @@ -2011,7 +2179,7 @@ "serverVersion": { "message": "服务器版本" }, - "selfHosted": { + "selfHostedServer": { "message": "自托管" }, "thirdParty": { @@ -2050,34 +2218,604 @@ "rememberEmail": { "message": "记住电子邮件地址" }, + "loginWithDevice": { + "message": "使用设备登录" + }, + "loginWithDeviceEnabledInfo": { + "message": "设备登录必须在 Bitwarden 应用程序的设置中启用。需要其他登录选项吗?" + }, + "fingerprintPhraseHeader": { + "message": "指纹短语" + }, + "fingerprintMatchInfo": { + "message": "请确保您的密码库已解锁,并且指纹短语与其他设备上的相匹配。" + }, + "resendNotification": { + "message": "重新发送通知" + }, + "viewAllLoginOptions": { + "message": "查看所有登录选项" + }, + "notificationSentDevice": { + "message": "通知已发送到您的设备。" + }, + "loginInitiated": { + "message": "登录已发起" + }, "exposedMasterPassword": { - "message": "暴露的主密码" + "message": "已暴露的主密码" }, "exposedMasterPasswordDesc": { - "message": "数据泄露中发现的密码。使用独特的密码来保护您的帐户。您确定要使用已暴露的密码吗?" + "message": "密码在数据泄露中被发现。请使用一个唯一的密码以保护您的账户。确定要使用已暴露的密码吗?" }, "weakAndExposedMasterPassword": { - "message": "弱而暴露的主密码" + "message": "主密码弱且曾经暴露" }, "weakAndBreachedMasterPasswordDesc": { - "message": "已经识别和发现在数据泄露中的弱密码。使用强大且独特的密码来保护您的帐户。您确定要使用此密码吗?" + "message": "识别到弱密码且其出现在数据泄露中。请使用一个强且唯一的密码以保护你的账户。确定要使用这个密码吗?" }, "checkForBreaches": { "message": "检查已知的数据泄露是否包含此密码。" }, "important": { - "message": "简体中文:重要" + "message": "重要:" }, "masterPasswordHint": { - "message": "检查此密码的已知数据泄露" + "message": "主密码忘记后,将无法恢复!" }, "characterMinimum": { - "message": "重要", + "message": "至少 $LENGTH$ 个字符", "placeholders": { "length": { "content": "$1", "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "您的组织策略已开启在页面加载时的自动填充。" + }, + "howToAutofill": { + "message": "如何自动填充" + }, + "autofillSelectInfoWithCommand": { + "message": "从此界面选择一个项目,使用快捷方式 $COMMAND$,或探索设置中的其他选项。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "从此界面选择一个项目,或探索设置中的其他选项。" + }, + "gotIt": { + "message": "明白了" + }, + "autofillSettings": { + "message": "自动填充设置" + }, + "autofillShortcut": { + "message": "自动填充键盘快捷键" + }, + "autofillShortcutNotSet": { + "message": "未设置自动填充快捷方式。请在浏览器设置中更改此设置。" + }, + "autofillShortcutText": { + "message": "自动填充快捷方式为: $COMMAND$。在浏览器设置中更改此项。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "默认自动填充快捷方式:$COMMAND$。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "登录到" + }, + "opensInANewWindow": { + "message": "在新窗口中打开" + }, + "deviceApprovalRequired": { + "message": "需要设备批准。请在下面选择一个批准选项:" + }, + "rememberThisDevice": { + "message": "记住此设备" + }, + "uncheckIfPublicDevice": { + "message": "若使用公共设备,请取消勾选" + }, + "approveFromYourOtherDevice": { + "message": "从您的其他设备批准" + }, + "requestAdminApproval": { + "message": "请求管理员批准" + }, + "approveWithMasterPassword": { + "message": "使用主密码批准" + }, + "ssoIdentifierRequired": { + "message": "必须填写组织 SSO 标识符。" + }, + "eu": { + "message": "欧盟", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "访问被拒绝。您没有权限查看此页面。" + }, + "general": { + "message": "常规" + }, + "display": { + "message": "显示" + }, + "accountSuccessfullyCreated": { + "message": "账户已成功创建!" + }, + "adminApprovalRequested": { + "message": "已请求管理员批准" + }, + "adminApprovalRequestSentToAdmins": { + "message": "您的请求已发送给您的管理员。" + }, + "youWillBeNotifiedOnceApproved": { + "message": "批准后,您将收到通知。" + }, + "troubleLoggingIn": { + "message": "登录遇到问题?" + }, + "loginApproved": { + "message": "登录已批准" + }, + "userEmailMissing": { + "message": "缺少用户电子邮件" + }, + "deviceTrusted": { + "message": "设备已信任" + }, + "inputRequired": { + "message": "必须输入内容。" + }, + "required": { + "message": "必填" + }, + "search": { + "message": "搜索" + }, + "inputMinLength": { + "message": "至少输入 $COUNT$ 个字符。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "输入长度不能超过 $COUNT$ 个字符。", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "以下字符不被允许:$CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "输入的值不能低于 $MIN$。", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "输入的值不能超过 $MAX$。", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "一个或多个电子邮件地址无效" + }, + "inputTrimValidator": { + "message": "输入不能只包含空格。", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "输入的不是电子邮件地址。" + }, + "fieldsNeedAttention": { + "message": "上面的 $COUNT$ 个字段需要您注意。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- 选择 --" + }, + "multiSelectPlaceholder": { + "message": "-- 输入以筛选 --" + }, + "multiSelectLoading": { + "message": "正在获取选项..." + }, + "multiSelectNotFound": { + "message": "未找到任何条目" + }, + "multiSelectClearAll": { + "message": "清除全部" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "子菜单" + }, + "toggleCollapse": { + "message": "切换折叠", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "别名域" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "具有主密码重新提示的项目无法在页面加载时自动填充。页面加载时的自动填充功能已关闭。", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "页面加载时自动填充设置为默认设置。", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "解锁账户", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "总计" + }, + "importWarning": { + "message": "您正在将数据导入到 $ORGANIZATION$。您的数据可能会与此组织中的成员共享。要继续吗?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "数据格式不正确。请检查您的导入文件然后重试。" + }, + "importNothingError": { + "message": "没有导入任何内容。" + }, + "importEncKeyError": { + "message": "解密导出的文件时出错。您的加密密钥与导出数据时使用的加密密钥不匹配。" + }, + "invalidFilePassword": { + "message": "无效的文件密码,请使用您创建导出文件时输入的密码。" + }, + "importDestination": { + "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": "确认文件密码" + }, + "typePasskey": { + "message": "通行密钥" + }, + "passkeyNotCopied": { + "message": "通行密钥不会被复制" + }, + "passkeyNotCopiedAlert": { + "message": "通行密钥将不会被复制到克隆的项目。要继续克隆这个项目吗?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "启动站点需要验证。对于没有主密码的账户,此功能尚未实现。" + }, + "logInWithPasskey": { + "message": "使用通行密钥登录吗?" + }, + "passkeyAlreadyExists": { + "message": "此应用程序已存在一个通行密钥。" + }, + "noPasskeysFoundForThisApplication": { + "message": "没有找到此应用程序的通行密钥。" + }, + "noMatchingPasskeyLogin": { + "message": "不存在匹配此站点的登录项目。" + }, + "confirm": { + "message": "确认" + }, + "savePasskey": { + "message": "保存通行密钥" + }, + "savePasskeyNewLogin": { + "message": "作为新的登录项目保存通行密钥" + }, + "choosePasskey": { + "message": "选择一个用于保存此通行密钥的登录项目" + }, + "passkeyItem": { + "message": "通行密钥项目" + }, + "overwritePasskey": { + "message": "覆盖通行密钥吗?" + }, + "overwritePasskeyAlert": { + "message": "此项目已包含一个通行密钥。确定要覆盖当前的通行密钥吗?" + }, + "featureNotSupported": { + "message": "功能尚不被支持" + }, + "yourPasskeyIsLocked": { + "message": "使用通行密钥需要身份验证。请验证身份以继续。" + }, + "useBrowserName": { + "message": "使用浏览器" + }, + "multifactorAuthenticationCancelled": { + "message": "多重身份验证已取消" + }, + "noLastPassDataFound": { + "message": "未找到 LastPass 数据" + }, + "incorrectUsernameOrPassword": { + "message": "用户名或密码不正确" + }, + "multifactorAuthenticationFailed": { + "message": "多重身份验证失败" + }, + "includeSharedFolders": { + "message": "包含共享的文件夹" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "正在导入您的账户..." + }, + "lastPassMFARequired": { + "message": "需要 LastPass 多重身份验证" + }, + "lastPassMFADesc": { + "message": "输入来自身份验证 App 的一次性通行代码" + }, + "lastPassOOBDesc": { + "message": "在您的身份验证 App 中批准登录请求或输入一次性通行代码。" + }, + "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": "活动账户" + }, + "accountLimitReached": { + "message": "已达到账户上限。请注销一个账户后再添加其他账户。" + }, + "active": { + "message": "已生效" + }, + "locked": { + "message": "已锁定" + }, + "unlocked": { + "message": "已解锁" + }, + "server": { + "message": "服务器" + }, + "hostedAt": { + "message": "托管于" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 466a245cf205..51c319611b9a 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -91,6 +91,15 @@ "autoFill": { "message": "自動填入" }, + "autoFillLogin": { + "message": "自動填入登入資訊" + }, + "autoFillCard": { + "message": "自動填入支付卡" + }, + "autoFillIdentity": { + "message": "自動填入身分資訊" + }, "generatePasswordCopied": { "message": "產生及複製密碼" }, @@ -100,6 +109,21 @@ "noMatchingLogins": { "message": "無符合的登入資料" }, + "noCards": { + "message": "無支付卡" + }, + "noIdentities": { + "message": "無身分資訊" + }, + "addLoginMenu": { + "message": "新增登入資訊" + }, + "addCardMenu": { + "message": "新增支付卡" + }, + "addIdentityMenu": { + "message": "新增身分資訊" + }, "unlockVaultMenu": { "message": "解鎖您的密碼庫" }, @@ -195,6 +219,15 @@ "helpFeedback": { "message": "協助與意見反應" }, + "helpCenter": { + "message": "Bitwarden 說明中心" + }, + "communityForums": { + "message": "瀏覽 Bitwarden 社群論壇" + }, + "contactSupport": { + "message": "連絡 Bitwarden 客戶支援" + }, "sync": { "message": "同步" }, @@ -329,6 +362,12 @@ "other": { "message": "其他" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "設定一個解鎖方式來變更您的密碼庫逾時動作。" + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, "rateExtension": { "message": "為本套件評分" }, @@ -369,6 +408,9 @@ "lockNow": { "message": "立即鎖定" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "立即" }, @@ -430,7 +472,14 @@ "message": "必須再次輸入主密碼。" }, "masterPasswordMinlength": { - "message": "主密碼需要至少 8 個字元。" + "message": "主密碼需要至少 $VALUE$ 個字元。", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } }, "masterPassDoesntMatch": { "message": "兩次填入的主密碼不相符。" @@ -491,7 +540,7 @@ "message": "您可以在 bitwarden.com 網頁版密碼庫變更主密碼。現在要前往嗎?" }, "twoStepLoginConfirmation": { - "message": "兩步驟登入需要您從其他裝置(例如安全金鑰、驗證器程式、SMS、手機或電子郵件)來驗證您的登入,這使您的帳戶更加安全。兩步驟登入可以在 bitwarden.com 網頁版密碼庫啟用。現在要前往嗎?" + "message": "兩步驟登入需要您從其他裝置(例如安全鑰匙、驗證器程式、SMS、手機或電子郵件)來驗證您的登入,這使您的帳戶更加安全。兩步驟登入可以在 bitwarden.com 網頁版密碼庫啟用。現在要前往嗎?" }, "editedFolder": { "message": "資料夾已儲存" @@ -576,6 +625,9 @@ "addLoginNotificationDesc": { "message": "在密碼庫中找不到相符的項目時詢問是否新增項目。" }, + "addLoginNotificationDescAlt": { + "message": "如果在您的密碼庫中找不到項目,則詢問是否新增項目。適用於所有已登入的帳戶。" + }, "showCardsCurrentTab": { "message": "於分頁頁面顯示支付卡" }, @@ -608,17 +660,35 @@ "changedPasswordNotificationDesc": { "message": "偵測到網站密碼變更時,詢問是否更新登入資料密碼。" }, + "changedPasswordNotificationDescAlt": { + "message": "當偵測到網站上的變更時,詢問是否更新登入的密碼。適用於所有已登入的帳戶。" + }, + "enableUsePasskeys": { + "message": "詢問是否儲存並使用密碼金鑰" + }, + "usePasskeysDesc": { + "message": "詢問是否儲存新的密碼金鑰或使用儲存在您的密碼庫中的密碼金鑰登入。適用於所有已登入的帳戶。" + }, "notificationChangeDesc": { "message": "是否要在 Bitwarden 中更新此密碼?" }, "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "解鎖您的 Bitwarden 密碼庫以完成自動填入請求。" + }, + "notificationUnlock": { + "message": "解鎖" + }, "enableContextMenuItem": { "message": "顯示內容選單選項" }, "contextMenuItemDesc": { - "message": "使用輔助點選(右鍵選單)來存取密碼產生和匹配的網站登入項目。 " + "message": "使用輔助點選(右鍵選單)來存取密碼產生和符合的網站登入項目。 " + }, + "contextMenuItemDescAlt": { + "message": "使用右鍵點選來存取密碼產生和網站的符合登入資訊。適用於所有已登入的帳戶。" }, "defaultUriMatchDetection": { "message": "預設的 URI 一致性偵測", @@ -633,6 +703,9 @@ "themeDesc": { "message": "變更應用程式的主題色彩。" }, + "themeDescAlt": { + "message": "變更應用程式的主題色彩。適用於所有已登入的帳戶。" + }, "dark": { "message": "深色", "description": "Dark color" @@ -746,8 +819,8 @@ "featureUnavailable": { "message": "功能不可用" }, - "updateKey": { - "message": "更新加密金鑰前不能使用此功能。" + "encryptionKeyMigrationRequired": { + "message": "需要遷移加密金鑰。請透過網頁版密碼庫登入以更新您的加密金鑰。" }, "premiumMembership": { "message": "進階會員" @@ -770,8 +843,8 @@ "ppremiumSignUpStorage": { "message": "用於檔案附件的 1 GB 加密儲存空間。" }, - "ppremiumSignUpTwoStep": { - "message": "YubiKey、FIDO U2F 和 Duo 等額外的兩步驟登入選項。" + "premiumSignUpTwoStepOptions": { + "message": "專有的兩步驟登入選項,例如 YubiKey 和 Duo。" }, "ppremiumSignUpReports": { "message": "密碼健康度檢查、提供帳戶體檢以及資料外洩報告,以保障您的密碼庫安全。" @@ -858,7 +931,7 @@ "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後按一下它的按鈕。" }, "insertU2f": { - "message": "將您的安全金鑰插入電腦的 USB 連接埠,然後按一下它的按鈕(如有的話)。" + "message": "將您的安全鑰匙插入電腦的 USB 連接埠,然後觸摸其按鈕(如有的話)。" }, "webAuthnNewTab": { "message": "要開始 WebAuthn 2FA 驗證,請點選下面的按鈕開啟一個新分頁,並依照新分頁中提供的說明操作。" @@ -895,24 +968,24 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP 安全金鑰" + "message": "YubiKey OTP 安全鑰匙" }, "yubiKeyDesc": { "message": "使用 YubiKey 存取您的帳戶。支援 YubiKey 4、4 Nano、4C、以及 NEO 裝置。" }, "duoDesc": { - "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." }, "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": "電子郵件" @@ -936,7 +1009,7 @@ "message": "伺服器 URL" }, "apiUrl": { - "message": "API 伺服器 URL" + "message": "API 伺服器網址" }, "webVaultUrl": { "message": "網頁版密碼庫伺服器 URL" @@ -953,6 +1026,31 @@ "environmentSaved": { "message": "環境 URL 已儲存" }, + "showAutoFillMenuOnFormFields": { + "message": "在表單欄位上顯示自動填入選單", + "description": "Represents the message for allowing the user to enable the auto-fill overlay" + }, + "showAutoFillMenuOnFormFieldsDescAlt": { + "message": "適用於所有已登入的帳戶。" + }, + "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": "當欄位被選取時(在焦點上)", + "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" + }, "enableAutoFillOnPageLoad": { "message": "頁面載入時自動填入" }, @@ -960,10 +1058,10 @@ "message": "網頁載入時如果偵測到登入表單,則執行自動填入。" }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "被入侵或不可信任的網站可不當利用頁面載入時的自動填入功能。" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "進一步瞭解「自動填入」功能" }, "defaultAutoFillOnPageLoad": { "message": "登入項目的預設自動填入設定" @@ -1045,6 +1143,9 @@ "faviconDesc": { "message": "在每個登入資料旁顯示一個可辨識的圖片。" }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "顯示圖示計數器" }, @@ -1239,10 +1340,10 @@ "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "檢查密碼是否已外洩。" + "message": "檢查密碼是否已暴露。" }, "passwordExposed": { - "message": "此密碼已外洩了 $VALUE$ 次,應立即變更密碼。", + "message": "此密碼在資料外洩事件中被暴露了 $VALUE$ 次,應立即變更它。", "placeholders": { "value": { "content": "$1", @@ -1390,10 +1491,10 @@ "message": "您必須至少選擇一個集合。" }, "cloneItem": { - "message": "複製項目" + "message": "克隆項目" }, "clone": { - "message": "複製" + "message": "克隆" }, "passwordGeneratorPolicyInEffect": { "message": "一個或多個組織原則正影響密碼產生器設定。" @@ -1424,9 +1525,6 @@ "restoreItem": { "message": "還原項目" }, - "restoreItemConfirmation": { - "message": "您確定要還原此項目嗎?" - }, "restoredItem": { "message": "項目已還原" }, @@ -1445,9 +1543,36 @@ "autoFillSuccess": { "message": "項目已自動填入" }, + "insecurePageWarning": { + "message": "警告:這是不安全的 HTTP 頁面,任何您送出的資訊均可能被其他人看見和更改。此登入資訊原先是在安全的 (HTTPS) 頁面儲存的。" + }, + "insecurePageWarningFillPrompt": { + "message": "您仍要填入此登入資訊嗎?" + }, + "autofillIframeWarning": { + "message": "這個表單寄放在不同的網域,而非您儲存登入資訊的 URI。選擇「確認」則依然自動填入,「取消」則停止本動作。" + }, + "autofillIframeWarningTip": { + "message": "若以後不想再跳出這個警告,請將這個網站的 URI「$HOSTNAME$」儲存到您的 Bitwarden 登入項目。", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, "setMasterPassword": { "message": "設定主密碼" }, + "currentMasterPass": { + "message": "目前的主密碼" + }, + "newMasterPass": { + "message": "新的主密碼" + }, + "confirmNewMasterPass": { + "message": "確認新的主密碼" + }, "masterPasswordPolicyInEffect": { "message": "一個或多個組織原則要求您的主密碼須符合下列條件:" }, @@ -1491,7 +1616,7 @@ "message": "您新的主密碼不符合原則要求。" }, "acceptPolicies": { - "message": "若選取此方塊,代表您同意下列項目:" + "message": "選中此選取框,即表示您同意下列條款:" }, "acceptPoliciesRequired": { "message": "尚未接受服務條款與隱私權政策。" @@ -1556,6 +1681,12 @@ "biometricsNotSupportedDesc": { "message": "此裝置不支援瀏覽器生物特徵辨識。" }, + "biometricsFailedTitle": { + "message": "生物特徵辨識失敗" + }, + "biometricsFailedDesc": { + "message": "生物特徵辨識無法完成,請考慮使用主密碼或登出。若仍無法解決,請聯絡 Bitwarden 客服。" + }, "nativeMessaginPermissionErrorTitle": { "message": "未提供權限" }, @@ -1574,12 +1705,18 @@ "personalOwnershipPolicyInEffect": { "message": "組織原則正在影響您的擁有權選項。" }, + "personalOwnershipPolicyInEffectImports": { + "message": "某個組織原則已禁止您將項目匯入至您的個人密碼庫。" + }, "excludedDomains": { "message": "排除網域" }, "excludedDomainsDesc": { "message": "Bitwarden 不會要求儲存這些網域的詳細登入資訊。必須重新整理頁面才能使變更生效。" }, + "excludedDomainsDescAlt": { + "message": "對於所有已登入的帳戶,Bitwarden 不會詢問是否儲存這些網域的登入資訊。您必須重新整理頁面以使變更生效。" + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ 不是一個有效的網域", "placeholders": { @@ -1828,6 +1965,9 @@ "updateMasterPasswordWarning": { "message": "您的主密碼最近被您的組織管理者變更過。若要存取密碼庫,您必須立即更新主密碼。繼續操作會登出目前的登入階段,並要求您重新登入。其他裝置上的活動登入階段最多會保持一個小時。" }, + "updateWeakMasterPasswordWarning": { + "message": "您的主密碼不符合一個或多個組織原則要求。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" + }, "resetPasswordPolicyAutoEnroll": { "message": "自動註冊" }, @@ -1837,8 +1977,13 @@ "selectFolder": { "message": "選擇資料夾⋯" }, - "ssoCompleteRegistration": { - "message": "要完成 SSO 登入設定,請設定一組主密碼以存取和保護您的密碼庫。" + "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" }, "hours": { "message": "小時" @@ -1859,6 +2004,32 @@ } } }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "您的組織原則已將密碼庫逾時動作設定為 $ACTION$。", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, "vaultTimeoutTooLarge": { "message": "您的密碼庫逾時時間超過組織設定的限制。" }, @@ -1907,8 +2078,8 @@ "exportingPersonalVaultTitle": { "message": "正匯出個人密碼庫" }, - "exportingPersonalVaultDescription": { - "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫項目。組織密碼庫的項目不包含在內。", + "exportingIndividualVaultDescription": { + "message": "僅匯出與 $EMAIL$ 關聯的個人密碼庫項目。組織密碼庫項目將不包括在內。僅匯出密碼庫項目資訊,不包括關聯的附件。", "placeholders": { "email": { "content": "$1", @@ -1987,9 +2158,6 @@ "disabledOrganizationFilterError": { "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。" }, - "cardBrandMir": { - "message": "Mir" - }, "loggingInTo": { "message": "正在登入至 $DOMAIN$", "placeholders": { @@ -2011,7 +2179,7 @@ "serverVersion": { "message": "伺服器版本" }, - "selfHosted": { + "selfHostedServer": { "message": "自我裝載" }, "thirdParty": { @@ -2050,26 +2218,50 @@ "rememberEmail": { "message": "記住電子郵件地址" }, + "loginWithDevice": { + "message": "使用裝置登入" + }, + "loginWithDeviceEnabledInfo": { + "message": "裝置登入必須在 Bitwarden 應用程式的設定中啟用。需要其他選項嗎?" + }, + "fingerprintPhraseHeader": { + "message": "指紋短語" + }, + "fingerprintMatchInfo": { + "message": "請確保您的密碼庫已解鎖,並且指紋短語與其他裝置的一致。" + }, + "resendNotification": { + "message": "重新傳送通知" + }, + "viewAllLoginOptions": { + "message": "檢視所有登入選項" + }, + "notificationSentDevice": { + "message": "已傳送通知至您的裝置。" + }, + "loginInitiated": { + "message": "登入已發起" + }, "exposedMasterPassword": { "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": "強度不足且已暴露的主密碼" }, "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": "檢查外洩密碼資料庫中是否有此密碼" }, "important": { - "message": "重要事項:" + "message": "重要:" }, "masterPasswordHint": { - "message": "如果您忘記主密碼,沒有復原的方法!" + "message": "若您忘記主密碼,將會無法找回!" }, "characterMinimum": { "message": "$LENGTH$ 個字元以上", @@ -2079,5 +2271,551 @@ "example": "14" } } + }, + "autofillPageLoadPolicyActivated": { + "message": "您的組織原則已啟用頁面載入時自動填入的功能。" + }, + "howToAutofill": { + "message": "如何自動填入" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this screen, or explore other options in settings." + }, + "gotIt": { + "message": "我知道了" + }, + "autofillSettings": { + "message": "自動填入設定" + }, + "autofillShortcut": { + "message": "自動填入鍵盤快速鍵" + }, + "autofillShortcutNotSet": { + "message": "自動填入快速鍵尚未設定。請在瀏覽器的設定中變更。" + }, + "autofillShortcutText": { + "message": "自動填入快速鍵:$COMMAND$。請在瀏覽器的設定中變更。", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "預設自動填入快速鍵:$COMMAND$", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "正登入到" + }, + "opensInANewWindow": { + "message": "在新視窗開啟" + }, + "deviceApprovalRequired": { + "message": "裝置核准已要求。請在下面選擇一個核准選項:" + }, + "rememberThisDevice": { + "message": "記住這個裝置" + }, + "uncheckIfPublicDevice": { + "message": "若使用公用裝置,請勿勾選" + }, + "approveFromYourOtherDevice": { + "message": "從其他裝置核准" + }, + "requestAdminApproval": { + "message": "要求管理員核准" + }, + "approveWithMasterPassword": { + "message": "使用主密碼批准" + }, + "ssoIdentifierRequired": { + "message": "需要組織 SSO 識別碼。" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "拒絕存取。您沒有檢視此頁面的權限。" + }, + "general": { + "message": "一般" + }, + "display": { + "message": "顯示" + }, + "accountSuccessfullyCreated": { + "message": "已成功建立帳戶!" + }, + "adminApprovalRequested": { + "message": "已要求管理員核准" + }, + "adminApprovalRequestSentToAdmins": { + "message": "您的要求已傳送給您的管理員。" + }, + "youWillBeNotifiedOnceApproved": { + "message": "核准後將通知您。" + }, + "troubleLoggingIn": { + "message": "登入時遇到困難?" + }, + "loginApproved": { + "message": "登入已核准" + }, + "userEmailMissing": { + "message": "缺少使用者電子郵件" + }, + "deviceTrusted": { + "message": "裝置已信任" + }, + "inputRequired": { + "message": "必須輸入內容。" + }, + "required": { + "message": "必填" + }, + "search": { + "message": "搜尋" + }, + "inputMinLength": { + "message": "必須輸入至少 $COUNT$ 個字元。", + "placeholders": { + "count": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxLength": { + "message": "輸入的內容長度不得超過 $COUNT$ 字元。", + "placeholders": { + "count": { + "content": "$1", + "example": "20" + } + } + }, + "inputForbiddenCharacters": { + "message": "以下字元不被允許:$CHARACTERS$", + "placeholders": { + "characters": { + "content": "$1", + "example": "@, #, $, %" + } + } + }, + "inputMinValue": { + "message": "輸入的值不能低於 $MIN$。", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + } + } + }, + "inputMaxValue": { + "message": "輸入值不得超過 $MAX$。", + "placeholders": { + "max": { + "content": "$1", + "example": "100" + } + } + }, + "multipleInputEmails": { + "message": "一個或多個電子郵件無效" + }, + "inputTrimValidator": { + "message": "輸入不得僅包含空格。", + "description": "Notification to inform the user that a form's input can't contain only whitespace." + }, + "inputEmail": { + "message": "輸入的不是電子郵件地址。" + }, + "fieldsNeedAttention": { + "message": "您需注意上方的 $COUNT$ 個欄位。", + "placeholders": { + "count": { + "content": "$1", + "example": "4" + } + } + }, + "selectPlaceholder": { + "message": "-- 選擇 --" + }, + "multiSelectPlaceholder": { + "message": "-- 輸入以進行篩選 --" + }, + "multiSelectLoading": { + "message": "正在取得選項…" + }, + "multiSelectNotFound": { + "message": "找不到任何項目" + }, + "multiSelectClearAll": { + "message": "全部清除" + }, + "plusNMore": { + "message": "+ $QUANTITY$ more", + "placeholders": { + "quantity": { + "content": "$1", + "example": "5" + } + } + }, + "submenu": { + "message": "子選單" + }, + "toggleCollapse": { + "message": "切換折疊", + "description": "Toggling an expand/collapse state." + }, + "aliasDomain": { + "message": "別名網域" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "使用主密碼重新提示的項目無法在頁面載入時自動填寫。已關閉頁面載入時的自動填入。", + "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "將頁面載入時的自動填入設定為使用預設設定。", + "description": "Toast message for informing the user that auto-fill 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." + }, + "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." + }, + "unlockAccount": { + "message": "解鎖帳號", + "description": "Button text to display in overlay when the account is locked." + }, + "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" + }, + "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" + } + } + }, + "total": { + "message": "總計" + }, + "importWarning": { + "message": "即將匯入資料至 $ORGANIZATION$。您的資料可能會與該組織中的成員共用,確定要繼續嗎?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "importFormatError": { + "message": "資料格式不正確。請檢查您匯入的檔案後再試一次。" + }, + "importNothingError": { + "message": "沒有匯入任何內容。" + }, + "importEncKeyError": { + "message": "解密匯出的檔案時發生錯誤,您的加密金鑰與匯出資料時使用的金鑰不同。" + }, + "invalidFilePassword": { + "message": "檔案密碼無效,請使用您當初匯出檔案時輸入的密碼。" + }, + "importDestination": { + "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": "確認檔案密碼" + }, + "typePasskey": { + "message": "Passkey" + }, + "passkeyNotCopied": { + "message": "密碼金鑰不會被複製" + }, + "passkeyNotCopiedAlert": { + "message": "密碼金鑰不會被複製到複製的項目。 您想繼續複製該項目嗎?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "發起站點需要驗證。對於沒有主密碼的帳戶,此功能尚未實現。" + }, + "logInWithPasskey": { + "message": "使用密碼金鑰登入?" + }, + "passkeyAlreadyExists": { + "message": "用於這個應用程式的密碼金鑰已經存在。" + }, + "noPasskeysFoundForThisApplication": { + "message": "未發現用於這個應用程式的密碼金鑰。" + }, + "noMatchingPasskeyLogin": { + "message": "您還沒有與該網站一致的登入項目。" + }, + "confirm": { + "message": "確認" + }, + "savePasskey": { + "message": "儲存密碼金鑰" + }, + "savePasskeyNewLogin": { + "message": "儲存密碼金鑰作為新的登入" + }, + "choosePasskey": { + "message": "選擇一個用於儲存此密碼金鑰的登入項目" + }, + "passkeyItem": { + "message": "密碼金鑰項目" + }, + "overwritePasskey": { + "message": "覆寫密碼金輪嗎?" + }, + "overwritePasskeyAlert": { + "message": "該項目已包含密碼金鑰。您確定要覆寫目前的密碼金鑰嗎?" + }, + "featureNotSupported": { + "message": "功能尚不受支援" + }, + "yourPasskeyIsLocked": { + "message": "使用密碼金鑰需要身分驗證。請驗證您的身份以繼續。" + }, + "useBrowserName": { + "message": "使用瀏覽器" + }, + "multifactorAuthenticationCancelled": { + "message": "多因素驗證已取消" + }, + "noLastPassDataFound": { + "message": "未找到任何 LastPass 資料" + }, + "incorrectUsernameOrPassword": { + "message": "使用者名稱或密碼不正確" + }, + "multifactorAuthenticationFailed": { + "message": "多因素驗證失敗" + }, + "includeSharedFolders": { + "message": "包含共用的資料夾" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "正在匯入您的帳戶..." + }, + "lastPassMFARequired": { + "message": "要求 LastPass 多因素驗證" + }, + "lastPassMFADesc": { + "message": "輸入來自身分驗證 App 的一次性通行代碼" + }, + "lastPassOOBDesc": { + "message": "在身分驗證 App 中核准登入請求或輸入一次性通行代碼。" + }, + "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": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "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" } } 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 new file mode 100644 index 000000000000..0b9dc08ad2c9 --- /dev/null +++ b/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 000000000000..6d4e89959422 --- /dev/null +++ b/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts @@ -0,0 +1,39 @@ +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 new file mode 100644 index 000000000000..6294756cdf7f --- /dev/null +++ b/apps/browser/src/admin-console/services/browser-organization.service.ts @@ -0,0 +1,12 @@ +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 new file mode 100644 index 000000000000..0fc924fc2434 --- /dev/null +++ b/apps/browser/src/admin-console/services/browser-policy.service.ts @@ -0,0 +1,44 @@ +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/types/group-policy-environment.ts b/apps/browser/src/admin-console/types/group-policy-environment.ts similarity index 100% rename from apps/browser/src/types/group-policy-environment.ts rename to apps/browser/src/admin-console/types/group-policy-environment.ts diff --git a/apps/browser/src/auth/background/service-factories/account-service.factory.ts b/apps/browser/src/auth/background/service-factories/account-service.factory.ts new file mode 100644 index 000000000000..9b7ad05ec490 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/account-service.factory.ts @@ -0,0 +1,44 @@ +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountServiceImplementation } from "@bitwarden/common/auth/services/account.service"; + +import { + FactoryOptions, + CachedServices, + factory, +} from "../../../platform/background/service-factories/factory-options"; +import { + GlobalStateProviderInitOptions, + globalStateProviderFactory, +} from "../../../platform/background/service-factories/global-state-provider.factory"; +import { + LogServiceInitOptions, + logServiceFactory, +} from "../../../platform/background/service-factories/log-service.factory"; +import { + MessagingServiceInitOptions, + messagingServiceFactory, +} from "../../../platform/background/service-factories/messaging-service.factory"; + +type AccountServiceFactoryOptions = FactoryOptions; + +export type AccountServiceInitOptions = AccountServiceFactoryOptions & + MessagingServiceInitOptions & + LogServiceInitOptions & + GlobalStateProviderInitOptions; + +export function accountServiceFactory( + cache: { accountService?: AccountService } & CachedServices, + opts: AccountServiceInitOptions, +): Promise { + return factory( + cache, + "accountService", + opts, + async () => + new AccountServiceImplementation( + await messagingServiceFactory(cache, opts), + await logServiceFactory(cache, opts), + await globalStateProviderFactory(cache, opts), + ), + ); +} 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 new file mode 100644 index 000000000000..ce6c0d78f03c --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 000000000000..31d338fecc74 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/auth-service.factory.ts @@ -0,0 +1,119 @@ +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 new file mode 100644 index 000000000000..8458c40b9bbf --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts @@ -0,0 +1,74 @@ +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 new file mode 100644 index 000000000000..625a14e30ea0 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts @@ -0,0 +1,71 @@ +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 new file mode 100644 index 000000000000..476b8e2d7858 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/token-service.factory.ts @@ -0,0 +1,28 @@ +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/two-factor-service.factory.ts b/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts new file mode 100644 index 000000000000..1d79bbbaf1db --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts @@ -0,0 +1,40 @@ +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 new file mode 100644 index 000000000000..f8d438776326 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 000000000000..d0cdfff9932e --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts @@ -0,0 +1,51 @@ +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 000000000000..f6b560c71d62 --- /dev/null +++ b/apps/browser/src/auth/guards/fido2-auth.guard.ts @@ -0,0 +1,34 @@ +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 authetication 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) { + 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 000000000000..364ee07fba27 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.html @@ -0,0 +1,70 @@ + +
+ +
+
{{ "switchAccounts" | 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 000000000000..d7661fa9d449 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -0,0 +1,113 @@ +import { Location } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; +import { Subject, firstValueFrom, map, switchMap, takeUntil } from "rxjs"; + +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 { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { DialogService } from "@bitwarden/components"; + +import { AccountSwitcherService } from "./services/account-switcher.service"; + +@Component({ + templateUrl: "account-switcher.component.html", +}) +export class AccountSwitcherComponent implements OnInit, OnDestroy { + readonly lockedStatus = AuthenticationStatus.Locked; + private destroy$ = new Subject(); + + loading = false; + activeUserCanLock = false; + + constructor( + private accountSwitcherService: AccountSwitcherService, + private accountService: AccountService, + private vaultTimeoutService: VaultTimeoutService, + private messagingService: MessagingService, + private dialogService: DialogService, + private location: Location, + private router: Router, + private vaultTimeoutSettingsService: VaultTimeoutSettingsService, + ) {} + + get accountLimit() { + return this.accountSwitcherService.ACCOUNT_LIMIT; + } + + get specialAddAccountId() { + return this.accountSwitcherService.SPECIAL_ADD_ACCOUNT_ID; + } + + get availableAccounts$() { + return this.accountSwitcherService.availableAccounts$; + } + + get currentAccount$() { + return this.accountService.activeAccount$; + } + + async ngOnInit() { + 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 ? userId : null); + this.router.navigate(["lock"]); + } + + async lockAll() { + this.loading = true; + this.availableAccounts$ + .pipe( + map((accounts) => + accounts + .filter((account) => account.id !== this.specialAddAccountId) + .sort((a, b) => (a.isActive ? -1 : b.isActive ? 1 : 0)) // Log out of the active account first + .map((account) => account.id), + ), + switchMap(async (accountIds) => { + if (accountIds.length === 0) { + return; + } + + // Must lock active (first) account first, then order doesn't matter + await this.vaultTimeoutService.lock(accountIds.shift()); + await Promise.all(accountIds.map((id) => this.vaultTimeoutService.lock(id))); + }), + takeUntil(this.destroy$), + ) + .subscribe(() => this.router.navigate(["lock"])); + } + + async logOut() { + this.loading = true; + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "logOut" }, + content: { key: "logOutConfirmation" }, + type: "info", + }); + + if (confirmed) { + this.messagingService.send("logout"); + } + + this.router.navigate(["account-switcher"]); + } + + 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 000000000000..0912c71b0664 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account.component.html @@ -0,0 +1,52 @@ + + + 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 000000000000..2455aee1b86e --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account.component.ts @@ -0,0 +1,55 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Router } from "@angular/router"; + +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 { AvatarModule } 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], +}) +export class AccountComponent { + @Input() account: AvailableAccount; + @Output() loading = new EventEmitter(); + + constructor( + private accountSwitcherService: AccountSwitcherService, + private router: Router, + private location: Location, + private i18nService: I18nService, + ) {} + + get specialAccountAddId() { + return this.accountSwitcherService.SPECIAL_ADD_ACCOUNT_ID; + } + + async selectAccount(id: string) { + this.loading.emit(true); + await this.accountSwitcherService.selectAccount(id); + + if (id === this.specialAccountAddId) { + this.router.navigate(["home"]); + } else { + this.location.back(); + } + } + + get status() { + if (this.account.isActive && this.account.status !== AuthenticationStatus.Locked) { + 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 000000000000..777d3af3047c --- /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 000000000000..df6cb3225075 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.ts @@ -0,0 +1,30 @@ +import { Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { CurrentAccountService } from "./services/current-account.service"; + +@Component({ + selector: "app-current-account", + templateUrl: "current-account.component.html", +}) +export class CurrentAccountComponent { + constructor( + private currentAccountService: CurrentAccountService, + private router: Router, + private location: Location, + private route: ActivatedRoute, + ) {} + + get currentAccount$() { + return this.currentAccountService.currentAccount$; + } + + async currentAccountClicked() { + if (this.route.snapshot.data.state.includes("account-switcher")) { + this.location.back(); + } else { + 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 000000000000..9845fac1dad5 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -0,0 +1,143 @@ +import { matches, mock } from "jest-mock-extended"; +import { BehaviorSubject, firstValueFrom, timeout } from "rxjs"; + +import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.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 { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "./account-switcher.service"; + +describe("AccountSwitcherService", () => { + const accountsSubject = new BehaviorSubject>(null); + const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>(null); + + const accountService = mock(); + const stateService = mock(); + const messagingService = mock(); + const environmentService = mock(); + const logService = mock(); + + let accountSwitcherService: AccountSwitcherService; + + beforeEach(() => { + jest.resetAllMocks(); + accountService.accounts$ = accountsSubject; + accountService.activeAccount$ = activeAccountSubject; + accountSwitcherService = new AccountSwitcherService( + accountService, + stateService, + messagingService, + environmentService, + logService, + ); + }); + + describe("availableAccounts$", () => { + it("should return all accounts and an add account option when accounts are less than 5", async () => { + const user1AccountInfo: AccountInfo = { + name: "Test User 1", + email: "test1@email.com", + status: AuthenticationStatus.Unlocked, + }; + + accountsSubject.next({ + "1": user1AccountInfo, + } as Record); + + activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "1" as UserId })); + + const accounts = await firstValueFrom( + accountSwitcherService.availableAccounts$.pipe(timeout(20)), + ); + expect(accounts).toHaveLength(2); + expect(accounts[0].id).toBe("1"); + expect(accounts[0].isActive).toBeTruthy(); + + expect(accounts[1].id).toBe("addAccount"); + expect(accounts[1].isActive).toBeFalsy(); + }); + + it.each([5, 6])( + "should return only accounts if there are %i accounts", + async (numberOfAccounts) => { + const seedAccounts: Record = {}; + for (let i = 0; i < numberOfAccounts; i++) { + seedAccounts[`${i}` as UserId] = { + email: `test${i}@email.com`, + name: "Test User ${i}", + status: AuthenticationStatus.Unlocked, + }; + } + accountsSubject.next(seedAccounts); + 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"); + }); + }, + ); + }); + + 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(accountService.switchAccount).toBeCalledWith(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(accountService.switchAccount).toBeCalledWith("1"); + expect(messagingService.send).toBeCalledWith( + "switchAccount", + matches((payload) => { + return payload.userId === "1"; + }), + ); + 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 000000000000..19ede98e2c31 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts @@ -0,0 +1,139 @@ +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 { 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 { StateService } from "@bitwarden/common/platform/abstractions/state.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; + + constructor( + private accountService: AccountService, + private stateService: StateService, + private messagingService: MessagingService, + private environmentService: EnvironmentService, + private logService: LogService, + ) { + this.availableAccounts$ = combineLatest([ + this.accountService.accounts$, + this.accountService.activeAccount$, + ]).pipe( + switchMap(async ([accounts, activeAccount]) => { + const accountEntries = Object.entries(accounts).filter( + ([_, account]) => account.status !== AuthenticationStatus.LoggedOut, + ); + // Accounts shouldn't ever be more than ACCOUNT_LIMIT but just in case do a greater than + const hasMaxAccounts = accountEntries.length >= this.ACCOUNT_LIMIT; + const options: AvailableAccount[] = await Promise.all( + accountEntries.map(async ([id, account]) => { + return { + name: account.name ?? account.email, + email: account.email, + id: id, + server: await this.environmentService.getHost(id), + status: account.status, + isActive: id === activeAccount?.id, + avatarColor: await this.stateService.getAvatarColor({ userId: id }), + }; + }), + ); + + if (!hasMaxAccounts) { + options.push({ + name: "Add account", + id: this.SPECIAL_ADD_ACCOUNT_ID, + isActive: activeAccount?.id == null, + }); + } + + return options; + }), + ); + + // Create a reusable observable that listens to the the switchAccountFinish message and returns the userId from the message + this.switchAccountFinished$ = fromChromeEvent<[message: { command: string; userId: string }]>( + chrome.runtime.onMessage, + ).pipe( + filter(([message]) => message.command === "switchAccountFinish"), + map(([message]) => message.userId), + ); + } + + get specialAccountAddId() { + return this.SPECIAL_ADD_ACCOUNT_ID; + } + + async selectAccount(id: string) { + if (id === this.SPECIAL_ADD_ACCOUNT_ID) { + id = null; + } + + // Creates a subscription to the switchAccountFinished observable but further + // filters it to only care about the current userId. + const switchAccountFinishedPromise = firstValueFrom( + this.switchAccountFinished$.pipe( + filter((userId) => userId === id), + 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)), + }), + ), + ); + + // Initiate the actions required to make account switching happen + await this.accountService.switchAccount(id as UserId); + this.messagingService.send("switchAccount", { userId: id }); // This message should cause switchAccountFinish to be sent + + // Wait until we recieve the switchAccountFinished message + await switchAccountFinishedPromise.catch((err) => { + if ( + err instanceof Error && + err.message === AccountSwitcherService.incompleteAccountSwitchError + ) { + this.logService.warning("message 'switchAccount' never responded."); + return; + } + throw err; + }); + } +} diff --git a/apps/browser/src/auth/popup/account-switching/services/current-account.service.ts b/apps/browser/src/auth/popup/account-switching/services/current-account.service.ts new file mode 100644 index 000000000000..21fc3bdac435 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/services/current-account.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from "@angular/core"; +import { Observable, switchMap } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +export type CurrentAccount = { + id: UserId; + name: string | undefined; + email: string; + status: AuthenticationStatus; + avatarColor: string; +}; + +@Injectable({ + providedIn: "root", +}) +export class CurrentAccountService { + currentAccount$: Observable; + + constructor( + private accountService: AccountService, + private stateService: StateService, + ) { + this.currentAccount$ = this.accountService.activeAccount$.pipe( + switchMap(async (account) => { + if (account == null) { + return null; + } + const currentAccount: CurrentAccount = { + id: account.id, + name: account.name || account.email, + email: account.email, + status: account.status, + avatarColor: await this.stateService.getAvatarColor({ userId: account.id }), + }; + + return currentAccount; + }), + ); + } +} diff --git a/apps/browser/src/popup/components/set-pin.component.html b/apps/browser/src/auth/popup/components/set-pin.component.html similarity index 100% rename from apps/browser/src/popup/components/set-pin.component.html rename to apps/browser/src/auth/popup/components/set-pin.component.html 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 000000000000..41ce33eabdef --- /dev/null +++ b/apps/browser/src/auth/popup/components/set-pin.component.ts @@ -0,0 +1,8 @@ +import { Component } from "@angular/core"; + +import { SetPinComponent as BaseSetPinComponent } from "@bitwarden/angular/auth/components/set-pin.component"; + +@Component({ + templateUrl: "set-pin.component.html", +}) +export class SetPinComponent extends BaseSetPinComponent {} diff --git a/apps/browser/src/popup/accounts/environment.component.html b/apps/browser/src/auth/popup/environment.component.html similarity index 100% rename from apps/browser/src/popup/accounts/environment.component.html rename to apps/browser/src/auth/popup/environment.component.html diff --git a/apps/browser/src/auth/popup/environment.component.ts b/apps/browser/src/auth/popup/environment.component.ts new file mode 100644 index 000000000000..6246aaf5db14 --- /dev/null +++ b/apps/browser/src/auth/popup/environment.component.ts @@ -0,0 +1,49 @@ +import { Component, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; + +import { EnvironmentComponent as BaseEnvironmentComponent } from "@bitwarden/angular/auth/components/environment.component"; +import { ModalService } from "@bitwarden/angular/services/modal.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service"; + +@Component({ + selector: "app-environment", + templateUrl: "environment.component.html", +}) +export class EnvironmentComponent extends BaseEnvironmentComponent implements OnInit { + showEditedManagedSettings = false; + + constructor( + platformUtilsService: PlatformUtilsService, + public environmentService: BrowserEnvironmentService, + i18nService: I18nService, + private router: Router, + modalService: ModalService, + ) { + super(platformUtilsService, environmentService, i18nService, modalService); + this.showCustom = true; + } + + async ngOnInit() { + this.showEditedManagedSettings = await this.environmentService.settingsHaveChanged(); + } + + async resetEnvironment() { + const urls = await this.environmentService.getManagedEnvironment(); + + this.baseUrl = urls.base; + this.webVaultUrl = urls.webVault; + this.apiUrl = urls.api; + this.iconsUrl = urls.icons; + this.identityUrl = urls.identity; + this.notificationsUrl = urls.notifications; + this.iconsUrl = urls.icons; + } + + saved() { + super.saved(); + this.router.navigate([""]); + } +} diff --git a/apps/browser/src/popup/accounts/hint.component.html b/apps/browser/src/auth/popup/hint.component.html similarity index 100% rename from apps/browser/src/popup/accounts/hint.component.html rename to apps/browser/src/auth/popup/hint.component.html diff --git a/apps/browser/src/auth/popup/hint.component.ts b/apps/browser/src/auth/popup/hint.component.ts new file mode 100644 index 000000000000..6de2c35301fc --- /dev/null +++ b/apps/browser/src/auth/popup/hint.component.ts @@ -0,0 +1,31 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { HintComponent as BaseHintComponent } from "@bitwarden/angular/auth/components/hint.component"; +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"; + +@Component({ + selector: "app-hint", + templateUrl: "hint.component.html", +}) +export class HintComponent extends BaseHintComponent { + constructor( + router: Router, + platformUtilsService: PlatformUtilsService, + i18nService: I18nService, + apiService: ApiService, + logService: LogService, + private route: ActivatedRoute, + loginService: LoginService, + ) { + super(router, i18nService, apiService, platformUtilsService, logService, loginService); + + super.onSuccessfulSubmit = async () => { + this.router.navigate([this.successRoute]); + }; + } +} diff --git a/apps/browser/src/popup/accounts/home.component.html b/apps/browser/src/auth/popup/home.component.html similarity index 77% rename from apps/browser/src/popup/accounts/home.component.html rename to apps/browser/src/auth/popup/home.component.html index 24feb9c83e5b..f70a4c6d0307 100644 --- a/apps/browser/src/popup/accounts/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 new file mode 100644 index 000000000000..b0b64f658e6f --- /dev/null +++ b/apps/browser/src/auth/popup/home.component.ts @@ -0,0 +1,101 @@ +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 { 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 { 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 { AccountSwitcherService } from "./account-switching/services/account-switcher.service"; + +@Component({ + selector: "app-home", + templateUrl: "home.component.html", +}) +export class HomeComponent implements OnInit, OnDestroy { + @ViewChild(EnvironmentSelectorComponent, { static: true }) + environmentSelector!: EnvironmentSelectorComponent; + private destroyed$: Subject = new Subject(); + + loginInitiated = false; + formGroup = this.formBuilder.group({ + email: ["", [Validators.required, Validators.email]], + rememberEmail: [false], + }); + + constructor( + protected platformUtilsService: PlatformUtilsService, + private stateService: StateService, + private formBuilder: FormBuilder, + private router: Router, + private i18nService: I18nService, + private environmentService: EnvironmentService, + private loginService: LoginService, + private accountSwitcherService: AccountSwitcherService, + ) {} + + async ngOnInit(): Promise { + let savedEmail = this.loginService.getEmail(); + const rememberEmail = this.loginService.getRememberEmail(); + + if (savedEmail != null) { + this.formGroup.patchValue({ + email: savedEmail, + rememberEmail: rememberEmail, + }); + } else { + savedEmail = await this.stateService.getRememberedEmail(); + if (savedEmail != null) { + this.formGroup.patchValue({ + email: savedEmail, + rememberEmail: true, + }); + } + } + + this.environmentSelector.onOpenSelfHostedSettings + .pipe(takeUntil(this.destroyed$)) + .subscribe(() => { + this.setFormValues(); + this.router.navigate(["environment"]); + }); + } + + ngOnDestroy(): void { + this.destroyed$.next(); + this.destroyed$.complete(); + } + + get availableAccounts$() { + return this.accountSwitcherService.availableAccounts$; + } + + submit() { + this.formGroup.markAllAsTouched(); + if (this.formGroup.invalid) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccured"), + 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 } }); + } + + 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); + } +} diff --git a/apps/browser/src/auth/popup/lock.component.html b/apps/browser/src/auth/popup/lock.component.html new file mode 100644 index 000000000000..9892503a7bb0 --- /dev/null +++ b/apps/browser/src/auth/popup/lock.component.html @@ -0,0 +1,101 @@ +
+ +
+

+ {{ "verifyIdentity" | i18n }} +

+
+ +
+
+
+ +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+

+ +

+ + {{ biometricError }} +

+ {{ "awaitDesktop" | i18n }} +

+ + +
+
+
diff --git a/apps/browser/src/auth/popup/lock.component.ts b/apps/browser/src/auth/popup/lock.component.ts new file mode 100644 index 000000000000..0379886bc244 --- /dev/null +++ b/apps/browser/src/auth/popup/lock.component.ts @@ -0,0 +1,136 @@ +import { Component, NgZone } from "@angular/core"; +import { Router } from "@angular/router"; + +import { LockComponent as BaseLockComponent } from "@bitwarden/angular/auth/components/lock.component"; +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 { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.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"; +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 { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; +import { DialogService } from "@bitwarden/components"; + +import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors"; +import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; +import { fido2PopoutSessionData$ } from "../../vault/fido2/browser-fido2-user-interface.service"; + +@Component({ + selector: "app-lock", + templateUrl: "lock.component.html", +}) +export class LockComponent extends BaseLockComponent { + private isInitialLockScreen: boolean; + + biometricError: string; + pendingBiometric = false; + fido2PopoutSessionData$ = fido2PopoutSessionData$(); + + constructor( + router: Router, + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + messagingService: MessagingService, + cryptoService: CryptoService, + vaultTimeoutService: VaultTimeoutService, + vaultTimeoutSettingsService: VaultTimeoutSettingsService, + environmentService: EnvironmentService, + stateService: StateService, + apiService: ApiService, + logService: LogService, + ngZone: NgZone, + policyApiService: PolicyApiServiceAbstraction, + policyService: InternalPolicyService, + passwordStrengthService: PasswordStrengthServiceAbstraction, + private authService: AuthService, + dialogService: DialogService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + userVerificationService: UserVerificationService, + private routerService: BrowserRouterService, + ) { + super( + router, + i18nService, + platformUtilsService, + messagingService, + cryptoService, + vaultTimeoutService, + vaultTimeoutSettingsService, + environmentService, + stateService, + apiService, + logService, + ngZone, + policyApiService, + policyService, + passwordStrengthService, + dialogService, + deviceTrustCryptoService, + userVerificationService, + ); + this.successRoute = "/tabs/current"; + this.isInitialLockScreen = (window as any).previousPopupUrl == null; + + super.onSuccessfulSubmit = async () => { + const previousUrl = this.routerService.getPreviousUrl(); + if (previousUrl) { + this.router.navigateByUrl(previousUrl); + } else { + this.router.navigate([this.successRoute]); + } + }; + } + + async ngOnInit() { + await super.ngOnInit(); + const disableAutoBiometricsPrompt = + (await this.stateService.getDisableAutoBiometricsPrompt()) ?? true; + + window.setTimeout(async () => { + document.getElementById(this.pinEnabled ? "pin" : "masterPassword")?.focus(); + if ( + this.biometricLock && + !disableAutoBiometricsPrompt && + this.isInitialLockScreen && + (await this.authService.getAuthStatus()) === AuthenticationStatus.Locked + ) { + await this.unlockBiometric(); + } + }, 100); + } + + override async unlockBiometric(): Promise { + if (!this.biometricLock) { + return; + } + + this.pendingBiometric = true; + this.biometricError = null; + + let success; + try { + success = await super.unlockBiometric(); + } catch (e) { + const error = BiometricErrors[e as BiometricErrorTypes]; + + if (error == null) { + this.logService.error("Unknown error: " + e); + } + + this.biometricError = this.i18nService.t(error.description); + } + 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 new file mode 100644 index 000000000000..32e3ea0c5984 --- /dev/null +++ b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html @@ -0,0 +1,108 @@ +
+
+

+ {{ "loginInitiated" | i18n }} +

+
+ + +
diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts new file mode 100644 index 000000000000..7fac9a42b066 --- /dev/null +++ b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts @@ -0,0 +1,18 @@ +import { Component } from "@angular/core"; + +import { BaseLoginDecryptionOptionsComponent } from "@bitwarden/angular/auth/components/base-login-decryption-options.component"; + +@Component({ + selector: "browser-login-decryption-options", + templateUrl: "login-decryption-options.component.html", +}) +export class LoginDecryptionOptionsComponent extends BaseLoginDecryptionOptionsComponent { + override async createUser(): Promise { + try { + await super.createUser(); + await this.router.navigate(["/tabs/vault"]); + } catch (error) { + this.validationService.showError(error); + } + } +} diff --git a/apps/browser/src/auth/popup/login-via-auth-request.component.html b/apps/browser/src/auth/popup/login-via-auth-request.component.html new file mode 100644 index 000000000000..2abff7bdb9c5 --- /dev/null +++ b/apps/browser/src/auth/popup/login-via-auth-request.component.html @@ -0,0 +1,61 @@ + diff --git a/apps/browser/src/auth/popup/login-via-auth-request.component.ts b/apps/browser/src/auth/popup/login-via-auth-request.component.ts new file mode 100644 index 000000000000..b5ff436f14a9 --- /dev/null +++ b/apps/browser/src/auth/popup/login-via-auth-request.component.ts @@ -0,0 +1,80 @@ +import { Location } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; + +import { LoginViaAuthRequestComponent as BaseLoginWithDeviceComponent } from "@bitwarden/angular/auth/components/login-via-auth-request.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AnonymousHubService } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; +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 { 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 { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +@Component({ + selector: "app-login-via-auth-request", + templateUrl: "login-via-auth-request.component.html", +}) +export class LoginViaAuthRequestComponent + extends BaseLoginWithDeviceComponent + implements OnInit, OnDestroy +{ + constructor( + router: Router, + cryptoService: CryptoService, + cryptoFunctionService: CryptoFunctionService, + appIdService: AppIdService, + passwordGenerationService: PasswordGenerationServiceAbstraction, + apiService: ApiService, + authService: AuthService, + logService: LogService, + environmentService: EnvironmentService, + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + anonymousHubService: AnonymousHubService, + validationService: ValidationService, + stateService: StateService, + loginService: LoginService, + syncService: SyncService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + authReqCryptoService: AuthRequestCryptoServiceAbstraction, + private location: Location, + ) { + super( + router, + cryptoService, + cryptoFunctionService, + appIdService, + passwordGenerationService, + apiService, + authService, + logService, + environmentService, + i18nService, + platformUtilsService, + anonymousHubService, + validationService, + stateService, + loginService, + deviceTrustCryptoService, + authReqCryptoService, + ); + super.onSuccessfulLogin = async () => { + await syncService.fullSync(true); + }; + } + + protected back() { + this.location.back(); + } +} diff --git a/apps/browser/src/auth/popup/login.component.html b/apps/browser/src/auth/popup/login.component.html new file mode 100644 index 000000000000..f6ebb747f777 --- /dev/null +++ b/apps/browser/src/auth/popup/login.component.html @@ -0,0 +1,82 @@ +
+
+

+ {{ "logIn" | i18n }} +

+
+
+
+
+
+
+ + + + +
+
+ +
+
+
+ +
+
+ +
+ + +
+
diff --git a/apps/browser/src/auth/popup/login.component.ts b/apps/browser/src/auth/popup/login.component.ts new file mode 100644 index 000000000000..0d191c3bc491 --- /dev/null +++ b/apps/browser/src/auth/popup/login.component.ts @@ -0,0 +1,129 @@ +import { Component, NgZone } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; +import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; +import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; +import { WebAuthnLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction"; +import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +import { flagEnabled } from "../../platform/flags"; + +@Component({ + selector: "app-login", + templateUrl: "login.component.html", +}) +export class LoginComponent extends BaseLoginComponent { + showPasswordless = false; + constructor( + devicesApiService: DevicesApiServiceAbstraction, + appIdService: AppIdService, + authService: AuthService, + router: Router, + protected platformUtilsService: PlatformUtilsService, + protected i18nService: I18nService, + protected stateService: StateService, + protected environmentService: EnvironmentService, + protected passwordGenerationService: PasswordGenerationServiceAbstraction, + protected cryptoFunctionService: CryptoFunctionService, + syncService: SyncService, + logService: LogService, + ngZone: NgZone, + formBuilder: FormBuilder, + formValidationErrorService: FormValidationErrorsService, + route: ActivatedRoute, + loginService: LoginService, + webAuthnLoginService: WebAuthnLoginServiceAbstraction, + ) { + super( + devicesApiService, + appIdService, + authService, + router, + platformUtilsService, + i18nService, + stateService, + environmentService, + passwordGenerationService, + cryptoFunctionService, + logService, + ngZone, + formBuilder, + formValidationErrorService, + route, + loginService, + webAuthnLoginService, + ); + super.onSuccessfulLogin = async () => { + await syncService.fullSync(true); + }; + super.successRoute = "/tabs/vault"; + this.showPasswordless = flagEnabled("showPasswordless"); + + if (this.showPasswordless) { + this.formGroup.controls.email.setValue(this.loginService.getEmail()); + this.formGroup.controls.rememberEmail.setValue(this.loginService.getRememberEmail()); + this.validateEmail(); + } + } + + settings() { + this.router.navigate(["environment"]); + } + + async launchSsoBrowser() { + await this.loginService.saveEmailSettings(); + // Generate necessary sso params + const passwordOptions: any = { + type: "password", + length: 64, + uppercase: true, + lowercase: true, + numbers: true, + special: false, + }; + + const state = + (await this.passwordGenerationService.generatePassword(passwordOptions)) + + ":clientId=browser"; + const codeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); + const codeVerifierHash = await this.cryptoFunctionService.hash(codeVerifier, "sha256"); + const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); + + await this.stateService.setSsoCodeVerifier(codeVerifier); + await this.stateService.setSsoState(state); + + let url = this.environmentService.getWebVaultUrl(); + if (url == null) { + url = "https://vault.bitwarden.com"; + } + + const redirectUri = url + "/sso-connector.html"; + + // Launch browser + this.platformUtilsService.launchUri( + url + + "/#/sso?clientId=browser" + + "&redirectUri=" + + encodeURIComponent(redirectUri) + + "&state=" + + state + + "&codeChallenge=" + + codeChallenge + + "&email=" + + encodeURIComponent(this.formGroup.controls.email.value), + ); + } +} diff --git a/apps/browser/src/auth/popup/register.component.html b/apps/browser/src/auth/popup/register.component.html new file mode 100644 index 000000000000..619f7b64abe5 --- /dev/null +++ b/apps/browser/src/auth/popup/register.component.html @@ -0,0 +1,147 @@ +
+
+
+ +
+

+ {{ "createAccount" | i18n }} +

+
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
diff --git a/apps/browser/src/auth/popup/register.component.ts b/apps/browser/src/auth/popup/register.component.ts new file mode 100644 index 000000000000..4752c885728c --- /dev/null +++ b/apps/browser/src/auth/popup/register.component.ts @@ -0,0 +1,60 @@ +import { Component } from "@angular/core"; +import { UntypedFormBuilder } from "@angular/forms"; +import { Router } from "@angular/router"; + +import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/auth/components/register.component"; +import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuditService } from "@bitwarden/common/abstractions/audit.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +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"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { DialogService } from "@bitwarden/components"; + +@Component({ + selector: "app-register", + templateUrl: "register.component.html", +}) +export class RegisterComponent extends BaseRegisterComponent { + color: string; + text: string; + + constructor( + formValidationErrorService: FormValidationErrorsService, + formBuilder: UntypedFormBuilder, + authService: AuthService, + router: Router, + i18nService: I18nService, + cryptoService: CryptoService, + apiService: ApiService, + stateService: StateService, + platformUtilsService: PlatformUtilsService, + passwordGenerationService: PasswordGenerationServiceAbstraction, + environmentService: EnvironmentService, + logService: LogService, + auditService: AuditService, + dialogService: DialogService, + ) { + super( + formValidationErrorService, + formBuilder, + authService, + router, + i18nService, + cryptoService, + apiService, + stateService, + platformUtilsService, + passwordGenerationService, + environmentService, + logService, + auditService, + dialogService, + ); + } +} diff --git a/apps/browser/src/popup/accounts/remove-password.component.html b/apps/browser/src/auth/popup/remove-password.component.html similarity index 100% rename from apps/browser/src/popup/accounts/remove-password.component.html rename to apps/browser/src/auth/popup/remove-password.component.html diff --git a/apps/browser/src/auth/popup/remove-password.component.ts b/apps/browser/src/auth/popup/remove-password.component.ts new file mode 100644 index 000000000000..5272a3082a2b --- /dev/null +++ b/apps/browser/src/auth/popup/remove-password.component.ts @@ -0,0 +1,9 @@ +import { Component } from "@angular/core"; + +import { RemovePasswordComponent as BaseRemovePasswordComponent } from "@bitwarden/angular/auth/components/remove-password.component"; + +@Component({ + selector: "app-remove-password", + templateUrl: "remove-password.component.html", +}) +export class RemovePasswordComponent extends BaseRemovePasswordComponent {} diff --git a/apps/browser/src/auth/popup/services/index.ts b/apps/browser/src/auth/popup/services/index.ts new file mode 100644 index 000000000000..63563f61fd9d --- /dev/null +++ b/apps/browser/src/auth/popup/services/index.ts @@ -0,0 +1 @@ +export { UnauthGuardService } from "./unauth-guard.service"; diff --git a/apps/browser/src/popup/services/unauth-guard.service.ts b/apps/browser/src/auth/popup/services/unauth-guard.service.ts similarity index 87% rename from apps/browser/src/popup/services/unauth-guard.service.ts rename to apps/browser/src/auth/popup/services/unauth-guard.service.ts index 7b9c33b2d6be..062239a7d36a 100644 --- a/apps/browser/src/popup/services/unauth-guard.service.ts +++ b/apps/browser/src/auth/popup/services/unauth-guard.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@angular/core"; -import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/guards/unauth.guard"; +import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/auth/guards"; @Injectable() export class UnauthGuardService extends BaseUnauthGuardService { diff --git a/apps/browser/src/auth/popup/set-password.component.html b/apps/browser/src/auth/popup/set-password.component.html new file mode 100644 index 000000000000..6261608c3455 --- /dev/null +++ b/apps/browser/src/auth/popup/set-password.component.html @@ -0,0 +1,160 @@ +
+
+
+ +
+

+ {{ "setMasterPassword" | i18n }} +

+
+ +
+
+
+
+ +
+
+
+

+ {{ "orgPermissionsUpdatedMustSetPassword" | i18n }} +

+ + +

{{ "orgRequiresYouToSetPassword" | i18n }}

+
+ + + {{ "resetPasswordAutoEnrollInviteWarning" | i18n }} + + + +
+
+
+
+
+
+ + +
+
+ +
+
+ + + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
diff --git a/apps/browser/src/auth/popup/set-password.component.ts b/apps/browser/src/auth/popup/set-password.component.ts new file mode 100644 index 000000000000..7b9d2c77e831 --- /dev/null +++ b/apps/browser/src/auth/popup/set-password.component.ts @@ -0,0 +1,59 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { SetPasswordComponent as BaseSetPasswordComponent } from "@bitwarden/angular/auth/components/set-password.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; +import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service"; +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 { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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 { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { DialogService } from "@bitwarden/components"; + +@Component({ + selector: "app-set-password", + templateUrl: "set-password.component.html", +}) +export class SetPasswordComponent extends BaseSetPasswordComponent { + constructor( + apiService: ApiService, + i18nService: I18nService, + cryptoService: CryptoService, + messagingService: MessagingService, + stateService: StateService, + passwordGenerationService: PasswordGenerationServiceAbstraction, + platformUtilsService: PlatformUtilsService, + policyApiService: PolicyApiServiceAbstraction, + policyService: PolicyService, + router: Router, + syncService: SyncService, + route: ActivatedRoute, + organizationApiService: OrganizationApiServiceAbstraction, + organizationUserService: OrganizationUserService, + dialogService: DialogService, + ) { + super( + i18nService, + cryptoService, + messagingService, + passwordGenerationService, + platformUtilsService, + policyApiService, + policyService, + router, + apiService, + syncService, + route, + stateService, + organizationApiService, + organizationUserService, + dialogService, + ); + } +} diff --git a/apps/browser/src/popup/accounts/sso.component.html b/apps/browser/src/auth/popup/sso.component.html similarity index 100% rename from apps/browser/src/popup/accounts/sso.component.html rename to apps/browser/src/auth/popup/sso.component.html diff --git a/apps/browser/src/auth/popup/sso.component.ts b/apps/browser/src/auth/popup/sso.component.ts new file mode 100644 index 000000000000..d3007a0f743d --- /dev/null +++ b/apps/browser/src/auth/popup/sso.component.ts @@ -0,0 +1,81 @@ +import { Component, Inject } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +import { BrowserApi } from "../../platform/browser/browser-api"; + +@Component({ + selector: "app-sso", + templateUrl: "sso.component.html", +}) +export class SsoComponent extends BaseSsoComponent { + constructor( + authService: AuthService, + router: Router, + i18nService: I18nService, + route: ActivatedRoute, + stateService: StateService, + platformUtilsService: PlatformUtilsService, + apiService: ApiService, + cryptoFunctionService: CryptoFunctionService, + passwordGenerationService: PasswordGenerationServiceAbstraction, + syncService: SyncService, + environmentService: EnvironmentService, + logService: LogService, + configService: ConfigServiceAbstraction, + @Inject(WINDOW) private win: Window, + ) { + super( + authService, + router, + i18nService, + route, + stateService, + platformUtilsService, + apiService, + cryptoFunctionService, + environmentService, + passwordGenerationService, + logService, + configService, + ); + + const url = this.environmentService.getWebVaultUrl(); + + this.redirectUri = url + "/sso-connector.html"; + this.clientId = "browser"; + + super.onSuccessfulLogin = async () => { + syncService.fullSync(true); + + // If the vault is unlocked then this will clear keys from memory, which we don't want to do + if ((await this.authService.getAuthStatus()) !== AuthenticationStatus.Unlocked) { + BrowserApi.reloadOpenWindows(); + } + + this.win.close(); + }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTdeNavigate = async () => { + this.win.close(); + }; + } +} diff --git a/apps/browser/src/auth/popup/two-factor-options.component.html b/apps/browser/src/auth/popup/two-factor-options.component.html new file mode 100644 index 000000000000..f25944aba65e --- /dev/null +++ b/apps/browser/src/auth/popup/two-factor-options.component.html @@ -0,0 +1,29 @@ +
+
+ +
+

+ {{ "twoStepOptions" | i18n }} +

+
+
+
+
+
+ + +
+
+
diff --git a/apps/browser/src/auth/popup/two-factor-options.component.ts b/apps/browser/src/auth/popup/two-factor-options.component.ts new file mode 100644 index 000000000000..905b5f9f8396 --- /dev/null +++ b/apps/browser/src/auth/popup/two-factor-options.component.ts @@ -0,0 +1,47 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +import { TwoFactorOptionsComponent as BaseTwoFactorOptionsComponent } from "@bitwarden/angular/auth/components/two-factor-options.component"; +import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +@Component({ + selector: "app-two-factor-options", + templateUrl: "two-factor-options.component.html", +}) +export class TwoFactorOptionsComponent extends BaseTwoFactorOptionsComponent { + constructor( + twoFactorService: TwoFactorService, + router: Router, + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + private activatedRoute: ActivatedRoute, + ) { + super(twoFactorService, router, i18nService, platformUtilsService, window); + } + + close() { + this.navigateTo2FA(); + } + + choose(p: any) { + super.choose(p); + this.twoFactorService.setSelectedProvider(p.type); + + this.navigateTo2FA(); + } + + navigateTo2FA() { + const sso = this.activatedRoute.snapshot.queryParamMap.get("sso") === "true"; + + if (sso) { + // Persist SSO flag back to the 2FA comp if it exists + // in order for successful login logic to work properly for + // SSO + 2FA in browser extension + this.router.navigate(["2fa"], { queryParams: { sso: true } }); + } else { + this.router.navigate(["2fa"]); + } + } +} diff --git a/apps/browser/src/auth/popup/two-factor.component.html b/apps/browser/src/auth/popup/two-factor.component.html new file mode 100644 index 000000000000..6d190120f56e --- /dev/null +++ b/apps/browser/src/auth/popup/two-factor.component.html @@ -0,0 +1,150 @@ +
+
+
+ +
+

+ {{ title }} +

+
+ +
+
+
+ +
+ + {{ "enterVerificationCodeApp" | i18n }} + + + {{ "enterVerificationCodeEmail" | i18n: twoFactorEmail }} + +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+

{{ "insertYubiKey" | i18n }}

+ +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ +
+

{{ "webAuthnNewTab" | i18n }}

+ +
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+ +
+
+

{{ "noTwoStepProviders" | i18n }}

+

{{ "noTwoStepProviders2" | i18n }}

+
+
+

+ +

+

+ +

+
+
+
diff --git a/apps/browser/src/auth/popup/two-factor.component.ts b/apps/browser/src/auth/popup/two-factor.component.ts new file mode 100644 index 000000000000..fde6f4ffc997 --- /dev/null +++ b/apps/browser/src/auth/popup/two-factor.component.ts @@ -0,0 +1,174 @@ +import { Component, Inject } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { first } from "rxjs/operators"; + +import { TwoFactorComponent as BaseTwoFactorComponent } from "@bitwarden/angular/auth/components/two-factor.component"; +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; +import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; +import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; +import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +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 { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { DialogService } from "@bitwarden/components"; + +import { BrowserApi } from "../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; + +import { closeTwoFactorAuthPopout } from "./utils/auth-popout-window"; + +const BroadcasterSubscriptionId = "TwoFactorComponent"; + +@Component({ + selector: "app-two-factor", + templateUrl: "two-factor.component.html", +}) +export class TwoFactorComponent extends BaseTwoFactorComponent { + constructor( + authService: AuthService, + router: Router, + i18nService: I18nService, + apiService: ApiService, + platformUtilsService: PlatformUtilsService, + private syncService: SyncService, + environmentService: EnvironmentService, + private broadcasterService: BroadcasterService, + stateService: StateService, + route: ActivatedRoute, + private messagingService: MessagingService, + logService: LogService, + twoFactorService: TwoFactorService, + appIdService: AppIdService, + loginService: LoginService, + configService: ConfigServiceAbstraction, + private dialogService: DialogService, + @Inject(WINDOW) protected win: Window, + ) { + super( + authService, + router, + i18nService, + apiService, + platformUtilsService, + win, + environmentService, + stateService, + route, + logService, + twoFactorService, + appIdService, + loginService, + configService, + ); + super.onSuccessfulLogin = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTdeNavigate = async () => { + this.win.close(); + }; + + super.successRoute = "/tabs/vault"; + // FIXME: Chromium 110 has broken WebAuthn support in extensions via an iframe + this.webAuthnNewTab = true; + } + + async ngOnInit() { + if (this.route.snapshot.paramMap.has("webAuthnResponse")) { + // WebAuthn fallback response + this.selectedProviderType = TwoFactorProviderType.WebAuthn; + this.token = this.route.snapshot.paramMap.get("webAuthnResponse"); + super.onSuccessfulLogin = async () => { + this.syncService.fullSync(true); + this.messagingService.send("reloadPopup"); + window.close(); + }; + this.remember = this.route.snapshot.paramMap.get("remember") === "true"; + await this.doSubmit(); + return; + } + + await super.ngOnInit(); + if (this.selectedProviderType == null) { + return; + } + + // WebAuthn prompt appears inside the popup on linux, and requires a larger popup width + // than usual to avoid cutting off the dialog. + if (this.selectedProviderType === TwoFactorProviderType.WebAuthn && (await this.isLinux())) { + document.body.classList.add("linux-webauthn"); + } + + if ( + this.selectedProviderType === TwoFactorProviderType.Email && + BrowserPopupUtils.inPopup(window) + ) { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "warning" }, + content: { key: "popup2faCloseMessage" }, + type: "warning", + }); + if (confirmed) { + BrowserPopupUtils.openCurrentPagePopout(window); + } + } + + // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe + this.route.queryParams.pipe(first()).subscribe(async (qParams) => { + if (qParams.sso === "true") { + super.onSuccessfulLogin = async () => { + // This is not awaited so we don't pause the application while the sync is happening. + // This call is executed by the service that lives in the background script so it will continue + // the sync even if this tab closes. + this.syncService.fullSync(true); + + // Force sidebars (FF && Opera) to reload while exempting current window + // because we are just going to close the current window. + BrowserApi.reloadOpenWindows(true); + + // We don't need this window anymore because the intent is for the user to be left + // on the web vault screen which tells them to continue in the browser extension (sidebar or popup) + await closeTwoFactorAuthPopout(); + }; + } + }); + } + + async ngOnDestroy() { + this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); + + if (this.selectedProviderType === TwoFactorProviderType.WebAuthn && (await this.isLinux())) { + document.body.classList.remove("linux-webauthn"); + } + super.ngOnDestroy(); + } + + anotherMethod() { + const sso = this.route.snapshot.queryParamMap.get("sso") === "true"; + + if (sso) { + // We must persist this so when the user returns to the 2FA comp, the + // proper onSuccessfulLogin logic is executed. + this.router.navigate(["2fa-options"], { queryParams: { sso: true } }); + } else { + this.router.navigate(["2fa-options"]); + } + } + + async isLinux() { + return (await BrowserApi.getPlatformInfo()).os === "linux"; + } +} diff --git a/apps/browser/src/auth/popup/update-temp-password.component.html b/apps/browser/src/auth/popup/update-temp-password.component.html new file mode 100644 index 000000000000..6e0cc0f4483b --- /dev/null +++ b/apps/browser/src/auth/popup/update-temp-password.component.html @@ -0,0 +1,142 @@ +
+
+ +

+ {{ "updateMasterPassword" | i18n }} +

+
+ +
+
+
+ + {{ masterPasswordWarningText }} + + + +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+ + +
+
+ +
+
+
diff --git a/apps/browser/src/auth/popup/update-temp-password.component.ts b/apps/browser/src/auth/popup/update-temp-password.component.ts new file mode 100644 index 000000000000..f7d952b97f4d --- /dev/null +++ b/apps/browser/src/auth/popup/update-temp-password.component.ts @@ -0,0 +1,9 @@ +import { Component } from "@angular/core"; + +import { UpdateTempPasswordComponent as BaseUpdateTempPasswordComponent } from "@bitwarden/angular/auth/components/update-temp-password.component"; + +@Component({ + selector: "app-update-temp-password", + templateUrl: "update-temp-password.component.html", +}) +export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent {} diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts new file mode 100644 index 000000000000..673e9d5c3358 --- /dev/null +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts @@ -0,0 +1,118 @@ +import { createChromeTabMock } from "../../../autofill/jest/autofill-mocks"; +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; + +import { + AuthPopoutType, + openUnlockPopout, + closeUnlockPopout, + openSsoAuthResultPopout, + openTwoFactorAuthPopout, + closeTwoFactorAuthPopout, +} from "./auth-popout-window"; + +describe("AuthPopoutWindow", () => { + const openPopoutSpy = jest.spyOn(BrowserPopupUtils, "openPopout").mockImplementation(); + const sendMessageDataSpy = jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + const closeSingleActionPopoutSpy = jest + .spyOn(BrowserPopupUtils, "closeSingleActionPopout") + .mockImplementation(); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("openUnlockPopout", () => { + let senderTab: chrome.tabs.Tab; + + beforeEach(() => { + senderTab = { windowId: 1 } as chrome.tabs.Tab; + }); + + it("opens a single action popup that allows the user to unlock the extension and sends a `bgUnlockPopoutOpened` message", async () => { + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValue([]); + + await openUnlockPopout(senderTab); + + expect(openPopoutSpy).toHaveBeenCalledWith("popup/index.html", { + singleActionKey: AuthPopoutType.unlockExtension, + senderWindowId: 1, + }); + expect(sendMessageDataSpy).toHaveBeenCalledWith(senderTab, "bgUnlockPopoutOpened", { + skipNotification: false, + }); + }); + + it("sends an indication that the presenting the notification bar for unlocking the extension should be skipped", async () => { + await openUnlockPopout(senderTab, true); + + expect(sendMessageDataSpy).toHaveBeenCalledWith(senderTab, "bgUnlockPopoutOpened", { + skipNotification: true, + }); + }); + + it("closes any existing popup window types that are open to the unlock extension route", async () => { + const unlockTab = createChromeTabMock({ + url: chrome.runtime.getURL("popup/index.html#/lock"), + }); + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValue([unlockTab]); + jest.spyOn(BrowserApi, "removeWindow"); + const senderTab = { windowId: 1 } as chrome.tabs.Tab; + + await openUnlockPopout(senderTab); + + expect(BrowserApi.tabsQuery).toHaveBeenCalledWith({ windowType: "popup" }); + expect(BrowserApi.removeWindow).toHaveBeenCalledWith(unlockTab.windowId); + }); + + it("closes any existing popup window types that are open to the login extension route", async () => { + const loginTab = createChromeTabMock({ + url: chrome.runtime.getURL("popup/index.html#/home"), + }); + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValue([loginTab]); + jest.spyOn(BrowserApi, "removeWindow"); + const senderTab = { windowId: 1 } as chrome.tabs.Tab; + + await openUnlockPopout(senderTab); + + expect(BrowserApi.removeWindow).toHaveBeenCalledWith(loginTab.windowId); + }); + }); + + describe("closeUnlockPopout", () => { + it("closes the unlock extension popout window", async () => { + await closeUnlockPopout(); + + expect(closeSingleActionPopoutSpy).toHaveBeenCalledWith(AuthPopoutType.unlockExtension); + }); + }); + + describe("openSsoAuthResultPopout", () => { + it("opens a window that facilitates presentation of the results for SSO authentication", async () => { + await openSsoAuthResultPopout({ code: "code", state: "state" }); + + expect(openPopoutSpy).toHaveBeenCalledWith("popup/index.html#/sso?code=code&state=state", { + singleActionKey: AuthPopoutType.ssoAuthResult, + }); + }); + }); + + describe("openTwoFactorAuthPopout", () => { + it("opens a window that facilitates two factor authentication", async () => { + await openTwoFactorAuthPopout({ data: "data", remember: "remember" }); + + expect(openPopoutSpy).toHaveBeenCalledWith( + "popup/index.html#/2fa;webAuthnResponse=data;remember=remember", + { singleActionKey: AuthPopoutType.twoFactorAuth }, + ); + }); + }); + + describe("closeTwoFactorAuthPopout", () => { + it("closes the two-factor authentication window", async () => { + await closeTwoFactorAuthPopout(); + + expect(closeSingleActionPopoutSpy).toHaveBeenCalledWith(AuthPopoutType.twoFactorAuth); + }); + }); +}); diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.ts new file mode 100644 index 000000000000..d01f9ad25e8c --- /dev/null +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.ts @@ -0,0 +1,88 @@ +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; + +const AuthPopoutType = { + unlockExtension: "auth_unlockExtension", + ssoAuthResult: "auth_ssoAuthResult", + twoFactorAuth: "auth_twoFactorAuth", +} as const; +const extensionUnlockUrls = new Set([ + chrome.runtime.getURL("popup/index.html#/lock"), + chrome.runtime.getURL("popup/index.html#/home"), +]); + +/** + * Opens a window that facilitates unlocking / logging into the extension. + * + * @param senderTab - Used to determine the windowId of the sender. + * @param skipNotification - Used to determine whether to show the unlock notification. + */ +async function openUnlockPopout(senderTab: chrome.tabs.Tab, skipNotification = false) { + const existingPopoutWindowTabs = await BrowserApi.tabsQuery({ windowType: "popup" }); + existingPopoutWindowTabs.forEach((tab) => { + if (extensionUnlockUrls.has(tab.url)) { + BrowserApi.removeWindow(tab.windowId); + } + }); + + await BrowserPopupUtils.openPopout("popup/index.html", { + singleActionKey: AuthPopoutType.unlockExtension, + senderWindowId: senderTab.windowId, + }); + await BrowserApi.tabSendMessageData(senderTab, "bgUnlockPopoutOpened", { skipNotification }); +} + +/** + * Closes the unlock popout window. + */ +async function closeUnlockPopout() { + await BrowserPopupUtils.closeSingleActionPopout(AuthPopoutType.unlockExtension); +} + +/** + * Opens a window that facilitates presenting the results for SSO authentication. + * + * @param resultData - The result data from the SSO authentication. + */ +async function openSsoAuthResultPopout(resultData: { code: string; state: string }) { + const { code, state } = resultData; + const authResultUrl = `popup/index.html#/sso?code=${encodeURIComponent( + code, + )}&state=${encodeURIComponent(state)}`; + + await BrowserPopupUtils.openPopout(authResultUrl, { + singleActionKey: AuthPopoutType.ssoAuthResult, + }); +} + +/** + * Opens a window that facilitates two-factor authentication. + * + * @param twoFactorAuthData - The data from the two-factor authentication. + */ +async function openTwoFactorAuthPopout(twoFactorAuthData: { data: string; remember: string }) { + const { data, remember } = twoFactorAuthData; + const params = + `webAuthnResponse=${encodeURIComponent(data)};` + `remember=${encodeURIComponent(remember)}`; + const twoFactorUrl = `popup/index.html#/2fa;${params}`; + + await BrowserPopupUtils.openPopout(twoFactorUrl, { + singleActionKey: AuthPopoutType.twoFactorAuth, + }); +} + +/** + * Closes the two-factor authentication popout window. + */ +async function closeTwoFactorAuthPopout() { + await BrowserPopupUtils.closeSingleActionPopout(AuthPopoutType.twoFactorAuth); +} + +export { + AuthPopoutType, + openUnlockPopout, + closeUnlockPopout, + openSsoAuthResultPopout, + openTwoFactorAuthPopout, + closeTwoFactorAuthPopout, +}; diff --git a/apps/browser/src/scripts/duo.js b/apps/browser/src/auth/scripts/duo.js similarity index 100% rename from apps/browser/src/scripts/duo.js rename to apps/browser/src/auth/scripts/duo.js diff --git a/apps/browser/src/autofill/background/abstractions/overlay.background.ts b/apps/browser/src/autofill/background/abstractions/overlay.background.ts new file mode 100644 index 000000000000..3c2b70bb475b --- /dev/null +++ b/apps/browser/src/autofill/background/abstractions/overlay.background.ts @@ -0,0 +1,133 @@ +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; + +import AutofillPageDetails from "../../models/autofill-page-details"; + +type WebsiteIconData = { + imageEnabled: boolean; + image: string; + fallbackImage: string; + icon: string; +}; + +type OverlayAddNewItemMessage = { + login?: { + uri?: string; + hostname: string; + username: string; + password: string; + }; +}; + +type OverlayBackgroundExtensionMessage = { + [key: string]: any; + command: string; + tab?: chrome.tabs.Tab; + sender?: string; + details?: AutofillPageDetails; + overlayElement?: string; + display?: string; + data?: { + commandToRetry?: { + msg?: { + command?: string; + }; + }; + }; +} & OverlayAddNewItemMessage; + +type OverlayPortMessage = { + [key: string]: any; + command: string; + direction?: string; + overlayCipherId?: string; +}; + +type FocusedFieldData = { + focusedFieldStyles: Partial; + focusedFieldRects: Partial; +}; + +type OverlayCipherData = { + id: string; + name: string; + type: CipherType; + reprompt: CipherRepromptType; + favorite: boolean; + icon: { imageEnabled: boolean; image: string; fallbackImage: string; icon: string }; + login?: { username: string }; + card?: string; +}; + +type BackgroundMessageParam = { + message: OverlayBackgroundExtensionMessage; +}; +type BackgroundSenderParam = { + sender: chrome.runtime.MessageSender; +}; +type BackgroundOnMessageHandlerParams = BackgroundMessageParam & BackgroundSenderParam; + +type OverlayBackgroundExtensionMessageHandlers = { + [key: string]: CallableFunction; + openAutofillOverlay: () => void; + autofillOverlayElementClosed: ({ message }: BackgroundMessageParam) => void; + autofillOverlayAddNewVaultItem: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; + getAutofillOverlayVisibility: () => void; + checkAutofillOverlayFocused: () => void; + focusAutofillOverlayList: () => void; + updateAutofillOverlayPosition: ({ message }: BackgroundMessageParam) => void; + updateAutofillOverlayHidden: ({ message }: BackgroundMessageParam) => void; + updateFocusedFieldData: ({ message }: BackgroundMessageParam) => void; + collectPageDetailsResponse: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; + unlockCompleted: ({ message }: BackgroundMessageParam) => void; + addEditCipherSubmitted: () => void; + deletedCipher: () => void; +}; + +type PortMessageParam = { + message: OverlayPortMessage; +}; +type PortConnectionParam = { + port: chrome.runtime.Port; +}; +type PortOnMessageHandlerParams = PortMessageParam & PortConnectionParam; + +type OverlayButtonPortMessageHandlers = { + [key: string]: CallableFunction; + overlayButtonClicked: ({ port }: PortConnectionParam) => void; + closeAutofillOverlay: ({ port }: PortConnectionParam) => void; + forceCloseAutofillOverlay: ({ port }: PortConnectionParam) => void; + overlayPageBlurred: () => void; + redirectOverlayFocusOut: ({ message, port }: PortOnMessageHandlerParams) => void; +}; + +type OverlayListPortMessageHandlers = { + [key: string]: CallableFunction; + checkAutofillOverlayButtonFocused: () => void; + forceCloseAutofillOverlay: ({ port }: PortConnectionParam) => void; + overlayPageBlurred: () => void; + unlockVault: ({ port }: PortConnectionParam) => void; + fillSelectedListItem: ({ message, port }: PortOnMessageHandlerParams) => void; + addNewVaultItem: ({ port }: PortConnectionParam) => void; + viewSelectedCipher: ({ message, port }: PortOnMessageHandlerParams) => void; + redirectOverlayFocusOut: ({ message, port }: PortOnMessageHandlerParams) => void; +}; + +interface OverlayBackground { + init(): Promise; + removePageDetails(tabId: number): void; + updateOverlayCiphers(): void; +} + +export { + WebsiteIconData, + OverlayBackgroundExtensionMessage, + OverlayPortMessage, + FocusedFieldData, + OverlayCipherData, + OverlayAddNewItemMessage, + OverlayBackgroundExtensionMessageHandlers, + OverlayButtonPortMessageHandlers, + OverlayListPortMessageHandlers, + OverlayBackground, +}; diff --git a/apps/browser/src/autofill/background/context-menus.background.ts b/apps/browser/src/autofill/background/context-menus.background.ts index 9d04571a7c4b..af43c2500dfd 100644 --- a/apps/browser/src/autofill/background/context-menus.background.ts +++ b/apps/browser/src/autofill/background/context-menus.background.ts @@ -1,6 +1,6 @@ -import LockedVaultPendingNotificationsItem from "../../background/models/lockedVaultPendingNotificationsItem"; -import { BrowserApi } from "../../browser/browserApi"; +import { BrowserApi } from "../../platform/browser/browser-api"; import { ContextMenuClickedHandler } from "../browser/context-menu-clicked-handler"; +import LockedVaultPendingNotificationsItem from "../notification/models/locked-vault-pending-notifications-item"; export default class ContextMenusBackground { private contextMenus: typeof chrome.contextMenus; @@ -15,23 +15,23 @@ export default class ContextMenusBackground { } this.contextMenus.onClicked.addListener((info, tab) => - this.contextMenuClickedHandler.run(info, tab) + this.contextMenuClickedHandler.run(info, tab), ); BrowserApi.messageListener( "contextmenus.background", - async ( + ( msg: { command: string; data: LockedVaultPendingNotificationsItem }, sender: chrome.runtime.MessageSender, - sendResponse: any ) => { if (msg.command === "unlockCompleted" && msg.data.target === "contextmenus.background") { - await this.contextMenuClickedHandler.cipherAction( - msg.data.commandToRetry.msg.data, - msg.data.commandToRetry.sender.tab - ); + this.contextMenuClickedHandler + .cipherAction(msg.data.commandToRetry.msg.data, msg.data.commandToRetry.sender.tab) + .then(() => { + BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); + }); } - } + }, ); } } diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts new file mode 100644 index 000000000000..1a898666794e --- /dev/null +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -0,0 +1,54 @@ +import { mock } from "jest-mock-extended"; + +import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; +import { AuthService } from "@bitwarden/common/auth/services/auth.service"; +import { EnvironmentService } from "@bitwarden/common/platform/services/environment.service"; +import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; +import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; + +import { BrowserStateService } from "../../platform/services/browser-state.service"; +import { createChromeTabMock } from "../jest/autofill-mocks"; +import AutofillService from "../services/autofill.service"; + +import NotificationBackground from "./notification.background"; + +describe("NotificationBackground", () => { + let notificationBackground: NotificationBackground; + const autofillService = mock(); + const cipherService = mock(); + const authService = mock(); + const policyService = mock(); + const folderService = mock(); + const stateService = mock(); + const environmentService = mock(); + + beforeEach(() => { + notificationBackground = new NotificationBackground( + autofillService, + cipherService, + authService, + policyService, + folderService, + stateService, + environmentService, + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("unlockVault", () => { + it("returns early if the message indicates that the notification should be skipped", async () => { + const tabMock = createChromeTabMock(); + const message = { data: { skipNotification: true } }; + jest.spyOn(notificationBackground["authService"], "getAuthStatus"); + jest.spyOn(notificationBackground as any, "pushUnlockVaultToQueue"); + + await notificationBackground["unlockVault"](message, tabMock); + + expect(notificationBackground["authService"].getAuthStatus).not.toHaveBeenCalled(); + expect(notificationBackground["pushUnlockVaultToQueue"]).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 6729fc8bd6b0..5f6522f59f7d 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -1,30 +1,37 @@ import { firstValueFrom } from "rxjs"; -import { AuthService } from "@bitwarden/common/abstractions/auth.service"; -import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; -import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; -import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { ThemeType } from "@bitwarden/common/enums/themeType"; -import { Utils } from "@bitwarden/common/misc/utils"; +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 { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { ThemeType } from "@bitwarden/common/platform/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { 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 { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; -import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; - -import AddChangePasswordQueueMessage from "../../background/models/addChangePasswordQueueMessage"; -import AddLoginQueueMessage from "../../background/models/addLoginQueueMessage"; -import AddLoginRuntimeMessage from "../../background/models/addLoginRuntimeMessage"; -import ChangePasswordRuntimeMessage from "../../background/models/changePasswordRuntimeMessage"; -import LockedVaultPendingNotificationsItem from "../../background/models/lockedVaultPendingNotificationsItem"; -import { NotificationQueueMessageType } from "../../background/models/notificationQueueMessageType"; -import { BrowserApi } from "../../browser/browserApi"; -import { BrowserStateService } from "../../services/abstractions/browser-state.service"; + +import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; +import { openAddEditVaultItemPopout } from "../../vault/popup/utils/vault-popout-window"; +import { NOTIFICATION_BAR_LIFESPAN_MS } from "../constants"; +import AddChangePasswordQueueMessage from "../notification/models/add-change-password-queue-message"; +import AddLoginQueueMessage from "../notification/models/add-login-queue-message"; +import AddLoginRuntimeMessage from "../notification/models/add-login-runtime-message"; +import AddUnlockVaultQueueMessage from "../notification/models/add-unlock-vault-queue-message"; +import ChangePasswordRuntimeMessage from "../notification/models/change-password-runtime-message"; +import LockedVaultPendingNotificationsItem from "../notification/models/locked-vault-pending-notifications-item"; +import { NotificationQueueMessageType } from "../notification/models/notification-queue-message-type"; import { AutofillService } from "../services/abstractions/autofill.service"; export default class NotificationBackground { - private notificationQueue: (AddLoginQueueMessage | AddChangePasswordQueueMessage)[] = []; + private notificationQueue: ( + | AddLoginQueueMessage + | AddChangePasswordQueueMessage + | AddUnlockVaultQueueMessage + )[] = []; constructor( private autofillService: AutofillService, @@ -32,7 +39,8 @@ export default class NotificationBackground { private authService: AuthService, private policyService: PolicyService, private folderService: FolderService, - private stateService: BrowserStateService + private stateService: BrowserStateService, + private environmentService: EnvironmentService, ) {} async init() { @@ -42,9 +50,9 @@ export default class NotificationBackground { BrowserApi.messageListener( "notification.background", - async (msg: any, sender: chrome.runtime.MessageSender) => { - await this.processMessage(msg, sender); - } + (msg: any, sender: chrome.runtime.MessageSender) => { + this.processMessage(msg, sender); + }, ); this.cleanupNotificationQueue(); @@ -53,10 +61,7 @@ export default class NotificationBackground { async processMessage(msg: any, sender: chrome.runtime.MessageSender) { switch (msg.command) { case "unlockCompleted": - if (msg.data.target !== "notification.background") { - return; - } - await this.processMessage(msg.data.commandToRetry.msg, msg.data.commandToRetry.sender); + await this.handleUnlockCompleted(msg.data, sender); break; case "bgGetDataForTab": await this.getDataForTab(sender.tab, msg.responseCommand); @@ -82,7 +87,9 @@ export default class NotificationBackground { if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { const retryMessage: LockedVaultPendingNotificationsItem = { commandToRetry: { - msg: msg, + msg: { + command: msg, + }, sender: sender, }, target: "notification.background", @@ -90,12 +97,12 @@ export default class NotificationBackground { await BrowserApi.tabSendMessageData( sender.tab, "addToLockedVaultPendingNotifications", - retryMessage + retryMessage, ); - await BrowserApi.tabSendMessageData(sender.tab, "promptForLogin"); + await openUnlockPopout(sender.tab); return; } - await this.saveOrUpdateCredentials(sender.tab, msg.folder); + await this.saveOrUpdateCredentials(sender.tab, msg.edit, msg.folder); break; case "bgNeverSave": await this.saveNever(sender.tab); @@ -114,6 +121,15 @@ export default class NotificationBackground { break; } break; + case "bgUnlockPopoutOpened": + await this.unlockVault(msg, sender.tab); + break; + case "checkNotificationQueue": + await this.checkNotificationQueue(sender.tab); + break; + case "bgReopenUnlockPopout": + await openUnlockPopout(sender.tab); + break; default: break; } @@ -138,10 +154,11 @@ export default class NotificationBackground { private cleanupNotificationQueue() { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { if (this.notificationQueue[i].expires < new Date()) { + BrowserApi.tabSendMessageData(this.notificationQueue[i].tab, "closeNotificationBar"); this.notificationQueue.splice(i, 1); } } - setTimeout(() => this.cleanupNotificationQueue(), 2 * 60 * 1000); // check every 2 minutes + setTimeout(() => this.cleanupNotificationQueue(), 30000); // check every 30 seconds } private async doNotificationQueueCheck(tab: chrome.tabs.Tab): Promise { @@ -156,7 +173,7 @@ export default class NotificationBackground { for (let i = 0; i < this.notificationQueue.length; i++) { if ( - this.notificationQueue[i].tabId !== tab.id || + this.notificationQueue[i].tab.id !== tab.id || this.notificationQueue[i].domain !== tabDomain ) { continue; @@ -168,11 +185,22 @@ export default class NotificationBackground { typeData: { isVaultLocked: this.notificationQueue[i].wasVaultLocked, theme: await this.getCurrentTheme(), + removeIndividualVault: await this.removeIndividualVault(), + webVaultURL: await this.environmentService.getWebVaultUrl(), }, }); } else if (this.notificationQueue[i].type === NotificationQueueMessageType.ChangePassword) { BrowserApi.tabSendMessageData(tab, "openNotificationBar", { type: "change", + typeData: { + isVaultLocked: this.notificationQueue[i].wasVaultLocked, + theme: await this.getCurrentTheme(), + webVaultURL: await this.environmentService.getWebVaultUrl(), + }, + }); + } else if (this.notificationQueue[i].type === NotificationQueueMessageType.UnlockVault) { + BrowserApi.tabSendMessageData(tab, "openNotificationBar", { + type: "unlock", typeData: { isVaultLocked: this.notificationQueue[i].wasVaultLocked, theme: await this.getCurrentTheme(), @@ -197,7 +225,7 @@ export default class NotificationBackground { private removeTabFromNotificationQueue(tab: chrome.tabs.Tab) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { - if (this.notificationQueue[i].tabId === tab.id) { + if (this.notificationQueue[i].tab.id === tab.id) { this.notificationQueue.splice(i, 1); } } @@ -225,27 +253,19 @@ export default class NotificationBackground { return; } - if (!(await this.allowPersonalOwnership())) { - return; - } - this.pushAddLoginToQueue(loginDomain, loginInfo, tab, true); return; } const ciphers = await this.cipherService.getAllDecryptedForUrl(loginInfo.url); const usernameMatches = ciphers.filter( - (c) => c.login.username != null && c.login.username.toLowerCase() === normalizedUsername + (c) => c.login.username != null && c.login.username.toLowerCase() === normalizedUsername, ); if (usernameMatches.length === 0) { if (disabledAddLogin) { return; } - if (!(await this.allowPersonalOwnership())) { - return; - } - this.pushAddLoginToQueue(loginDomain, loginInfo, tab); } else if ( usernameMatches.length === 1 && @@ -264,7 +284,7 @@ export default class NotificationBackground { loginDomain: string, loginInfo: AddLoginRuntimeMessage, tab: chrome.tabs.Tab, - isVaultLocked = false + isVaultLocked = false, ) { // remove any old messages for this tab this.removeTabFromNotificationQueue(tab); @@ -274,8 +294,8 @@ export default class NotificationBackground { password: loginInfo.password, domain: loginDomain, uri: loginInfo.url, - tabId: tab.id, - expires: new Date(new Date().getTime() + 5 * 60000), // 5 minutes + tab: tab, + expires: new Date(new Date().getTime() + NOTIFICATION_BAR_LIFESPAN_MS), wasVaultLocked: isVaultLocked, }; this.notificationQueue.push(message); @@ -297,7 +317,7 @@ export default class NotificationBackground { const ciphers = await this.cipherService.getAllDecryptedForUrl(changeData.url); if (changeData.currentPassword != null) { const passwordMatches = ciphers.filter( - (c) => c.login.password === changeData.currentPassword + (c) => c.login.password === changeData.currentPassword, ); if (passwordMatches.length === 1) { id = passwordMatches[0].id; @@ -310,12 +330,40 @@ export default class NotificationBackground { } } + /** + * Sets up a notification to unlock the vault when the user + * attempts to autofill a cipher while the vault is locked. + * + * @param message - Extension message, determines if the notification should be skipped + * @param tab - The tab that the message was sent from + */ + private async unlockVault( + message: { data?: { skipNotification?: boolean } }, + tab: chrome.tabs.Tab, + ) { + if (message.data?.skipNotification) { + return; + } + + const currentAuthStatus = await this.authService.getAuthStatus(); + if (currentAuthStatus !== AuthenticationStatus.Locked || this.notificationQueue.length) { + return; + } + + const loginDomain = Utils.getDomain(tab.url); + if (!loginDomain) { + return; + } + + this.pushUnlockVaultToQueue(loginDomain, tab); + } + private async pushChangePasswordToQueue( cipherId: string, loginDomain: string, newPassword: string, tab: chrome.tabs.Tab, - isVaultLocked = false + isVaultLocked = false, ) { // remove any old messages for this tab this.removeTabFromNotificationQueue(tab); @@ -324,22 +372,32 @@ export default class NotificationBackground { cipherId: cipherId, newPassword: newPassword, domain: loginDomain, - tabId: tab.id, - expires: new Date(new Date().getTime() + 5 * 60000), // 5 minutes + tab: tab, + expires: new Date(new Date().getTime() + NOTIFICATION_BAR_LIFESPAN_MS), wasVaultLocked: isVaultLocked, }; this.notificationQueue.push(message); await this.checkNotificationQueue(tab); } - private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, folderId?: string) { + private async pushUnlockVaultToQueue(loginDomain: string, tab: chrome.tabs.Tab) { + this.removeTabFromNotificationQueue(tab); + const message: AddUnlockVaultQueueMessage = { + type: NotificationQueueMessageType.UnlockVault, + domain: loginDomain, + tab: tab, + expires: new Date(new Date().getTime() + 0.5 * 60000), // 30 seconds + wasVaultLocked: true, + }; + this.notificationQueue.push(message); + await this.checkNotificationQueue(tab); + this.removeTabFromNotificationQueue(tab); + } + + private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, edit: boolean, folderId?: string) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; - if ( - queueMessage.tabId !== tab.id || - (queueMessage.type !== NotificationQueueMessageType.AddLogin && - queueMessage.type !== NotificationQueueMessageType.ChangePassword) - ) { + if (queueMessage.tab.id !== tab.id || !(queueMessage.type in NotificationQueueMessageType)) { continue; } @@ -352,86 +410,92 @@ export default class NotificationBackground { BrowserApi.tabSendMessageData(tab, "closeNotificationBar"); if (queueMessage.type === NotificationQueueMessageType.ChangePassword) { - const changePasswordMessage = queueMessage as AddChangePasswordQueueMessage; - const cipher = await this.getDecryptedCipherById(changePasswordMessage.cipherId); - if (cipher == null) { - return; - } - await this.updateCipher(cipher, changePasswordMessage.newPassword); + const cipherView = await this.getDecryptedCipherById(queueMessage.cipherId); + await this.updatePassword(cipherView, queueMessage.newPassword, edit, tab); return; } if (queueMessage.type === NotificationQueueMessageType.AddLogin) { - if (!queueMessage.wasVaultLocked) { - await this.createNewCipher(queueMessage as AddLoginQueueMessage, folderId); - BrowserApi.tabSendMessageData(tab, "addedCipher"); - return; + // If the vault was locked, check if a cipher needs updating instead of creating a new one + if (queueMessage.wasVaultLocked) { + const allCiphers = await this.cipherService.getAllDecryptedForUrl(queueMessage.uri); + const existingCipher = allCiphers.find( + (c) => + c.login.username != null && c.login.username.toLowerCase() === queueMessage.username, + ); + + if (existingCipher != null) { + await this.updatePassword(existingCipher, queueMessage.password, edit, tab); + return; + } } - // If the vault was locked, check if a cipher needs updating instead of creating a new one - const addLoginMessage = queueMessage as AddLoginQueueMessage; - const ciphers = await this.cipherService.getAllDecryptedForUrl(addLoginMessage.uri); - const usernameMatches = ciphers.filter( - (c) => - c.login.username != null && c.login.username.toLowerCase() === addLoginMessage.username - ); - - if (usernameMatches.length >= 1) { - await this.updateCipher(usernameMatches[0], addLoginMessage.password); + folderId = (await this.folderExists(folderId)) ? folderId : null; + const newCipher = AddLoginQueueMessage.toCipherView(queueMessage, folderId); + + if (edit) { + await this.editItem(newCipher, tab); return; } - await this.createNewCipher(addLoginMessage, folderId); + const cipher = await this.cipherService.encrypt(newCipher); + await this.cipherService.createWithServer(cipher); BrowserApi.tabSendMessageData(tab, "addedCipher"); } } } - private async createNewCipher(queueMessage: AddLoginQueueMessage, folderId: string) { - const loginModel = new LoginView(); - const loginUri = new LoginUriView(); - loginUri.uri = queueMessage.uri; - loginModel.uris = [loginUri]; - loginModel.username = queueMessage.username; - loginModel.password = queueMessage.password; - const model = new CipherView(); - model.name = Utils.getHostname(queueMessage.uri) || queueMessage.domain; - model.name = model.name.replace(/^www\./, ""); - model.type = CipherType.Login; - model.login = loginModel; - - if (!Utils.isNullOrWhitespace(folderId)) { - const folders = await firstValueFrom(this.folderService.folderViews$); - if (folders.some((x) => x.id === folderId)) { - model.folderId = folderId; - } + private async updatePassword( + cipherView: CipherView, + newPassword: string, + edit: boolean, + tab: chrome.tabs.Tab, + ) { + cipherView.login.password = newPassword; + + if (edit) { + await this.editItem(cipherView, tab); + BrowserApi.tabSendMessage(tab, "editedCipher"); + return; } - const cipher = await this.cipherService.encrypt(model); - await this.cipherService.createWithServer(cipher); + const cipher = await this.cipherService.encrypt(cipherView); + await this.cipherService.updateWithServer(cipher); + // We've only updated the password, no need to broadcast editedCipher message + return; } - private async getDecryptedCipherById(cipherId: string) { - const cipher = await this.cipherService.get(cipherId); - if (cipher != null && cipher.type === CipherType.Login) { - return await cipher.decrypt(); + private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) { + await this.stateService.setAddEditCipherInfo({ + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }); + + await openAddEditVaultItemPopout(senderTab, { cipherId: cipherView.id }); + } + + private async folderExists(folderId: string) { + if (Utils.isNullOrWhitespace(folderId) || folderId === "null") { + return false; } - return null; + + const folders = await firstValueFrom(this.folderService.folderViews$); + return folders.some((x) => x.id === folderId); } - private async updateCipher(cipher: CipherView, newPassword: string) { + private async getDecryptedCipherById(cipherId: string) { + const cipher = await this.cipherService.get(cipherId); if (cipher != null && cipher.type === CipherType.Login) { - cipher.login.password = newPassword; - const newCipher = await this.cipherService.encrypt(cipher); - await this.cipherService.updateWithServer(newCipher); + return await cipher.decrypt(await this.cipherService.getKeyForCipherKeyDecryption(cipher)); } + return null; } private async saveNever(tab: chrome.tabs.Tab) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; if ( - queueMessage.tabId !== tab.id || + queueMessage.tab.id !== tab.id || queueMessage.type !== NotificationQueueMessageType.AddLogin ) { continue; @@ -459,9 +523,27 @@ export default class NotificationBackground { await BrowserApi.tabSendMessageData(tab, responseCommand, responseData); } - private async allowPersonalOwnership(): Promise { - return !(await firstValueFrom( - this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership) - )); + private async removeIndividualVault(): Promise { + return await firstValueFrom( + this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), + ); + } + + private async handleUnlockCompleted( + messageData: LockedVaultPendingNotificationsItem, + sender: chrome.runtime.MessageSender, + ): Promise { + if (messageData.commandToRetry.msg.command === "autofill_login") { + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); + } + + if (messageData.target !== "notification.background") { + return; + } + + await this.processMessage( + messageData.commandToRetry.msg.command, + messageData.commandToRetry.sender, + ); } } diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts new file mode 100644 index 000000000000..92f0cc1380be --- /dev/null +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -0,0 +1,1346 @@ +import { mock, mockReset } from "jest-mock-extended"; + +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { AuthService } from "@bitwarden/common/auth/services/auth.service"; +import { ThemeType } from "@bitwarden/common/platform/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/services/environment.service"; +import { I18nService } from "@bitwarden/common/platform/services/i18n.service"; +import { SettingsService } from "@bitwarden/common/services/settings.service"; +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 { CipherService } from "@bitwarden/common/vault/services/cipher.service"; + +import { BrowserApi } from "../../platform/browser/browser-api"; +import { BrowserStateService } from "../../platform/services/browser-state.service"; +import { SHOW_AUTOFILL_BUTTON } from "../constants"; +import { + createAutofillPageDetailsMock, + createChromeTabMock, + createFocusedFieldDataMock, + createPageDetailMock, + createPortSpyMock, +} from "../jest/autofill-mocks"; +import { flushPromises, sendExtensionRuntimeMessage, sendPortMessage } from "../jest/testing-utils"; +import { AutofillService } from "../services/abstractions/autofill.service"; +import { + AutofillOverlayElement, + AutofillOverlayPort, + AutofillOverlayVisibility, + RedirectFocusDirection, +} from "../utils/autofill-overlay.enum"; + +import OverlayBackground from "./overlay.background"; + +const iconServerUrl = "https://icons.bitwarden.com/"; + +describe("OverlayBackground", () => { + let buttonPortSpy: chrome.runtime.Port; + let listPortSpy: chrome.runtime.Port; + let overlayBackground: OverlayBackground; + const cipherService = mock(); + const autofillService = mock(); + const authService = mock(); + const environmentService = mock({ + getIconsUrl: () => iconServerUrl, + }); + const settingsService = mock(); + const stateService = mock(); + const i18nService = mock(); + const initOverlayElementPorts = (options = { initList: true, initButton: true }) => { + const { initList, initButton } = options; + if (initButton) { + overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.Button)); + buttonPortSpy = overlayBackground["overlayButtonPort"]; + } + + if (initList) { + overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.List)); + listPortSpy = overlayBackground["overlayListPort"]; + } + + return { buttonPortSpy, listPortSpy }; + }; + + beforeEach(() => { + overlayBackground = new OverlayBackground( + cipherService, + autofillService, + authService, + environmentService, + settingsService, + stateService, + i18nService, + ); + overlayBackground.init(); + }); + + afterEach(() => { + jest.clearAllMocks(); + mockReset(cipherService); + }); + + describe("removePageDetails", () => { + it("removes the page details for a specific tab from the pageDetailsForTab object", () => { + const tabId = 1; + overlayBackground["pageDetailsForTab"][tabId] = [createPageDetailMock()]; + overlayBackground.removePageDetails(tabId); + + expect(overlayBackground["pageDetailsForTab"][tabId]).toBeUndefined(); + }); + }); + + describe("init", () => { + it("sets up the extension message listeners, get the overlay's visibility settings, and get the user's auth status", async () => { + overlayBackground["setupExtensionMessageListeners"] = jest.fn(); + overlayBackground["getOverlayVisibility"] = jest.fn(); + overlayBackground["getAuthStatus"] = jest.fn(); + + await overlayBackground.init(); + + expect(overlayBackground["setupExtensionMessageListeners"]).toHaveBeenCalled(); + expect(overlayBackground["getOverlayVisibility"]).toHaveBeenCalled(); + expect(overlayBackground["getAuthStatus"]).toHaveBeenCalled(); + }); + }); + + describe("updateOverlayCiphers", () => { + const url = "https://jest-testing-website.com"; + const tab = createChromeTabMock({ url }); + const cipher1 = mock({ + id: "id-1", + localData: { lastUsedDate: 222 }, + name: "name-1", + type: CipherType.Login, + login: { username: "username-1", uri: url }, + }); + const cipher2 = mock({ + id: "id-2", + localData: { lastUsedDate: 111 }, + name: "name-2", + type: CipherType.Login, + login: { username: "username-2", uri: url }, + }); + + beforeEach(() => { + overlayBackground["userAuthStatus"] = AuthenticationStatus.Unlocked; + }); + + it("ignores updating the overlay ciphers if the user's auth status is not unlocked", async () => { + overlayBackground["userAuthStatus"] = AuthenticationStatus.Locked; + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId"); + jest.spyOn(cipherService, "getAllDecryptedForUrl"); + + await overlayBackground.updateOverlayCiphers(); + + expect(BrowserApi.getTabFromCurrentWindowId).not.toHaveBeenCalled(); + expect(cipherService.getAllDecryptedForUrl).not.toHaveBeenCalled(); + }); + + it("ignores updating the overlay ciphers if the tab is undefined", async () => { + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId").mockResolvedValueOnce(undefined); + jest.spyOn(cipherService, "getAllDecryptedForUrl"); + + await overlayBackground.updateOverlayCiphers(); + + expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); + expect(cipherService.getAllDecryptedForUrl).not.toHaveBeenCalled(); + }); + + it("queries all ciphers for the given url, sort them by last used, and format them for usage in the overlay", async () => { + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId").mockResolvedValueOnce(tab); + cipherService.getAllDecryptedForUrl.mockResolvedValue([cipher1, cipher2]); + cipherService.sortCiphersByLastUsedThenName.mockReturnValue(-1); + jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + jest.spyOn(overlayBackground as any, "getOverlayCipherData"); + + await overlayBackground.updateOverlayCiphers(); + + expect(BrowserApi.getTabFromCurrentWindowId).toHaveBeenCalled(); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith(url); + expect(overlayBackground["cipherService"].sortCiphersByLastUsedThenName).toHaveBeenCalled(); + expect(overlayBackground["overlayLoginCiphers"]).toStrictEqual( + new Map([ + ["overlay-cipher-0", cipher2], + ["overlay-cipher-1", cipher1], + ]), + ); + expect(overlayBackground["getOverlayCipherData"]).toHaveBeenCalled(); + }); + + it("posts an `updateOverlayListCiphers` message to the overlay list port, and send a `updateIsOverlayCiphersPopulated` message to the tab indicating that the list of ciphers is populated", async () => { + overlayBackground["overlayListPort"] = mock(); + cipherService.getAllDecryptedForUrl.mockResolvedValue([cipher1, cipher2]); + cipherService.sortCiphersByLastUsedThenName.mockReturnValue(-1); + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId").mockResolvedValueOnce(tab); + jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + + await overlayBackground.updateOverlayCiphers(); + + expect(overlayBackground["overlayListPort"].postMessage).toHaveBeenCalledWith({ + command: "updateOverlayListCiphers", + ciphers: [ + { + card: null, + favorite: cipher2.favorite, + icon: { + fallbackImage: "images/bwi-globe.png", + icon: "bwi-globe", + image: "https://icons.bitwarden.com//jest-testing-website.com/icon.png", + imageEnabled: true, + }, + id: "overlay-cipher-0", + login: { + username: "us*******2", + }, + name: "name-2", + reprompt: cipher2.reprompt, + type: 1, + }, + { + card: null, + favorite: cipher1.favorite, + icon: { + fallbackImage: "images/bwi-globe.png", + icon: "bwi-globe", + image: "https://icons.bitwarden.com//jest-testing-website.com/icon.png", + imageEnabled: true, + }, + id: "overlay-cipher-1", + login: { + username: "us*******1", + }, + name: "name-1", + reprompt: cipher1.reprompt, + type: 1, + }, + ], + }); + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + tab, + "updateIsOverlayCiphersPopulated", + { isOverlayCiphersPopulated: true }, + ); + }); + }); + + describe("getOverlayCipherData", () => { + const url = "https://jest-testing-website.com"; + const cipher1 = mock({ + id: "id-1", + localData: { lastUsedDate: 222 }, + name: "name-1", + type: CipherType.Login, + login: { username: "username-1", uri: url }, + }); + const cipher2 = mock({ + id: "id-2", + localData: { lastUsedDate: 111 }, + name: "name-2", + type: CipherType.Login, + login: { username: "username-2", uri: url }, + }); + const cipher3 = mock({ + id: "id-3", + localData: { lastUsedDate: 333 }, + name: "name-3", + type: CipherType.Card, + card: { subTitle: "Visa, *6789" }, + }); + const cipher4 = mock({ + id: "id-4", + localData: { lastUsedDate: 444 }, + name: "name-4", + type: CipherType.Card, + card: { subTitle: "Mastercard, *1234" }, + }); + + it("formats and returns the cipher data", () => { + overlayBackground["overlayLoginCiphers"] = new Map([ + ["overlay-cipher-0", cipher2], + ["overlay-cipher-1", cipher1], + ["overlay-cipher-2", cipher3], + ["overlay-cipher-3", cipher4], + ]); + + const overlayCipherData = overlayBackground["getOverlayCipherData"](); + + expect(overlayCipherData).toStrictEqual([ + { + card: null, + favorite: cipher2.favorite, + icon: { + fallbackImage: "images/bwi-globe.png", + icon: "bwi-globe", + image: "https://icons.bitwarden.com//jest-testing-website.com/icon.png", + imageEnabled: true, + }, + id: "overlay-cipher-0", + login: { + username: "us*******2", + }, + name: "name-2", + reprompt: cipher2.reprompt, + type: 1, + }, + { + card: null, + favorite: cipher1.favorite, + icon: { + fallbackImage: "images/bwi-globe.png", + icon: "bwi-globe", + image: "https://icons.bitwarden.com//jest-testing-website.com/icon.png", + imageEnabled: true, + }, + id: "overlay-cipher-1", + login: { + username: "us*******1", + }, + name: "name-1", + reprompt: cipher1.reprompt, + type: 1, + }, + { + card: "Visa, *6789", + favorite: cipher3.favorite, + icon: { + fallbackImage: "", + icon: "bwi-credit-card", + image: undefined, + imageEnabled: true, + }, + id: "overlay-cipher-2", + login: null, + name: "name-3", + reprompt: cipher3.reprompt, + type: 3, + }, + { + card: "Mastercard, *1234", + favorite: cipher4.favorite, + icon: { + fallbackImage: "", + icon: "bwi-credit-card", + image: undefined, + imageEnabled: true, + }, + id: "overlay-cipher-3", + login: null, + name: "name-4", + reprompt: cipher4.reprompt, + type: 3, + }, + ]); + }); + }); + + describe("obscureName", () => { + it("returns an empty string if the name is falsy", () => { + const name: string = undefined; + + const obscureName = overlayBackground["obscureName"](name); + + expect(obscureName).toBe(""); + }); + + it("will not attempt to obscure a username that is only a domain", () => { + const name = "@domain.com"; + + const obscureName = overlayBackground["obscureName"](name); + + expect(obscureName).toBe(name); + }); + + it("will obscure all characters of a name that is less than 5 characters expect for the first character", () => { + const name = "name@domain.com"; + + const obscureName = overlayBackground["obscureName"](name); + + expect(obscureName).toBe("n***@domain.com"); + }); + + it("will obscure all characters of a name that is greater than 4 characters by less than 6 ", () => { + const name = "name1@domain.com"; + + const obscureName = overlayBackground["obscureName"](name); + + expect(obscureName).toBe("na***@domain.com"); + }); + + it("will obscure all characters of a name that is greater than 5 characters except for the first two characters and the last character", () => { + const name = "name12@domain.com"; + + const obscureName = overlayBackground["obscureName"](name); + + expect(obscureName).toBe("na***2@domain.com"); + }); + }); + + describe("getAuthStatus", () => { + it("will update the user's auth status but will not update the overlay ciphers", async () => { + const authStatus = AuthenticationStatus.Unlocked; + overlayBackground["userAuthStatus"] = AuthenticationStatus.Unlocked; + jest.spyOn(overlayBackground["authService"], "getAuthStatus").mockResolvedValue(authStatus); + jest.spyOn(overlayBackground as any, "updateOverlayButtonAuthStatus").mockImplementation(); + jest.spyOn(overlayBackground as any, "updateOverlayCiphers").mockImplementation(); + + const status = await overlayBackground["getAuthStatus"](); + + expect(overlayBackground["authService"].getAuthStatus).toHaveBeenCalled(); + expect(overlayBackground["updateOverlayButtonAuthStatus"]).not.toHaveBeenCalled(); + expect(overlayBackground["updateOverlayCiphers"]).not.toHaveBeenCalled(); + expect(overlayBackground["userAuthStatus"]).toBe(authStatus); + expect(status).toBe(authStatus); + }); + + it("will update the user's auth status and update the overlay ciphers if the status has been modified", async () => { + const authStatus = AuthenticationStatus.Unlocked; + overlayBackground["userAuthStatus"] = AuthenticationStatus.LoggedOut; + jest.spyOn(overlayBackground["authService"], "getAuthStatus").mockResolvedValue(authStatus); + jest.spyOn(overlayBackground as any, "updateOverlayButtonAuthStatus").mockImplementation(); + jest.spyOn(overlayBackground as any, "updateOverlayCiphers").mockImplementation(); + + await overlayBackground["getAuthStatus"](); + + expect(overlayBackground["authService"].getAuthStatus).toHaveBeenCalled(); + expect(overlayBackground["updateOverlayButtonAuthStatus"]).toHaveBeenCalled(); + expect(overlayBackground["updateOverlayCiphers"]).toHaveBeenCalled(); + expect(overlayBackground["userAuthStatus"]).toBe(authStatus); + }); + }); + + describe("updateOverlayButtonAuthStatus", () => { + it("will send a message to the button port with the user's auth status", () => { + overlayBackground["overlayButtonPort"] = mock(); + jest.spyOn(overlayBackground["overlayButtonPort"], "postMessage"); + + overlayBackground["updateOverlayButtonAuthStatus"](); + + expect(overlayBackground["overlayButtonPort"].postMessage).toHaveBeenCalledWith({ + command: "updateOverlayButtonAuthStatus", + authStatus: overlayBackground["userAuthStatus"], + }); + }); + }); + + describe("getTranslations", () => { + it("will query the overlay page translations if they have not been queried", () => { + overlayBackground["overlayPageTranslations"] = undefined; + jest.spyOn(overlayBackground as any, "getTranslations"); + jest.spyOn(overlayBackground["i18nService"], "translate").mockImplementation((key) => key); + jest.spyOn(BrowserApi, "getUILanguage").mockReturnValue("en"); + + const translations = overlayBackground["getTranslations"](); + + expect(overlayBackground["getTranslations"]).toHaveBeenCalled(); + const translationKeys = [ + "opensInANewWindow", + "bitwardenOverlayButton", + "toggleBitwardenVaultOverlay", + "bitwardenVault", + "unlockYourAccountToViewMatchingLogins", + "unlockAccount", + "fillCredentialsFor", + "partialUsername", + "view", + "noItemsToShow", + "newItem", + "addNewVaultItem", + ]; + translationKeys.forEach((key) => { + expect(overlayBackground["i18nService"].translate).toHaveBeenCalledWith(key); + }); + expect(translations).toStrictEqual({ + locale: "en", + opensInANewWindow: "opensInANewWindow", + buttonPageTitle: "bitwardenOverlayButton", + toggleBitwardenVaultOverlay: "toggleBitwardenVaultOverlay", + listPageTitle: "bitwardenVault", + unlockYourAccount: "unlockYourAccountToViewMatchingLogins", + unlockAccount: "unlockAccount", + fillCredentialsFor: "fillCredentialsFor", + partialUsername: "partialUsername", + view: "view", + noItemsToShow: "noItemsToShow", + newItem: "newItem", + addNewVaultItem: "addNewVaultItem", + }); + }); + }); + + describe("setupExtensionMessageListeners", () => { + it("will set up onMessage and onConnect listeners", () => { + overlayBackground["setupExtensionMessageListeners"](); + + // eslint-disable-next-line + expect(chrome.runtime.onMessage.addListener).toHaveBeenCalled(); + expect(chrome.runtime.onConnect.addListener).toHaveBeenCalled(); + }); + }); + + describe("handleExtensionMessage", () => { + it("will return early if the message command is not present within the extensionMessageHandlers", () => { + const message = { + command: "not-a-command", + }; + const sender = mock({ tab: { id: 1 } }); + const sendResponse = jest.fn(); + + const returnValue = overlayBackground["handleExtensionMessage"]( + message, + sender, + sendResponse, + ); + + expect(returnValue).toBe(undefined); + expect(sendResponse).not.toHaveBeenCalled(); + }); + + it("will trigger the message handler and return undefined if the message does not have a response", () => { + const message = { + command: "autofillOverlayElementClosed", + }; + const sender = mock({ tab: { id: 1 } }); + const sendResponse = jest.fn(); + jest.spyOn(overlayBackground as any, "overlayElementClosed"); + + const returnValue = overlayBackground["handleExtensionMessage"]( + message, + sender, + sendResponse, + ); + + expect(returnValue).toBe(undefined); + expect(sendResponse).not.toHaveBeenCalled(); + expect(overlayBackground["overlayElementClosed"]).toHaveBeenCalledWith(message); + }); + + it("will return a response if the message handler returns a response", async () => { + const message = { + command: "openAutofillOverlay", + }; + const sender = mock({ tab: { id: 1 } }); + const sendResponse = jest.fn(); + jest.spyOn(overlayBackground as any, "getTranslations").mockReturnValue("translations"); + + const returnValue = overlayBackground["handleExtensionMessage"]( + message, + sender, + sendResponse, + ); + + expect(returnValue).toBe(true); + }); + + describe("extension message handlers", () => { + beforeEach(() => { + jest + .spyOn(overlayBackground as any, "getAuthStatus") + .mockResolvedValue(AuthenticationStatus.Unlocked); + }); + + describe("openAutofillOverlay message handler", () => { + it("opens the autofill overlay by sending a message to the current tab", async () => { + const sender = mock({ tab: { id: 1 } }); + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId").mockResolvedValueOnce(sender.tab); + jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + + sendExtensionRuntimeMessage({ command: "openAutofillOverlay" }); + await flushPromises(); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + sender.tab, + "openAutofillOverlay", + { + isFocusingFieldElement: false, + isOpeningFullOverlay: false, + authStatus: AuthenticationStatus.Unlocked, + }, + ); + }); + }); + + describe("autofillOverlayElementClosed message handler", () => { + beforeEach(() => { + initOverlayElementPorts(); + }); + + it("disconnects the button element port", () => { + sendExtensionRuntimeMessage({ + command: "autofillOverlayElementClosed", + overlayElement: AutofillOverlayElement.Button, + }); + + expect(buttonPortSpy.disconnect).toHaveBeenCalled(); + expect(overlayBackground["overlayButtonPort"]).toBeNull(); + }); + + it("disconnects the list element port", () => { + sendExtensionRuntimeMessage({ + command: "autofillOverlayElementClosed", + overlayElement: AutofillOverlayElement.List, + }); + + expect(listPortSpy.disconnect).toHaveBeenCalled(); + expect(overlayBackground["overlayListPort"]).toBeNull(); + }); + }); + + describe("autofillOverlayAddNewVaultItem message handler", () => { + let sender: chrome.runtime.MessageSender; + beforeEach(() => { + sender = mock({ tab: { id: 1 } }); + jest + .spyOn(overlayBackground["stateService"], "setAddEditCipherInfo") + .mockImplementation(); + jest.spyOn(overlayBackground as any, "openAddEditVaultItemPopout").mockImplementation(); + }); + + it("will not open the add edit popout window if the message does not have a login cipher provided", () => { + sendExtensionRuntimeMessage({ command: "autofillOverlayAddNewVaultItem" }, sender); + + expect(overlayBackground["stateService"].setAddEditCipherInfo).not.toHaveBeenCalled(); + expect(overlayBackground["openAddEditVaultItemPopout"]).not.toHaveBeenCalled(); + }); + + it("will open the add edit popout window after creating a new cipher", async () => { + sendExtensionRuntimeMessage( + { + command: "autofillOverlayAddNewVaultItem", + login: { + uri: "https://tacos.com", + hostname: "", + username: "username", + password: "password", + }, + }, + sender, + ); + await flushPromises(); + + expect(overlayBackground["stateService"].setAddEditCipherInfo).toHaveBeenCalled(); + expect(overlayBackground["openAddEditVaultItemPopout"]).toHaveBeenCalled(); + }); + }); + + describe("getAutofillOverlayVisibility message handler", () => { + beforeEach(() => { + jest + .spyOn(overlayBackground["settingsService"], "getAutoFillOverlayVisibility") + .mockResolvedValue(AutofillOverlayVisibility.OnFieldFocus); + }); + + it("will set the overlayVisibility property", async () => { + sendExtensionRuntimeMessage({ command: "getAutofillOverlayVisibility" }); + await flushPromises(); + + expect(overlayBackground["overlayVisibility"]).toBe( + AutofillOverlayVisibility.OnFieldFocus, + ); + }); + + it("returns the overlayVisibility property", async () => { + const sendMessageSpy = jest.fn(); + + sendExtensionRuntimeMessage( + { command: "getAutofillOverlayVisibility" }, + undefined, + sendMessageSpy, + ); + await flushPromises(); + + expect(sendMessageSpy).toHaveBeenCalledWith(AutofillOverlayVisibility.OnFieldFocus); + }); + }); + + describe("checkAutofillOverlayFocused message handler", () => { + beforeEach(() => { + initOverlayElementPorts(); + }); + + it("will check if the overlay list is focused if the list port is open", () => { + sendExtensionRuntimeMessage({ command: "checkAutofillOverlayFocused" }); + + expect(listPortSpy.postMessage).toHaveBeenCalledWith({ + command: "checkAutofillOverlayListFocused", + }); + expect(buttonPortSpy.postMessage).not.toHaveBeenCalledWith({ + command: "checkAutofillOverlayButtonFocused", + }); + }); + + it("will check if the overlay button is focused if the list port is not open", () => { + overlayBackground["overlayListPort"] = undefined; + + sendExtensionRuntimeMessage({ command: "checkAutofillOverlayFocused" }); + + expect(buttonPortSpy.postMessage).toHaveBeenCalledWith({ + command: "checkAutofillOverlayButtonFocused", + }); + expect(listPortSpy.postMessage).not.toHaveBeenCalledWith({ + command: "checkAutofillOverlayListFocused", + }); + }); + }); + + describe("focusAutofillOverlayList message handler", () => { + it("will send a `focusOverlayList` message to the overlay list port", () => { + initOverlayElementPorts({ initList: true, initButton: false }); + + sendExtensionRuntimeMessage({ command: "focusAutofillOverlayList" }); + + expect(listPortSpy.postMessage).toHaveBeenCalledWith({ command: "focusOverlayList" }); + }); + }); + + describe("updateAutofillOverlayPosition message handler", () => { + beforeEach(() => { + overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.List)); + listPortSpy = overlayBackground["overlayListPort"]; + overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.Button)); + buttonPortSpy = overlayBackground["overlayButtonPort"]; + }); + + it("ignores updating the position if the overlay element type is not provided", () => { + sendExtensionRuntimeMessage({ command: "updateAutofillOverlayPosition" }); + + expect(listPortSpy.postMessage).not.toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: expect.anything(), + }); + expect(buttonPortSpy.postMessage).not.toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: expect.anything(), + }); + }); + + it("updates the overlay button's position", () => { + const focusedFieldData = createFocusedFieldDataMock(); + sendExtensionRuntimeMessage({ command: "updateFocusedFieldData", focusedFieldData }); + + sendExtensionRuntimeMessage({ + command: "updateAutofillOverlayPosition", + overlayElement: AutofillOverlayElement.Button, + }); + + expect(buttonPortSpy.postMessage).toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: { height: "2px", left: "4px", top: "2px", width: "2px" }, + }); + }); + + it("modifies the overlay button's height for medium sized input elements", () => { + const focusedFieldData = createFocusedFieldDataMock({ + focusedFieldRects: { top: 1, left: 2, height: 35, width: 4 }, + }); + sendExtensionRuntimeMessage({ command: "updateFocusedFieldData", focusedFieldData }); + + sendExtensionRuntimeMessage({ + command: "updateAutofillOverlayPosition", + overlayElement: AutofillOverlayElement.Button, + }); + + expect(buttonPortSpy.postMessage).toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: { height: "20px", left: "-22px", top: "8px", width: "20px" }, + }); + }); + + it("modifies the overlay button's height for large sized input elements", () => { + const focusedFieldData = createFocusedFieldDataMock({ + focusedFieldRects: { top: 1, left: 2, height: 50, width: 4 }, + }); + sendExtensionRuntimeMessage({ command: "updateFocusedFieldData", focusedFieldData }); + + sendExtensionRuntimeMessage({ + command: "updateAutofillOverlayPosition", + overlayElement: AutofillOverlayElement.Button, + }); + + expect(buttonPortSpy.postMessage).toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: { height: "27px", left: "-32px", top: "13px", width: "27px" }, + }); + }); + + it("takes into account the right padding of the focused field in positioning the button if the right padding of the field is larger than the left padding", () => { + const focusedFieldData = createFocusedFieldDataMock({ + focusedFieldStyles: { paddingRight: "20px", paddingLeft: "6px" }, + }); + sendExtensionRuntimeMessage({ command: "updateFocusedFieldData", focusedFieldData }); + + sendExtensionRuntimeMessage({ + command: "updateAutofillOverlayPosition", + overlayElement: AutofillOverlayElement.Button, + }); + + expect(buttonPortSpy.postMessage).toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: { height: "2px", left: "-18px", top: "2px", width: "2px" }, + }); + }); + + it("will post a message to the overlay list facilitating an update of the list's position", () => { + const focusedFieldData = createFocusedFieldDataMock(); + sendExtensionRuntimeMessage({ command: "updateFocusedFieldData", focusedFieldData }); + + overlayBackground["updateOverlayPosition"]({ + overlayElement: AutofillOverlayElement.List, + }); + sendExtensionRuntimeMessage({ + command: "updateAutofillOverlayPosition", + overlayElement: AutofillOverlayElement.List, + }); + + expect(listPortSpy.postMessage).toHaveBeenCalledWith({ + command: "updateIframePosition", + styles: { left: "2px", top: "4px", width: "4px" }, + }); + }); + }); + + describe("updateOverlayHidden", () => { + beforeEach(() => { + initOverlayElementPorts(); + }); + + it("returns early if the display value is not provided", () => { + const message = { + command: "updateAutofillOverlayHidden", + }; + + sendExtensionRuntimeMessage(message); + + expect(buttonPortSpy.postMessage).not.toHaveBeenCalledWith(message); + expect(listPortSpy.postMessage).not.toHaveBeenCalledWith(message); + }); + + it("posts a message to the overlay button and list with the display value", () => { + const message = { command: "updateAutofillOverlayHidden", display: "none" }; + + sendExtensionRuntimeMessage(message); + + expect(overlayBackground["overlayButtonPort"].postMessage).toHaveBeenCalledWith({ + command: "updateOverlayHidden", + styles: { + display: message.display, + }, + }); + expect(overlayBackground["overlayListPort"].postMessage).toHaveBeenCalledWith({ + command: "updateOverlayHidden", + styles: { + display: message.display, + }, + }); + }); + }); + + describe("collectPageDetailsResponse message handler", () => { + let sender: chrome.runtime.MessageSender; + const pageDetails1 = createAutofillPageDetailsMock({ + login: { username: "username1", password: "password1" }, + }); + const pageDetails2 = createAutofillPageDetailsMock({ + login: { username: "username2", password: "password2" }, + }); + + beforeEach(() => { + sender = mock({ tab: { id: 1 } }); + }); + + it("stores the page details provided by the message by the tab id of the sender", () => { + sendExtensionRuntimeMessage( + { command: "collectPageDetailsResponse", details: pageDetails1 }, + sender, + ); + + expect(overlayBackground["pageDetailsForTab"][sender.tab.id]).toStrictEqual([ + { frameId: sender.frameId, tab: sender.tab, details: pageDetails1 }, + ]); + }); + + it("updates the page details for a tab that already has a set of page details stored ", () => { + overlayBackground["pageDetailsForTab"][sender.tab.id] = [ + { + frameId: sender.frameId, + tab: sender.tab, + details: pageDetails1, + }, + ]; + + sendExtensionRuntimeMessage( + { command: "collectPageDetailsResponse", details: pageDetails2 }, + sender, + ); + + expect(overlayBackground["pageDetailsForTab"][sender.tab.id]).toStrictEqual([ + { frameId: sender.frameId, tab: sender.tab, details: pageDetails1 }, + { frameId: sender.frameId, tab: sender.tab, details: pageDetails2 }, + ]); + }); + }); + + describe("unlockCompleted message handler", () => { + let getAuthStatusSpy: jest.SpyInstance; + + beforeEach(() => { + overlayBackground["userAuthStatus"] = AuthenticationStatus.LoggedOut; + jest.spyOn(BrowserApi, "tabSendMessageData"); + getAuthStatusSpy = jest + .spyOn(overlayBackground as any, "getAuthStatus") + .mockImplementation(() => { + overlayBackground["userAuthStatus"] = AuthenticationStatus.Unlocked; + return Promise.resolve(AuthenticationStatus.Unlocked); + }); + }); + + it("updates the user's auth status but does not open the overlay", async () => { + const message = { + command: "unlockCompleted", + data: { + commandToRetry: { msg: { command: "" } }, + }, + }; + + sendExtensionRuntimeMessage(message); + await flushPromises(); + + expect(getAuthStatusSpy).toHaveBeenCalled(); + expect(BrowserApi.tabSendMessageData).not.toHaveBeenCalled(); + }); + + it("updates user's auth status and opens the overlay if a follow up command is provided", async () => { + const sender = mock({ tab: { id: 1 } }); + const message = { + command: "unlockCompleted", + data: { + commandToRetry: { msg: { command: "openAutofillOverlay" } }, + }, + }; + jest.spyOn(BrowserApi, "getTabFromCurrentWindowId").mockResolvedValueOnce(sender.tab); + + sendExtensionRuntimeMessage(message); + await flushPromises(); + + expect(getAuthStatusSpy).toHaveBeenCalled(); + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + sender.tab, + "openAutofillOverlay", + { + isFocusingFieldElement: true, + isOpeningFullOverlay: false, + authStatus: AuthenticationStatus.Unlocked, + }, + ); + }); + }); + + describe("addEditCipherSubmitted message handler", () => { + it("updates the overlay ciphers", () => { + const message = { + command: "addEditCipherSubmitted", + }; + jest.spyOn(overlayBackground as any, "updateOverlayCiphers").mockImplementation(); + + sendExtensionRuntimeMessage(message); + + expect(overlayBackground["updateOverlayCiphers"]).toHaveBeenCalled(); + }); + }); + + describe("deletedCipher message handler", () => { + it("updates the overlay ciphers", () => { + const message = { + command: "deletedCipher", + }; + jest.spyOn(overlayBackground as any, "updateOverlayCiphers").mockImplementation(); + + sendExtensionRuntimeMessage(message); + + expect(overlayBackground["updateOverlayCiphers"]).toHaveBeenCalled(); + }); + }); + }); + }); + + describe("handlePortOnConnect", () => { + beforeEach(() => { + jest.spyOn(overlayBackground as any, "updateOverlayPosition").mockImplementation(); + jest.spyOn(overlayBackground as any, "getAuthStatus").mockImplementation(); + jest.spyOn(overlayBackground as any, "getTranslations").mockImplementation(); + jest.spyOn(overlayBackground as any, "getOverlayCipherData").mockImplementation(); + }); + + it("skips setting up the overlay port if the port connection is not for an overlay element", () => { + const port = createPortSpyMock("not-an-overlay-element"); + + overlayBackground["handlePortOnConnect"](port); + + expect(port.onMessage.addListener).not.toHaveBeenCalled(); + expect(port.postMessage).not.toHaveBeenCalled(); + }); + + it("sets up the overlay list port if the port connection is for the overlay list", async () => { + initOverlayElementPorts({ initList: true, initButton: false }); + await flushPromises(); + + expect(overlayBackground["overlayButtonPort"]).toBeUndefined(); + expect(listPortSpy.onMessage.addListener).toHaveBeenCalled(); + expect(listPortSpy.postMessage).toHaveBeenCalled(); + expect(overlayBackground["getAuthStatus"]).toHaveBeenCalled(); + expect(chrome.runtime.getURL).toHaveBeenCalledWith("overlay/list.css"); + expect(overlayBackground["getTranslations"]).toHaveBeenCalled(); + expect(overlayBackground["getOverlayCipherData"]).toHaveBeenCalled(); + expect(overlayBackground["updateOverlayPosition"]).toHaveBeenCalledWith({ + overlayElement: AutofillOverlayElement.List, + }); + }); + + it("sets up the overlay button port if the port connection is for the overlay button", async () => { + initOverlayElementPorts({ initList: false, initButton: true }); + await flushPromises(); + + expect(overlayBackground["overlayListPort"]).toBeUndefined(); + expect(buttonPortSpy.onMessage.addListener).toHaveBeenCalled(); + expect(buttonPortSpy.postMessage).toHaveBeenCalled(); + expect(overlayBackground["getAuthStatus"]).toHaveBeenCalled(); + expect(chrome.runtime.getURL).toHaveBeenCalledWith("overlay/button.css"); + expect(overlayBackground["getTranslations"]).toHaveBeenCalled(); + expect(overlayBackground["updateOverlayPosition"]).toHaveBeenCalledWith({ + overlayElement: AutofillOverlayElement.Button, + }); + }); + + it("gets the system theme", async () => { + jest.spyOn(overlayBackground["stateService"], "getTheme").mockResolvedValue(ThemeType.System); + window.matchMedia = jest.fn(() => mock({ matches: true })); + + initOverlayElementPorts({ initList: true, initButton: false }); + await flushPromises(); + + expect(window.matchMedia).toHaveBeenCalledWith("(prefers-color-scheme: dark)"); + }); + }); + + describe("handleOverlayElementPortMessage", () => { + beforeEach(() => { + initOverlayElementPorts(); + overlayBackground["userAuthStatus"] = AuthenticationStatus.Unlocked; + }); + + it("ignores port messages that do not contain a handler", () => { + jest.spyOn(overlayBackground as any, "checkOverlayButtonFocused").mockImplementation(); + + sendPortMessage(buttonPortSpy, { command: "checkAutofillOverlayButtonFocused" }); + + expect(overlayBackground["checkOverlayButtonFocused"]).not.toHaveBeenCalled(); + }); + + describe("overlay button message handlers", () => { + it("unlocks the vault if the user auth status is not unlocked", () => { + overlayBackground["userAuthStatus"] = AuthenticationStatus.LoggedOut; + jest.spyOn(overlayBackground as any, "unlockVault").mockImplementation(); + + sendPortMessage(buttonPortSpy, { command: "overlayButtonClicked" }); + + expect(overlayBackground["unlockVault"]).toHaveBeenCalled(); + }); + + it("opens the autofill overlay if the auth status is unlocked", () => { + jest.spyOn(overlayBackground as any, "openOverlay").mockImplementation(); + + sendPortMessage(buttonPortSpy, { command: "overlayButtonClicked" }); + + expect(overlayBackground["openOverlay"]).toHaveBeenCalled(); + }); + + describe("closeAutofillOverlay", () => { + it("sends a `closeOverlay` message to the sender tab", () => { + jest.spyOn(BrowserApi, "tabSendMessageData"); + + sendPortMessage(buttonPortSpy, { command: "closeAutofillOverlay" }); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + buttonPortSpy.sender.tab, + "closeAutofillOverlay", + { forceCloseOverlay: false }, + ); + }); + }); + + describe("forceCloseAutofillOverlay", () => { + it("sends a `closeOverlay` message to the sender tab with a `forceCloseOverlay` flag of `true` set", () => { + jest.spyOn(BrowserApi, "tabSendMessageData"); + + sendPortMessage(buttonPortSpy, { command: "forceCloseAutofillOverlay" }); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + buttonPortSpy.sender.tab, + "closeAutofillOverlay", + { forceCloseOverlay: true }, + ); + }); + }); + + describe("overlayPageBlurred", () => { + it("checks if the overlay list is focused", () => { + jest.spyOn(overlayBackground as any, "checkOverlayListFocused"); + + sendPortMessage(buttonPortSpy, { command: "overlayPageBlurred" }); + + expect(overlayBackground["checkOverlayListFocused"]).toHaveBeenCalled(); + }); + }); + + describe("redirectOverlayFocusOut", () => { + beforeEach(() => { + jest.spyOn(BrowserApi, "tabSendMessageData"); + }); + + it("ignores the redirect message if the direction is not provided", () => { + sendPortMessage(buttonPortSpy, { command: "redirectOverlayFocusOut" }); + + expect(BrowserApi.tabSendMessageData).not.toHaveBeenCalled(); + }); + + it("sends the redirect message if the direction is provided", () => { + sendPortMessage(buttonPortSpy, { + command: "redirectOverlayFocusOut", + direction: RedirectFocusDirection.Next, + }); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + buttonPortSpy.sender.tab, + "redirectOverlayFocusOut", + { direction: RedirectFocusDirection.Next }, + ); + }); + }); + }); + + describe("overlay list message handlers", () => { + describe("checkAutofillOverlayButtonFocused", () => { + it("checks on the focus state of the overlay button", () => { + jest.spyOn(overlayBackground as any, "checkOverlayButtonFocused").mockImplementation(); + + sendPortMessage(listPortSpy, { command: "checkAutofillOverlayButtonFocused" }); + + expect(overlayBackground["checkOverlayButtonFocused"]).toHaveBeenCalled(); + }); + }); + + describe("forceCloseAutofillOverlay", () => { + it("sends a `closeOverlay` message to the sender tab with a `forceCloseOverlay` flag of `true` set", () => { + jest.spyOn(BrowserApi, "tabSendMessageData"); + + sendPortMessage(listPortSpy, { command: "forceCloseAutofillOverlay" }); + + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + listPortSpy.sender.tab, + "closeAutofillOverlay", + { forceCloseOverlay: true }, + ); + }); + }); + + describe("overlayPageBlurred", () => { + it("checks on the focus state of the overlay button", () => { + jest.spyOn(overlayBackground as any, "checkOverlayButtonFocused").mockImplementation(); + + sendPortMessage(listPortSpy, { command: "overlayPageBlurred" }); + + expect(overlayBackground["checkOverlayButtonFocused"]).toHaveBeenCalled(); + }); + }); + + describe("unlockVault", () => { + it("closes the autofill overlay and opens the unlock popout", async () => { + jest.spyOn(overlayBackground as any, "closeOverlay").mockImplementation(); + jest.spyOn(overlayBackground as any, "openUnlockPopout").mockImplementation(); + jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); + + sendPortMessage(listPortSpy, { command: "unlockVault" }); + await flushPromises(); + + expect(overlayBackground["closeOverlay"]).toHaveBeenCalledWith(listPortSpy); + expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( + listPortSpy.sender.tab, + "addToLockedVaultPendingNotifications", + { + commandToRetry: { + msg: { command: "openAutofillOverlay" }, + sender: listPortSpy.sender, + }, + target: "overlay.background", + }, + ); + expect(overlayBackground["openUnlockPopout"]).toHaveBeenCalledWith( + listPortSpy.sender.tab, + true, + ); + }); + }); + + describe("fillSelectedListItem", () => { + let getLoginCiphersSpy: jest.SpyInstance; + let isPasswordRepromptRequiredSpy: jest.SpyInstance; + let doAutoFillSpy: jest.SpyInstance; + + beforeEach(() => { + getLoginCiphersSpy = jest.spyOn(overlayBackground["overlayLoginCiphers"], "get"); + isPasswordRepromptRequiredSpy = jest.spyOn( + overlayBackground["autofillService"], + "isPasswordRepromptRequired", + ); + doAutoFillSpy = jest.spyOn(overlayBackground["autofillService"], "doAutoFill"); + }); + + it("ignores the fill request if the overlay cipher id is not provided", async () => { + sendPortMessage(listPortSpy, { command: "fillSelectedListItem" }); + await flushPromises(); + + expect(getLoginCiphersSpy).not.toHaveBeenCalled(); + expect(isPasswordRepromptRequiredSpy).not.toHaveBeenCalled(); + expect(doAutoFillSpy).not.toHaveBeenCalled(); + }); + + it("ignores the fill request if a master password reprompt is required", async () => { + const cipher = mock({ + reprompt: CipherRepromptType.Password, + type: CipherType.Login, + }); + overlayBackground["overlayLoginCiphers"] = new Map([["overlay-cipher-1", cipher]]); + getLoginCiphersSpy = jest.spyOn(overlayBackground["overlayLoginCiphers"], "get"); + isPasswordRepromptRequiredSpy.mockResolvedValue(true); + + sendPortMessage(listPortSpy, { + command: "fillSelectedListItem", + overlayCipherId: "overlay-cipher-1", + }); + await flushPromises(); + + expect(getLoginCiphersSpy).toHaveBeenCalled(); + expect(isPasswordRepromptRequiredSpy).toHaveBeenCalledWith( + cipher, + listPortSpy.sender.tab, + ); + expect(doAutoFillSpy).not.toHaveBeenCalled(); + }); + + it("auto-fills the selected cipher and move it to the top of the front of the ciphers map", async () => { + const cipher1 = mock({ id: "overlay-cipher-1" }); + const cipher2 = mock({ id: "overlay-cipher-2" }); + const cipher3 = mock({ id: "overlay-cipher-3" }); + overlayBackground["overlayLoginCiphers"] = new Map([ + ["overlay-cipher-1", cipher1], + ["overlay-cipher-2", cipher2], + ["overlay-cipher-3", cipher3], + ]); + isPasswordRepromptRequiredSpy.mockResolvedValue(false); + + sendPortMessage(listPortSpy, { + command: "fillSelectedListItem", + overlayCipherId: "overlay-cipher-2", + }); + await flushPromises(); + + expect(isPasswordRepromptRequiredSpy).toHaveBeenCalledWith( + cipher2, + listPortSpy.sender.tab, + ); + expect(doAutoFillSpy).toHaveBeenCalledWith({ + tab: listPortSpy.sender.tab, + cipher: cipher2, + pageDetails: undefined, + fillNewPassword: true, + allowTotpAutofill: true, + }); + expect(overlayBackground["overlayLoginCiphers"].entries()).toStrictEqual( + new Map([ + ["overlay-cipher-2", cipher2], + ["overlay-cipher-1", cipher1], + ["overlay-cipher-3", cipher3], + ]).entries(), + ); + }); + }); + + describe("getNewVaultItemDetails", () => { + it("will send an addNewVaultItemFromOverlay message", async () => { + jest.spyOn(BrowserApi, "tabSendMessage"); + + sendPortMessage(listPortSpy, { command: "addNewVaultItem" }); + await flushPromises(); + + expect(BrowserApi.tabSendMessage).toHaveBeenCalledWith(listPortSpy.sender.tab, { + command: "addNewVaultItemFromOverlay", + }); + }); + }); + + describe("viewSelectedCipher", () => { + let openViewVaultItemPopoutSpy: jest.SpyInstance; + + beforeEach(() => { + openViewVaultItemPopoutSpy = jest + .spyOn(overlayBackground as any, "openViewVaultItemPopout") + .mockImplementation(); + }); + + it("returns early if the passed cipher ID does not match one of the overlay login ciphers", async () => { + overlayBackground["overlayLoginCiphers"] = new Map([ + ["overlay-cipher-0", mock({ id: "overlay-cipher-0" })], + ]); + + sendPortMessage(listPortSpy, { + command: "viewSelectedCipher", + overlayCipherId: "overlay-cipher-1", + }); + await flushPromises(); + + expect(openViewVaultItemPopoutSpy).not.toHaveBeenCalled(); + }); + + it("will open the view vault item popout with the selected cipher", async () => { + const cipher = mock({ id: "overlay-cipher-1" }); + overlayBackground["overlayLoginCiphers"] = new Map([ + ["overlay-cipher-0", mock({ id: "overlay-cipher-0" })], + ["overlay-cipher-1", cipher], + ]); + + sendPortMessage(listPortSpy, { + command: "viewSelectedCipher", + overlayCipherId: "overlay-cipher-1", + }); + await flushPromises(); + + expect(overlayBackground["openViewVaultItemPopout"]).toHaveBeenCalledWith( + listPortSpy.sender.tab, + { + cipherId: cipher.id, + action: SHOW_AUTOFILL_BUTTON, + }, + ); + }); + }); + + describe("redirectOverlayFocusOut", () => { + it("redirects focus out of the overlay list", async () => { + const message = { + command: "redirectOverlayFocusOut", + direction: RedirectFocusDirection.Next, + }; + const redirectOverlayFocusOutSpy = jest.spyOn( + overlayBackground as any, + "redirectOverlayFocusOut", + ); + + sendPortMessage(listPortSpy, message); + await flushPromises(); + + expect(redirectOverlayFocusOutSpy).toHaveBeenCalledWith(message, listPortSpy); + }); + }); + }); + }); +}); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts new file mode 100644 index 000000000000..3d6f00ec10f7 --- /dev/null +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -0,0 +1,769 @@ +import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { ThemeType } from "@bitwarden/common/platform/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { buildCipherIcon } from "@bitwarden/common/vault/icon/build-cipher-icon"; +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 { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { + openViewVaultItemPopout, + openAddEditVaultItemPopout, +} from "../../vault/popup/utils/vault-popout-window"; +import { SHOW_AUTOFILL_BUTTON } from "../constants"; +import LockedVaultPendingNotificationsItem from "../notification/models/locked-vault-pending-notifications-item"; +import { AutofillService, PageDetail } from "../services/abstractions/autofill.service"; +import { AutofillOverlayElement, AutofillOverlayPort } from "../utils/autofill-overlay.enum"; + +import { + FocusedFieldData, + OverlayBackgroundExtensionMessageHandlers, + OverlayButtonPortMessageHandlers, + OverlayCipherData, + OverlayListPortMessageHandlers, + OverlayBackground as OverlayBackgroundInterface, + OverlayBackgroundExtensionMessage, + OverlayAddNewItemMessage, + OverlayPortMessage, + WebsiteIconData, +} from "./abstractions/overlay.background"; + +class OverlayBackground implements OverlayBackgroundInterface { + private readonly openUnlockPopout = openUnlockPopout; + private readonly openViewVaultItemPopout = openViewVaultItemPopout; + private readonly openAddEditVaultItemPopout = openAddEditVaultItemPopout; + private overlayVisibility: number; + private overlayLoginCiphers: Map = new Map(); + private pageDetailsForTab: Record = {}; + private userAuthStatus: AuthenticationStatus = AuthenticationStatus.LoggedOut; + private overlayButtonPort: chrome.runtime.Port; + private overlayListPort: chrome.runtime.Port; + private focusedFieldData: FocusedFieldData; + private overlayPageTranslations: Record; + private readonly iconsServerUrl: string; + private readonly extensionMessageHandlers: OverlayBackgroundExtensionMessageHandlers = { + openAutofillOverlay: () => this.openOverlay(false), + autofillOverlayElementClosed: ({ message }) => this.overlayElementClosed(message), + autofillOverlayAddNewVaultItem: ({ message, sender }) => this.addNewVaultItem(message, sender), + getAutofillOverlayVisibility: () => this.getOverlayVisibility(), + checkAutofillOverlayFocused: () => this.checkOverlayFocused(), + focusAutofillOverlayList: () => this.focusOverlayList(), + updateAutofillOverlayPosition: ({ message }) => this.updateOverlayPosition(message), + updateAutofillOverlayHidden: ({ message }) => this.updateOverlayHidden(message), + updateFocusedFieldData: ({ message }) => this.setFocusedFieldData(message), + collectPageDetailsResponse: ({ message, sender }) => this.storePageDetails(message, sender), + unlockCompleted: ({ message }) => this.unlockCompleted(message), + addEditCipherSubmitted: () => this.updateOverlayCiphers(), + deletedCipher: () => this.updateOverlayCiphers(), + }; + private readonly overlayButtonPortMessageHandlers: OverlayButtonPortMessageHandlers = { + overlayButtonClicked: ({ port }) => this.handleOverlayButtonClicked(port), + closeAutofillOverlay: ({ port }) => this.closeOverlay(port), + forceCloseAutofillOverlay: ({ port }) => this.closeOverlay(port, true), + overlayPageBlurred: () => this.checkOverlayListFocused(), + redirectOverlayFocusOut: ({ message, port }) => this.redirectOverlayFocusOut(message, port), + }; + private readonly overlayListPortMessageHandlers: OverlayListPortMessageHandlers = { + checkAutofillOverlayButtonFocused: () => this.checkOverlayButtonFocused(), + forceCloseAutofillOverlay: ({ port }) => this.closeOverlay(port, true), + overlayPageBlurred: () => this.checkOverlayButtonFocused(), + unlockVault: ({ port }) => this.unlockVault(port), + fillSelectedListItem: ({ message, port }) => this.fillSelectedOverlayListItem(message, port), + addNewVaultItem: ({ port }) => this.getNewVaultItemDetails(port), + viewSelectedCipher: ({ message, port }) => this.viewSelectedCipher(message, port), + redirectOverlayFocusOut: ({ message, port }) => this.redirectOverlayFocusOut(message, port), + }; + + constructor( + private cipherService: CipherService, + private autofillService: AutofillService, + private authService: AuthService, + private environmentService: EnvironmentService, + private settingsService: SettingsService, + private stateService: StateService, + private i18nService: I18nService, + ) { + this.iconsServerUrl = this.environmentService.getIconsUrl(); + } + + /** + * Removes cached page details for a tab + * based on the passed tabId. + * + * @param tabId - Used to reference the page details of a specific tab + */ + removePageDetails(tabId: number) { + delete this.pageDetailsForTab[tabId]; + } + + /** + * Sets up the extension message listeners and gets the settings for the + * overlay's visibility and the user's authentication status. + */ + async init() { + this.setupExtensionMessageListeners(); + await this.getOverlayVisibility(); + await this.getAuthStatus(); + } + + /** + * Updates the overlay list's ciphers and sends the updated list to the overlay list iframe. + * Queries all ciphers for the given url, and sorts them by last used. Will not update the + * list of ciphers if the extension is not unlocked. + */ + async updateOverlayCiphers() { + if (this.userAuthStatus !== AuthenticationStatus.Unlocked) { + return; + } + + const currentTab = await BrowserApi.getTabFromCurrentWindowId(); + if (!currentTab?.url) { + return; + } + + this.overlayLoginCiphers = new Map(); + const ciphersViews = (await this.cipherService.getAllDecryptedForUrl(currentTab.url)).sort( + (a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b), + ); + for (let cipherIndex = 0; cipherIndex < ciphersViews.length; cipherIndex++) { + this.overlayLoginCiphers.set(`overlay-cipher-${cipherIndex}`, ciphersViews[cipherIndex]); + } + + const ciphers = this.getOverlayCipherData(); + this.overlayListPort?.postMessage({ command: "updateOverlayListCiphers", ciphers }); + await BrowserApi.tabSendMessageData(currentTab, "updateIsOverlayCiphersPopulated", { + isOverlayCiphersPopulated: Boolean(ciphers.length), + }); + } + + /** + * Strips out unnecessary data from the ciphers and returns an array of + * objects that contain the cipher data needed for the overlay list. + */ + private getOverlayCipherData(): OverlayCipherData[] { + const isFaviconDisabled = this.settingsService.getDisableFavicon(); + const overlayCiphersArray = Array.from(this.overlayLoginCiphers); + const overlayCipherData = []; + let loginCipherIcon: WebsiteIconData; + + for (let cipherIndex = 0; cipherIndex < overlayCiphersArray.length; cipherIndex++) { + const [overlayCipherId, cipher] = overlayCiphersArray[cipherIndex]; + if (!loginCipherIcon && cipher.type === CipherType.Login) { + loginCipherIcon = buildCipherIcon(this.iconsServerUrl, cipher, isFaviconDisabled); + } + + overlayCipherData.push({ + id: overlayCipherId, + name: cipher.name, + type: cipher.type, + reprompt: cipher.reprompt, + favorite: cipher.favorite, + icon: + cipher.type === CipherType.Login + ? loginCipherIcon + : buildCipherIcon(this.iconsServerUrl, cipher, isFaviconDisabled), + login: + cipher.type === CipherType.Login + ? { username: this.obscureName(cipher.login.username) } + : null, + card: cipher.type === CipherType.Card ? cipher.card.subTitle : null, + }); + } + + return overlayCipherData; + } + + /** + * Handles aggregation of page details for a tab. Stores the page details + * in association with the tabId of the tab that sent the message. + * + * @param message - Message received from the `collectPageDetailsResponse` command + * @param sender - The sender of the message + */ + private storePageDetails( + message: OverlayBackgroundExtensionMessage, + sender: chrome.runtime.MessageSender, + ) { + const pageDetails = { + frameId: sender.frameId, + tab: sender.tab, + details: message.details, + }; + + if (this.pageDetailsForTab[sender.tab.id]?.length) { + this.pageDetailsForTab[sender.tab.id].push(pageDetails); + return; + } + + this.pageDetailsForTab[sender.tab.id] = [pageDetails]; + } + + /** + * Triggers autofill for the selected cipher in the overlay list. Also places + * the selected cipher at the top of the list of ciphers. + * + * @param overlayCipherId - Cipher ID corresponding to the overlayLoginCiphers map. Does not correspond to the actual cipher's ID. + * @param sender - The sender of the port message + */ + private async fillSelectedOverlayListItem( + { overlayCipherId }: OverlayPortMessage, + { sender }: chrome.runtime.Port, + ) { + if (!overlayCipherId) { + return; + } + + const cipher = this.overlayLoginCiphers.get(overlayCipherId); + + if (await this.autofillService.isPasswordRepromptRequired(cipher, sender.tab)) { + return; + } + await this.autofillService.doAutoFill({ + tab: sender.tab, + cipher: cipher, + pageDetails: this.pageDetailsForTab[sender.tab.id], + fillNewPassword: true, + allowTotpAutofill: true, + }); + + this.overlayLoginCiphers = new Map([[overlayCipherId, cipher], ...this.overlayLoginCiphers]); + } + + /** + * Checks if the overlay is focused. Will check the overlay list + * if it is open, otherwise it will check the overlay button. + */ + private checkOverlayFocused() { + if (this.overlayListPort) { + this.checkOverlayListFocused(); + + return; + } + + this.checkOverlayButtonFocused(); + } + + /** + * Posts a message to the overlay button iframe to check if it is focused. + */ + private checkOverlayButtonFocused() { + this.overlayButtonPort?.postMessage({ command: "checkAutofillOverlayButtonFocused" }); + } + + /** + * Posts a message to the overlay list iframe to check if it is focused. + */ + private checkOverlayListFocused() { + this.overlayListPort?.postMessage({ command: "checkAutofillOverlayListFocused" }); + } + + /** + * Sends a message to the sender tab to close the autofill overlay. + * + * @param sender - The sender of the port message + * @param forceCloseOverlay - Identifies whether the overlay should be force closed + */ + private closeOverlay({ sender }: chrome.runtime.Port, forceCloseOverlay = false) { + BrowserApi.tabSendMessageData(sender.tab, "closeAutofillOverlay", { forceCloseOverlay }); + } + + /** + * Handles cleanup when an overlay element is closed. Disconnects + * the list and button ports and sets them to null. + * + * @param overlayElement - The overlay element that was closed, either the list or button + */ + private overlayElementClosed({ overlayElement }: OverlayBackgroundExtensionMessage) { + if (overlayElement === AutofillOverlayElement.Button) { + this.overlayButtonPort?.disconnect(); + this.overlayButtonPort = null; + + return; + } + + this.overlayListPort?.disconnect(); + this.overlayListPort = null; + } + + /** + * Updates the position of either the overlay list or button. The position + * is based on the focused field's position and dimensions. + * + * @param overlayElement - The overlay element to update, either the list or button + */ + private updateOverlayPosition({ overlayElement }: { overlayElement?: string }) { + if (!overlayElement) { + return; + } + + if (overlayElement === AutofillOverlayElement.Button) { + this.overlayButtonPort?.postMessage({ + command: "updateIframePosition", + styles: this.getOverlayButtonPosition(), + }); + + return; + } + + this.overlayListPort?.postMessage({ + command: "updateIframePosition", + styles: this.getOverlayListPosition(), + }); + } + + /** + * Gets the position of the focused field and calculates the position + * of the overlay button based on the focused field's position and dimensions. + */ + private getOverlayButtonPosition() { + if (!this.focusedFieldData) { + return; + } + + const { top, left, width, height } = this.focusedFieldData.focusedFieldRects; + const { paddingRight, paddingLeft } = this.focusedFieldData.focusedFieldStyles; + let elementOffset = height * 0.37; + if (height >= 35) { + elementOffset = height >= 50 ? height * 0.47 : height * 0.42; + } + + const elementHeight = height - elementOffset; + const elementTopPosition = top + elementOffset / 2; + let elementLeftPosition = left + width - height + elementOffset / 2; + + const fieldPaddingRight = parseInt(paddingRight, 10); + const fieldPaddingLeft = parseInt(paddingLeft, 10); + if (fieldPaddingRight > fieldPaddingLeft) { + elementLeftPosition = left + width - height - (fieldPaddingRight - elementOffset + 2); + } + + return { + top: `${Math.round(elementTopPosition)}px`, + left: `${Math.round(elementLeftPosition)}px`, + height: `${Math.round(elementHeight)}px`, + width: `${Math.round(elementHeight)}px`, + }; + } + + /** + * Gets the position of the focused field and calculates the position + * of the overlay list based on the focused field's position and dimensions. + */ + private getOverlayListPosition() { + if (!this.focusedFieldData) { + return; + } + + const { top, left, width, height } = this.focusedFieldData.focusedFieldRects; + return { + width: `${Math.round(width)}px`, + top: `${Math.round(top + height)}px`, + left: `${Math.round(left)}px`, + }; + } + + /** + * Sets the focused field data to the data passed in the extension message. + * + * @param focusedFieldData - Contains the rects and styles of the focused field. + */ + private setFocusedFieldData({ focusedFieldData }: OverlayBackgroundExtensionMessage) { + this.focusedFieldData = focusedFieldData; + } + + /** + * Updates the overlay's visibility based on the display property passed in the extension message. + * + * @param display - The display property of the overlay, either "block" or "none" + */ + private updateOverlayHidden({ display }: OverlayBackgroundExtensionMessage) { + if (!display) { + return; + } + + const portMessage = { command: "updateOverlayHidden", styles: { display } }; + + this.overlayButtonPort?.postMessage(portMessage); + this.overlayListPort?.postMessage(portMessage); + } + + /** + * Sends a message to the currently active tab to open the autofill overlay. + * + * @param isFocusingFieldElement - Identifies whether the field element should be focused when the overlay is opened + * @param isOpeningFullOverlay - Identifies whether the full overlay should be forced open regardless of other states + */ + private async openOverlay(isFocusingFieldElement = false, isOpeningFullOverlay = false) { + const currentTab = await BrowserApi.getTabFromCurrentWindowId(); + + await BrowserApi.tabSendMessageData(currentTab, "openAutofillOverlay", { + isFocusingFieldElement, + isOpeningFullOverlay, + authStatus: await this.getAuthStatus(), + }); + } + + /** + * Obscures the username by replacing all but the first and last characters with asterisks. + * If the username is less than 4 characters, only the first character will be shown. + * If the username is 6 or more characters, the first and last characters will be shown. + * The domain will not be obscured. + * + * @param name - The username to obscure + */ + private obscureName(name: string): string { + if (!name) { + return ""; + } + + const [username, domain] = name.split("@"); + const usernameLength = username?.length; + if (!usernameLength) { + return name; + } + + const startingCharacters = username.slice(0, usernameLength > 4 ? 2 : 1); + let numberStars = usernameLength; + if (usernameLength > 4) { + numberStars = usernameLength < 6 ? numberStars - 1 : numberStars - 2; + } + + let obscureName = `${startingCharacters}${new Array(numberStars).join("*")}`; + if (usernameLength >= 6) { + obscureName = `${obscureName}${username.slice(-1)}`; + } + + return domain ? `${obscureName}@${domain}` : obscureName; + } + + /** + * Gets the overlay's visibility setting from the settings service. + */ + private async getOverlayVisibility(): Promise { + this.overlayVisibility = await this.settingsService.getAutoFillOverlayVisibility(); + + return this.overlayVisibility; + } + + /** + * Gets the user's authentication status from the auth service. If the user's + * authentication status has changed, the overlay button's authentication status + * will be updated and the overlay list's ciphers will be updated. + */ + private async getAuthStatus() { + const formerAuthStatus = this.userAuthStatus; + this.userAuthStatus = await this.authService.getAuthStatus(); + + if ( + this.userAuthStatus !== formerAuthStatus && + this.userAuthStatus === AuthenticationStatus.Unlocked + ) { + this.updateOverlayButtonAuthStatus(); + await this.updateOverlayCiphers(); + } + + return this.userAuthStatus; + } + + /** + * Gets the currently set theme for the user. + */ + private async getCurrentTheme() { + const theme = await this.stateService.getTheme(); + + if (theme !== ThemeType.System) { + return theme; + } + + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? ThemeType.Dark + : ThemeType.Light; + } + + /** + * Sends a message to the overlay button to update its authentication status. + */ + private updateOverlayButtonAuthStatus() { + this.overlayButtonPort?.postMessage({ + command: "updateOverlayButtonAuthStatus", + authStatus: this.userAuthStatus, + }); + } + + /** + * Handles the overlay button being clicked. If the user is not authenticated, + * the vault will be unlocked. If the user is authenticated, the overlay will + * be opened. + * + * @param port - The port of the overlay button + */ + private handleOverlayButtonClicked(port: chrome.runtime.Port) { + if (this.userAuthStatus !== AuthenticationStatus.Unlocked) { + this.unlockVault(port); + return; + } + + this.openOverlay(false, true); + } + + /** + * Facilitates opening the unlock popout window. + * + * @param port - The port of the overlay list + */ + private async unlockVault(port: chrome.runtime.Port) { + const { sender } = port; + + this.closeOverlay(port); + const retryMessage: LockedVaultPendingNotificationsItem = { + commandToRetry: { msg: { command: "openAutofillOverlay" }, sender }, + target: "overlay.background", + }; + await BrowserApi.tabSendMessageData( + sender.tab, + "addToLockedVaultPendingNotifications", + retryMessage, + ); + await this.openUnlockPopout(sender.tab, true); + } + + /** + * Triggers the opening of a vault item popout window associated + * with the passed cipher ID. + * @param overlayCipherId - Cipher ID corresponding to the overlayLoginCiphers map. Does not correspond to the actual cipher's ID. + * @param sender - The sender of the port message + */ + private async viewSelectedCipher( + { overlayCipherId }: OverlayPortMessage, + { sender }: chrome.runtime.Port, + ) { + const cipher = this.overlayLoginCiphers.get(overlayCipherId); + if (!cipher) { + return; + } + + await this.openViewVaultItemPopout(sender.tab, { + cipherId: cipher.id, + action: SHOW_AUTOFILL_BUTTON, + }); + } + + /** + * Facilitates redirecting focus to the overlay list. + */ + private focusOverlayList() { + this.overlayListPort?.postMessage({ command: "focusOverlayList" }); + } + + /** + * Updates the authentication status for the user and opens the overlay if + * a followup command is present in the message. + * + * @param message - Extension message received from the `unlockCompleted` command + */ + private async unlockCompleted(message: OverlayBackgroundExtensionMessage) { + await this.getAuthStatus(); + + if (message.data?.commandToRetry?.msg?.command === "openAutofillOverlay") { + await this.openOverlay(true); + } + } + + /** + * Gets the translations for the overlay page. + */ + private getTranslations() { + if (!this.overlayPageTranslations) { + this.overlayPageTranslations = { + locale: BrowserApi.getUILanguage(), + opensInANewWindow: this.i18nService.translate("opensInANewWindow"), + buttonPageTitle: this.i18nService.translate("bitwardenOverlayButton"), + toggleBitwardenVaultOverlay: this.i18nService.translate("toggleBitwardenVaultOverlay"), + listPageTitle: this.i18nService.translate("bitwardenVault"), + unlockYourAccount: this.i18nService.translate("unlockYourAccountToViewMatchingLogins"), + unlockAccount: this.i18nService.translate("unlockAccount"), + fillCredentialsFor: this.i18nService.translate("fillCredentialsFor"), + partialUsername: this.i18nService.translate("partialUsername"), + view: this.i18nService.translate("view"), + noItemsToShow: this.i18nService.translate("noItemsToShow"), + newItem: this.i18nService.translate("newItem"), + addNewVaultItem: this.i18nService.translate("addNewVaultItem"), + }; + } + + return this.overlayPageTranslations; + } + + /** + * Facilitates redirecting focus out of one of the + * overlay elements to elements on the page. + * + * @param direction - The direction to redirect focus to (either "next", "previous" or "current) + * @param sender - The sender of the port message + */ + private redirectOverlayFocusOut( + { direction }: OverlayPortMessage, + { sender }: chrome.runtime.Port, + ) { + if (!direction) { + return; + } + + BrowserApi.tabSendMessageData(sender.tab, "redirectOverlayFocusOut", { direction }); + } + + /** + * Triggers adding a new vault item from the overlay. Gathers data + * input by the user before calling to open the add/edit window. + * + * @param sender - The sender of the port message + */ + private getNewVaultItemDetails({ sender }: chrome.runtime.Port) { + BrowserApi.tabSendMessage(sender.tab, { command: "addNewVaultItemFromOverlay" }); + } + + /** + * Handles adding a new vault item from the overlay. Gathers data login + * data captured in the extension message. + * + * @param login - The login data captured from the extension message + * @param sender - The sender of the extension message + */ + private async addNewVaultItem( + { login }: OverlayAddNewItemMessage, + sender: chrome.runtime.MessageSender, + ) { + if (!login) { + return; + } + + const uriView = new LoginUriView(); + uriView.uri = login.uri; + + const loginView = new LoginView(); + loginView.uris = [uriView]; + loginView.username = login.username || ""; + loginView.password = login.password || ""; + + const cipherView = new CipherView(); + cipherView.name = (Utils.getHostname(login.uri) || login.hostname).replace(/^www\./, ""); + cipherView.folderId = null; + cipherView.type = CipherType.Login; + cipherView.login = loginView; + + await this.stateService.setAddEditCipherInfo({ + cipher: cipherView, + collectionIds: cipherView.collectionIds, + }); + + await this.openAddEditVaultItemPopout(sender.tab, { cipherId: cipherView.id }); + } + + /** + * Sets up the extension message listeners for the overlay. + */ + private setupExtensionMessageListeners() { + BrowserApi.messageListener("overlay.background", this.handleExtensionMessage); + chrome.runtime.onConnect.addListener(this.handlePortOnConnect); + } + + /** + * 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: OverlayBackgroundExtensionMessage, + 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)); + return true; + }; + + /** + * Handles the connection of a port to the extension background. + * + * @param port - The port that connected to the extension background + */ + private handlePortOnConnect = async (port: chrome.runtime.Port) => { + const isOverlayListPort = port.name === AutofillOverlayPort.List; + const isOverlayButtonPort = port.name === AutofillOverlayPort.Button; + + if (!isOverlayListPort && !isOverlayButtonPort) { + return; + } + + if (isOverlayListPort) { + this.overlayListPort = port; + } else { + this.overlayButtonPort = port; + } + + port.onMessage.addListener(this.handleOverlayElementPortMessage); + port.postMessage({ + command: `initAutofillOverlay${isOverlayListPort ? "List" : "Button"}`, + authStatus: await this.getAuthStatus(), + styleSheetUrl: chrome.runtime.getURL(`overlay/${isOverlayListPort ? "list" : "button"}.css`), + theme: `theme_${await this.getCurrentTheme()}`, + translations: this.getTranslations(), + ciphers: isOverlayListPort ? this.getOverlayCipherData() : null, + }); + this.updateOverlayPosition({ + overlayElement: isOverlayListPort + ? AutofillOverlayElement.List + : AutofillOverlayElement.Button, + }); + }; + + /** + * Handles messages sent to the overlay list or button ports. + * + * @param message - The message received from the port + * @param port - The port that sent the message + */ + private handleOverlayElementPortMessage = ( + message: OverlayBackgroundExtensionMessage, + port: chrome.runtime.Port, + ) => { + const command = message?.command; + let handler: CallableFunction | undefined; + + if (port.name === AutofillOverlayPort.Button) { + handler = this.overlayButtonPortMessageHandlers[command]; + } + + if (port.name === AutofillOverlayPort.List) { + handler = this.overlayListPortMessageHandlers[command]; + } + + if (!handler) { + return; + } + + handler({ message, port }); + }; +} + +export default OverlayBackground; diff --git a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts b/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts index 6187a87161e2..acd9be2a8ead 100644 --- a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts +++ b/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts @@ -1,28 +1,36 @@ +import { + UserVerificationServiceInitOptions, + userVerificationServiceFactory, +} from "../../../auth/background/service-factories/user-verification-service.factory"; import { EventCollectionServiceInitOptions, eventCollectionServiceFactory, -} from "../../../background/service_factories/event-collection-service.factory"; +} from "../../../background/service-factories/event-collection-service.factory"; +import { + settingsServiceFactory, + SettingsServiceInitOptions, +} from "../../../background/service-factories/settings-service.factory"; import { CachedServices, factory, FactoryOptions, -} from "../../../background/service_factories/factory-options"; +} from "../../../platform/background/service-factories/factory-options"; import { logServiceFactory, LogServiceInitOptions, -} from "../../../background/service_factories/log-service.factory"; +} from "../../../platform/background/service-factories/log-service.factory"; import { stateServiceFactory, StateServiceInitOptions, -} from "../../../background/service_factories/state-service.factory"; -import { - totpServiceFactory, - TotpServiceInitOptions, -} from "../../../background/service_factories/totp-service.factory"; +} from "../../../platform/background/service-factories/state-service.factory"; import { cipherServiceFactory, CipherServiceInitOptions, } from "../../../vault/background/service_factories/cipher-service.factory"; +import { + TotpServiceInitOptions, + totpServiceFactory, +} from "../../../vault/background/service_factories/totp-service.factory"; import { AutofillService as AbstractAutoFillService } from "../../services/abstractions/autofill.service"; import AutofillService from "../../services/autofill.service"; @@ -33,11 +41,13 @@ export type AutoFillServiceInitOptions = AutoFillServiceOptions & StateServiceInitOptions & TotpServiceInitOptions & EventCollectionServiceInitOptions & - LogServiceInitOptions; + LogServiceInitOptions & + SettingsServiceInitOptions & + UserVerificationServiceInitOptions; export function autofillServiceFactory( cache: { autofillService?: AbstractAutoFillService } & CachedServices, - opts: AutoFillServiceInitOptions + opts: AutoFillServiceInitOptions, ): Promise { return factory( cache, @@ -49,7 +59,9 @@ export function autofillServiceFactory( await stateServiceFactory(cache, opts), await totpServiceFactory(cache, opts), await eventCollectionServiceFactory(cache, opts), - await logServiceFactory(cache, opts) - ) + await logServiceFactory(cache, opts), + await settingsServiceFactory(cache, opts), + await userVerificationServiceFactory(cache, opts), + ), ); } diff --git a/apps/browser/src/autofill/background/tabs.background.spec.ts b/apps/browser/src/autofill/background/tabs.background.spec.ts new file mode 100644 index 000000000000..b3de1e96ce36 --- /dev/null +++ b/apps/browser/src/autofill/background/tabs.background.spec.ts @@ -0,0 +1,238 @@ +import { mock } from "jest-mock-extended"; + +import MainBackground from "../../background/main.background"; +import { + flushPromises, + triggerTabOnActivatedEvent, + triggerTabOnRemovedEvent, + triggerTabOnReplacedEvent, + triggerTabOnUpdatedEvent, + triggerWindowOnFocusedChangedEvent, +} from "../jest/testing-utils"; + +import NotificationBackground from "./notification.background"; +import OverlayBackground from "./overlay.background"; +import TabsBackground from "./tabs.background"; + +describe("TabsBackground", () => { + let tabsBackgorund: TabsBackground; + const mainBackground = mock({ + messagingService: { + send: jest.fn(), + }, + }); + const notificationBackground = mock(); + const overlayBackground = mock(); + + beforeEach(() => { + tabsBackgorund = new TabsBackground(mainBackground, notificationBackground, overlayBackground); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("init", () => { + it("sets up a window on focusChanged listener", () => { + const handleWindowOnFocusChangedSpy = jest.spyOn( + tabsBackgorund as any, + "handleWindowOnFocusChanged", + ); + + tabsBackgorund.init(); + + expect(chrome.windows.onFocusChanged.addListener).toHaveBeenCalledWith( + handleWindowOnFocusChangedSpy, + ); + }); + }); + + describe("tab event listeners", () => { + beforeEach(() => { + tabsBackgorund.init(); + }); + + describe("window onFocusChanged event", () => { + it("ignores focus change events that do not contain a windowId", async () => { + triggerWindowOnFocusedChangedEvent(undefined); + await flushPromises(); + + expect(mainBackground.messagingService.send).not.toHaveBeenCalled(); + }); + + it("sets the local focusedWindowId property", async () => { + triggerWindowOnFocusedChangedEvent(10); + await flushPromises(); + + expect(tabsBackgorund["focusedWindowId"]).toBe(10); + }); + + it("updates the current tab data", async () => { + triggerWindowOnFocusedChangedEvent(10); + await flushPromises(); + + expect(mainBackground.refreshBadge).toHaveBeenCalled(); + expect(mainBackground.refreshMenu).toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); + }); + + it("sends a `windowChanged` message", async () => { + triggerWindowOnFocusedChangedEvent(10); + await flushPromises(); + + expect(mainBackground.messagingService.send).toHaveBeenCalledWith("windowChanged"); + }); + }); + + describe("handleTabOnActivated", () => { + it("updates the current tab data", async () => { + triggerTabOnActivatedEvent({ tabId: 10, windowId: 20 }); + await flushPromises(); + + expect(mainBackground.refreshBadge).toHaveBeenCalled(); + expect(mainBackground.refreshMenu).toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); + }); + + it("sends a `tabChanged` message to the messaging service", async () => { + triggerTabOnActivatedEvent({ tabId: 10, windowId: 20 }); + await flushPromises(); + + expect(mainBackground.messagingService.send).toHaveBeenCalledWith("tabChanged"); + }); + }); + + describe("handleTabOnReplaced", () => { + beforeEach(() => { + mainBackground.onReplacedRan = false; + }); + + it("ignores the event if the `onReplacedRan` property of the main background class is set to `true`", () => { + mainBackground.onReplacedRan = true; + + triggerTabOnReplacedEvent(10, 20); + + expect(notificationBackground.checkNotificationQueue).not.toHaveBeenCalled(); + }); + + it("checks the notification queue", () => { + triggerTabOnReplacedEvent(10, 20); + + expect(notificationBackground.checkNotificationQueue).toHaveBeenCalled(); + }); + + it("updates the current tab data", async () => { + triggerTabOnReplacedEvent(10, 20); + await flushPromises(); + + expect(mainBackground.refreshBadge).toHaveBeenCalled(); + expect(mainBackground.refreshMenu).toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); + }); + + it("sends a `tabChanged` message to the messaging service", async () => { + triggerTabOnReplacedEvent(10, 20); + await flushPromises(); + + expect(mainBackground.messagingService.send).toHaveBeenCalledWith("tabChanged"); + }); + }); + + describe("handleTabOnUpdated", () => { + const focusedWindowId = 10; + let tab: chrome.tabs.Tab; + + beforeEach(() => { + mainBackground.onUpdatedRan = false; + tabsBackgorund["focusedWindowId"] = focusedWindowId; + tab = mock({ + windowId: focusedWindowId, + active: true, + status: "loading", + }); + }); + + it("removes the cached page details from the overlay background if the tab status is `loading`", () => { + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + + expect(overlayBackground.removePageDetails).toHaveBeenCalledWith(focusedWindowId); + }); + + it("removes the cached page details from the overlay background if the tab status is `unloaded`", () => { + triggerTabOnUpdatedEvent(focusedWindowId, { status: "unloaded" }, tab); + + expect(overlayBackground.removePageDetails).toHaveBeenCalledWith(focusedWindowId); + }); + + it("skips updating the current tab data the focusedWindowId is set to a value less than zero", async () => { + tab.windowId = -1; + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); + expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); + }); + + it("skips updating the current tab data if the updated tab is not for the focusedWindowId", async () => { + tab.windowId = 20; + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); + expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); + }); + + it("skips updating the current tab data if the updated tab is not active", async () => { + tab.active = false; + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); + expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); + }); + + it("skips updating the badge, context menu and notification bar if the `onUpdatedRan` property of the main background class is set to `true`", async () => { + mainBackground.onUpdatedRan = true; + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); + expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); + }); + + it("checks the notification queue", async () => { + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(notificationBackground.checkNotificationQueue).toHaveBeenCalled(); + }); + + it("updates the current tab data", async () => { + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.refreshBadge).toHaveBeenCalled(); + expect(mainBackground.refreshMenu).toHaveBeenCalled(); + expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); + }); + + it("sends a `tabChanged` message to the messaging service", async () => { + triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); + await flushPromises(); + + expect(mainBackground.messagingService.send).toHaveBeenCalledWith("tabChanged"); + }); + }); + + describe("handleTabOnRemoved", () => { + it("removes the cached overlay page details", () => { + triggerTabOnRemovedEvent(10, { windowId: 20, isWindowClosing: false }); + + expect(overlayBackground.removePageDetails).toHaveBeenCalledWith(10); + }); + }); + }); +}); diff --git a/apps/browser/src/autofill/background/tabs.background.ts b/apps/browser/src/autofill/background/tabs.background.ts index 0f724c84dd58..b095f99ce20e 100644 --- a/apps/browser/src/autofill/background/tabs.background.ts +++ b/apps/browser/src/autofill/background/tabs.background.ts @@ -1,67 +1,123 @@ import MainBackground from "../../background/main.background"; import NotificationBackground from "./notification.background"; +import OverlayBackground from "./overlay.background"; export default class TabsBackground { constructor( private main: MainBackground, - private notificationBackground: NotificationBackground + private notificationBackground: NotificationBackground, + private overlayBackground: OverlayBackground, ) {} private focusedWindowId: number; + /** + * Initializes the window and tab listeners. + */ async init() { if (!chrome.tabs || !chrome.windows) { return; } - chrome.windows.onFocusChanged.addListener(async (windowId: number) => { - if (windowId === null || windowId < 0) { - return; - } - - this.focusedWindowId = windowId; - this.main.messagingService.send("windowChanged"); - }); - - chrome.tabs.onActivated.addListener(async (activeInfo: chrome.tabs.TabActiveInfo) => { - await this.main.refreshBadge(); - await this.main.refreshMenu(); - this.main.messagingService.send("tabChanged"); - }); - - chrome.tabs.onReplaced.addListener(async (addedTabId: number, removedTabId: number) => { - if (this.main.onReplacedRan) { - return; - } - this.main.onReplacedRan = true; - - await this.notificationBackground.checkNotificationQueue(); - await this.main.refreshBadge(); - await this.main.refreshMenu(); - this.main.messagingService.send("tabChanged"); - }); - - chrome.tabs.onUpdated.addListener( - async (tabId: number, changeInfo: chrome.tabs.TabChangeInfo, tab: chrome.tabs.Tab) => { - if (this.focusedWindowId > 0 && tab.windowId != this.focusedWindowId) { - return; - } - - if (!tab.active) { - return; - } - - if (this.main.onUpdatedRan) { - return; - } - this.main.onUpdatedRan = true; - - await this.notificationBackground.checkNotificationQueue(tab); - await this.main.refreshBadge(); - await this.main.refreshMenu(); - this.main.messagingService.send("tabChanged"); - } - ); + chrome.windows.onFocusChanged.addListener(this.handleWindowOnFocusChanged); + chrome.tabs.onActivated.addListener(this.handleTabOnActivated); + chrome.tabs.onReplaced.addListener(this.handleTabOnReplaced); + chrome.tabs.onUpdated.addListener(this.handleTabOnUpdated); + chrome.tabs.onRemoved.addListener(this.handleTabOnRemoved); } + + /** + * Handles the window onFocusChanged event. + * + * @param windowId - The ID of the window that was focused. + */ + private handleWindowOnFocusChanged = async (windowId: number) => { + if (!windowId) { + return; + } + + this.focusedWindowId = windowId; + await this.updateCurrentTabData(); + this.main.messagingService.send("windowChanged"); + }; + + /** + * Handles the tab onActivated event. + */ + private handleTabOnActivated = async () => { + await this.updateCurrentTabData(); + this.main.messagingService.send("tabChanged"); + }; + + /** + * Handles the tab onReplaced event. + */ + private handleTabOnReplaced = async () => { + if (this.main.onReplacedRan) { + return; + } + this.main.onReplacedRan = true; + + await this.notificationBackground.checkNotificationQueue(); + await this.updateCurrentTabData(); + this.main.messagingService.send("tabChanged"); + }; + + /** + * Handles the tab onUpdated event. + * + * @param tabId - The ID of the tab that was updated. + * @param changeInfo - The change information. + * @param tab - The updated tab. + */ + private handleTabOnUpdated = async ( + tabId: number, + changeInfo: chrome.tabs.TabChangeInfo, + tab: chrome.tabs.Tab, + ) => { + const removePageDetailsStatus = new Set(["loading", "unloaded"]); + if (removePageDetailsStatus.has(changeInfo.status)) { + this.overlayBackground.removePageDetails(tabId); + } + + if (this.focusedWindowId > 0 && tab.windowId !== this.focusedWindowId) { + return; + } + + if (!tab.active) { + return; + } + + await this.overlayBackground.updateOverlayCiphers(); + + if (this.main.onUpdatedRan) { + return; + } + this.main.onUpdatedRan = true; + + await this.notificationBackground.checkNotificationQueue(tab); + await this.main.refreshBadge(); + await this.main.refreshMenu(); + this.main.messagingService.send("tabChanged"); + }; + + /** + * Handles the tab onRemoved event. + * + * @param tabId - The ID of the tab that was removed. + */ + private handleTabOnRemoved = async (tabId: number) => { + this.overlayBackground.removePageDetails(tabId); + }; + + /** + * Updates the current tab data, refreshing the badge and context menu + * for the current tab. Also updates the overlay ciphers. + */ + private updateCurrentTabData = async () => { + await this.main.refreshBadge(); + await this.main.refreshMenu(); + await this.overlayBackground.updateOverlayCiphers(); + }; } diff --git a/apps/browser/src/autofill/background/web-request.background.ts b/apps/browser/src/autofill/background/web-request.background.ts new file mode 100644 index 000000000000..7bb3e679c799 --- /dev/null +++ b/apps/browser/src/autofill/background/web-request.background.ts @@ -0,0 +1,100 @@ +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { UriMatchType } from "@bitwarden/common/vault/enums"; + +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/autofill/browser/cipher-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts index fe1e5b4271d6..ceec27a34e38 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts @@ -1,10 +1,10 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { AuthService } from "@bitwarden/common/abstractions/auth.service"; -import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.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 { CipherContextMenuHandler } from "./cipher-context-menu-handler"; import { MainContextMenuHandler } from "./main-context-menu-handler"; @@ -69,12 +69,12 @@ describe("CipherContextMenuHandler", () => { expect(mainContextMenuHandler.noLogins).toHaveBeenCalledTimes(1); }); - it("only adds valid ciphers", async () => { + it("only adds autofill ciphers including ciphers that require reprompt", async () => { authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked); mainContextMenuHandler.init.mockResolvedValue(true); - const realCipher = { + const loginCipher = { id: "5", type: CipherType.Login, reprompt: CipherRepromptType.None, @@ -82,27 +82,57 @@ describe("CipherContextMenuHandler", () => { login: { username: "Test Username" }, }; + const repromptLoginCipher = { + id: "6", + type: CipherType.Login, + reprompt: CipherRepromptType.Password, + name: "Test Reprompt Cipher", + login: { username: "Test Username" }, + }; + + const cardCipher = { + id: "7", + type: CipherType.Card, + name: "Test Card Cipher", + card: { username: "Test Username" }, + }; + cipherService.getAllDecryptedForUrl.mockResolvedValue([ - null, - undefined, - { type: CipherType.Card }, - { type: CipherType.Login, reprompt: CipherRepromptType.Password }, - realCipher, + null, // invalid cipher + undefined, // invalid cipher + { type: CipherType.SecureNote }, // invalid cipher + loginCipher, // valid cipher + repromptLoginCipher, + cardCipher, // valid cipher ] as any[]); await sut.update("https://test.com"); expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com"); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", [ + CipherType.Card, + CipherType.Identity, + ]); - expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(1); + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(3); expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith( "Test Cipher (Test Username)", "5", - "https://test.com", - realCipher + loginCipher, + ); + + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith( + "Test Reprompt Cipher (Test Username)", + "6", + repromptLoginCipher, + ); + + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith( + "Test Card Cipher", + "7", + cardCipher, ); }); }); diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts index 366f2e4659d8..cfb966f87ece 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -1,26 +1,24 @@ -import { AuthService } from "@bitwarden/common/abstractions/auth.service"; -import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; -import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { Utils } from "@bitwarden/common/misc/utils"; -import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; -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 { authServiceFactory, AuthServiceInitOptions, -} from "../../background/service_factories/auth-service.factory"; -import { CachedServices } from "../../background/service_factories/factory-options"; -import { searchServiceFactory } from "../../background/service_factories/search-service.factory"; -import { BrowserApi } from "../../browser/browserApi"; +} from "../../auth/background/service-factories/auth-service.factory"; import { Account } from "../../models/account"; +import { CachedServices } from "../../platform/background/service-factories/factory-options"; +import { BrowserApi } from "../../platform/browser/browser-api"; import { cipherServiceFactory, CipherServiceInitOptions, } from "../../vault/background/service_factories/cipher-service.factory"; +import { AutofillCipherTypeId } from "../types"; import { MainContextMenuHandler } from "./main-context-menu-handler"; @@ -40,19 +38,15 @@ export class CipherContextMenuHandler { constructor( private mainContextMenuHandler: MainContextMenuHandler, private authService: AuthService, - private cipherService: CipherService + private cipherService: CipherService, ) {} static async create(cachedServices: CachedServices) { const stateFactory = new StateFactory(GlobalState, Account); - let searchService: SearchService | null = null; const serviceOptions: AuthServiceInitOptions & CipherServiceInitOptions = { apiServiceOptions: { logoutCallback: NOT_IMPLEMENTED, }, - cipherServiceOptions: { - searchServiceFactory: () => searchService, - }, cryptoFunctionServiceOptions: { win: self, }, @@ -73,24 +67,26 @@ export class CipherContextMenuHandler { clipboardWriteCallback: NOT_IMPLEMENTED, win: self, }, - stateMigrationServiceOptions: { - stateFactory: stateFactory, - }, stateServiceOptions: { stateFactory: stateFactory, }, }; - searchService = await searchServiceFactory(cachedServices, serviceOptions); return new CipherContextMenuHandler( await MainContextMenuHandler.mv3Create(cachedServices), await authServiceFactory(cachedServices, serviceOptions), - await cipherServiceFactory(cachedServices, serviceOptions) + await cipherServiceFactory(cachedServices, serviceOptions), ); } + static async windowsOnFocusChangedListener(windowId: number, serviceCache: CachedServices) { + const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); + const tab = await BrowserApi.getTabFromCurrentWindow(); + await cipherContextMenuHandler.update(tab?.url); + } + static async tabsOnActivatedListener( activeInfo: chrome.tabs.TabActiveInfo, - serviceCache: CachedServices + serviceCache: CachedServices, ) { const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); const tab = await BrowserApi.getTab(activeInfo.tabId); @@ -100,7 +96,7 @@ export class CipherContextMenuHandler { static async tabsOnReplacedListener( addedTabId: number, removedTabId: number, - serviceCache: CachedServices + serviceCache: CachedServices, ) { const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); const tab = await BrowserApi.getTab(addedTabId); @@ -111,7 +107,7 @@ export class CipherContextMenuHandler { tabId: number, changeInfo: chrome.tabs.TabChangeInfo, tab: chrome.tabs.Tab, - serviceCache: CachedServices + serviceCache: CachedServices, ) { if (changeInfo.status !== "complete") { return; @@ -123,7 +119,7 @@ export class CipherContextMenuHandler { static async messageListener( message: { command: string }, sender: chrome.runtime.MessageSender, - cachedServices: CachedServices + cachedServices: CachedServices, ) { if (!CipherContextMenuHandler.shouldListen(message)) { return; @@ -153,7 +149,7 @@ export class CipherContextMenuHandler { const authStatus = await this.authService.getAuthStatus(); await MainContextMenuHandler.removeAll(); if (authStatus !== AuthenticationStatus.Unlocked) { - // Should I pass in the auth status or even have two seperate methods for this + // Should I pass in the auth status or even have two separate methods for this // on MainContextMenuHandler await this.mainContextMenuHandler.noAccess(); return; @@ -164,33 +160,67 @@ export class CipherContextMenuHandler { return; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(url); + const ciphers = await this.cipherService.getAllDecryptedForUrl(url, [ + CipherType.Card, + CipherType.Identity, + ]); ciphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b)); - if (ciphers.length === 0) { - await this.mainContextMenuHandler.noLogins(url); - return; + const groupedCiphers: Record = ciphers.reduce( + (ciphersByType, cipher) => { + if (!cipher?.type) { + return ciphersByType; + } + + const existingCiphersOfType = ciphersByType[cipher.type as AutofillCipherTypeId] || []; + + return { + ...ciphersByType, + [cipher.type]: [...existingCiphersOfType, cipher], + }; + }, + { + [CipherType.Login]: [], + [CipherType.Card]: [], + [CipherType.Identity]: [], + }, + ); + + if (groupedCiphers[CipherType.Login].length === 0) { + await this.mainContextMenuHandler.noLogins(); + } + + if (groupedCiphers[CipherType.Identity].length === 0) { + await this.mainContextMenuHandler.noIdentities(); + } + + if (groupedCiphers[CipherType.Card].length === 0) { + await this.mainContextMenuHandler.noCards(); } for (const cipher of ciphers) { - await this.updateForCipher(url, cipher); + await this.updateForCipher(cipher); } } - private async updateForCipher(url: string, cipher: CipherView) { + private async updateForCipher(cipher: CipherView) { if ( cipher == null || - cipher.type !== CipherType.Login || - cipher.reprompt !== CipherRepromptType.None + !new Set([CipherType.Login, CipherType.Card, CipherType.Identity]).has(cipher.type) ) { return; } let title = cipher.name; - if (!Utils.isNullOrEmpty(title)) { + + if (cipher.type === CipherType.Login && !Utils.isNullOrEmpty(title) && cipher.login?.username) { title += ` (${cipher.login.username})`; } - await this.mainContextMenuHandler.loadOptions(title, cipher.id, url, cipher); + if (cipher.type === CipherType.Card && cipher.card?.subTitle) { + title += ` ${cipher.card.subTitle}`; + } + + await this.mainContextMenuHandler.loadOptions(title, cipher.id, cipher); } } diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts index 89e97512578c..f2312a0d6655 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts @@ -1,34 +1,37 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { AuthService } from "@bitwarden/common/abstractions/auth.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { TotpService } from "@bitwarden/common/abstractions/totp.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { TotpService } 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 { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { AutofillTabCommand } from "../commands/autofill-tab-command"; +import { + AUTOFILL_ID, + COPY_PASSWORD_ID, + COPY_USERNAME_ID, + COPY_VERIFICATION_CODE_ID, + GENERATE_PASSWORD_ID, + NOOP_COMMAND_SUFFIX, +} from "../constants"; import { CopyToClipboardAction, ContextMenuClickedHandler, CopyToClipboardOptions, GeneratePasswordToClipboardAction, + AutofillAction, } from "./context-menu-clicked-handler"; -import { - AUTOFILL_ID, - COPY_PASSWORD_ID, - COPY_USERNAME_ID, - COPY_VERIFICATIONCODE_ID, - GENERATE_PASSWORD_ID, -} from "./main-context-menu-handler"; describe("ContextMenuClickedHandler", () => { const createData = ( menuItemId: chrome.contextMenus.OnClickData["menuItemId"], - parentMenuItemId?: chrome.contextMenus.OnClickData["parentMenuItemId"] + parentMenuItemId?: chrome.contextMenus.OnClickData["parentMenuItemId"], ): chrome.contextMenus.OnClickData => { return { menuItemId: menuItemId, @@ -49,8 +52,9 @@ describe("ContextMenuClickedHandler", () => { new Cipher({ id: id ?? "1", type: CipherType.Login, - } as any) + } as any), ); + cipherView.login.username = username ?? "USERNAME"; cipherView.login.password = password ?? "PASSWORD"; cipherView.login.totp = totp ?? "TOTP"; @@ -59,31 +63,36 @@ describe("ContextMenuClickedHandler", () => { let copyToClipboard: CopyToClipboardAction; let generatePasswordToClipboard: GeneratePasswordToClipboardAction; + let autofill: AutofillAction; let authService: MockProxy; let cipherService: MockProxy; - let autofillTabCommand: MockProxy; + let stateService: MockProxy; let totpService: MockProxy; let eventCollectionService: MockProxy; + let userVerificationService: MockProxy; let sut: ContextMenuClickedHandler; beforeEach(() => { copyToClipboard = jest.fn(); generatePasswordToClipboard = jest.fn, [tab: chrome.tabs.Tab]>(); + autofill = jest.fn, [tab: chrome.tabs.Tab, cipher: CipherView]>(); authService = mock(); cipherService = mock(); - autofillTabCommand = mock(); + stateService = mock(); totpService = mock(); eventCollectionService = mock(); sut = new ContextMenuClickedHandler( copyToClipboard, generatePasswordToClipboard, + autofill, authService, cipherService, - autofillTabCommand, + stateService, totpService, - eventCollectionService + eventCollectionService, + userVerificationService, ); }); @@ -104,11 +113,11 @@ describe("ContextMenuClickedHandler", () => { const cipher = createCipher(); cipherService.getAllDecrypted.mockResolvedValue([cipher]); - await sut.run(createData("T_1", AUTOFILL_ID), { id: 5 } as any); + await sut.run(createData(`${AUTOFILL_ID}_1`, AUTOFILL_ID), { id: 5 } as any); - expect(autofillTabCommand.doAutofillTabWithCipherCommand).toBeCalledTimes(1); + expect(autofill).toBeCalledTimes(1); - expect(autofillTabCommand.doAutofillTabWithCipherCommand).toBeCalledWith({ id: 5 }, cipher); + expect(autofill).toBeCalledWith({ id: 5 }, cipher); }); it("copies username to clipboard", async () => { @@ -116,11 +125,16 @@ describe("ContextMenuClickedHandler", () => { createCipher({ username: "TEST_USERNAME" }), ]); - await sut.run(createData("T_1", COPY_USERNAME_ID)); + await sut.run(createData(`${COPY_USERNAME_ID}_1`, COPY_USERNAME_ID), { + url: "https://test.com", + } as any); expect(copyToClipboard).toBeCalledTimes(1); - expect(copyToClipboard).toHaveBeenCalledWith({ text: "TEST_USERNAME", options: undefined }); + expect(copyToClipboard).toHaveBeenCalledWith({ + text: "TEST_USERNAME", + tab: { url: "https://test.com" }, + }); }); it("copies password to clipboard", async () => { @@ -128,11 +142,16 @@ describe("ContextMenuClickedHandler", () => { createCipher({ password: "TEST_PASSWORD" }), ]); - await sut.run(createData("T_1", COPY_PASSWORD_ID)); + await sut.run(createData(`${COPY_PASSWORD_ID}_1`, COPY_PASSWORD_ID), { + url: "https://test.com", + } as any); expect(copyToClipboard).toBeCalledTimes(1); - expect(copyToClipboard).toHaveBeenCalledWith({ text: "TEST_PASSWORD", options: undefined }); + expect(copyToClipboard).toHaveBeenCalledWith({ + text: "TEST_PASSWORD", + tab: { url: "https://test.com" }, + }); }); it("copies totp code to clipboard", async () => { @@ -146,11 +165,16 @@ describe("ContextMenuClickedHandler", () => { return Promise.resolve("654321"); }); - await sut.run(createData("T_1", COPY_VERIFICATIONCODE_ID)); + await sut.run(createData(`${COPY_VERIFICATION_CODE_ID}_1`, COPY_VERIFICATION_CODE_ID), { + url: "https://test.com", + } as any); expect(totpService.getCode).toHaveBeenCalledTimes(1); - expect(copyToClipboard).toHaveBeenCalledWith({ text: "123456" }); + expect(copyToClipboard).toHaveBeenCalledWith({ + text: "123456", + tab: { url: "https://test.com" }, + }); }); it("attempts to find a cipher when noop but unlocked", async () => { @@ -161,11 +185,13 @@ describe("ContextMenuClickedHandler", () => { } as any, ]); - await sut.run(createData("T_noop", COPY_USERNAME_ID), { url: "https://test.com" } as any); + await sut.run(createData(`${COPY_USERNAME_ID}_${NOOP_COMMAND_SUFFIX}`, COPY_USERNAME_ID), { + url: "https://test.com", + } as any); expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com"); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", []); expect(copyToClipboard).toHaveBeenCalledTimes(1); @@ -183,11 +209,13 @@ describe("ContextMenuClickedHandler", () => { } as any, ]); - await sut.run(createData("T_noop", COPY_USERNAME_ID), { url: "https://test.com" } as any); + await sut.run(createData(`${COPY_USERNAME_ID}_${NOOP_COMMAND_SUFFIX}`, COPY_USERNAME_ID), { + url: "https://test.com", + } as any); expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); - expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com"); + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com", []); }); }); }); diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 63b83049df1a..0de2009bbe1d 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -1,48 +1,61 @@ -import { AuthService } from "@bitwarden/common/abstractions/auth.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; -import { EventType } from "@bitwarden/common/enums/eventType"; -import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { EventType } from "@bitwarden/common/enums"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { TotpService } 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 { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import LockedVaultPendingNotificationsItem from "../../background/models/lockedVaultPendingNotificationsItem"; import { authServiceFactory, AuthServiceInitOptions, -} from "../../background/service_factories/auth-service.factory"; -import { eventCollectionServiceFactory } from "../../background/service_factories/event-collection-service.factory"; -import { CachedServices } from "../../background/service_factories/factory-options"; -import { passwordGenerationServiceFactory } from "../../background/service_factories/password-generation-service.factory"; -import { searchServiceFactory } from "../../background/service_factories/search-service.factory"; -import { stateServiceFactory } from "../../background/service_factories/state-service.factory"; -import { totpServiceFactory } from "../../background/service_factories/totp-service.factory"; -import { BrowserApi } from "../../browser/browserApi"; +} from "../../auth/background/service-factories/auth-service.factory"; +import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory"; +import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; +import { eventCollectionServiceFactory } from "../../background/service-factories/event-collection-service.factory"; import { Account } from "../../models/account"; +import { CachedServices } from "../../platform/background/service-factories/factory-options"; +import { stateServiceFactory } from "../../platform/background/service-factories/state-service.factory"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { passwordGenerationServiceFactory } from "../../tools/background/service_factories/password-generation-service.factory"; import { cipherServiceFactory, CipherServiceInitOptions, } from "../../vault/background/service_factories/cipher-service.factory"; +import { totpServiceFactory } from "../../vault/background/service_factories/totp-service.factory"; +import { + openAddEditVaultItemPopout, + openVaultItemPasswordRepromptPopout, +} from "../../vault/popup/utils/vault-popout-window"; import { autofillServiceFactory } from "../background/service_factories/autofill-service.factory"; import { copyToClipboard, GeneratePasswordToClipboardCommand } from "../clipboard"; import { AutofillTabCommand } from "../commands/autofill-tab-command"; - import { + AUTOFILL_CARD_ID, AUTOFILL_ID, + AUTOFILL_IDENTITY_ID, COPY_IDENTIFIER_ID, COPY_PASSWORD_ID, COPY_USERNAME_ID, - COPY_VERIFICATIONCODE_ID, + COPY_VERIFICATION_CODE_ID, + CREATE_CARD_ID, + CREATE_IDENTITY_ID, + CREATE_LOGIN_ID, GENERATE_PASSWORD_ID, NOOP_COMMAND_SUFFIX, -} from "./main-context-menu-handler"; +} from "../constants"; +import LockedVaultPendingNotificationsItem from "../notification/models/locked-vault-pending-notifications-item"; +import { AutofillCipherTypeId } from "../types"; export type CopyToClipboardOptions = { text: string; tab: chrome.tabs.Tab }; export type CopyToClipboardAction = (options: CopyToClipboardOptions) => void; +export type AutofillAction = (tab: chrome.tabs.Tab, cipher: CipherView) => Promise; export type GeneratePasswordToClipboardAction = (tab: chrome.tabs.Tab) => Promise; @@ -53,23 +66,21 @@ export class ContextMenuClickedHandler { constructor( private copyToClipboard: CopyToClipboardAction, private generatePasswordToClipboard: GeneratePasswordToClipboardAction, + private autofillAction: AutofillAction, private authService: AuthService, private cipherService: CipherService, - private autofillTabCommand: AutofillTabCommand, + private stateService: StateService, private totpService: TotpService, - private eventCollectionService: EventCollectionService + private eventCollectionService: EventCollectionService, + private userVerificationService: UserVerificationService, ) {} static async mv3Create(cachedServices: CachedServices) { const stateFactory = new StateFactory(GlobalState, Account); - let searchService: SearchService | null = null; const serviceOptions: AuthServiceInitOptions & CipherServiceInitOptions = { apiServiceOptions: { logoutCallback: NOT_IMPLEMENTED, }, - cipherServiceOptions: { - searchServiceFactory: () => searchService, - }, cryptoFunctionServiceOptions: { win: self, }, @@ -90,35 +101,37 @@ export class ContextMenuClickedHandler { clipboardWriteCallback: NOT_IMPLEMENTED, win: self, }, - stateMigrationServiceOptions: { - stateFactory: stateFactory, - }, stateServiceOptions: { stateFactory: stateFactory, }, }; - searchService = await searchServiceFactory(cachedServices, serviceOptions); const generatePasswordToClipboardCommand = new GeneratePasswordToClipboardCommand( await passwordGenerationServiceFactory(cachedServices, serviceOptions), - await stateServiceFactory(cachedServices, serviceOptions) + await stateServiceFactory(cachedServices, serviceOptions), + ); + + const autofillCommand = new AutofillTabCommand( + await autofillServiceFactory(cachedServices, serviceOptions), ); return new ContextMenuClickedHandler( (options) => copyToClipboard(options.tab, options.text), (tab) => generatePasswordToClipboardCommand.generatePasswordToClipboard(tab), + (tab, cipher) => autofillCommand.doAutofillTabWithCipherCommand(tab, cipher), await authServiceFactory(cachedServices, serviceOptions), await cipherServiceFactory(cachedServices, serviceOptions), - new AutofillTabCommand(await autofillServiceFactory(cachedServices, serviceOptions)), + await stateServiceFactory(cachedServices, serviceOptions), await totpServiceFactory(cachedServices, serviceOptions), - await eventCollectionServiceFactory(cachedServices, serviceOptions) + await eventCollectionServiceFactory(cachedServices, serviceOptions), + await userVerificationServiceFactory(cachedServices, serviceOptions), ); } static async onClickedListener( info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab, - cachedServices: CachedServices = {} + cachedServices: CachedServices = {}, ) { const contextMenuClickedHandler = await ContextMenuClickedHandler.mv3Create(cachedServices); await contextMenuClickedHandler.run(info, tab); @@ -127,7 +140,7 @@ export class ContextMenuClickedHandler { static async messageListener( message: { command: string; data: LockedVaultPendingNotificationsItem }, sender: chrome.runtime.MessageSender, - cachedServices: CachedServices + cachedServices: CachedServices, ) { if ( message.command !== "unlockCompleted" || @@ -139,22 +152,20 @@ export class ContextMenuClickedHandler { const contextMenuClickedHandler = await ContextMenuClickedHandler.mv3Create(cachedServices); await contextMenuClickedHandler.run( message.data.commandToRetry.msg.data, - message.data.commandToRetry.sender.tab + message.data.commandToRetry.sender.tab, ); } - async run(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) { + async run(info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) { + if (!tab) { + return; + } + switch (info.menuItemId) { case GENERATE_PASSWORD_ID: - if (!tab) { - return; - } await this.generatePasswordToClipboard(tab); break; case COPY_IDENTIFIER_ID: - if (!tab) { - return; - } this.copyToClipboard({ text: await this.getIdentifier(tab, info), tab: tab }); break; default: @@ -162,7 +173,11 @@ export class ContextMenuClickedHandler { } } - async cipherAction(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) { + async cipherAction(info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) { + if (!tab) { + return; + } + if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { const retryMessage: LockedVaultPendingNotificationsItem = { commandToRetry: { @@ -174,52 +189,137 @@ export class ContextMenuClickedHandler { await BrowserApi.tabSendMessageData( tab, "addToLockedVaultPendingNotifications", - retryMessage + retryMessage, ); - await BrowserApi.tabSendMessageData(tab, "promptForLogin"); + await openUnlockPopout(tab); return; } // NOTE: We don't actually use the first part of this ID, we further switch based on the parentMenuItemId // I would really love to not add it but that is a departure from how it currently works. - const id = (info.menuItemId as string).split("_")[1]; // We create all the ids, we can guarantee they are strings + const menuItemId = (info.menuItemId as string).split("_")[1]; // We create all the ids, we can guarantee they are strings let cipher: CipherView | undefined; - if (id === NOOP_COMMAND_SUFFIX) { + const isCreateCipherAction = [CREATE_LOGIN_ID, CREATE_IDENTITY_ID, CREATE_CARD_ID].includes( + menuItemId as string, + ); + + if (isCreateCipherAction) { + // pass; defer to logic below + } else if (menuItemId === NOOP_COMMAND_SUFFIX) { + const additionalCiphersToGet = + info.parentMenuItemId === AUTOFILL_IDENTITY_ID + ? [CipherType.Identity] + : info.parentMenuItemId === AUTOFILL_CARD_ID + ? [CipherType.Card] + : []; + // This NOOP item has come through which is generally only for no access state but since we got here // we are actually unlocked we will do our best to find a good match of an item to autofill this is useful // in scenarios like unlock on autofill - const ciphers = await this.cipherService.getAllDecryptedForUrl(tab.url); - cipher = ciphers.find((c) => c.reprompt === CipherRepromptType.None); + const ciphers = await this.cipherService.getAllDecryptedForUrl( + tab.url, + additionalCiphersToGet, + ); + + cipher = ciphers[0]; } else { const ciphers = await this.cipherService.getAllDecrypted(); - cipher = ciphers.find((c) => c.id === id); + cipher = ciphers.find(({ id }) => id === menuItemId); } - if (cipher == null) { + if (!cipher && !isCreateCipherAction) { return; } + this.stateService.setLastActive(new Date().getTime()); switch (info.parentMenuItemId) { case AUTOFILL_ID: - if (tab == null) { - return; + case AUTOFILL_IDENTITY_ID: + case AUTOFILL_CARD_ID: { + const cipherType = this.getCipherCreationType(menuItemId); + + if (cipherType) { + await openAddEditVaultItemPopout(tab, { cipherType }); + break; } - await this.autofillTabCommand.doAutofillTabWithCipherCommand(tab, cipher); + + if (await this.isPasswordRepromptRequired(cipher)) { + await openVaultItemPasswordRepromptPopout(tab, { + cipherId: cipher.id, + // The action here is passed on to the single-use reprompt window and doesn't change based on cipher type + action: AUTOFILL_ID, + }); + } else { + await this.autofillAction(tab, cipher); + } + break; + } case COPY_USERNAME_ID: + if (menuItemId === CREATE_LOGIN_ID) { + await openAddEditVaultItemPopout(tab, { cipherType: CipherType.Login }); + break; + } + this.copyToClipboard({ text: cipher.login.username, tab: tab }); break; case COPY_PASSWORD_ID: - this.copyToClipboard({ text: cipher.login.password, tab: tab }); - this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id); + if (menuItemId === CREATE_LOGIN_ID) { + await openAddEditVaultItemPopout(tab, { cipherType: CipherType.Login }); + break; + } + + if (await this.isPasswordRepromptRequired(cipher)) { + await openVaultItemPasswordRepromptPopout(tab, { + cipherId: cipher.id, + action: COPY_PASSWORD_ID, + }); + } else { + this.copyToClipboard({ text: cipher.login.password, tab: tab }); + this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id); + } + break; - case COPY_VERIFICATIONCODE_ID: - this.copyToClipboard({ text: await this.totpService.getCode(cipher.login.totp), tab: tab }); + case COPY_VERIFICATION_CODE_ID: + if (menuItemId === CREATE_LOGIN_ID) { + await openAddEditVaultItemPopout(tab, { cipherType: CipherType.Login }); + break; + } + + if (await this.isPasswordRepromptRequired(cipher)) { + await openVaultItemPasswordRepromptPopout(tab, { + cipherId: cipher.id, + action: COPY_VERIFICATION_CODE_ID, + }); + } else { + this.copyToClipboard({ + text: await this.totpService.getCode(cipher.login.totp), + tab: tab, + }); + } + break; } } + private async isPasswordRepromptRequired(cipher: CipherView): Promise { + return ( + cipher.reprompt === CipherRepromptType.Password && + (await this.userVerificationService.hasMasterPasswordAndMasterKeyHash()) + ); + } + + private getCipherCreationType(menuItemId?: string): AutofillCipherTypeId | null { + return menuItemId === CREATE_IDENTITY_ID + ? CipherType.Identity + : menuItemId === CREATE_CARD_ID + ? CipherType.Card + : menuItemId === CREATE_LOGIN_ID + ? CipherType.Login + : null; + } + private async getIdentifier(tab: chrome.tabs.Tab, info: chrome.contextMenus.OnClickData) { return new Promise((resolve, reject) => { BrowserApi.sendTabsMessage( @@ -233,7 +333,7 @@ export class ContextMenuClickedHandler { } resolve(identifier); - } + }, ); }); } diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts index d3a901401070..8617d657e832 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts @@ -1,17 +1,19 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.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 { BrowserStateService } from "../../services/abstractions/browser-state.service"; +import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; import { MainContextMenuHandler } from "./main-context-menu-handler"; describe("context-menu", () => { let stateService: MockProxy; let i18nService: MockProxy; + let logService: MockProxy; let removeAllSpy: jest.SpyInstance void]>; let createSpy: jest.SpyInstance< @@ -24,6 +26,7 @@ describe("context-menu", () => { beforeEach(() => { stateService = mock(); i18nService = mock(); + logService = mock(); removeAllSpy = jest .spyOn(chrome.contextMenus, "removeAll") @@ -36,7 +39,7 @@ describe("context-menu", () => { return props.id; }); - sut = new MainContextMenuHandler(stateService, i18nService); + sut = new MainContextMenuHandler(stateService, i18nService, logService); }); afterEach(() => jest.resetAllMocks()); @@ -57,7 +60,7 @@ describe("context-menu", () => { const createdMenu = await sut.init(); expect(createdMenu).toBeTruthy(); - expect(createSpy).toHaveBeenCalledTimes(7); + expect(createSpy).toHaveBeenCalledTimes(10); }); it("has menu enabled and has premium", async () => { @@ -67,7 +70,7 @@ describe("context-menu", () => { const createdMenu = await sut.init(); expect(createdMenu).toBeTruthy(); - expect(createSpy).toHaveBeenCalledTimes(8); + expect(createSpy).toHaveBeenCalledTimes(11); }); }); @@ -85,7 +88,7 @@ describe("context-menu", () => { id: id ?? "1", type: CipherType.Login, viewPassword: viewPassword ?? true, - } as any) + } as any), ); cipherView.login.username = username ?? "USERNAME"; cipherView.login.password = password ?? "PASSWORD"; @@ -94,7 +97,7 @@ describe("context-menu", () => { }; it("is not a login cipher", async () => { - await sut.loadOptions("TEST_TITLE", "1", "", { + await sut.loadOptions("TEST_TITLE", "1", { ...createCipher(), type: CipherType.SecureNote, } as any); @@ -106,12 +109,11 @@ describe("context-menu", () => { await sut.loadOptions( "TEST_TITLE", "1", - "", createCipher({ username: "", totp: "", viewPassword: false, - }) + }), ); expect(createSpy).toHaveBeenCalledTimes(1); @@ -120,18 +122,18 @@ describe("context-menu", () => { it("create entry for each cipher piece", async () => { stateService.getCanAccessPremium.mockResolvedValue(true); - await sut.loadOptions("TEST_TITLE", "1", "", createCipher()); + await sut.loadOptions("TEST_TITLE", "1", createCipher()); // One for autofill, copy username, copy password, and copy totp code expect(createSpy).toHaveBeenCalledTimes(4); }); - it("creates noop item for no cipher", async () => { + it("creates a login/unlock item for each context menu action option when user is not authenticated", async () => { stateService.getCanAccessPremium.mockResolvedValue(true); - await sut.loadOptions("TEST_TITLE", "NOOP", ""); + await sut.loadOptions("TEST_TITLE", "NOOP"); - expect(createSpy).toHaveBeenCalledTimes(4); + expect(createSpy).toHaveBeenCalledTimes(6); }); }); }); diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.ts index 898bd46e4a1d..f1686452ac4e 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.ts @@ -1,42 +1,53 @@ -import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { Utils } from "@bitwarden/common/misc/utils"; -import { GlobalState } from "@bitwarden/common/models/domain/global-state"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; +import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { CachedServices } from "../../background/service_factories/factory-options"; +import { Account } from "../../models/account"; +import { CachedServices } from "../../platform/background/service-factories/factory-options"; import { i18nServiceFactory, I18nServiceInitOptions, -} from "../../background/service_factories/i18n-service.factory"; +} from "../../platform/background/service-factories/i18n-service.factory"; +import { + logServiceFactory, + LogServiceInitOptions, +} from "../../platform/background/service-factories/log-service.factory"; import { stateServiceFactory, StateServiceInitOptions, -} from "../../background/service_factories/state-service.factory"; -import { Account } from "../../models/account"; -import { BrowserStateService } from "../../services/abstractions/browser-state.service"; - -export const ROOT_ID = "root"; - -export const AUTOFILL_ID = "autofill"; -export const COPY_USERNAME_ID = "copy-username"; -export const COPY_PASSWORD_ID = "copy-password"; -export const COPY_VERIFICATIONCODE_ID = "copy-totp"; -export const COPY_IDENTIFIER_ID = "copy-identifier"; - -const SEPARATOR_ID = "separator"; -export const GENERATE_PASSWORD_ID = "generate-password"; - -export const NOOP_COMMAND_SUFFIX = "noop"; +} from "../../platform/background/service-factories/state-service.factory"; +import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; +import { + AUTOFILL_CARD_ID, + AUTOFILL_ID, + AUTOFILL_IDENTITY_ID, + COPY_IDENTIFIER_ID, + COPY_PASSWORD_ID, + COPY_USERNAME_ID, + COPY_VERIFICATION_CODE_ID, + CREATE_CARD_ID, + CREATE_IDENTITY_ID, + CREATE_LOGIN_ID, + GENERATE_PASSWORD_ID, + NOOP_COMMAND_SUFFIX, + ROOT_ID, + SEPARATOR_ID, +} from "../constants"; export class MainContextMenuHandler { - // private initRunning = false; create: (options: chrome.contextMenus.CreateProperties) => Promise; - constructor(private stateService: BrowserStateService, private i18nService: I18nService) { + constructor( + private stateService: BrowserStateService, + private i18nService: I18nService, + private logService: LogService, + ) { if (chrome.contextMenus) { this.create = (options) => { return new Promise((resolve, reject) => { @@ -56,30 +67,29 @@ export class MainContextMenuHandler { static async mv3Create(cachedServices: CachedServices) { const stateFactory = new StateFactory(GlobalState, Account); - const serviceOptions: StateServiceInitOptions & I18nServiceInitOptions = { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - i18nServiceOptions: { - systemLanguage: chrome.i18n.getUILanguage(), - }, - logServiceOptions: { - isDev: false, - }, - stateMigrationServiceOptions: { - stateFactory: stateFactory, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - }; + const serviceOptions: StateServiceInitOptions & I18nServiceInitOptions & LogServiceInitOptions = + { + cryptoFunctionServiceOptions: { + win: self, + }, + encryptServiceOptions: { + logMacFailures: false, + }, + i18nServiceOptions: { + systemLanguage: chrome.i18n.getUILanguage(), + }, + logServiceOptions: { + isDev: false, + }, + stateServiceOptions: { + stateFactory: stateFactory, + }, + }; return new MainContextMenuHandler( await stateServiceFactory(cachedServices, serviceOptions), - await i18nServiceFactory(cachedServices, serviceOptions) + await i18nServiceFactory(cachedServices, serviceOptions), + await logServiceFactory(cachedServices, serviceOptions), ); } @@ -89,17 +99,17 @@ export class MainContextMenuHandler { */ async init(): Promise { const menuDisabled = await this.stateService.getDisableContextMenuItem(); + if (menuDisabled) { + await MainContextMenuHandler.removeAll(); + return false; + } if (this.initRunning) { - return menuDisabled; + return true; } + this.initRunning = true; try { - if (menuDisabled) { - await MainContextMenuHandler.removeAll(); - return false; - } - const create = async (options: Omit) => { await this.create({ ...options, contexts: ["all"] }); }; @@ -112,7 +122,7 @@ export class MainContextMenuHandler { await create({ id: AUTOFILL_ID, parentId: ROOT_ID, - title: this.i18nService.t("autoFill"), + title: this.i18nService.t("autoFillLogin"), }); await create({ @@ -129,14 +139,32 @@ export class MainContextMenuHandler { if (await this.stateService.getCanAccessPremium()) { await create({ - id: COPY_VERIFICATIONCODE_ID, + id: COPY_VERIFICATION_CODE_ID, parentId: ROOT_ID, title: this.i18nService.t("copyVerificationCode"), }); } await create({ - id: SEPARATOR_ID, + id: SEPARATOR_ID + 1, + type: "separator", + parentId: ROOT_ID, + }); + + await create({ + id: AUTOFILL_IDENTITY_ID, + parentId: ROOT_ID, + title: this.i18nService.t("autoFillIdentity"), + }); + + await create({ + id: AUTOFILL_CARD_ID, + parentId: ROOT_ID, + title: this.i18nService.t("autoFillCard"), + }); + + await create({ + id: SEPARATOR_ID + 2, type: "separator", parentId: ROOT_ID, }); @@ -152,11 +180,12 @@ export class MainContextMenuHandler { parentId: ROOT_ID, title: this.i18nService.t("copyElementIdentifier"), }); - - return true; + } catch (error) { + this.logService.warning(error.message); } finally { this.initRunning = false; } + return true; } static async removeAll() { @@ -185,38 +214,54 @@ export class MainContextMenuHandler { }); } - async loadOptions(title: string, id: string, url: string, cipher?: CipherView | undefined) { - if (cipher != null && cipher.type !== CipherType.Login) { - return; - } + async loadOptions(title: string, optionId: string, cipher?: CipherView) { + try { + const sanitizedTitle = MainContextMenuHandler.sanitizeContextMenuTitle(title); - const sanitizedTitle = MainContextMenuHandler.sanitizeContextMenuTitle(title); + const createChildItem = async (parentId: string) => { + const menuItemId = `${parentId}_${optionId}`; - const createChildItem = async (parent: string) => { - const menuItemId = `${parent}_${id}`; - return await this.create({ - type: "normal", - id: menuItemId, - parentId: parent, - title: sanitizedTitle, - contexts: ["all"], - }); - }; + return await this.create({ + type: "normal", + id: menuItemId, + parentId, + title: sanitizedTitle, + contexts: ["all"], + }); + }; - if (cipher == null || !Utils.isNullOrEmpty(cipher.login.password)) { - await createChildItem(AUTOFILL_ID); - if (cipher?.viewPassword ?? true) { - await createChildItem(COPY_PASSWORD_ID); + if ( + !cipher || + (cipher.type === CipherType.Login && !Utils.isNullOrEmpty(cipher.login?.password)) + ) { + await createChildItem(AUTOFILL_ID); + + if (cipher?.viewPassword ?? true) { + await createChildItem(COPY_PASSWORD_ID); + } } - } - if (cipher == null || !Utils.isNullOrEmpty(cipher.login.username)) { - await createChildItem(COPY_USERNAME_ID); - } + if ( + !cipher || + (cipher.type === CipherType.Login && !Utils.isNullOrEmpty(cipher.login?.username)) + ) { + await createChildItem(COPY_USERNAME_ID); + } - const canAccessPremium = await this.stateService.getCanAccessPremium(); - if (canAccessPremium && (cipher == null || !Utils.isNullOrEmpty(cipher.login.totp))) { - await createChildItem(COPY_VERIFICATIONCODE_ID); + const canAccessPremium = await this.stateService.getCanAccessPremium(); + if (canAccessPremium && (!cipher || !Utils.isNullOrEmpty(cipher.login?.totp))) { + await createChildItem(COPY_VERIFICATION_CODE_ID); + } + + if ((!cipher || cipher.type === CipherType.Card) && optionId !== CREATE_LOGIN_ID) { + await createChildItem(AUTOFILL_CARD_ID); + } + + if ((!cipher || cipher.type === CipherType.Identity) && optionId !== CREATE_LOGIN_ID) { + await createChildItem(AUTOFILL_IDENTITY_ID); + } + } catch (error) { + this.logService.warning(error.message); } } @@ -230,12 +275,71 @@ export class MainContextMenuHandler { await this.loadOptions( this.i18nService.t(authed ? "unlockVaultMenu" : "loginToVaultMenu"), NOOP_COMMAND_SUFFIX, - "" ); } } - async noLogins(url: string) { - await this.loadOptions(this.i18nService.t("noMatchingLogins"), NOOP_COMMAND_SUFFIX, url); + async noCards() { + await this.create({ + id: `${AUTOFILL_CARD_ID}_NOTICE`, + enabled: false, + parentId: AUTOFILL_CARD_ID, + title: this.i18nService.t("noCards"), + type: "normal", + }); + + await this.create({ + id: `${AUTOFILL_CARD_ID}_${SEPARATOR_ID}`, + parentId: AUTOFILL_CARD_ID, + type: "separator", + }); + + await this.create({ + id: `${AUTOFILL_CARD_ID}_${CREATE_CARD_ID}`, + parentId: AUTOFILL_CARD_ID, + title: this.i18nService.t("addCardMenu"), + type: "normal", + }); + } + + async noIdentities() { + await this.create({ + id: `${AUTOFILL_IDENTITY_ID}_NOTICE`, + enabled: false, + parentId: AUTOFILL_IDENTITY_ID, + title: this.i18nService.t("noIdentities"), + type: "normal", + }); + + await this.create({ + id: `${AUTOFILL_IDENTITY_ID}_${SEPARATOR_ID}`, + parentId: AUTOFILL_IDENTITY_ID, + type: "separator", + }); + + await this.create({ + id: `${AUTOFILL_IDENTITY_ID}_${CREATE_IDENTITY_ID}`, + parentId: AUTOFILL_IDENTITY_ID, + title: this.i18nService.t("addIdentityMenu"), + type: "normal", + }); + } + + async noLogins() { + await this.create({ + id: `${AUTOFILL_ID}_NOTICE`, + enabled: false, + parentId: AUTOFILL_ID, + title: this.i18nService.t("noMatchingLogins"), + type: "normal", + }); + + await this.create({ + id: `${AUTOFILL_ID}_${SEPARATOR_ID}` + 1, + parentId: AUTOFILL_ID, + type: "separator", + }); + + await this.loadOptions(this.i18nService.t("addLoginMenu"), CREATE_LOGIN_ID); } } diff --git a/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts b/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts index baced83894da..7bfe79340460 100644 --- a/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts +++ b/apps/browser/src/autofill/clipboard/clear-clipboard.spec.ts @@ -1,4 +1,4 @@ -import { BrowserApi } from "../../browser/browserApi"; +import { BrowserApi } from "../../platform/browser/browser-api"; import { ClearClipboard } from "./clear-clipboard"; diff --git a/apps/browser/src/autofill/clipboard/clear-clipboard.ts b/apps/browser/src/autofill/clipboard/clear-clipboard.ts index a96a72fc6589..f8018bb036a8 100644 --- a/apps/browser/src/autofill/clipboard/clear-clipboard.ts +++ b/apps/browser/src/autofill/clipboard/clear-clipboard.ts @@ -1,4 +1,4 @@ -import { BrowserApi } from "../../browser/browserApi"; +import { BrowserApi } from "../../platform/browser/browser-api"; export const clearClipboardAlarmName = "clearClipboard"; diff --git a/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts b/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts index 926b78b97626..92d35e70e570 100644 --- a/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts +++ b/apps/browser/src/autofill/clipboard/copy-to-clipboard-command.ts @@ -1,4 +1,4 @@ -import { BrowserApi } from "../../browser/browserApi"; +import { BrowserApi } from "../../platform/browser/browser-api"; /** * Copies text to the clipboard in a MV3 safe way. diff --git a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts index 4c1460c86ef7..3001087f74f9 100644 --- a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts +++ b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.spec.ts @@ -1,15 +1,15 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; -import { setAlarmTime } from "../../alarms/alarm-state"; -import { BrowserApi } from "../../browser/browserApi"; -import { BrowserStateService } from "../../services/abstractions/browser-state.service"; +import { setAlarmTime } from "../../platform/alarms/alarm-state"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; import { clearClipboardAlarmName } from "./clear-clipboard"; import { GeneratePasswordToClipboardCommand } from "./generate-password-to-clipboard-command"; -jest.mock("../../alarms/alarm-state", () => { +jest.mock("../../platform/alarms/alarm-state", () => { return { setAlarmTime: jest.fn(), }; @@ -18,13 +18,13 @@ jest.mock("../../alarms/alarm-state", () => { const setAlarmTimeMock = setAlarmTime as jest.Mock; describe("GeneratePasswordToClipboardCommand", () => { - let passwordGenerationService: MockProxy; + let passwordGenerationService: MockProxy; let stateService: MockProxy; let sut: GeneratePasswordToClipboardCommand; beforeEach(() => { - passwordGenerationService = mock(); + passwordGenerationService = mock(); stateService = mock(); passwordGenerationService.getOptions.mockResolvedValue([{ length: 8 }, {} as any]); diff --git a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts index eec0b31834da..5094f6701abe 100644 --- a/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts +++ b/apps/browser/src/autofill/clipboard/generate-password-to-clipboard-command.ts @@ -1,15 +1,15 @@ -import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; -import { setAlarmTime } from "../../alarms/alarm-state"; -import { BrowserStateService } from "../../services/abstractions/browser-state.service"; +import { setAlarmTime } from "../../platform/alarms/alarm-state"; +import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; import { clearClipboardAlarmName } from "./clear-clipboard"; import { copyToClipboard } from "./copy-to-clipboard-command"; export class GeneratePasswordToClipboardCommand { constructor( - private passwordGenerationService: PasswordGenerationService, - private stateService: BrowserStateService + private passwordGenerationService: PasswordGenerationServiceAbstraction, + private stateService: BrowserStateService, ) {} async generatePasswordToClipboard(tab: chrome.tabs.Tab) { diff --git a/apps/browser/src/autofill/commands/autofill-tab-command.ts b/apps/browser/src/autofill/commands/autofill-tab-command.ts index 4910a6cf6fab..16ce40ff3d75 100644 --- a/apps/browser/src/autofill/commands/autofill-tab-command.ts +++ b/apps/browser/src/autofill/commands/autofill-tab-command.ts @@ -21,7 +21,7 @@ export class AutofillTabCommand { }, ], tab, - true + true, ); } @@ -46,6 +46,7 @@ export class AutofillTabCommand { onlyEmptyFields: false, onlyVisibleFields: false, fillNewPassword: true, + allowTotpAutofill: true, }); } @@ -63,7 +64,7 @@ export class AutofillTabCommand { } resolve(response); - } + }, ); }); } diff --git a/apps/browser/src/autofill/constants.ts b/apps/browser/src/autofill/constants.ts new file mode 100644 index 000000000000..2c361723ad28 --- /dev/null +++ b/apps/browser/src/autofill/constants.ts @@ -0,0 +1,42 @@ +export const TYPE_CHECK = { + FUNCTION: "function", + NUMBER: "number", + STRING: "string", +} as const; + +export const EVENTS = { + CHANGE: "change", + INPUT: "input", + KEYDOWN: "keydown", + KEYPRESS: "keypress", + KEYUP: "keyup", + BLUR: "blur", + CLICK: "click", + FOCUS: "focus", + SCROLL: "scroll", + RESIZE: "resize", + DOMCONTENTLOADED: "DOMContentLoaded", + LOAD: "load", + MESSAGE: "message", + VISIBILITYCHANGE: "visibilitychange", + FOCUSOUT: "focusout", +} as const; + +/* Context Menu item Ids */ +export const AUTOFILL_CARD_ID = "autofill-card"; +export const AUTOFILL_ID = "autofill"; +export const SHOW_AUTOFILL_BUTTON = "show-autofill-button"; +export const AUTOFILL_IDENTITY_ID = "autofill-identity"; +export const COPY_IDENTIFIER_ID = "copy-identifier"; +export const COPY_PASSWORD_ID = "copy-password"; +export const COPY_USERNAME_ID = "copy-username"; +export const COPY_VERIFICATION_CODE_ID = "copy-totp"; +export const CREATE_CARD_ID = "create-card"; +export const CREATE_IDENTITY_ID = "create-identity"; +export const CREATE_LOGIN_ID = "create-login"; +export const GENERATE_PASSWORD_ID = "generate-password"; +export const NOOP_COMMAND_SUFFIX = "noop"; +export const ROOT_ID = "root"; +export const SEPARATOR_ID = "separator"; + +export const NOTIFICATION_BAR_LIFESPAN_MS = 150000; // 150 seconds diff --git a/apps/browser/src/autofill/content/abstractions/autofill-init.ts b/apps/browser/src/autofill/content/abstractions/autofill-init.ts new file mode 100644 index 000000000000..139099a4d58e --- /dev/null +++ b/apps/browser/src/autofill/content/abstractions/autofill-init.ts @@ -0,0 +1,43 @@ +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; + +import AutofillScript from "../../models/autofill-script"; + +type AutofillExtensionMessage = { + command: string; + tab?: chrome.tabs.Tab; + sender?: string; + fillScript?: AutofillScript; + url?: string; + pageDetailsUrl?: string; + ciphers?: any; + data?: { + authStatus?: AuthenticationStatus; + isFocusingFieldElement?: boolean; + isOverlayCiphersPopulated?: boolean; + direction?: "previous" | "next"; + isOpeningFullOverlay?: boolean; + forceCloseOverlay?: boolean; + }; +}; + +type AutofillExtensionMessageParam = { message: AutofillExtensionMessage }; + +type AutofillExtensionMessageHandlers = { + [key: string]: CallableFunction; + collectPageDetails: ({ message }: AutofillExtensionMessageParam) => void; + collectPageDetailsImmediately: ({ message }: AutofillExtensionMessageParam) => void; + fillForm: ({ message }: AutofillExtensionMessageParam) => void; + openAutofillOverlay: ({ message }: AutofillExtensionMessageParam) => void; + closeAutofillOverlay: ({ message }: AutofillExtensionMessageParam) => void; + addNewVaultItemFromOverlay: () => void; + redirectOverlayFocusOut: ({ message }: AutofillExtensionMessageParam) => void; + updateIsOverlayCiphersPopulated: ({ message }: AutofillExtensionMessageParam) => void; + bgUnlockPopoutOpened: () => void; + bgVaultItemRepromptPopoutOpened: () => void; +}; + +interface AutofillInit { + init(): void; +} + +export { AutofillExtensionMessage, AutofillExtensionMessageHandlers, AutofillInit }; diff --git a/apps/browser/src/autofill/content/autofill-init.spec.ts b/apps/browser/src/autofill/content/autofill-init.spec.ts new file mode 100644 index 000000000000..1524fdce1008 --- /dev/null +++ b/apps/browser/src/autofill/content/autofill-init.spec.ts @@ -0,0 +1,482 @@ +import { mock } from "jest-mock-extended"; + +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; + +import { flushPromises, sendExtensionRuntimeMessage } from "../jest/testing-utils"; +import AutofillPageDetails from "../models/autofill-page-details"; +import AutofillScript from "../models/autofill-script"; +import AutofillOverlayContentService from "../services/autofill-overlay-content.service"; +import { RedirectFocusDirection } from "../utils/autofill-overlay.enum"; + +import { AutofillExtensionMessage } from "./abstractions/autofill-init"; +import AutofillInit from "./autofill-init"; + +describe("AutofillInit", () => { + let autofillInit: AutofillInit; + const autofillOverlayContentService = mock(); + + beforeEach(() => { + autofillInit = new AutofillInit(autofillOverlayContentService); + }); + + afterEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + }); + + describe("init", () => { + it("sets up the extension message listeners", () => { + jest.spyOn(autofillInit as any, "setupExtensionMessageListeners"); + + autofillInit.init(); + + expect(autofillInit["setupExtensionMessageListeners"]).toHaveBeenCalled(); + }); + }); + + describe("setupExtensionMessageListeners", () => { + it("sets up a chrome runtime on message listener", () => { + jest.spyOn(chrome.runtime.onMessage, "addListener"); + + autofillInit["setupExtensionMessageListeners"](); + + expect(chrome.runtime.onMessage.addListener).toHaveBeenCalledWith( + autofillInit["handleExtensionMessage"], + ); + }); + }); + + describe("handleExtensionMessage", () => { + let message: AutofillExtensionMessage; + let sender: chrome.runtime.MessageSender; + const sendResponse = jest.fn(); + + beforeEach(() => { + message = { + command: "collectPageDetails", + tab: mock(), + sender: "sender", + }; + sender = mock(); + }); + + it("returns a undefined value if a extension message handler is not found with the given message command", () => { + message.command = "unknownCommand"; + + const response = autofillInit["handleExtensionMessage"](message, sender, sendResponse); + + expect(response).toBe(undefined); + }); + + it("returns a undefined value if the message handler does not return a response", async () => { + const response1 = await autofillInit["handleExtensionMessage"](message, sender, sendResponse); + await flushPromises(); + + expect(response1).not.toBe(false); + + message.command = "removeAutofillOverlay"; + message.fillScript = mock(); + + const response2 = autofillInit["handleExtensionMessage"](message, sender, sendResponse); + await flushPromises(); + + expect(response2).toBe(undefined); + }); + + it("returns a true value and calls sendResponse if the message handler returns a response", async () => { + message.command = "collectPageDetailsImmediately"; + const pageDetails: AutofillPageDetails = { + title: "title", + url: "http://example.com", + documentUrl: "documentUrl", + forms: {}, + fields: [], + collectedTimestamp: 0, + }; + jest + .spyOn(autofillInit["collectAutofillContentService"], "getPageDetails") + .mockResolvedValue(pageDetails); + + const response = await autofillInit["handleExtensionMessage"](message, sender, sendResponse); + await Promise.resolve(response); + + expect(response).toBe(true); + expect(sendResponse).toHaveBeenCalledWith(pageDetails); + }); + + describe("extension message handlers", () => { + beforeEach(() => { + autofillInit.init(); + }); + + describe("collectPageDetails", () => { + it("sends the collected page details for autofill using a background script message", async () => { + const pageDetails: AutofillPageDetails = { + title: "title", + url: "http://example.com", + documentUrl: "documentUrl", + forms: {}, + fields: [], + collectedTimestamp: 0, + }; + const message = { + command: "collectPageDetails", + sender: "sender", + tab: mock(), + }; + jest + .spyOn(autofillInit["collectAutofillContentService"], "getPageDetails") + .mockResolvedValue(pageDetails); + + sendExtensionRuntimeMessage(message, sender, sendResponse); + await flushPromises(); + + expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({ + command: "collectPageDetailsResponse", + tab: message.tab, + details: pageDetails, + sender: message.sender, + }); + }); + }); + + describe("collectPageDetailsImmediately", () => { + it("returns collected page details for autofill if set to send the details in the response", async () => { + const pageDetails: AutofillPageDetails = { + title: "title", + url: "http://example.com", + documentUrl: "documentUrl", + forms: {}, + fields: [], + collectedTimestamp: 0, + }; + jest + .spyOn(autofillInit["collectAutofillContentService"], "getPageDetails") + .mockResolvedValue(pageDetails); + + sendExtensionRuntimeMessage( + { command: "collectPageDetailsImmediately" }, + sender, + sendResponse, + ); + await flushPromises(); + + expect(autofillInit["collectAutofillContentService"].getPageDetails).toHaveBeenCalled(); + expect(sendResponse).toBeCalledWith(pageDetails); + expect(chrome.runtime.sendMessage).not.toHaveBeenCalled(); + }); + }); + + describe("fillForm", () => { + let fillScript: AutofillScript; + beforeEach(() => { + fillScript = mock(); + jest.spyOn(autofillInit["insertAutofillContentService"], "fillForm").mockImplementation(); + }); + + it("skips calling the InsertAutofillContentService and does not fill the form if the url to fill is not equal to the current tab url", async () => { + const fillScript = mock(); + const message = { + command: "fillForm", + fillScript, + pageDetailsUrl: "https://a-different-url.com", + }; + + sendExtensionRuntimeMessage(message); + await flushPromises(); + + expect(autofillInit["insertAutofillContentService"].fillForm).not.toHaveBeenCalledWith( + fillScript, + ); + }); + + it("calls the InsertAutofillContentService to fill the form", async () => { + sendExtensionRuntimeMessage({ + command: "fillForm", + fillScript, + pageDetailsUrl: window.location.href, + }); + await flushPromises(); + + expect(autofillInit["insertAutofillContentService"].fillForm).toHaveBeenCalledWith( + fillScript, + ); + }); + + it("updates the isCurrentlyFilling properties of the overlay and focus the recent field after filling", async () => { + jest.useFakeTimers(); + jest.spyOn(autofillInit as any, "updateOverlayIsCurrentlyFilling"); + jest + .spyOn(autofillInit["autofillOverlayContentService"], "focusMostRecentOverlayField") + .mockImplementation(); + + sendExtensionRuntimeMessage({ + command: "fillForm", + fillScript, + pageDetailsUrl: window.location.href, + }); + await flushPromises(); + jest.advanceTimersByTime(300); + + expect(autofillInit["updateOverlayIsCurrentlyFilling"]).toHaveBeenNthCalledWith(1, true); + expect(autofillInit["insertAutofillContentService"].fillForm).toHaveBeenCalledWith( + fillScript, + ); + expect(autofillInit["updateOverlayIsCurrentlyFilling"]).toHaveBeenNthCalledWith(2, false); + expect( + autofillInit["autofillOverlayContentService"].focusMostRecentOverlayField, + ).toHaveBeenCalled(); + }); + + it("skips attempting to focus the most recent field if the autofillOverlayContentService is not present", async () => { + jest.useFakeTimers(); + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + jest.spyOn(newAutofillInit as any, "updateOverlayIsCurrentlyFilling"); + jest + .spyOn(newAutofillInit["insertAutofillContentService"], "fillForm") + .mockImplementation(); + + sendExtensionRuntimeMessage({ + command: "fillForm", + fillScript, + pageDetailsUrl: window.location.href, + }); + await flushPromises(); + jest.advanceTimersByTime(300); + + expect(newAutofillInit["updateOverlayIsCurrentlyFilling"]).toHaveBeenNthCalledWith( + 1, + true, + ); + expect(newAutofillInit["insertAutofillContentService"].fillForm).toHaveBeenCalledWith( + fillScript, + ); + expect(newAutofillInit["updateOverlayIsCurrentlyFilling"]).not.toHaveBeenNthCalledWith( + 2, + false, + ); + }); + }); + + describe("openAutofillOverlay", () => { + const message = { + command: "openAutofillOverlay", + data: { + isFocusingFieldElement: true, + isOpeningFullOverlay: true, + authStatus: AuthenticationStatus.Unlocked, + }, + }; + + it("skips attempting to open the autofill overlay if the autofillOverlayContentService is not present", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + + sendExtensionRuntimeMessage(message); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + }); + + it("opens the autofill overlay", () => { + sendExtensionRuntimeMessage(message); + + expect( + autofillInit["autofillOverlayContentService"].openAutofillOverlay, + ).toHaveBeenCalledWith({ + isFocusingFieldElement: message.data.isFocusingFieldElement, + isOpeningFullOverlay: message.data.isOpeningFullOverlay, + authStatus: message.data.authStatus, + }); + }); + }); + + describe("closeAutofillOverlay", () => { + beforeEach(() => { + autofillInit["autofillOverlayContentService"].isFieldCurrentlyFocused = false; + autofillInit["autofillOverlayContentService"].isCurrentlyFilling = false; + }); + + it("skips attempting to remove the overlay if the autofillOverlayContentService is not present", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + jest.spyOn(newAutofillInit as any, "removeAutofillOverlay"); + + sendExtensionRuntimeMessage({ + command: "closeAutofillOverlay", + data: { forceCloseOverlay: false }, + }); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + }); + + it("removes the autofill overlay if the message flags a forced closure", () => { + sendExtensionRuntimeMessage({ + command: "closeAutofillOverlay", + data: { forceCloseOverlay: true }, + }); + + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlay, + ).toHaveBeenCalled(); + }); + + it("ignores the message if a field is currently focused", () => { + autofillInit["autofillOverlayContentService"].isFieldCurrentlyFocused = true; + + sendExtensionRuntimeMessage({ command: "closeAutofillOverlay" }); + + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlayList, + ).not.toHaveBeenCalled(); + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlay, + ).not.toHaveBeenCalled(); + }); + + it("removes the autofill overlay list if the overlay is currently filling", () => { + autofillInit["autofillOverlayContentService"].isCurrentlyFilling = true; + + sendExtensionRuntimeMessage({ command: "closeAutofillOverlay" }); + + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlayList, + ).toHaveBeenCalled(); + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlay, + ).not.toHaveBeenCalled(); + }); + + it("removes the entire overlay if the overlay is not currently filling", () => { + sendExtensionRuntimeMessage({ command: "closeAutofillOverlay" }); + + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlayList, + ).not.toHaveBeenCalled(); + expect( + autofillInit["autofillOverlayContentService"].removeAutofillOverlay, + ).toHaveBeenCalled(); + }); + }); + + describe("addNewVaultItemFromOverlay", () => { + it("will not add a new vault item if the autofillOverlayContentService is not present", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + + sendExtensionRuntimeMessage({ command: "addNewVaultItemFromOverlay" }); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + }); + + it("will add a new vault item", () => { + sendExtensionRuntimeMessage({ command: "addNewVaultItemFromOverlay" }); + + expect(autofillInit["autofillOverlayContentService"].addNewVaultItem).toHaveBeenCalled(); + }); + }); + + describe("redirectOverlayFocusOut", () => { + const message = { + command: "redirectOverlayFocusOut", + data: { + direction: RedirectFocusDirection.Next, + }, + }; + + it("ignores the message to redirect focus if the autofillOverlayContentService does not exist", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + + sendExtensionRuntimeMessage(message); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + }); + + it("redirects the overlay focus", () => { + sendExtensionRuntimeMessage(message); + + expect( + autofillInit["autofillOverlayContentService"].redirectOverlayFocusOut, + ).toHaveBeenCalledWith(message.data.direction); + }); + }); + + describe("updateIsOverlayCiphersPopulated", () => { + const message = { + command: "updateIsOverlayCiphersPopulated", + data: { + isOverlayCiphersPopulated: true, + }, + }; + + it("skips updating whether the ciphers are populated if the autofillOverlayContentService does note exist", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + + sendExtensionRuntimeMessage(message); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + }); + + it("updates whether the overlay ciphers are populated", () => { + sendExtensionRuntimeMessage(message); + + expect(autofillInit["autofillOverlayContentService"].isOverlayCiphersPopulated).toEqual( + message.data.isOverlayCiphersPopulated, + ); + }); + }); + + describe("bgUnlockPopoutOpened", () => { + it("skips attempting to blur and remove the overlay if the autofillOverlayContentService is not present", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + jest.spyOn(newAutofillInit as any, "removeAutofillOverlay"); + + sendExtensionRuntimeMessage({ command: "bgUnlockPopoutOpened" }); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + expect(newAutofillInit["removeAutofillOverlay"]).not.toHaveBeenCalled(); + }); + + it("blurs the most recently focused feel and remove the autofill overlay", () => { + jest.spyOn(autofillInit["autofillOverlayContentService"], "blurMostRecentOverlayField"); + jest.spyOn(autofillInit as any, "removeAutofillOverlay"); + + sendExtensionRuntimeMessage({ command: "bgUnlockPopoutOpened" }); + + expect( + autofillInit["autofillOverlayContentService"].blurMostRecentOverlayField, + ).toHaveBeenCalled(); + expect(autofillInit["removeAutofillOverlay"]).toHaveBeenCalled(); + }); + }); + + describe("bgVaultItemRepromptPopoutOpened", () => { + it("skips attempting to blur and remove the overlay if the autofillOverlayContentService is not present", () => { + const newAutofillInit = new AutofillInit(undefined); + newAutofillInit.init(); + jest.spyOn(newAutofillInit as any, "removeAutofillOverlay"); + + sendExtensionRuntimeMessage({ command: "bgVaultItemRepromptPopoutOpened" }); + + expect(newAutofillInit["autofillOverlayContentService"]).toBe(undefined); + expect(newAutofillInit["removeAutofillOverlay"]).not.toHaveBeenCalled(); + }); + + it("blurs the most recently focused feel and remove the autofill overlay", () => { + jest.spyOn(autofillInit["autofillOverlayContentService"], "blurMostRecentOverlayField"); + jest.spyOn(autofillInit as any, "removeAutofillOverlay"); + + sendExtensionRuntimeMessage({ command: "bgVaultItemRepromptPopoutOpened" }); + + expect( + autofillInit["autofillOverlayContentService"].blurMostRecentOverlayField, + ).toHaveBeenCalled(); + expect(autofillInit["removeAutofillOverlay"]).toHaveBeenCalled(); + }); + }); + }); + }); +}); diff --git a/apps/browser/src/autofill/content/autofill-init.ts b/apps/browser/src/autofill/content/autofill-init.ts new file mode 100644 index 000000000000..9b23305377cf --- /dev/null +++ b/apps/browser/src/autofill/content/autofill-init.ts @@ -0,0 +1,252 @@ +import AutofillPageDetails from "../models/autofill-page-details"; +import { AutofillOverlayContentService } from "../services/abstractions/autofill-overlay-content.service"; +import CollectAutofillContentService from "../services/collect-autofill-content.service"; +import DomElementVisibilityService from "../services/dom-element-visibility.service"; +import InsertAutofillContentService from "../services/insert-autofill-content.service"; + +import { + AutofillExtensionMessage, + AutofillExtensionMessageHandlers, + AutofillInit as AutofillInitInterface, +} from "./abstractions/autofill-init"; + +class AutofillInit implements AutofillInitInterface { + private readonly autofillOverlayContentService: AutofillOverlayContentService | undefined; + private readonly domElementVisibilityService: DomElementVisibilityService; + private readonly collectAutofillContentService: CollectAutofillContentService; + private readonly insertAutofillContentService: InsertAutofillContentService; + private readonly extensionMessageHandlers: AutofillExtensionMessageHandlers = { + collectPageDetails: ({ message }) => this.collectPageDetails(message), + collectPageDetailsImmediately: ({ message }) => this.collectPageDetails(message, true), + fillForm: ({ message }) => this.fillForm(message), + openAutofillOverlay: ({ message }) => this.openAutofillOverlay(message), + closeAutofillOverlay: ({ message }) => this.removeAutofillOverlay(message), + addNewVaultItemFromOverlay: () => this.addNewVaultItemFromOverlay(), + redirectOverlayFocusOut: ({ message }) => this.redirectOverlayFocusOut(message), + updateIsOverlayCiphersPopulated: ({ message }) => this.updateIsOverlayCiphersPopulated(message), + bgUnlockPopoutOpened: () => this.blurAndRemoveOverlay(), + bgVaultItemRepromptPopoutOpened: () => this.blurAndRemoveOverlay(), + }; + + /** + * AutofillInit constructor. Initializes the DomElementVisibilityService, + * CollectAutofillContentService and InsertAutofillContentService classes. + * + * @param autofillOverlayContentService - The autofill overlay content service, potentially undefined. + */ + constructor(autofillOverlayContentService?: AutofillOverlayContentService) { + this.autofillOverlayContentService = autofillOverlayContentService; + this.domElementVisibilityService = new DomElementVisibilityService(); + this.collectAutofillContentService = new CollectAutofillContentService( + this.domElementVisibilityService, + this.autofillOverlayContentService, + ); + this.insertAutofillContentService = new InsertAutofillContentService( + this.domElementVisibilityService, + this.collectAutofillContentService, + ); + } + + /** + * Initializes the autofill content script, setting up + * the extension message listeners. This method should + * be called once when the content script is loaded. + */ + init() { + this.setupExtensionMessageListeners(); + this.autofillOverlayContentService?.init(); + } + + /** + * Collects the page details and sends them to the + * extension background script. If the `sendDetailsInResponse` + * parameter is set to true, the page details will be + * returned to facilitate sending the details in the + * response to the extension message. + * + * @param message - The extension message. + * @param sendDetailsInResponse - Determines whether to send the details in the response. + */ + private async collectPageDetails( + message: AutofillExtensionMessage, + sendDetailsInResponse = false, + ): Promise { + const pageDetails: AutofillPageDetails = + await this.collectAutofillContentService.getPageDetails(); + if (sendDetailsInResponse) { + return pageDetails; + } + + chrome.runtime.sendMessage({ + command: "collectPageDetailsResponse", + tab: message.tab, + details: pageDetails, + sender: message.sender, + }); + } + + /** + * Fills the form with the given fill script. + * + * @param {AutofillExtensionMessage} message + */ + private async fillForm({ fillScript, pageDetailsUrl }: AutofillExtensionMessage) { + if ((document.defaultView || window).location.href !== pageDetailsUrl) { + return; + } + + this.updateOverlayIsCurrentlyFilling(true); + await this.insertAutofillContentService.fillForm(fillScript); + + if (!this.autofillOverlayContentService) { + return; + } + + setTimeout(() => { + this.updateOverlayIsCurrentlyFilling(false); + this.autofillOverlayContentService.focusMostRecentOverlayField(); + }, 250); + } + + /** + * Handles updating the overlay is currently filling value. + * + * @param isCurrentlyFilling - Indicates if the overlay is currently filling + */ + private updateOverlayIsCurrentlyFilling(isCurrentlyFilling: boolean) { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.isCurrentlyFilling = isCurrentlyFilling; + } + + /** + * Opens the autofill overlay. + * + * @param data - The extension message data. + */ + private openAutofillOverlay({ data }: AutofillExtensionMessage) { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.openAutofillOverlay(data); + } + + /** + * Blurs the most recent overlay field and removes the overlay. Used + * in cases where the background unlock or vault item reprompt popout + * is opened. + */ + private blurAndRemoveOverlay() { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.blurMostRecentOverlayField(); + this.removeAutofillOverlay(); + } + + /** + * Removes the autofill overlay if the field is not currently focused. + * If the autofill is currently filling, only the overlay list will be + * removed. + */ + private removeAutofillOverlay(message?: AutofillExtensionMessage) { + if (message?.data?.forceCloseOverlay) { + this.autofillOverlayContentService?.removeAutofillOverlay(); + return; + } + + if ( + !this.autofillOverlayContentService || + this.autofillOverlayContentService.isFieldCurrentlyFocused + ) { + return; + } + + if (this.autofillOverlayContentService.isCurrentlyFilling) { + this.autofillOverlayContentService.removeAutofillOverlayList(); + return; + } + + this.autofillOverlayContentService.removeAutofillOverlay(); + } + + /** + * Adds a new vault item from the overlay. + */ + private addNewVaultItemFromOverlay() { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.addNewVaultItem(); + } + + /** + * Redirects the overlay focus out of an overlay iframe. + * + * @param data - Contains the direction to redirect the focus. + */ + private redirectOverlayFocusOut({ data }: AutofillExtensionMessage) { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.redirectOverlayFocusOut(data?.direction); + } + + /** + * Updates whether the current tab has ciphers that can populate the overlay list + * + * @param data - Contains the isOverlayCiphersPopulated value + * + */ + private updateIsOverlayCiphersPopulated({ data }: AutofillExtensionMessage) { + if (!this.autofillOverlayContentService) { + return; + } + + this.autofillOverlayContentService.isOverlayCiphersPopulated = Boolean( + data?.isOverlayCiphersPopulated, + ); + } + + /** + * Sets up the extension message listeners for the content script. + */ + private setupExtensionMessageListeners() { + chrome.runtime.onMessage.addListener(this.handleExtensionMessage); + } + + /** + * Handles the extension messages sent to the content script. + * + * @param message - The extension message. + * @param sender - The message sender. + * @param sendResponse - The send response callback. + */ + private handleExtensionMessage = ( + message: AutofillExtensionMessage, + sender: chrome.runtime.MessageSender, + sendResponse: (response?: any) => void, + ): boolean => { + const command: string = message.command; + const handler: CallableFunction | undefined = this.extensionMessageHandlers[command]; + if (!handler) { + return; + } + + const messageResponse = handler({ message, sender }); + if (!messageResponse) { + return; + } + + Promise.resolve(messageResponse).then((response) => sendResponse(response)); + return true; + }; +} + +export default AutofillInit; diff --git a/apps/browser/src/autofill/content/autofill.css b/apps/browser/src/autofill/content/autofill.css index e495cbf5c452..cbdb776fafaf 100644 --- a/apps/browser/src/autofill/content/autofill.css +++ b/apps/browser/src/autofill/content/autofill.css @@ -34,3 +34,10 @@ span[data-bwautofill].com-bitwarden-browser-animated-fill { animation: bitwardenfill 200ms ease-in-out 0ms 1; -webkit-animation: bitwardenfill 200ms ease-in-out 0ms 1; } + +@media (prefers-reduced-motion) { + .com-bitwarden-browser-animated-fill { + animation: none; + -webkit-animation: none; + } +} diff --git a/apps/browser/src/autofill/content/autofill.js b/apps/browser/src/autofill/content/autofill.js index d9ac840c8d87..ef0fb73408b6 100644 --- a/apps/browser/src/autofill/content/autofill.js +++ b/apps/browser/src/autofill/content/autofill.js @@ -56,7 +56,12 @@ function getPageDetails(theDoc, oneShotId) { // start helpers - // get the value of a dom element's attribute + /** + * For a given element `el`, returns the value of the attribute `attrName`. + * @param {HTMLElement} el + * @param {string} attrName + * @returns {string} The value of the attribute + */ function getElementAttrValue(el, attrName) { var attrVal = el[attrName]; if ('string' == typeof attrVal) { @@ -89,7 +94,11 @@ return elType !== el.type; } - // get the value of a dom element + /** + * Returns the value of the given element. + * @param {HTMLElement} el + * @returns {any} Value of the element + */ function getElementValue(el) { switch (toLowerString(el.type)) { case 'checkbox': @@ -113,7 +122,11 @@ } } - // get all the options for a "select" element + /** + * If `el` is a `` element + */ function getSelectElementOptions(el) { if (!el.options) { return null; @@ -132,34 +145,51 @@ }; } - // get the top label + /** + * If `el` is in a data table, get the label in the row directly above it + * @param {HTMLElement} el + * @returns {string} A string containing the label, or null if not found + */ function getLabelTop(el) { var parent; + + // Traverse up the DOM until we reach either the top or the table data element containing our field for (el = el.parentElement || el.parentNode; el && 'td' != toLowerString(el.tagName);) { el = el.parentElement || el.parentNode; } + // If we reached the top, return null if (!el || void 0 === el) { return null; } + // Establish the parent of the table and make sure it's a table row parent = el.parentElement || el.parentNode; if ('tr' != parent.tagName.toLowerCase()) { return null; } + // Get the previous sibling of the table row and make sure it's a table row parent = parent.previousElementSibling; if (!parent || 'tr' != (parent.tagName + '').toLowerCase() || parent.cells && el.cellIndex >= parent.cells.length) { return null; } + // Parent is established as the row above the table data element containing our field + // Now let's traverse over to the cell in the same column as our field el = parent.cells[el.cellIndex]; + + // Get the contents of this label var elText = el.textContent || el.innerText; return elText = cleanText(elText); } - // get all the tags for a given label + /** + * Get the contents of the elements that are labels for `el` + * @param {HTMLElement} el + * @returns {string} A string containing all of the `innerText` or `textContent` values for all elements that are labels for `el` + */ function getLabelTag(el) { var docLabel, theLabels = []; @@ -207,7 +237,13 @@ }).join(''); } - // add property and value to the object if there is a value + /** + * Add property `prop` with value `val` to the object `obj` + * @param {object} obj + * @param {string} prop + * @param {any} val + * @param {*} d + */ function addProp(obj, prop, val, d) { if (0 !== d && d === val || null === val || void 0 === val) { return; @@ -216,12 +252,21 @@ obj[prop] = val; } - // lowercase helper + /** + * Converts the string `s` to lowercase + * @param {string} s + * @returns Lowercase string + */ function toLowerString(s) { return 'string' === typeof s ? s.toLowerCase() : ('' + s).toLowerCase(); } - // query the document helper + /** + * Query the document `doc` for elements matching the selector `selector` + * @param {Document} doc + * @param {string} query + * @returns {HTMLElement[]} An array of elements matching the selector + */ function queryDoc(doc, query) { var els = []; try { @@ -382,7 +427,6 @@ title: theDoc.title, url: theView.location.href, documentUrl: theDoc.location.href, - tabUrl: theView.location.href, forms: function (forms) { var formObj = {}; forms.forEach(function (f) { @@ -396,7 +440,7 @@ // get proper page title. maybe they are using the special meta tag? var theTitle = document.querySelector('[data-onepassword-title]') - if (theTitle && theTitle.dataset[DISPLAY_TITLE_ATTRIBUE]) { + if (theTitle && theTitle.dataset[DISPLAY_TITLE_ATTRIBUTE]) { pageDetails.displayTitle = theTitle.dataset.onepasswordTitle; } @@ -405,6 +449,12 @@ document.elementForOPID = getElementForOPID; + /** + * Do the event on the element. + * @param {HTMLElement} kedol The element to do the event on + * @param {string} fonor The event name + * @returns + */ function doEventOnElement(kedol, fonor) { var quebo; isFirefox ? (quebo = document.createEvent('KeyboardEvent'), quebo.initKeyEvent(fonor, true, false, null, false, false, false, false, 0, 0)) : (quebo = kedol.ownerDocument.createEvent('Events'), @@ -413,20 +463,35 @@ return quebo; } - // clean up the text + /** + * Clean up the string `s` to remove non-printable characters and whitespace. + * @param {string} s + * @returns {string} Clean text + */ function cleanText(s) { var sVal = null; s && (sVal = s.replace(/^\\s+|\\s+$|\\r?\\n.*$/gm, ''), sVal = 0 < sVal.length ? sVal : null); return sVal; } - // check the node type and adjust the array accordingly + /** + * If `el` is a text node, add the node's text to `arr`. + * If `el` is an element node, add the element's `textContent or `innerText` to `arr`. + * @param {string[]} arr An array of `textContent` or `innerText` values + * @param {HTMLElement} el The element to push to the array + */ function checkNodeType(arr, el) { var theText = ''; 3 === el.nodeType ? theText = el.nodeValue : 1 === el.nodeType && (theText = el.textContent || el.innerText); (theText = cleanText(theText)) && arr.push(theText); } + /** + * Check if `el` is a type that indicates the transition to a new section of the page. + * If so, this indicates that we should not use `el` or its children for getting autofill context for the previous element. + * @param {HTMLElement} el The element to check + * @returns {boolean} Returns `true` if `el` is an HTML element from a known set and `false` otherwise + */ function isKnownTag(el) { if (el && void 0 !== el) { var tags = 'select option input form textarea button table iframe body head script'.split(' '); @@ -444,6 +509,12 @@ } } + /** + * Recursively gather all of the text values from the elements preceding `el` in the DOM + * @param {HTMLElement} el + * @param {string[]} arr An array of `textContent` or `innerText` values + * @param {number} steps The number of steps to take up the DOM tree + */ function shiftForLeftLabel(el, arr, steps) { var sib; for (steps || (steps = 0); el && el.previousSibling;) { @@ -470,37 +541,51 @@ } } - // is a dom element visible on screen? + /** + * Determine if the element is visible. + * Visible is define as not having `display: none` or `visibility: hidden`. + * @param {HTMLElement} el + * @returns {boolean} Returns `true` if the element is visible and `false` otherwise + */ function isElementVisible(el) { var theEl = el; + // Get the top level document el = (el = el.ownerDocument) ? el.defaultView : {}; - // walk the dom tree + // walk the dom tree until we reach the top for (var elStyle; theEl && theEl !== document;) { + // Calculate the style of the element elStyle = el.getComputedStyle ? el.getComputedStyle(theEl, null) : theEl.style; + // If there's no computed style at all, we're done, as we know that it's not hidden if (!elStyle) { return true; } + // If the element's computed style includes `display: none` or `visibility: hidden`, we know it's hidden if ('none' === elStyle.display || 'hidden' == elStyle.visibility) { return false; } - // walk up + // At this point, we aren't sure if the element is hidden or not, so we need to keep walking up the tree theEl = theEl.parentNode; } return theEl === document; } - // is a dom element "viewable" on screen? + /** + * Determine if the element is "viewable" on the screen. + * "Viewable" is defined as being visible in the DOM and being within the confines of the viewport. + * @param {HTMLElement} el + * @returns {boolean} Returns `true` if the element is viewable and `false` otherwise + */ function isElementViewable(el) { var theDoc = el.ownerDocument.documentElement, - rect = el.getBoundingClientRect(), - docScrollWidth = theDoc.scrollWidth, - docScrollHeight = theDoc.scrollHeight, - leftOffset = rect.left - theDoc.clientLeft, - topOffset = rect.top - theDoc.clientTop, + rect = el.getBoundingClientRect(), // getBoundingClientRect is relative to the viewport + docScrollWidth = theDoc.scrollWidth, // scrollWidth is the width of the document including any overflow + docScrollHeight = theDoc.scrollHeight, // scrollHeight is the height of the document including any overflow + leftOffset = rect.left - theDoc.clientLeft, // How far from the left of the viewport is the element, minus the left border width? + topOffset = rect.top - theDoc.clientTop, // How far from the top of the viewport is the element, minus the top border width? theRect; if (!isElementVisible(el) || !el.offsetParent || 10 > el.clientWidth || 10 > el.clientHeight) { @@ -512,30 +597,49 @@ return false; } + // If any of the rects have a left side that is further right than the document width or a right side that is + // further left than the origin (i.e. is negative), we consider the element to be not viewable for (var i = 0; i < rects.length; i++) { if (theRect = rects[i], theRect.left > docScrollWidth || 0 > theRect.right) { return false; } } + // If the element is further left than the document width, or further down than the document height, we know that it's not viewable if (0 > leftOffset || leftOffset > docScrollWidth || 0 > topOffset || topOffset > docScrollHeight) { return false; } - // walk the tree + // Our next check is going to get the center point of the element, and then use elementFromPoint to see if the element + // is actually returned from that point. If it is, we know that it's viewable. If it isn't, we know that it's not viewable. + // If the right side of the bounding rectangle is outside the viewport, the x coordinate of the center point is the window width (minus offset) divided by 2. + // If the right side of the bounding rectangle is inside the viewport, the x coordinate of the center point is the width of the bounding rectangle divided by 2. + // If the bottom of the bounding rectangle is outside the viewport, the y coordinate of the center point is the window height (minus offset) divided by 2. + // If the bottom side of the bounding rectangle is inside the viewport, the y coordinate of the center point is the height of the bounding rectangle divided by + // We then use elementFromPoint to find the element at that point. for (var pointEl = el.ownerDocument.elementFromPoint(leftOffset + (rect.right > window.innerWidth ? (window.innerWidth - leftOffset) / 2 : rect.width / 2), topOffset + (rect.bottom > window.innerHeight ? (window.innerHeight - topOffset) / 2 : rect.height / 2)); pointEl && pointEl !== el && pointEl !== document;) { - if (pointEl.tagName && 'string' === typeof pointEl.tagName && 'label' === pointEl.tagName.toLowerCase() - && el.labels && 0 < el.labels.length) { - return 0 <= Array.prototype.slice.call(el.labels).indexOf(pointEl); - } - - // walk up - pointEl = pointEl.parentNode; + // If the element we found is a label, and the element we're checking has labels + if (pointEl.tagName && 'string' === typeof pointEl.tagName && 'label' === pointEl.tagName.toLowerCase() + && el.labels && 0 < el.labels.length) { + // Return true if the element we found is one of the labels for the element we're checking. + // This means that the element we're looking for is considered viewable + return 0 <= Array.prototype.slice.call(el.labels).indexOf(pointEl); + } + + // Walk up the DOM tree to check the parent element + pointEl = pointEl.parentNode; } + // If the for loop exited because we found the element we're looking for, return true, as it's viewable + // If the element that we found isn't the element we're looking for, it means the element we're looking for is not viewable return pointEl === el; } + /** + * Retrieve the element from the document with the specified `opid` property + * @param {number} opId + * @returns {HTMLElement} The element with the specified `opiId`, or `null` if no such element exists + */ function getElementForOPID(opId) { var theEl; if (void 0 === opId || null === opId) { @@ -561,13 +665,18 @@ } } - // get all the form elements that we care about + /** + * Query `theDoc` for form elements that we can use for autofill, ranked by importance and limited by `limit` + * @param {Document} theDoc The Document to query + * @param {number} limit The maximum number of elements to return + * @returns An array of HTMLElements + */ function getFormElements(theDoc, limit) { // START MODIFICATION var els = []; try { var elsList = theDoc.querySelectorAll('input:not([type="hidden"]):not([type="submit"]):not([type="reset"])' + - ':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, ' + + ':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, textarea, ' + 'span[data-bwautofill]'); els = Array.prototype.slice.call(elsList); } catch (e) { } @@ -603,7 +712,11 @@ // END MODIFICATION } - // focus the element and optionally restore its original value + /** + * Focus the element `el` and optionally restore its original value + * @param {HTMLElement} el + * @param {boolean} setVal Set the value of the element to its original value + */ function focusElement(el, setVal) { if (setVal) { var initialValue = el.value; @@ -628,20 +741,43 @@ // Check if URL is not secure when the original saved one was function urlNotSecure(savedURLs) { - var passwordInputs = null; - if (!savedURLs) { + if (!savedURLs || !savedURLs.length) { return false; } - return savedURLs.some(url => url?.indexOf('https://') === 0) && 'http:' === document.location.protocol && (passwordInputs = document.querySelectorAll('input[type=password]'), - 0 < passwordInputs.length && (confirmResult = confirm('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.\n\nDo you still wish to fill this login?'), - 0 == confirmResult)) ? true : false; + const confirmationWarning = [ + chrome.i18n.getMessage("insecurePageWarning"), + chrome.i18n.getMessage("insecurePageWarningFillPrompt", [window.location.hostname]) + ].join('\n\n'); + + if ( + // At least one of the `savedURLs` uses SSL for the current page + savedURLs.some(url => url.startsWith(`https://${window.location.hostname}`)) && + // The current page is not using SSL + document.location.protocol === 'http:' && + // There are password inputs on the page + document.querySelectorAll('input[type=password]')?.length + ) { + // The user agrees the page is unsafe or not + return !confirm(confirmationWarning); + } + + // The page is secure + return false; } // Detect if within an iframe, and the iframe is sandboxed function isSandboxed() { - // self.origin is 'null' if inside a frame with sandboxed csp or iframe tag - return self.origin == null || self.origin === 'null'; + // self.origin is 'null' if inside a frame with sandboxed csp or iframe tag + if (String(self.origin).toLowerCase() === "null") { + return true; + } + + if (window.frameElement?.hasAttribute("sandbox")) { + return true; + } + + return location.hostname === ""; } function doFill(fillScript) { @@ -660,6 +796,22 @@ return; } + if (fillScript.untrustedIframe) { + // confirm() is blocked by sandboxed iframes, but we don't want to fill sandboxed iframes anyway. + // If this occurs, confirm() returns false without displaying the dialog box, and autofill will be aborted. + // The browser may print a message to the console, but this is not a standard error that we can handle. + const confirmationWarning = [ + chrome.i18n.getMessage("autofillIframeWarning"), + chrome.i18n.getMessage("autofillIframeWarningTip", [window.location.hostname]) + ].join('\n\n'); + + const acceptedIframeWarning = confirm(confirmationWarning); + + if (!acceptedIframeWarning) { + return; + } + } + doOperation = function (ops, theOperation) { var op = ops[0]; if (void 0 === op) { @@ -755,7 +907,12 @@ return el ? (fillTheElement(el, op), [el]) : null; } - // do a fill by query operation + /** + * Find all elements matching `query` and fill them using the value `op` from the fill script + * @param {string} query + * @param {string} op + * @returns {HTMLElement} + */ function doFillByQuery(query, op) { var elements = selectAllFromDoc(query); return Array.prototype.map.call(Array.prototype.slice.call(elements), function (el) { @@ -764,7 +921,12 @@ }, this); } - // do a simple set value by query + /** + * Assign `valueToSet` to all elements in the DOM that match `query`. + * @param {string} query + * @param {string} valueToSet + * @returns {Array} Array of elements that were set. + */ function doSimpleSetByQuery(query, valueToSet) { var elements = selectAllFromDoc(query), arr = []; @@ -774,7 +936,11 @@ return arr; } - // focus by opid + /** + * Do a a click and focus on the element with the given `opId`. + * @param {number} opId + * @returns + */ function doFocusByOpId(opId) { var el = getElementByOpId(opId) if (el) { @@ -785,13 +951,21 @@ return null; } - // do a click by opid operation + /** + * Do a click on the element with the given `opId`. + * @param {number} opId + * @returns + */ function doClickByOpId(opId) { var el = getElementByOpId(opId); return el ? clickElement(el) ? [el] : null : null; } - // do a click by query operation + /** + * Do a `click` and `focus` on all elements that match the query. + * @param {string} query + * @returns + */ function doClickByQuery(query) { query = selectAllFromDoc(query); return Array.prototype.map.call(Array.prototype.slice.call(query), function (el) { @@ -811,7 +985,11 @@ }, styleTimeout = 200; - // fill an element + /** + * Fill an element `el` using the value `op` from the fill script + * @param {HTMLElement} el + * @param {string} op + */ function fillTheElement(el, op) { var shouldCheck; if (el && null !== op && void 0 !== op && !(el.disabled || el.a || el.readOnly)) { @@ -840,7 +1018,11 @@ } } - // do all the full operations needed + /** + * Do all the fill operations needed on the element `el`. + * @param {HTMLElement} el + * @param {*} afterValSetFunc The function to perform after the operations are complete. + */ function doAllFillOperations(el, afterValSetFunc) { setValueForElement(el); afterValSetFunc(el); @@ -860,7 +1042,12 @@ document.elementForOPID = getElementByOpId; - // normalize the event based on API support + /** + * Normalize the event based on API support + * @param {HTMLElement} el + * @param {string} eventName + * @returns {Event} A normalized event + */ function normalizeEvent(el, eventName) { var ev; if ('KeyboardEvent' in window) { @@ -882,7 +1069,11 @@ return ev; } - // set value of the given element + /** + * Simulate the entry of a value into an element. + * Clicks the element, focuses it, and then fires a keydown, keypress, and keyup event. + * @param {HTMLElement} el + */ function setValueForElement(el) { var valueToSet = el.value; clickElement(el); @@ -893,7 +1084,11 @@ el.value !== valueToSet && (el.value = valueToSet); } - // set value of the given element by using events + /** + * Simulate the entry of a value into an element by using events. + * Dispatches a keydown, keypress, and keyup event, then fires the `input` and `change` events before removing focus. + * @param {HTMLElement} el + */ function setValueForElementByEvent(el) { var valueToSet = el.value, ev1 = el.ownerDocument.createEvent('HTMLEvents'), @@ -910,7 +1105,11 @@ el.value !== valueToSet && (el.value = valueToSet); } - // click on an element + /** + * Click on an element `el` + * @param {HTMLElement} el + * @returns {boolean} Returns true if the element was clicked and false if it was not able to be clicked + */ function clickElement(el) { if (!el || el && 'function' !== typeof el.click) { return false; @@ -919,7 +1118,10 @@ return true; } - // get all fields we care about + /** + * Get all the elements on the DOM that are likely to be a password field + * @returns {Array} Array of elements + */ function getAllFields() { var r = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|passe|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i'); return Array.prototype.slice.call(selectAllFromDoc("input[type='text']")).filter(function (el) { @@ -927,7 +1129,9 @@ }, this); } - // touch all the fields + /** + * Touch all the fields + */ function touchAllFields() { getAllFields().forEach(function (el) { setValueForElement(el); @@ -936,7 +1140,11 @@ }); } - // can we see the element to apply some styling? + /** + * Determine if we can apply styling to `el` to indicate that it was filled. + * @param {HTMLElement} el + * @returns {boolean} Returns true if we can see the element to apply styling. + */ function canSeeElementToStyle(el) { var currentEl; if (currentEl = animateTheFilling) { @@ -965,7 +1173,11 @@ return currentEl ? -1 !== 'email text password number tel url'.split(' ').indexOf(el.type || '') : false; } - // find the element for this operation + /** + * Find the element for the given `opid`. + * @param {number} theOpId + * @returns {HTMLElement} The element for the given `opid`, or `null` if not found. + */ function getElementByOpId(theOpId) { var theElement; if (void 0 === theOpId || null === theOpId) { @@ -973,7 +1185,7 @@ } try { // START MODIFICATION - var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, ' + + var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, textarea, ' + 'span[data-bwautofill]')); // END MODIFICATION var filteredElements = elements.filter(function (o) { @@ -993,7 +1205,11 @@ } } - // helper for doc.querySelectorAll + /** + * Helper for doc.querySelectorAll + * @param {string} theSelector + * @returns + */ function selectAllFromDoc(theSelector) { var d = document, elements = []; try { @@ -1002,7 +1218,11 @@ return elements; } - // focus an element and optionally re-set its value after focusing + /** + * Focus an element and optionally re-set its value after focusing + * @param {HTMLElement} el + * @param {boolean} setValue Re-set the value after focusing + */ function doFocusElement(el, setValue) { if (setValue) { var existingValue = el.value; diff --git a/apps/browser/src/autofill/content/autofiller.ts b/apps/browser/src/autofill/content/autofiller.ts index 7fe9e5514a8c..7f58e72c7d32 100644 --- a/apps/browser/src/autofill/content/autofiller.ts +++ b/apps/browser/src/autofill/content/autofiller.ts @@ -1,4 +1,10 @@ -document.addEventListener("DOMContentLoaded", (event) => { +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", loadAutofiller); +} else { + loadAutofiller(); +} + +function loadAutofiller() { let pageHref: string = null; let filledThisHref = false; let delayFillTimeout: number; @@ -49,4 +55,4 @@ document.addEventListener("DOMContentLoaded", (event) => { chrome.runtime.sendMessage(msg); } } -}); +} diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts new file mode 100644 index 000000000000..5bc9fb1718fd --- /dev/null +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts @@ -0,0 +1,11 @@ +import AutofillOverlayContentService from "../services/autofill-overlay-content.service"; + +import AutofillInit from "./autofill-init"; + +(function (windowContext) { + if (!windowContext.bitwardenAutofillInit) { + const autofillOverlayContentService = new AutofillOverlayContentService(); + windowContext.bitwardenAutofillInit = new AutofillInit(autofillOverlayContentService); + windowContext.bitwardenAutofillInit.init(); + } +})(window); diff --git a/apps/browser/src/autofill/content/bootstrap-autofill.ts b/apps/browser/src/autofill/content/bootstrap-autofill.ts new file mode 100644 index 000000000000..3264c77ea0ec --- /dev/null +++ b/apps/browser/src/autofill/content/bootstrap-autofill.ts @@ -0,0 +1,8 @@ +import AutofillInit from "./autofill-init"; + +(function (windowContext) { + if (!windowContext.bitwardenAutofillInit) { + windowContext.bitwardenAutofillInit = new AutofillInit(); + windowContext.bitwardenAutofillInit.init(); + } +})(window); diff --git a/apps/browser/src/autofill/content/message_handler.ts b/apps/browser/src/autofill/content/message_handler.ts index 0f690bd4f79d..9bf48e3b17d4 100644 --- a/apps/browser/src/autofill/content/message_handler.ts +++ b/apps/browser/src/autofill/content/message_handler.ts @@ -10,6 +10,7 @@ window.addEventListener( command: event.data.command, code: event.data.code, state: event.data.state, + lastpass: event.data.lastpass, referrer: event.source.location.hostname, }); } @@ -23,11 +24,11 @@ window.addEventListener( }); } }, - false + false, ); const forwardCommands = [ - "promptForLogin", + "bgUnlockPopoutOpened", "addToLockedVaultPendingNotifications", "unlockCompleted", "addedCipher", diff --git a/apps/browser/src/autofill/content/misc-utils.ts b/apps/browser/src/autofill/content/misc-utils.ts index b34a27a30a5b..7fe884f1d514 100644 --- a/apps/browser/src/autofill/content/misc-utils.ts +++ b/apps/browser/src/autofill/content/misc-utils.ts @@ -7,7 +7,7 @@ async function copyText(text: string) { async function onMessageListener( msg: TabMessage, sender: chrome.runtime.MessageSender, - responseCallback: (response: unknown) => void + responseCallback: (response: unknown) => void, ) { switch (msg.command) { case "copyText": diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 5a6d519b75e4..92e8f5993858 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -1,15 +1,45 @@ -import AddLoginRuntimeMessage from "../../background/models/addLoginRuntimeMessage"; -import ChangePasswordRuntimeMessage from "../../background/models/changePasswordRuntimeMessage"; - -document.addEventListener("DOMContentLoaded", (event) => { - if (window.location.hostname.endsWith("vault.bitwarden.com")) { - return; - } - - const pageDetails: any[] = []; - const formData: any[] = []; +import AutofillField from "../models/autofill-field"; +import { WatchedForm } from "../models/watched-form"; +import AddLoginRuntimeMessage from "../notification/models/add-login-runtime-message"; +import ChangePasswordRuntimeMessage from "../notification/models/change-password-runtime-message"; +import { FormData } from "../services/abstractions/autofill.service"; +import { GlobalSettings, UserSettings } from "../types"; + +interface HTMLElementWithFormOpId extends HTMLElement { + formOpId: string; +} + +/** + * @fileoverview This file contains the code for the Bitwarden Notification Bar content script. + * The notification bar is used to notify logged in users that they can + * save a new login, change a existing password on a password change screen, + * or update an existing login after detecting a different password on login. + * + * Note: content scripts are reloaded on non-SPA page change. + */ + +/* + * Run content script when the DOM is fully loaded + * + * The DOMContentLoaded event fires when the HTML document has been completely parsed, + * and all deferred scripts (