diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml
index 412f166629e..05b89d66c33 100644
--- a/.github/workflows/build-browser.yml
+++ b/.github/workflows/build-browser.yml
@@ -38,7 +38,7 @@ defaults:
jobs:
cloc:
name: CLOC
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- name: Checkout repo
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
@@ -54,7 +54,7 @@ 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 }}
@@ -71,7 +71,7 @@ jobs:
locales-test:
name: Locales Test
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
needs:
- setup
defaults:
@@ -108,7 +108,7 @@ jobs:
build:
name: Build
- runs-on: windows-2019
+ runs-on: ubuntu-22.04
needs:
- setup
- locales-test
@@ -137,6 +137,7 @@ jobs:
run: |
node --version
npm --version
+ node-gyp --version
- name: NPM setup
run: npm ci
@@ -152,24 +153,27 @@ jobs:
run: gulp ci
- name: Build sources for reviewers
- shell: cmd
run: |
- REM Remove ".git" directory
- rmdir /S /Q ".git"
+ # Include hidden files in glob copy
+ shopt -s dotglob
- REM Copy root level files to source directory
+ # Remove ".git" directory
+ rm -r .git
+
+ # Copy root level files to source directory
mkdir browser-source
- copy * browser-source
+ FILES=$(find . -maxdepth 1 -type f)
+ for FILE in $FILES; do cp "$FILE" browser-source/; done
- REM Copy apps\browser to Browser source directory
- mkdir browser-source\apps\browser
- xcopy apps\browser\* browser-source\apps\browser /E
+ # Copy apps/browser to Browser source directory
+ mkdir -p browser-source/apps/browser
+ cp -r apps/browser/* browser-source/apps/browser
- REM Copy libs to Browser source directory
- mkdir browser-source\libs
- xcopy libs\* browser-source\libs /E
+ # Copy libs to Browser source directory
+ mkdir browser-source/libs
+ cp -r libs/* browser-source/libs
- call 7z a browser-source.zip "browser-source\*"
+ zip -r browser-source.zip browser-source
working-directory: ./
- name: Upload Opera artifact
@@ -339,7 +343,7 @@ 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
@@ -354,7 +358,7 @@ jobs:
- name: Retrieve secrets
id: retrieve-secrets
- uses: bitwarden/gh-actions/get-keyvault-secrets@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
+ uses: bitwarden/gh-actions/get-keyvault-secrets@37ffa14164a7308bc273829edfe75c97cd562375
with:
keyvault: "bitwarden-ci"
secrets: "crowdin-api-token"
@@ -374,7 +378,7 @@ jobs:
check-failures:
name: Check for failures
if: always()
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
needs:
- cloc
- setup
@@ -416,7 +420,7 @@ jobs:
- name: Retrieve secrets
id: retrieve-secrets
if: failure()
- uses: bitwarden/gh-actions/get-keyvault-secrets@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
+ uses: bitwarden/gh-actions/get-keyvault-secrets@37ffa14164a7308bc273829edfe75c97cd562375
with:
keyvault: "bitwarden-ci"
secrets: "devops-alerts-slack-webhook-url"
diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml
index 20f3f7efac5..407f81deb60 100644
--- a/.github/workflows/release-browser.yml
+++ b/.github/workflows/release-browser.yml
@@ -22,7 +22,7 @@ defaults:
jobs:
setup:
name: Setup
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
outputs:
release-version: ${{ steps.version.outputs.version }}
steps:
@@ -41,7 +41,7 @@ jobs:
- name: Check Release Version
id: version
- uses: bitwarden/gh-actions/release-version-check@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
+ uses: bitwarden/gh-actions/release-version-check@58a2fdfbd3f1fc7e6727bc5dc51d159f4df07072
with:
release-type: ${{ github.event.inputs.release_type }}
project-type: ts
@@ -52,7 +52,7 @@ jobs:
locales-test:
name: Locales Test
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
needs: setup
steps:
- name: Checkout repo
@@ -86,7 +86,7 @@ jobs:
release:
name: Create GitHub Release
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
needs:
- setup
- locales-test
diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml
index 99119725a3e..22b76f46408 100644
--- a/.github/workflows/release-desktop.yml
+++ b/.github/workflows/release-desktop.yml
@@ -56,7 +56,7 @@ jobs:
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- name: Branch check
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
run: |
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-desktop" ]]; then
echo "==================================="
@@ -69,7 +69,7 @@ jobs:
id: version
uses: bitwarden/gh-actions/release-version-check@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
- release-type: ${{ github.event.inputs.release_type }}
+ release-type: ${{ inputs.release_type }}
project-type: ts
file: apps/desktop/src/package.json
monorepo: true
@@ -93,7 +93,7 @@ jobs:
esac
- name: Create GitHub deployment
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5
id: deployment
with:
@@ -122,7 +122,7 @@ jobs:
cf-prod-account"
- name: Download all artifacts
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -131,7 +131,7 @@ jobs:
path: apps/desktop/artifacts
- name: Dry Run - Download all artifacts
- if: ${{ github.event.inputs.release_type == 'Dry Run' }}
+ if: ${{ inputs.release_type == 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -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: ${{ 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: ${{ inputs.release_type != 'Dry Run' && 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: ${{ inputs.release_type != 'Dry Run' && 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 }}
@@ -192,7 +192,7 @@ jobs:
- name: Create Release
uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0
- if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' && inputs.github_release }}
+ if: ${{ steps.release-channel.outputs.channel == 'latest' && inputs.release_type != 'Dry Run' && inputs.github_release == 'true' }}
env:
PKG_VERSION: ${{ steps.version.outputs.version }}
RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }}
@@ -230,7 +230,7 @@ jobs:
draft: true
- name: Update deployment status to Success
- if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }}
+ if: ${{ inputs.release_type != 'Dry Run' && success() }}
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
with:
token: '${{ secrets.GITHUB_TOKEN }}'
@@ -238,7 +238,7 @@ jobs:
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
- if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }}
+ if: ${{ inputs.release_type != 'Dry Run' && failure() }}
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
with:
token: '${{ secrets.GITHUB_TOKEN }}'
@@ -249,7 +249,7 @@ jobs:
name: Deploy Snap
runs-on: ubuntu-22.04
needs: setup
- if: inputs.snap_publish
+ if: ${{ inputs.snap_publish == 'true' }}
env:
_PKG_VERSION: ${{ needs.setup.outputs.release-version }}
steps:
@@ -278,7 +278,7 @@ jobs:
working-directory: apps/desktop
- name: Download Snap artifact
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -288,7 +288,7 @@ jobs:
path: apps/desktop/dist
- name: Dry Run - Download Snap artifact
- if: ${{ github.event.inputs.release_type == 'Dry Run' }}
+ if: ${{ inputs.release_type == 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -298,7 +298,7 @@ jobs:
path: apps/desktop/dist
- name: Deploy to Snap Store
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }}
run: |
@@ -310,7 +310,7 @@ jobs:
name: Deploy Choco
runs-on: windows-2019
needs: setup
- if: inputs.choco_publish
+ if: ${{ inputs.choco_publish == 'true' }}
env:
_PKG_VERSION: ${{ needs.setup.outputs.release-version }}
steps:
@@ -346,7 +346,7 @@ jobs:
working-directory: apps/desktop
- name: Download choco artifact
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -356,7 +356,7 @@ jobs:
path: apps/desktop/dist
- name: Dry Run - Download choco artifact
- if: ${{ github.event.inputs.release_type == 'Dry Run' }}
+ if: ${{ inputs.release_type == 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
with:
workflow: build-desktop.yml
@@ -366,7 +366,7 @@ jobs:
path: apps/desktop/dist
- name: Push to Chocolatey
- if: ${{ github.event.inputs.release_type != 'Dry Run' }}
+ if: ${{ inputs.release_type != 'Dry Run' }}
shell: pwsh
run: choco push --source=https://push.chocolatey.org/
working-directory: apps/desktop/dist
diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml
index 857099db511..7b1a787d946 100644
--- a/.github/workflows/version-auto-bump.yml
+++ b/.github/workflows/version-auto-bump.yml
@@ -44,4 +44,5 @@ jobs:
uses: ./.github/workflows/version-bump.yml
with:
version_number: ${{ needs.setup.outputs.version_number }}
- client: "Desktop"
+ bump_desktop: true
+ secrets: inherit
diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml
index 420ef456ec0..563facdb40c 100644
--- a/.github/workflows/version-bump.yml
+++ b/.github/workflows/version-bump.yml
@@ -4,16 +4,22 @@ name: Version Bump
on:
workflow_dispatch:
inputs:
- client:
- description: "Client Project"
- required: true
- type: choice
- options:
- - Browser
- - CLI
- - Desktop
- - Web
- - All
+ bump_browser:
+ description: "Browser Project Version Bump"
+ type: boolean
+ default: false
+ bump_cli:
+ description: "CLI Project Version Bump"
+ type: boolean
+ default: false
+ bump_desktop:
+ description: "Desktop Project Version Bump"
+ type: boolean
+ default: false
+ bump_web:
+ description: "Web Project Version Bump"
+ type: boolean
+ default: false
version_number:
description: "New Version"
required: true
@@ -23,9 +29,10 @@ on:
version_number:
required: true
type: string
- client:
- required: true
- type: string
+ bump_desktop:
+ description: "Desktop Project Version Bump"
+ type: boolean
+ default: false
defaults:
run:
@@ -33,8 +40,8 @@ defaults:
jobs:
bump_version:
- name: "Bump ${{ github.event.inputs.client }} Version"
- runs-on: ubuntu-20.04
+ name: "Bump Version"
+ runs-on: ubuntu-22.04
steps:
- name: Checkout Branch
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
@@ -42,7 +49,7 @@ jobs:
- name: Login to Azure - Prod Subscription
uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7
with:
- creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
+ creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
- name: Retrieve secrets
id: retrieve-secrets
@@ -62,13 +69,27 @@ jobs:
- name: Create Version Branch
id: branch
env:
- CLIENT_NAME: ${{ github.event.inputs.client }}
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
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}
+ BRANCH=version_bump_${VERSION}_${GITHUB_SHA:0:7}
+ echo "branch=$BRANCH" >> $GITHUB_OUTPUT
+ git switch -c ${BRANCH}
########################
# VERSION BUMP SECTION #
@@ -76,27 +97,27 @@ jobs:
### Browser
- name: Bump Browser Version
- if: ${{ github.event.inputs.client == 'Browser' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_browser == true }}
env:
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
run: npm version --workspace=@bitwarden/browser ${VERSION}
- name: Bump Browser Version - Manifest
- if: ${{ github.event.inputs.client == 'Browser' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_browser == true }}
uses: bitwarden/gh-actions/version-bump@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
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' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_browser == true }}
uses: bitwarden/gh-actions/version-bump@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
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' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_browser == true }}
run: |
npm install -g prettier
prettier --write apps/browser/src/manifest.json
@@ -104,30 +125,30 @@ jobs:
### CLI
- name: Bump CLI Version
- if: ${{ github.event.inputs.client == 'CLI' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_cli == true }}
env:
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
run: npm version --workspace=@bitwarden/cli ${VERSION}
### Desktop
- name: Bump Desktop Version - Root
- if: ${{ github.event.inputs.client == 'Desktop' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_desktop == true }}
env:
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
run: npm version --workspace=@bitwarden/desktop ${VERSION}
- name: Bump Desktop Version - App
- if: ${{ github.event.inputs.client == 'Desktop' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_desktop == true }}
env:
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
run: npm version ${VERSION}
working-directory: "apps/desktop/src"
### Web
- name: Bump Web Version
- if: ${{ github.event.inputs.client == 'Web' || github.event.inputs.client == 'All' }}
+ if: ${{ inputs.bump_web == true }}
env:
- VERSION: ${{ github.event.inputs.version_number }}
+ VERSION: ${{ inputs.version_number }}
run: npm version --workspace=@bitwarden/web-vault ${VERSION}
########################
@@ -151,27 +172,26 @@ jobs:
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
env:
CLIENT: ${{ steps.branch.outputs.client }}
- VERSION: ${{ github.event.inputs.version_number }}
+ 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}
+ BRANCH: ${{ steps.branch.outputs.branch }}
+ run: git push -u origin ${BRANCH}
- name: Create Bump Version PR
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
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 }}"
+ BRANCH: ${{ steps.branch.outputs.branch }}
+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+ TITLE: "Bump ${{ steps.branch.outputs.client }} version to ${{ inputs.version_number }}"
run: |
gh pr create --title "$TITLE" \
- --base "$BASE" \
- --head "$PR_BRANCH" \
+ --base "$BASE_BRANCH" \
+ --head "$BRANCH" \
--label "version update" \
--label "automated pr" \
--body "
@@ -183,5 +203,4 @@ jobs:
- [X] Other
## Objective
- Automated ${{ github.event.inputs.client }} version bump to ${{ github.event.inputs.version_number }}"
-
+ Automated ${{ steps.branch.outputs.client }} version bump to ${{ inputs.version_number }}"
diff --git a/apps/browser/package.json b/apps/browser/package.json
index 2e866653cd3..cec3a9caab1 100644
--- a/apps/browser/package.json
+++ b/apps/browser/package.json
@@ -1,12 +1,11 @@
{
"name": "@bitwarden/browser",
- "version": "2023.8.2",
+ "version": "2023.8.3",
"scripts": {
"build": "webpack",
"build:mv3": "cross-env MANIFEST_VERSION=3 webpack",
"build:watch": "webpack --watch",
"build:watch:mv3": "cross-env MANIFEST_VERSION=3 webpack --watch",
- "build:watch:autofill": "cross-env AUTOFILL_VERSION=2 webpack --watch",
"build:prod": "cross-env NODE_ENV=production webpack",
"build:prod:watch": "cross-env NODE_ENV=production webpack --watch",
"dist": "npm run build:prod && gulp dist",
@@ -19,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/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json
index 2b6c041a06d..6bb0efb8fd3 100644
--- a/apps/browser/src/_locales/ar/messages.json
+++ b/apps/browser/src/_locales/ar/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات."
},
- "ppremiumSignUpTwoStep": {
- "message": "خيارات تسجيل الدخول الإضافية من خطوتين مثل YubiKey و FIDO U2F و Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "نظافة كلمة المرور، صحة الحساب، وتقارير خرق البيانات للحفاظ على سلامة خزنتك."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "إصدار الخادم"
},
- "selfHosted": {
- "message": "استضافة ذاتية"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json
index 347fc449fa4..4ee8ab8edaf 100644
--- a/apps/browser/src/_locales/az/messages.json
+++ b/apps/browser/src/_locales/az/messages.json
@@ -795,8 +795,8 @@
"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ı."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server Versiyası"
},
- "selfHosted": {
- "message": "Öz-özünə sahiblik edən"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Üçüncü tərəf"
diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json
index 1df3d80b2e0..e57ea2eff54 100644
--- a/apps/browser/src/_locales/be/messages.json
+++ b/apps/browser/src/_locales/be/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 ГБ зашыфраванага сховішча для далучаных файлаў."
},
- "ppremiumSignUpTwoStep": {
- "message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Версія сервера"
},
- "selfHosted": {
- "message": "Уласнае размяшчэнне"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Іншы пастаўшчык"
diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json
index ee3049ffe22..9e4d696193e 100644
--- a/apps/browser/src/_locales/bg/messages.json
+++ b/apps/browser/src/_locales/bg/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB пространство за файлове, които се шифрират."
},
- "ppremiumSignUpTwoStep": {
- "message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Частно двустепенно удостоверяване чрез YubiKey и Duo."
},
"ppremiumSignUpReports": {
"message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Версия на сървъра"
},
- "selfHosted": {
- "message": "Собствен хостинг"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json
index a7b49de5ab3..261ceea180d 100644
--- a/apps/browser/src/_locales/bn/messages.json
+++ b/apps/browser/src/_locales/bn/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।"
},
- "ppremiumSignUpTwoStep": {
- "message": "YubiKey, FIDO U2F, ও Duo এর মতো অতিরিক্ত দ্বি-পদক্ষেপ লগইন বিকল্পগুলি।"
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "আপনার ভল্টটি সুরক্ষিত রাখতে পাসওয়ার্ড স্বাস্থ্যকরন, অ্যাকাউন্ট স্বাস্থ্য এবং ডেটা লঙ্ঘনের প্রতিবেদন।"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json
index cf2b0fd8a52..5b27e7186d4 100644
--- a/apps/browser/src/_locales/bs/messages.json
+++ b/apps/browser/src/_locales/bs/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json
index f00775b993e..7a7edc3d896 100644
--- a/apps/browser/src/_locales/ca/messages.json
+++ b/apps/browser/src/_locales/ca/messages.json
@@ -339,7 +339,7 @@
"message": "Altres"
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
- "message": "Set up an unlock method to change your vault timeout action."
+ "message": "Configura un mètode de desbloqueig per canviar l'acció del temps d'espera de la caixa forta."
},
"rateExtension": {
"message": "Valora aquesta extensió"
@@ -634,10 +634,10 @@
"message": "Actualitza"
},
"notificationUnlockDesc": {
- "message": "Unlock your Bitwarden vault to complete the auto-fill request."
+ "message": "Desbloquegeu la vostra caixa forta de Bitwarden per completar la sol·licitud d'emplenament automàtic."
},
"notificationUnlock": {
- "message": "Unlock"
+ "message": "Desbloqueja"
},
"enableContextMenuItem": {
"message": "Mostra les opcions del menú contextual"
@@ -795,8 +795,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."
@@ -1606,10 +1606,10 @@
"message": "La biometria del navegador no és compatible amb aquest dispositiu."
},
"biometricsFailedTitle": {
- "message": "Biometrics failed"
+ "message": "La biometria ha fallat"
},
"biometricsFailedDesc": {
- "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support."
+ "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"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versió del servidor"
},
- "selfHosted": {
- "message": "Autoallotjat"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tercers"
@@ -2153,7 +2153,7 @@
"message": "S'ha enviat una notificació al vostre dispositiu."
},
"loginInitiated": {
- "message": "Login initiated"
+ "message": "S'ha iniciat la sessió"
},
"exposedMasterPassword": {
"message": "Contrasenya mestra exposada"
@@ -2234,34 +2234,34 @@
}
},
"loggingInOn": {
- "message": "Logging in on"
+ "message": "Inici de sessió en"
},
"opensInANewWindow": {
"message": "S'obri en una finestra nova"
},
"deviceApprovalRequired": {
- "message": "Device approval required. Select an approval option below:"
+ "message": "Cal l'aprovació del dispositiu. Seleccioneu una opció d'aprovació a continuació:"
},
"rememberThisDevice": {
- "message": "Remember this device"
+ "message": "Recorda aquest dispositiu"
},
"uncheckIfPublicDevice": {
- "message": "Uncheck if using a public device"
+ "message": "Desmarqueu si utilitzeu un dispositiu públic"
},
"approveFromYourOtherDevice": {
- "message": "Approve from your other device"
+ "message": "Aproveu des d'un altre dispositiu vostre"
},
"requestAdminApproval": {
- "message": "Request admin approval"
+ "message": "Sol·liciteu l'aprovació de l'administrador"
},
"approveWithMasterPassword": {
- "message": "Approve with master password"
+ "message": "Aprova amb contrasenya mestra"
},
"ssoIdentifierRequired": {
- "message": "Organization SSO identifier is required."
+ "message": "Es requereix un identificador SSO de l'organització."
},
"eu": {
- "message": "EU",
+ "message": "UE",
"description": "European Union"
},
"usDomain": {
@@ -2280,28 +2280,28 @@
"message": "Mostra"
},
"accountSuccessfullyCreated": {
- "message": "Account successfully created!"
+ "message": "Compte creat correctament!"
},
"adminApprovalRequested": {
- "message": "Admin approval requested"
+ "message": "S'ha sol·licitat l'aprovació de l'administrador"
},
"adminApprovalRequestSentToAdmins": {
- "message": "Your request has been sent to your admin."
+ "message": "La vostra sol·licitud s'ha enviat a l'administrador."
},
"youWillBeNotifiedOnceApproved": {
- "message": "You will be notified once approved."
+ "message": "Se us notificarà una vegada aprovat."
},
"troubleLoggingIn": {
- "message": "Trouble logging in?"
+ "message": "Teniu problemes per iniciar la sessió?"
},
"loginApproved": {
- "message": "Login approved"
+ "message": "S'ha aprovat l'inici de sessió"
},
"userEmailMissing": {
- "message": "User email missing"
+ "message": "Falta el correu electrònic de l'usuari"
},
"deviceTrusted": {
- "message": "Device trusted"
+ "message": "Dispositiu de confiança"
},
"inputRequired": {
"message": "L'entrada és obligatòria."
diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json
index 4d642f35640..253aab484b7 100644
--- a/apps/browser/src/_locales/cs/messages.json
+++ b/apps/browser/src/_locales/cs/messages.json
@@ -795,8 +795,8 @@
"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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Verze serveru"
},
- "selfHosted": {
- "message": "Vlastní hosting"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tretí strana"
diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json
index 6b278cbd93b..7861a5e758b 100644
--- a/apps/browser/src/_locales/cy/messages.json
+++ b/apps/browser/src/_locales/cy/messages.json
@@ -7,7 +7,7 @@
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
},
"extDesc": {
- "message": "A secure and free password manager for all of your devices.",
+ "message": "Rheolydd cyfrineiriau diogel a rhad ac am ddim ar gyfer eich holl ddyfeisiau.",
"description": "Extension description"
},
"loginOrCreateNewAccount": {
@@ -29,7 +29,7 @@
"message": "Cau"
},
"submit": {
- "message": "Submit"
+ "message": "Cyflwyno"
},
"emailAddress": {
"message": "Cyfeiriad ebost"
@@ -227,10 +227,10 @@
"message": "Cell we Bitwarden"
},
"importItems": {
- "message": "Import items"
+ "message": "Mewnforio eitemau"
},
"select": {
- "message": "Select"
+ "message": "Dewis"
},
"generatePassword": {
"message": "Cynhyrchu cyfrinair"
@@ -345,7 +345,7 @@
"message": "Rate the extension"
},
"rateExtensionDesc": {
- "message": "Please consider helping us out with a good review!"
+ "message": "Ystyriwch ein helpu ni gydag adolygiad da!"
},
"browserNotSupportClipboard": {
"message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
@@ -360,7 +360,7 @@
"message": "Datgloi"
},
"loggedInAsOn": {
- "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "message": "Wedi mewngofnodi gyda $EMAIL$ ar $HOSTNAME$.",
"placeholders": {
"email": {
"content": "$1",
@@ -379,7 +379,7 @@
"message": "Cloi'r gell"
},
"lockNow": {
- "message": "Lock now"
+ "message": "Cloi nawr"
},
"immediately": {
"message": "ar unwaith"
@@ -427,7 +427,7 @@
"message": "Diogelwch"
},
"errorOccurred": {
- "message": "An error has occurred"
+ "message": "Bu gwall"
},
"emailRequired": {
"message": "Mae angen cyfeiriad ebost."
@@ -513,13 +513,13 @@
"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"
+ "message": "Ffolder wedi'i chadw"
},
"deleteFolderConfirmation": {
"message": "Are you sure you want to delete this folder?"
},
"deletedFolder": {
- "message": "Folder deleted"
+ "message": "Ffolder wedi'i dileu"
},
"gettingStartedTutorial": {
"message": "Getting started tutorial"
@@ -534,7 +534,7 @@
"message": "Syncing failed"
},
"passwordCopied": {
- "message": "Password copied"
+ "message": "Cyfrinair wedi'i gopïo"
},
"uri": {
"message": "URI"
@@ -553,10 +553,10 @@
"message": "URI newydd"
},
"addedItem": {
- "message": "Item added"
+ "message": "Eitem wedi'i hychwanegu"
},
"editedItem": {
- "message": "Item saved"
+ "message": "Eitem wedi'i chadw"
},
"deleteItemConfirmation": {
"message": "Ydych chi wir eisiau anfon i'r sbwriel?"
@@ -565,13 +565,13 @@
"message": "Anfonwyd yr eitem i'r sbwriel"
},
"overwritePassword": {
- "message": "Overwrite password"
+ "message": "Trosysgrifo'r cyfrinair"
},
"overwritePasswordConfirmation": {
"message": "Are you sure you want to overwrite the current password?"
},
"overwriteUsername": {
- "message": "Overwrite username"
+ "message": "Trosysgrifo'r enw defnyddiwr"
},
"overwriteUsernameConfirmation": {
"message": "Are you sure you want to overwrite the current username?"
@@ -608,7 +608,7 @@
"message": "List identity items on the Tab page for easy auto-fill."
},
"clearClipboard": {
- "message": "Clear clipboard",
+ "message": "Clirio'r clipfwrdd",
"description": "Clipboard is the operating system thing where you copy/paste data to on your device."
},
"clearClipboardDesc": {
@@ -637,7 +637,7 @@
"message": "Unlock your Bitwarden vault to complete the auto-fill request."
},
"notificationUnlock": {
- "message": "Unlock"
+ "message": "Datgloi"
},
"enableContextMenuItem": {
"message": "Show context menu options"
@@ -711,7 +711,7 @@
"message": "Rhannu"
},
"movedItemToOrg": {
- "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "message": "Symudwyd $ITEMNAME$ i $ORGNAME$",
"placeholders": {
"itemname": {
"content": "$1",
@@ -751,10 +751,10 @@
"message": "Attachment deleted"
},
"newAttachment": {
- "message": "Add new attachment"
+ "message": "Ychwanegu atodiad newydd"
},
"noAttachments": {
- "message": "No attachments."
+ "message": "Dim atodiadau."
},
"attachmentSaved": {
"message": "Attachment saved"
@@ -763,7 +763,7 @@
"message": "Ffeil"
},
"selectFile": {
- "message": "Select a file"
+ "message": "Dewis ffeil"
},
"maxFileSize": {
"message": "Maximum file size is 500 MB."
@@ -787,40 +787,40 @@
"message": "Adnewyddu'ch aelodaeth"
},
"premiumNotCurrentMember": {
- "message": "You are not currently a Premium member."
+ "message": "Does gennych chi ddim aeloaeth uwch ar hyn o bryd."
},
"premiumSignUpAndGet": {
- "message": "Sign up for a Premium membership and get:"
+ "message": "Cofrestrwch ar gyfer aelodaeth uwch i gael:"
},
"ppremiumSignUpStorage": {
- "message": "1 GB encrypted storage for file attachments."
+ "message": "Storfa 1GB wedi'i hamgryptio ar gyfer atodiadau ffeiliau."
},
- "ppremiumSignUpTwoStep": {
- "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ "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": "TOTP verification code (2FA) generator for logins in your vault."
+ "message": "Cynhyrchydd codau dilysu TOTP (2FA) ar gyfer manylion mewngofnodi yn eich cell."
},
"ppremiumSignUpSupport": {
- "message": "Priority customer support."
+ "message": "Cymorth wedi'i flaenoriaethu."
},
"ppremiumSignUpFuture": {
"message": "All future Premium features. More coming soon!"
},
"premiumPurchase": {
- "message": "Purchase Premium"
+ "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": "You are a Premium member!"
+ "message": "Mae gennych aelodaeth uwch!"
},
"premiumCurrentMemberThanks": {
- "message": "Thank you for supporting Bitwarden."
+ "message": "Diolch am gefnogi Bitwarden."
},
"premiumPrice": {
"message": "Hyn oll am $PRICE$ y flwyddyn!",
@@ -844,10 +844,10 @@
"message": "Ask for biometrics on launch"
},
"premiumRequired": {
- "message": "Premium required"
+ "message": "Mae angen aelodaeth uwch"
},
"premiumRequiredDesc": {
- "message": "A Premium membership is required to use this feature."
+ "message": "Mae angen aelodaeth uwch i ddefnyddio'r nodwedd hon."
},
"enterVerificationCodeApp": {
"message": "Enter the 6 digit verification code from your authenticator app."
@@ -904,7 +904,7 @@
"message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
},
"twoStepOptions": {
- "message": "Two-step login options"
+ "message": "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."
@@ -1033,7 +1033,7 @@
"message": "Copy value"
},
"value": {
- "message": "Value"
+ "message": "Gwerth"
},
"newCustomField": {
"message": "Maes addasedig newydd"
@@ -1048,7 +1048,7 @@
"message": "Hidden"
},
"cfTypeBoolean": {
- "message": "Boolean"
+ "message": "Gwerth Boole"
},
"cfTypeLinked": {
"message": "Linked",
@@ -1134,7 +1134,7 @@
"message": "Cod diogelwch"
},
"ex": {
- "message": "ex."
+ "message": "engh."
},
"title": {
"message": "Teitl"
@@ -1297,7 +1297,7 @@
"message": "Starts with"
},
"regEx": {
- "message": "Regular expression",
+ "message": "Mynegiant rheolaidd",
"description": "A programming term, also known as 'RegEx'."
},
"matchDetection": {
@@ -1427,7 +1427,7 @@
"message": "Vault timeout action"
},
"lock": {
- "message": "Lock",
+ "message": "Cloi",
"description": "Verb form: to make secure or inaccesible by"
},
"trash": {
@@ -1438,13 +1438,13 @@
"message": "Chwilio drwy'r sbwriel"
},
"permanentlyDeleteItem": {
- "message": "Permanently delete item"
+ "message": "Dileu'r eitem yn barhaol"
},
"permanentlyDeleteItemConfirmation": {
"message": "Are you sure you want to permanently delete this item?"
},
"permanentlyDeletedItem": {
- "message": "Item permanently deleted"
+ "message": "Eitem wedi'i dileu'n barhaol"
},
"restoreItem": {
"message": "Adfer yr eitem"
@@ -1546,7 +1546,7 @@
"message": "Terms of Service and Privacy Policy have not been acknowledged."
},
"termsOfService": {
- "message": "Terms of Service"
+ "message": "Telerau gwasanaeth"
},
"privacyPolicy": {
"message": "Polisi preifatrwydd"
@@ -1671,7 +1671,7 @@
"description": "This text will be displayed after a Send has been accessed the maximum amount of times."
},
"expired": {
- "message": "Expired"
+ "message": "Wedi dod i ben"
},
"pendingDeletion": {
"message": "Pending deletion"
@@ -1744,10 +1744,10 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"oneDay": {
- "message": "1 day"
+ "message": "1 diwrnod"
},
"days": {
- "message": "$DAYS$ days",
+ "message": "$DAYS$ o ddyddiau",
"placeholders": {
"days": {
"content": "$1",
@@ -1854,7 +1854,7 @@
"message": "There was an error saving your deletion and expiration dates."
},
"hideEmail": {
- "message": "Hide my email address from recipients."
+ "message": "Cuddio fy nghyfeiriad ebost rhag derbynwyr."
},
"sendOptionsPolicyInEffect": {
"message": "One or more organization policies are affecting your Send options."
@@ -2007,10 +2007,10 @@
"message": "Regenerate username"
},
"generateUsername": {
- "message": "Generate username"
+ "message": "Cynhyrchu enw defnyddiwr"
},
"usernameType": {
- "message": "Username type"
+ "message": "Math o enw defnyddiwr"
},
"plusAddressedEmail": {
"message": "Plus addressed email",
@@ -2026,10 +2026,10 @@
"message": "Use your domain's configured catch-all inbox."
},
"random": {
- "message": "Random"
+ "message": "Hap"
},
"randomWord": {
- "message": "Random word"
+ "message": "Gair ar hap"
},
"websiteName": {
"message": "Website name"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
@@ -2129,7 +2129,7 @@
"message": "New around here?"
},
"rememberEmail": {
- "message": "Remember email"
+ "message": "Cofio'r ebost"
},
"loginWithDevice": {
"message": "Mewngofnodi â dyfais"
@@ -2165,19 +2165,19 @@
"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?"
+ "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": "Check known data breaches for this password"
+ "message": "Chwilio am achosion o ddatgelu data sy'n cynnwys y cyfrinair hwn"
},
"important": {
"message": "Pwysig:"
},
"masterPasswordHint": {
- "message": "Your master password cannot be recovered if you forget it!"
+ "message": "Allwch chi ddim adfer eich prif gyfrinair os caiff ei anghofio!"
},
"characterMinimum": {
- "message": "$LENGTH$ character minimum",
+ "message": "Isafswm o $LENGTH$ nod",
"placeholders": {
"length": {
"content": "$1",
@@ -2243,7 +2243,7 @@
"message": "Device approval required. Select an approval option below:"
},
"rememberThisDevice": {
- "message": "Remember this device"
+ "message": "Cofio'r ddyfais hon"
},
"uncheckIfPublicDevice": {
"message": "Uncheck if using a public device"
@@ -2261,7 +2261,7 @@
"message": "Organization SSO identifier is required."
},
"eu": {
- "message": "EU",
+ "message": "UE",
"description": "European Union"
},
"usDomain": {
@@ -2310,7 +2310,7 @@
"message": "required"
},
"search": {
- "message": "Search"
+ "message": "Chwilio"
},
"inputMinLength": {
"message": "Input must be at least $COUNT$ characters long.",
@@ -2377,19 +2377,19 @@
}
},
"selectPlaceholder": {
- "message": "-- Select --"
+ "message": "-- Dewis --"
},
"multiSelectPlaceholder": {
- "message": "-- Type to filter --"
+ "message": "-- Teipiwch i hidlo --"
},
"multiSelectLoading": {
- "message": "Retrieving options..."
+ "message": "Yn nôl dewisiadau..."
},
"multiSelectNotFound": {
- "message": "No items found"
+ "message": "Heb ganfod eitemau"
},
"multiSelectClearAll": {
- "message": "Clear all"
+ "message": "Clirio'r cyfan"
},
"plusNMore": {
"message": "+ $QUANTITY$ more",
@@ -2401,7 +2401,7 @@
}
},
"submenu": {
- "message": "Submenu"
+ "message": "Is-ddewislen"
},
"toggleCollapse": {
"message": "Toggle collapse",
diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json
index 7d258e9a5d1..df94e9aab71 100644
--- a/apps/browser/src/_locales/da/messages.json
+++ b/apps/browser/src/_locales/da/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Selv-hostet"
+ "selfHostedServer": {
+ "message": "selv-hostet"
},
"thirdParty": {
"message": "Tredjepart"
diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json
index 8dfe56577e8..7dcdbc3c51f 100644
--- a/apps/browser/src/_locales/de/messages.json
+++ b/apps/browser/src/_locales/de/messages.json
@@ -795,8 +795,8 @@
"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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server-Version"
},
- "selfHosted": {
- "message": "Selbst gehostet"
+ "selfHostedServer": {
+ "message": "selbst gehostet"
},
"thirdParty": {
"message": "Drittanbieter"
diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json
index 5295936e303..1e377c35d0d 100644
--- a/apps/browser/src/_locales/el/messages.json
+++ b/apps/browser/src/_locales/el/messages.json
@@ -339,7 +339,7 @@
"message": "Άλλες"
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
- "message": "Set up an unlock method to change your vault timeout action."
+ "message": "Ρυθμίστε μια μέθοδο ξεκλειδώματος για να αλλάξετε την ενέργεια χρονικού ορίου θησαυ/κιου."
},
"rateExtension": {
"message": "Βαθμολογήστε την επέκταση"
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία."
},
- "ppremiumSignUpTwoStep": {
- "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey, το FIDO U2F και το Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey και το Duo."
},
"ppremiumSignUpReports": {
"message": "Ασφάλεια κωδικών, υγεία λογαριασμού και αναφορές παραβίασης δεδομένων για να διατηρήσετε ασφαλές το vault σας."
@@ -1438,7 +1438,7 @@
"message": "Αναζήτηση Κάδου"
},
"permanentlyDeleteItem": {
- "message": "Μόνιμη Διαγραφή Αντικειμένου"
+ "message": "Οριστική διαγραφή αντικειμένου"
},
"permanentlyDeleteItemConfirmation": {
"message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα αυτό το στοιχείο;"
@@ -1471,13 +1471,13 @@
"message": "Προειδοποίηση: Αυτή είναι μια μη ασφαλή σελίδα HTTP και οποιαδήποτε πληροφορία υποβάλλετε μπορεί να γίνει ορατή και επεμβάσιμη από άλλους. Αυτή η σύνδεση αποθηκεύτηκε αρχικά σε μια ασφαλή (HTTPS) σελίδα."
},
"insecurePageWarningFillPrompt": {
- "message": "Do you still wish to fill this login?"
+ "message": "Θέλετε ακόμα να συμπληρώσετε αυτή τη σύνδεση;"
},
"autofillIframeWarning": {
"message": "Η φόρμα φιλοξενείται από διαφορετικό τομέα (domain) από το λινκ (uri) της αποθηκευμένης σύνδεσης σας (login). Επιλέξτε OK για αυτόματη συμπλήρωση, ή Ακύρωση για να σταματήσετε."
},
"autofillIframeWarningTip": {
- "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.",
+ "message": "Για να αποτρέψετε αυτή την προειδοποίηση στο μέλλον, αποθηκεύστε αυτό το URI, $HOSTNAME$, στο στοιχείο σύνδεσης Bitwarden σας για αυτόν τον ιστότοπο.",
"placeholders": {
"hostname": {
"content": "$1",
@@ -1486,13 +1486,13 @@
}
},
"setMasterPassword": {
- "message": "Ορισμός Κύριου Κωδικού"
+ "message": "Καθορισμός κύριου κωδικού"
},
"currentMasterPass": {
"message": "Τρέχων Κύριος Κωδικός"
},
"newMasterPass": {
- "message": "Νέος Κύριος Κωδικός"
+ "message": "Νέος κύριος κωδικός"
},
"confirmNewMasterPass": {
"message": "Επιβεβαίωση Νέου Κύριου Κωδικού"
@@ -1606,10 +1606,10 @@
"message": "Τα βιομετρικά στοιχεία του προγράμματος περιήγησης δεν υποστηρίζονται σε αυτήν τη συσκευή."
},
"biometricsFailedTitle": {
- "message": "Biometrics failed"
+ "message": "Ο βιομετρικός έλεγχος απέτυχε"
},
"biometricsFailedDesc": {
- "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support."
+ "message": "Τα βιομετρικά δεν μπόρεσαν να ολοκληρωθούν, σκεφτείτε να χρησιμοποιήσετε έναν κύριο κωδικό πρόσβασης ή να αποσυνδεθείτε. Αν αυτό εξακολουθεί να συμβαίνει, παρακαλώ επικοινωνήστε με την υποστήριξη της Bitwarden."
},
"nativeMessaginPermissionErrorTitle": {
"message": "Δεν Έχει Χορηγηθεί Άδεια"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Έκδοση διακομιστή"
},
- "selfHosted": {
- "message": "Αυτο-φιλοξενείται"
+ "selfHostedServer": {
+ "message": "αυτο-φιλοξενούμενο"
},
"thirdParty": {
"message": "Τρίτο μέρος"
@@ -2153,7 +2153,7 @@
"message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας."
},
"loginInitiated": {
- "message": "Login initiated"
+ "message": "Η σύνδεση ξεκίνησε"
},
"exposedMasterPassword": {
"message": "Εκτεθειμένος Κύριος Κωδικός Πρόσβασης"
@@ -2240,28 +2240,28 @@
"message": "Ανοίγει σε νέο παράθυρο"
},
"deviceApprovalRequired": {
- "message": "Device approval required. Select an approval option below:"
+ "message": "Απαιτείται έγκριση συσκευής. Επιλέξτε μια επιλογή έγκρισης παρακάτω:"
},
"rememberThisDevice": {
- "message": "Remember this device"
+ "message": "Απομνημόνευση αυτής της συσκευής"
},
"uncheckIfPublicDevice": {
- "message": "Uncheck if using a public device"
+ "message": "Αποεπιλέξτε αν γίνεται χρήση δημόσιας συσκευής"
},
"approveFromYourOtherDevice": {
- "message": "Approve from your other device"
+ "message": "Έγκριση από άλλη συσκευή σας"
},
"requestAdminApproval": {
- "message": "Request admin approval"
+ "message": "Αίτηση έγκρισης διαχειριστή"
},
"approveWithMasterPassword": {
- "message": "Approve with master password"
+ "message": "Έγκριση με τον κύριο κωδικό"
},
"ssoIdentifierRequired": {
- "message": "Organization SSO identifier is required."
+ "message": "Απαιτείται αναγνωριστικό οργανισμού SSO."
},
"eu": {
- "message": "EU",
+ "message": "ΕΕ",
"description": "European Union"
},
"usDomain": {
@@ -2274,46 +2274,46 @@
"message": "Δεν επιτρέπεται η πρόσβαση. Δεν έχετε άδεια για να δείτε αυτή τη σελίδα."
},
"general": {
- "message": "General"
+ "message": "Γενικά"
},
"display": {
- "message": "Display"
+ "message": "Εμφάνιση"
},
"accountSuccessfullyCreated": {
- "message": "Account successfully created!"
+ "message": "Επιτυχής δημιουργία λογαριασμού!"
},
"adminApprovalRequested": {
- "message": "Admin approval requested"
+ "message": "Ζητήθηκε έγκριση διαχειριστή"
},
"adminApprovalRequestSentToAdmins": {
- "message": "Your request has been sent to your admin."
+ "message": "Το αίτημά σας εστάλη στον διαχειριστή σας."
},
"youWillBeNotifiedOnceApproved": {
- "message": "You will be notified once approved."
+ "message": "Θα ειδοποιηθείτε μόλις εγκριθεί."
},
"troubleLoggingIn": {
- "message": "Trouble logging in?"
+ "message": "Δεν μπορείτε να συνδεθείτε;"
},
"loginApproved": {
- "message": "Login approved"
+ "message": "Η σύνδεση εγκρίθηκε"
},
"userEmailMissing": {
- "message": "User email missing"
+ "message": "Το email του χρήστη απουσιάζει"
},
"deviceTrusted": {
- "message": "Device trusted"
+ "message": "Αξιόπιστη συσκευή"
},
"inputRequired": {
- "message": "Input is required."
+ "message": "Απαιτείται εισαγωγή."
},
"required": {
- "message": "required"
+ "message": "απαιτείται"
},
"search": {
- "message": "Search"
+ "message": "Αναζήτηση"
},
"inputMinLength": {
- "message": "Input must be at least $COUNT$ characters long.",
+ "message": "Η καταχώρηση πρέπει να είναι τουλάχιστον $COUNT$ χαρακτήρες.",
"placeholders": {
"count": {
"content": "$1",
@@ -2322,7 +2322,7 @@
}
},
"inputMaxLength": {
- "message": "Input must not exceed $COUNT$ characters in length.",
+ "message": "Η καταχώρηση δεν πρέπει να υπερβαίνει τους $COUNT$ χαρακτήρες σε μήκος.",
"placeholders": {
"count": {
"content": "$1",
@@ -2331,7 +2331,7 @@
}
},
"inputForbiddenCharacters": {
- "message": "The following characters are not allowed: $CHARACTERS$",
+ "message": "Οι ακόλουθοι χαρακτήρες δεν επιτρέπονται: $CHARACTERS$",
"placeholders": {
"characters": {
"content": "$1",
@@ -2340,7 +2340,7 @@
}
},
"inputMinValue": {
- "message": "Input value must be at least $MIN$.",
+ "message": "Η τιμή καταχώρησης πρέπει να είναι τουλάχιστον $MIN$",
"placeholders": {
"min": {
"content": "$1",
@@ -2349,7 +2349,7 @@
}
},
"inputMaxValue": {
- "message": "Input value must not exceed $MAX$.",
+ "message": "Η τιμή καταχώρησης δεν πρέπει να υπερβαίνει το $MAX$.",
"placeholders": {
"max": {
"content": "$1",
@@ -2358,17 +2358,17 @@
}
},
"multipleInputEmails": {
- "message": "1 or more emails are invalid"
+ "message": "1 ή περισσότερα email δεν είναι έγκυρα"
},
"inputTrimValidator": {
- "message": "Input must not contain only whitespace.",
+ "message": "Η καταχώρηση δεν πρέπει να περιέχει μόνο κενά.",
"description": "Notification to inform the user that a form's input can't contain only whitespace."
},
"inputEmail": {
- "message": "Input is not an email address."
+ "message": "Η καταχώρηση δεν είναι διεύθυνση email."
},
"fieldsNeedAttention": {
- "message": "$COUNT$ field(s) above need your attention.",
+ "message": "$COUNT$ Το/α παραπάνω πεδίo/α χρειάζονται την προσοχή σας.",
"placeholders": {
"count": {
"content": "$1",
@@ -2377,22 +2377,22 @@
}
},
"selectPlaceholder": {
- "message": "-- Select --"
+ "message": "-- Επιλογή --"
},
"multiSelectPlaceholder": {
- "message": "-- Type to filter --"
+ "message": "-- Πληκτρολογήστε για φιλτράρισμα --"
},
"multiSelectLoading": {
- "message": "Retrieving options..."
+ "message": "Ανάκτηση επιλογών..."
},
"multiSelectNotFound": {
- "message": "No items found"
+ "message": "Δεν βρέθηκαν αντικείμενα"
},
"multiSelectClearAll": {
- "message": "Clear all"
+ "message": "Εκκαθάριση όλων"
},
"plusNMore": {
- "message": "+ $QUANTITY$ more",
+ "message": "+ $QUANTITY$ περισσότερα",
"placeholders": {
"quantity": {
"content": "$1",
@@ -2401,10 +2401,10 @@
}
},
"submenu": {
- "message": "Submenu"
+ "message": "Υπομενού"
},
"toggleCollapse": {
- "message": "Toggle collapse",
+ "message": "Εναλλαγή σύμπτυξης",
"description": "Toggling an expand/collapse state."
}
}
diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json
index b068befd0d0..c71a2af99c5 100644
--- a/apps/browser/src/_locales/en/messages.json
+++ b/apps/browser/src/_locales/en/messages.json
@@ -795,8 +795,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."
@@ -2095,8 +2095,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json
index b10b53657a3..84fee7b77c3 100644
--- a/apps/browser/src/_locales/en_GB/messages.json
+++ b/apps/browser/src/_locales/en_GB/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json
index 8d46a4cbe26..4bf280ce707 100644
--- a/apps/browser/src/_locales/en_IN/messages.json
+++ b/apps/browser/src/_locales/en_IN/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server Version"
},
- "selfHosted": {
- "message": "Self-Hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-Party"
diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json
index 71764078cf4..50b721348c8 100644
--- a/apps/browser/src/_locales/es/messages.json
+++ b/apps/browser/src/_locales/es/messages.json
@@ -795,8 +795,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": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Higiene de contraseña, salud de la cuenta e informes de violaciones de datos para mantener su caja fuerte segura."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versión del servidor"
},
- "selfHosted": {
- "message": "Autoalojado"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Aplicaciones de terceros"
diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json
index 24c15541572..f9a11297795 100644
--- a/apps/browser/src/_locales/et/messages.json
+++ b/apps/browser/src/_locales/et/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Serveri versioon"
},
- "selfHosted": {
- "message": "Enda majutatud"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Kolmanda osapoole"
diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json
index 4e5a6857c4c..987565d609d 100644
--- a/apps/browser/src/_locales/eu/messages.json
+++ b/apps/browser/src/_locales/eu/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Zerbitzariaren bertsioa"
},
- "selfHosted": {
- "message": "Ostatatze propioduna"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Hirugarrenen aplikazioak"
diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json
index b7aadc46e30..ebb75c9f893 100644
--- a/apps/browser/src/_locales/fa/messages.json
+++ b/apps/browser/src/_locales/fa/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده."
},
- "ppremiumSignUpTwoStep": {
- "message": "گزینههای ورود دو مرحلهای اضافی مانند YubiKey, FIDO U2F و Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "گزارشهای بهداشت رمز عبور، سلامت حساب و نقض دادهها برای ایمن نگهداشتن گاوصندوق شما."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "نسخه سرور"
},
- "selfHosted": {
- "message": "خود میزبان"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "شخص ثالث"
diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json
index 4ab409bfcb2..2abd01eefa6 100644
--- a/apps/browser/src/_locales/fi/messages.json
+++ b/apps/browser/src/_locales/fi/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Palvelimen versio"
},
- "selfHosted": {
- "message": "Itse ylläpidetty"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Ulkopuolinen taho"
@@ -2246,7 +2246,7 @@
"message": "Muista tämä laite"
},
"uncheckIfPublicDevice": {
- "message": "Poista käytöstä julkisilla laitteilla"
+ "message": "Poista valinta julkisilla laitteilla"
},
"approveFromYourOtherDevice": {
"message": "Hyväksy muilta laitteiltasi"
@@ -2286,7 +2286,7 @@
"message": "Hyväksyntää pyydetty ylläpidolta"
},
"adminApprovalRequestSentToAdmins": {
- "message": "Pyyntösi on välitetty ylläpidolle."
+ "message": "Pyyntösi on välitetty ylläpidollesi."
},
"youWillBeNotifiedOnceApproved": {
"message": "Saat ilmoituksen kun se on hyväksytty."
@@ -2310,7 +2310,7 @@
"message": "pakollinen"
},
"search": {
- "message": "Etsi"
+ "message": "Hae"
},
"inputMinLength": {
"message": "Syötteen tulee sisältää ainakin $COUNT$ merkkiä.",
diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json
index 802d686c5af..3f046898751 100644
--- a/apps/browser/src/_locales/fil/messages.json
+++ b/apps/browser/src/_locales/fil/messages.json
@@ -795,8 +795,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": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Pasahod higiyena, kalusugan ng account, at mga ulat sa data breach upang panatilihing ligtas ang iyong vault."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Bersyon ng server"
},
- "selfHosted": {
- "message": "Auto-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Ika-tatlong-partido"
diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json
index 67c126dd9fc..d9dcd906c10 100644
--- a/apps/browser/src/_locales/fr/messages.json
+++ b/apps/browser/src/_locales/fr/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Version du serveur"
},
- "selfHosted": {
- "message": "Auto-hébergé"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tierce partie"
diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/gl/messages.json
+++ b/apps/browser/src/_locales/gl/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json
index ebdc30e269d..d199a2e8db9 100644
--- a/apps/browser/src/_locales/he/messages.json
+++ b/apps/browser/src/_locales/he/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים."
},
- "ppremiumSignUpTwoStep": {
- "message": "אפשרויות כניסה דו שלבית מתקדמות כמו YubiKey, FIDO U2F, וגם Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json
index 7d08de998db..e1d89271f21 100644
--- a/apps/browser/src/_locales/hi/messages.json
+++ b/apps/browser/src/_locales/hi/messages.json
@@ -795,8 +795,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": "अपनी वॉल्ट को सुरक्षित रखने के लिए पासवर्ड स्वच्छता, खाता स्वास्थ्य और डेटा उल्लंघन रिपोर्ट।"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json
index 18f0d151312..ee296293572 100644
--- a/apps/browser/src/_locales/hr/messages.json
+++ b/apps/browser/src/_locales/hr/messages.json
@@ -795,8 +795,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": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Higijenu lozinki, zdravlje računa i izvještaje o krađi podatak radi zaštite svojeg trezora."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Verzija poslužitelja"
},
- "selfHosted": {
- "message": "Vlastiti poslužitelj"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json
index e32509dbbc3..62a14307f6e 100644
--- a/apps/browser/src/_locales/hu/messages.json
+++ b/apps/browser/src/_locales/hu/messages.json
@@ -795,8 +795,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": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Jelszó higiénia, fiók biztonság és adatszivárgási jelentések a széf biztonsága érdekében."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Szerver verzió"
},
- "selfHosted": {
- "message": "Saját kiszolgáló"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Harmadik fél"
diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json
index b53f92ba44c..5b1d144591d 100644
--- a/apps/browser/src/_locales/id/messages.json
+++ b/apps/browser/src/_locales/id/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json
index 75154c2453f..ad335ccd56c 100644
--- a/apps/browser/src/_locales/it/messages.json
+++ b/apps/browser/src/_locales/it/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB di spazio di archiviazione criptato per gli allegati."
},
- "ppremiumSignUpTwoStep": {
- "message": "Più opzioni di verifica 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 rapporti su violazioni di dati per mantenere sicura la tua cassaforte."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versione Server"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Terze parti"
diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json
index 93af04dd99f..629a1644510 100644
--- a/apps/browser/src/_locales/ja/messages.json
+++ b/apps/browser/src/_locales/ja/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1GB の暗号化されたファイルストレージ"
},
- "ppremiumSignUpTwoStep": {
- "message": "YubiKey、FIDO U2F、Duoなどの追加の2段階認証ログインオプション"
+ "premiumSignUpTwoStepOptions": {
+ "message": "YubiKey、Duo などのプロプライエタリな2段階認証オプション。"
},
"ppremiumSignUpReports": {
"message": "保管庫を安全に保つための、パスワードやアカウントの健全性、データ侵害に関するレポート"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "サーバーのバージョン"
},
- "selfHosted": {
- "message": "セルフホスト"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "サードパーティー"
diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json
index c8c379ec377..f950febf1f3 100644
--- a/apps/browser/src/_locales/ka/messages.json
+++ b/apps/browser/src/_locales/ka/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/km/messages.json
+++ b/apps/browser/src/_locales/km/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json
index daaf3011f6f..3635ce719ba 100644
--- a/apps/browser/src/_locales/kn/messages.json
+++ b/apps/browser/src/_locales/kn/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ."
},
- "ppremiumSignUpTwoStep": {
- "message": "ಹೆಚ್ಚುವರಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳಾದ ಯೂಬಿಕೆ, ಎಫ್ಐಡಿಒ ಯು 2 ಎಫ್, ಮತ್ತು ಡ್ಯುವೋ."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ಪಾಸ್ವರ್ಡ್ ನೈರ್ಮಲ್ಯ, ಖಾತೆ ಆರೋಗ್ಯ ಮತ್ತು ಡೇಟಾ ಉಲ್ಲಂಘನೆ ವರದಿಗಳು."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json
index 4d302bc5834..c8ad9cff366 100644
--- a/apps/browser/src/_locales/ko/messages.json
+++ b/apps/browser/src/_locales/ko/messages.json
@@ -795,8 +795,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": "보관함을 안전하게 유지하기 위한 암호 위생, 계정 상태, 데이터 유출 보고서"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json
index 72748ba4a37..b8f9c6cf12a 100644
--- a/apps/browser/src/_locales/lt/messages.json
+++ b/apps/browser/src/_locales/lt/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB užšifruotos vietos diske bylų prisegimams."
},
- "ppremiumSignUpTwoStep": {
- "message": "Papildomos dviejų žingsių prisijungimo opcijos, tokios kaip YubiKey, FIDO U2F ir Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Patentuotos dviejų žingsnių prisijungimo parinktys, tokios kaip YubiKey ir Duo."
},
"ppremiumSignUpReports": {
"message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad tavo saugyklas būtų saugus."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Trečioji šalis"
diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json
index ee46e51a6b2..dfe5405e037 100644
--- a/apps/browser/src/_locales/lv/messages.json
+++ b/apps/browser/src/_locales/lv/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB šifrētas krātuves datņu pielikumiem."
},
- "ppremiumSignUpTwoStep": {
- "message": "Tādas papildu divpakāpju pieteikš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, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Servera versija"
},
- "selfHosted": {
- "message": "Pašizvietots"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Trešās puses"
diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json
index c7b3bd91b0d..dab1da00605 100644
--- a/apps/browser/src/_locales/ml/messages.json
+++ b/apps/browser/src/_locales/ml/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്ത സംഭരണം."
},
- "ppremiumSignUpTwoStep": {
- "message": "രണ്ട്-ഘട്ട പ്രവേശന ഓപ്ഷനുകളായ Yubikey, FIDO U2F, Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "നിങ്ങളുടെ വാൾട് സൂക്ഷിക്കുന്നതിന്. പാസ്വേഡ് ശുചിത്വം, അക്കൗണ്ട് ആരോഗ്യം, ഡാറ്റ ലംഘന റിപ്പോർട്ടുകൾ."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json
index 5943fb9724e..4401946ca5d 100644
--- a/apps/browser/src/_locales/mr/messages.json
+++ b/apps/browser/src/_locales/mr/messages.json
@@ -208,10 +208,10 @@
"message": "संकालन"
},
"syncVaultNow": {
- "message": "Sync vault now"
+ "message": "तिजोरी संकालन आता करा"
},
"lastSync": {
- "message": "Last sync:"
+ "message": "शेवटचे संकालन:"
},
"passGen": {
"message": "पासवर्ड जनित्र"
@@ -279,7 +279,7 @@
"message": "Avoid ambiguous characters"
},
"searchVault": {
- "message": "Search vault"
+ "message": "तिजोरीत शोधा"
},
"edit": {
"message": "Edit"
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/my/messages.json
+++ b/apps/browser/src/_locales/my/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json
index 8b3889b799d..5a3cb1a6675 100644
--- a/apps/browser/src/_locales/nb/messages.json
+++ b/apps/browser/src/_locales/nb/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server Versjon"
},
- "selfHosted": {
- "message": "Selvbetjent"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tredjepart"
diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/ne/messages.json
+++ b/apps/browser/src/_locales/ne/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json
index ed6f5394af3..7149b18ff68 100644
--- a/apps/browser/src/_locales/nl/messages.json
+++ b/apps/browser/src/_locales/nl/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Serverversie"
},
- "selfHosted": {
- "message": "Zelfgehost"
+ "selfHostedServer": {
+ "message": "zelfgehost"
},
"thirdParty": {
"message": "van derden"
diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/nn/messages.json
+++ b/apps/browser/src/_locales/nn/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/or/messages.json
+++ b/apps/browser/src/_locales/or/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json
index 37e5b701472..c2ec8abe5d0 100644
--- a/apps/browser/src/_locales/pl/messages.json
+++ b/apps/browser/src/_locales/pl/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Wersja serwera"
},
- "selfHosted": {
- "message": "Samodzielnie hostowany"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Inny dostawca"
diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json
index 0dd3ed1eee6..474174a36e9 100644
--- a/apps/browser/src/_locales/pt_BR/messages.json
+++ b/apps/browser/src/_locales/pt_BR/messages.json
@@ -795,8 +795,8 @@
"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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versão do servidor"
},
- "selfHosted": {
- "message": "Auto-hospedado"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Terceiros"
diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json
index 68a69fcf9c5..28362dc31ad 100644
--- a/apps/browser/src/_locales/pt_PT/messages.json
+++ b/apps/browser/src/_locales/pt_PT/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB de armazenamento encriptado para anexos de ficheiros."
},
- "ppremiumSignUpTwoStep": {
- "message": "Opções adicionais de verificação de dois passos, 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 da conta e relatórios de violação de dados para manter o seu cofre seguro."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versão do servidor"
},
- "selfHosted": {
- "message": "Auto-hospedado"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "De terceiros"
diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json
index 6f577a8da57..40c86ecf37d 100644
--- a/apps/browser/src/_locales/ro/messages.json
+++ b/apps/browser/src/_locales/ro/messages.json
@@ -196,13 +196,13 @@
"message": "Ajutor și feedback"
},
"helpCenter": {
- "message": "Bitwarden Help center"
+ "message": "Centrul de Ajutor Bitwarden"
},
"communityForums": {
- "message": "Explore Bitwarden community forums"
+ "message": "Explorează forumurile comunității Bitwarden"
},
"contactSupport": {
- "message": "Contact Bitwarden support"
+ "message": "Contactați asistența Bitwarden"
},
"sync": {
"message": "Sincronizare"
@@ -442,7 +442,7 @@
"message": "Este necesară rescrierea parolei principale."
},
"masterPasswordMinlength": {
- "message": "Master password must be at least $VALUE$ characters long.",
+ "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": {
@@ -634,10 +634,10 @@
"message": "Actualizare"
},
"notificationUnlockDesc": {
- "message": "Unlock your Bitwarden vault to complete the auto-fill request."
+ "message": "Deblochează seiful Bitwarden pentru a finaliza solicitarea de completare automată."
},
"notificationUnlock": {
- "message": "Unlock"
+ "message": "Deblocare"
},
"enableContextMenuItem": {
"message": "Afișați opțiunile meniului contextual"
@@ -795,8 +795,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": "Proprietary two-step login options such as YubiKey and Duo."
},
"ppremiumSignUpReports": {
"message": "Rapoarte privind igiena parolelor, sănătatea contului și breșele de date pentru a vă păstra seiful în siguranță."
@@ -985,7 +985,7 @@
"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 exploata funcția de autocompletare la încărcarea paginii."
},
"learnMoreAboutAutofill": {
"message": "Learn more about auto-fill"
@@ -1468,7 +1468,7 @@
"message": "Articolul s-a completat automat "
},
"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."
+ "message": "Avertisment: Aceasta este o pagină HTTP nesecurizată și orice informație pe care o trimiteți poate fi văzută și modificată de alte persoane. Această Parolă a fost salvată inițial pe o pagină securizată (HTTPS)."
},
"insecurePageWarningFillPrompt": {
"message": "Do you still wish to fill this login?"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Versiune server"
},
- "selfHosted": {
- "message": "Autogăzduit"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Parte terță"
diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json
index d9614a63c2c..df0906a0ec1 100644
--- a/apps/browser/src/_locales/ru/messages.json
+++ b/apps/browser/src/_locales/ru/messages.json
@@ -671,7 +671,7 @@
"description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
},
"exportVault": {
- "message": "Экспортировать хранилище"
+ "message": "Экспорт хранилища"
},
"fileFormat": {
"message": "Формат файла"
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 ГБ зашифрованного хранилища для вложенных файлов."
},
- "ppremiumSignUpTwoStep": {
- "message": "Дополнительные варианты двухэтапной аутентификации, такие как YubiKey, FIDO U2F и Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Проприетарные варианты двухэтапной аутентификации, такие как YubiKey или Duo."
},
"ppremiumSignUpReports": {
"message": "Гигиена паролей, здоровье аккаунта и отчеты об утечках данных для обеспечения безопасности вашего хранилища."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Версия сервера"
},
- "selfHosted": {
- "message": "Собственный хостинг"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Сторонний"
@@ -2141,7 +2141,7 @@
"message": "Фраза отпечатка"
},
"fingerprintMatchInfo": {
- "message": "Убедитесь, что ваше хранилище разблокировано и фраза отпечатка пальца совпадает на другом устройстве."
+ "message": "Убедитесь, что ваше хранилище разблокировано и фраза отпечатка совпадает на другом устройстве."
},
"resendNotification": {
"message": "Отправить уведомление повторно"
@@ -2168,7 +2168,7 @@
"message": "Обнаружен слабый пароль, найденный в утечке данных. Используйте надежный и уникальный пароль для защиты вашего аккаунта. Вы уверены, что хотите использовать этот пароль?"
},
"checkForBreaches": {
- "message": "Проверьте известные случаи утечки данных для этого пароля"
+ "message": "Проверять известные случаи утечки данных для этого пароля"
},
"important": {
"message": "Важно:"
diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json
index 0d9a9648b7e..1236f44e6eb 100644
--- a/apps/browser/src/_locales/si/messages.json
+++ b/apps/browser/src/_locales/si/messages.json
@@ -795,8 +795,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 නය වාර්තා කරයි."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json
index c06ad279ec6..5778db28f79 100644
--- a/apps/browser/src/_locales/sk/messages.json
+++ b/apps/browser/src/_locales/sk/messages.json
@@ -795,8 +795,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čí."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Verzia servera"
},
- "selfHosted": {
- "message": "Vlastný hosting"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tretia strana"
diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json
index dba7c971bd7..06967ee2166 100644
--- a/apps/browser/src/_locales/sl/messages.json
+++ b/apps/browser/src/_locales/sl/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB šifriranega prostora za shrambo podatkov."
},
- "ppremiumSignUpTwoStep": {
- "message": "Dodatne možnosti za prijavo v dveh korakih, n.pr. 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, ki vam pomagajo ohraniti varnost vašega trezorja."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Verzija strežnika"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json
index 155c5f6acc5..f823208d1dd 100644
--- a/apps/browser/src/_locales/sr/messages.json
+++ b/apps/browser/src/_locales/sr/messages.json
@@ -339,7 +339,7 @@
"message": "Остало"
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
- "message": "Set up an unlock method to change your vault timeout action."
+ "message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа."
},
"rateExtension": {
"message": "Оцени овај додатак"
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1ГБ шифровано складиште за прилоге."
},
- "ppremiumSignUpTwoStep": {
- "message": "Додатне опције пријаве у два корака као што су YubiKey, FIDO U2F, и Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Приоритарне опције пријаве у два корака као што су YubiKey и Duo."
},
"ppremiumSignUpReports": {
"message": "Извештаји о хигијени лозинки, здравственом стању налога и кршењу података да бисте заштитили сеф."
@@ -1606,10 +1606,10 @@
"message": "Биометрија прегледача није подржана на овом уређају."
},
"biometricsFailedTitle": {
- "message": "Biometrics failed"
+ "message": "Биометрија није успела"
},
"biometricsFailedDesc": {
- "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support."
+ "message": "Биометрија се не може завршити, размислите о коришћењу главне лозинке или одјавите се. Ако се ово настави, контактирајте подршку Bitwarden-а."
},
"nativeMessaginPermissionErrorTitle": {
"message": "Дозвола није дата"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Верзија сервера"
},
- "selfHosted": {
- "message": "Личан хостинг"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Трећа страна"
@@ -2153,7 +2153,7 @@
"message": "Обавештење је послато на ваш уређај."
},
"loginInitiated": {
- "message": "Login initiated"
+ "message": "Пријава је покренута"
},
"exposedMasterPassword": {
"message": "Изложена главна лозинка"
@@ -2240,25 +2240,25 @@
"message": "Отвара се у новом прозору"
},
"deviceApprovalRequired": {
- "message": "Device approval required. Select an approval option below:"
+ "message": "Потребно је одобрење уређаја. Изаберите опцију одобрења испод:"
},
"rememberThisDevice": {
- "message": "Remember this device"
+ "message": "Запамти овај уређај"
},
"uncheckIfPublicDevice": {
- "message": "Uncheck if using a public device"
+ "message": "Искључите ако се користи јавни уређај"
},
"approveFromYourOtherDevice": {
- "message": "Approve from your other device"
+ "message": "Одобри са мојим другим уређајем"
},
"requestAdminApproval": {
- "message": "Request admin approval"
+ "message": "Затражити одобрење администратора"
},
"approveWithMasterPassword": {
- "message": "Approve with master password"
+ "message": "Одобрити са главном лозинком"
},
"ssoIdentifierRequired": {
- "message": "Organization SSO identifier is required."
+ "message": "Потребан је SSO идентификатор организације."
},
"eu": {
"message": "EU",
@@ -2280,40 +2280,40 @@
"message": "Приказ"
},
"accountSuccessfullyCreated": {
- "message": "Account successfully created!"
+ "message": "Налог је успешно креиран!"
},
"adminApprovalRequested": {
- "message": "Admin approval requested"
+ "message": "Захтевано је одобрење администратора"
},
"adminApprovalRequestSentToAdmins": {
- "message": "Your request has been sent to your admin."
+ "message": "Ваш захтев је послат вашем администратору."
},
"youWillBeNotifiedOnceApproved": {
- "message": "You will be notified once approved."
+ "message": "Бићете обавештени када буде одобрено."
},
"troubleLoggingIn": {
- "message": "Trouble logging in?"
+ "message": "Имате проблема са пријављивањем?"
},
"loginApproved": {
- "message": "Login approved"
+ "message": "Пријава је одобрена"
},
"userEmailMissing": {
- "message": "User email missing"
+ "message": "Недостаје имејл корисника"
},
"deviceTrusted": {
- "message": "Device trusted"
+ "message": "Уређај поуздан"
},
"inputRequired": {
- "message": "Input is required."
+ "message": "Унос је потребан."
},
"required": {
- "message": "required"
+ "message": "обавезно"
},
"search": {
- "message": "Search"
+ "message": "Тражи"
},
"inputMinLength": {
- "message": "Input must be at least $COUNT$ characters long.",
+ "message": "Унос трба имати најмање $COUNT$ слова.",
"placeholders": {
"count": {
"content": "$1",
@@ -2322,7 +2322,7 @@
}
},
"inputMaxLength": {
- "message": "Input must not exceed $COUNT$ characters in length.",
+ "message": "Унос не сме бити већи од $COUNT$ карактера.",
"placeholders": {
"count": {
"content": "$1",
@@ -2331,7 +2331,7 @@
}
},
"inputForbiddenCharacters": {
- "message": "The following characters are not allowed: $CHARACTERS$",
+ "message": "Следећи знакови нису дозвољени: $CHARACTERS$",
"placeholders": {
"characters": {
"content": "$1",
@@ -2340,7 +2340,7 @@
}
},
"inputMinValue": {
- "message": "Input value must be at least $MIN$.",
+ "message": "Вредност мора бити најмање $MIN$.",
"placeholders": {
"min": {
"content": "$1",
@@ -2349,7 +2349,7 @@
}
},
"inputMaxValue": {
- "message": "Input value must not exceed $MAX$.",
+ "message": "Вредност не сме бити већа од $MAX$.",
"placeholders": {
"max": {
"content": "$1",
@@ -2358,17 +2358,17 @@
}
},
"multipleInputEmails": {
- "message": "1 or more emails are invalid"
+ "message": "1 или више имејлова су неважећи"
},
"inputTrimValidator": {
- "message": "Input must not contain only whitespace.",
+ "message": "Унос не сме да садржи само размак.",
"description": "Notification to inform the user that a form's input can't contain only whitespace."
},
"inputEmail": {
- "message": "Input is not an email address."
+ "message": "Унос није имејл."
},
"fieldsNeedAttention": {
- "message": "$COUNT$ field(s) above need your attention.",
+ "message": "$COUNT$ поље(а) изнад захтевај(у) вашу пажњу.",
"placeholders": {
"count": {
"content": "$1",
@@ -2377,22 +2377,22 @@
}
},
"selectPlaceholder": {
- "message": "-- Select --"
+ "message": "-- Одабрати --"
},
"multiSelectPlaceholder": {
- "message": "-- Type to filter --"
+ "message": "-- Тип за филтрирање --"
},
"multiSelectLoading": {
- "message": "Retrieving options..."
+ "message": "Преузимање опција..."
},
"multiSelectNotFound": {
- "message": "No items found"
+ "message": "Нема предмета"
},
"multiSelectClearAll": {
- "message": "Clear all"
+ "message": "Обриши све"
},
"plusNMore": {
- "message": "+ $QUANTITY$ more",
+ "message": "+ још $QUANTITY$",
"placeholders": {
"quantity": {
"content": "$1",
@@ -2401,10 +2401,10 @@
}
},
"submenu": {
- "message": "Submenu"
+ "message": "Под-мени"
},
"toggleCollapse": {
- "message": "Toggle collapse",
+ "message": "Промени проширење",
"description": "Toggling an expand/collapse state."
}
}
diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json
index f3275fce001..2c90c1c8f86 100644
--- a/apps/browser/src/_locales/sv/messages.json
+++ b/apps/browser/src/_locales/sv/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Serverversion"
},
- "selfHosted": {
- "message": "Lokalt installerad"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Tredje part"
diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json
index 56640a8af8e..43c3cc0b68e 100644
--- a/apps/browser/src/_locales/te/messages.json
+++ b/apps/browser/src/_locales/te/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json
index 1cc5e9bc50c..97ce8ca58cc 100644
--- a/apps/browser/src/_locales/th/messages.json
+++ b/apps/browser/src/_locales/th/messages.json
@@ -795,8 +795,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": "สุขอนามัยของรหัสผ่าน ความสมบูรณ์ของบัญชี และรายงานการละเมิดข้อมูลเพื่อให้ตู้นิรภัยของคุณปลอดภัย"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Server version"
},
- "selfHosted": {
- "message": "Self-hosted"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Third-party"
diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json
index 8bcdf1f6580..e32dcb4ac81 100644
--- a/apps/browser/src/_locales/tr/messages.json
+++ b/apps/browser/src/_locales/tr/messages.json
@@ -795,8 +795,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ı."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Sunucu sürümü"
},
- "selfHosted": {
- "message": "Barındırılan"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Üçüncü taraf"
diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json
index dfa5ac4c7d3..c695aaadf2e 100644
--- a/apps/browser/src/_locales/uk/messages.json
+++ b/apps/browser/src/_locales/uk/messages.json
@@ -285,7 +285,7 @@
"message": "Змінити"
},
"view": {
- "message": "Перегляд"
+ "message": "Переглянути"
},
"noItemsInList": {
"message": "Немає записів."
@@ -321,7 +321,7 @@
"message": "Видалити запис"
},
"viewItem": {
- "message": "Перегляд запису"
+ "message": "Переглянути запис"
},
"launch": {
"message": "Перейти"
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 ГБ зашифрованого сховища для файлів."
},
- "ppremiumSignUpTwoStep": {
- "message": "Додаткові можливості двоетапної перевірки, наприклад, YubiKey, FIDO U2F та Duo."
+ "premiumSignUpTwoStepOptions": {
+ "message": "Додаткові можливості двоетапної авторизації, як-от YubiKey та Duo."
},
"ppremiumSignUpReports": {
"message": "Гігієна паролів, здоров'я облікового запису, а також звіти про вразливості даних, щоб зберігати ваше сховище в безпеці."
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "Версія сервера"
},
- "selfHosted": {
- "message": "Власне розміщення"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "Сторонній"
@@ -2304,16 +2304,16 @@
"message": "Довірений пристрій"
},
"inputRequired": {
- "message": "Input is required."
+ "message": "Необхідно ввести дані."
},
"required": {
- "message": "required"
+ "message": "обов'язково"
},
"search": {
- "message": "Search"
+ "message": "Пошук"
},
"inputMinLength": {
- "message": "Input must be at least $COUNT$ characters long.",
+ "message": "Введені дані мають бути довжиною принаймні $COUNT$ символів.",
"placeholders": {
"count": {
"content": "$1",
@@ -2322,7 +2322,7 @@
}
},
"inputMaxLength": {
- "message": "Input must not exceed $COUNT$ characters in length.",
+ "message": "Вхідне значення не повинно перевищувати $COUNT$ символів.",
"placeholders": {
"count": {
"content": "$1",
@@ -2331,7 +2331,7 @@
}
},
"inputForbiddenCharacters": {
- "message": "The following characters are not allowed: $CHARACTERS$",
+ "message": "Вказані символи заборонені: $CHARACTERS$",
"placeholders": {
"characters": {
"content": "$1",
@@ -2340,7 +2340,7 @@
}
},
"inputMinValue": {
- "message": "Input value must be at least $MIN$.",
+ "message": "Значення має бути принаймні $MIN$.",
"placeholders": {
"min": {
"content": "$1",
@@ -2349,7 +2349,7 @@
}
},
"inputMaxValue": {
- "message": "Input value must not exceed $MAX$.",
+ "message": "Значення не може перевищувати $MAX$.",
"placeholders": {
"max": {
"content": "$1",
@@ -2358,17 +2358,17 @@
}
},
"multipleInputEmails": {
- "message": "1 or more emails are invalid"
+ "message": "1 або більше адрес е-пошти недійсні"
},
"inputTrimValidator": {
- "message": "Input must not contain only whitespace.",
+ "message": "Введене значення не повинно містити лише пробіл.",
"description": "Notification to inform the user that a form's input can't contain only whitespace."
},
"inputEmail": {
- "message": "Input is not an email address."
+ "message": "Введені дані не є адресою е-пошти."
},
"fieldsNeedAttention": {
- "message": "$COUNT$ field(s) above need your attention.",
+ "message": "$COUNT$ поле (поля) вище потребують вашої уваги.",
"placeholders": {
"count": {
"content": "$1",
@@ -2377,22 +2377,22 @@
}
},
"selectPlaceholder": {
- "message": "-- Select --"
+ "message": "-- Оберіть--"
},
"multiSelectPlaceholder": {
- "message": "-- Type to filter --"
+ "message": "-- Введіть для фільтрування --"
},
"multiSelectLoading": {
- "message": "Retrieving options..."
+ "message": "Параметри отримання..."
},
"multiSelectNotFound": {
- "message": "No items found"
+ "message": "Нічого не знайдено"
},
"multiSelectClearAll": {
- "message": "Clear all"
+ "message": "Очистити все"
},
"plusNMore": {
- "message": "+ $QUANTITY$ more",
+ "message": "+ ще $QUANTITY$",
"placeholders": {
"quantity": {
"content": "$1",
@@ -2401,10 +2401,10 @@
}
},
"submenu": {
- "message": "Submenu"
+ "message": "Підменю"
},
"toggleCollapse": {
- "message": "Toggle collapse",
+ "message": "Згорнути/розгорнути",
"description": "Toggling an expand/collapse state."
}
}
diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json
index 7faabed46e0..95716b3fc36 100644
--- a/apps/browser/src/_locales/vi/messages.json
+++ b/apps/browser/src/_locales/vi/messages.json
@@ -795,8 +795,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."
@@ -2092,8 +2092,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"
diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json
index eb02a54f453..eded4b220c7 100644
--- a/apps/browser/src/_locales/zh_CN/messages.json
+++ b/apps/browser/src/_locales/zh_CN/messages.json
@@ -795,8 +795,8 @@
"ppremiumSignUpStorage": {
"message": "1 GB 文件附件加密存储。"
},
- "ppremiumSignUpTwoStep": {
- "message": "额外的两步登录选项,如 YubiKey、FIDO U2F 和 Duo。"
+ "premiumSignUpTwoStepOptions": {
+ "message": "专有的两步登录选项,如 YubiKey 和 Duo。"
},
"ppremiumSignUpReports": {
"message": "密码健康、账户体检以及数据泄露报告,保障您的密码库安全。"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "服务器版本"
},
- "selfHosted": {
- "message": "自托管"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "第三方"
@@ -2135,7 +2135,7 @@
"message": "设备登录"
},
"loginWithDeviceEnabledInfo": {
- "message": "设备登录必须在 Bitwarden 应用程序的设置中设启用。需要其他选项吗?"
+ "message": "设备登录必须在 Bitwarden 应用程序的设置中启用。需要其他登录选项吗?"
},
"fingerprintPhraseHeader": {
"message": "指纹短语"
diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json
index a0a2c9e3eb3..96bdfaaa4df 100644
--- a/apps/browser/src/_locales/zh_TW/messages.json
+++ b/apps/browser/src/_locales/zh_TW/messages.json
@@ -795,8 +795,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": "密碼健康度檢查、提供帳戶體檢以及資料外洩報告,以保障您的密碼庫安全。"
@@ -2092,8 +2092,8 @@
"serverVersion": {
"message": "伺服器版本"
},
- "selfHosted": {
- "message": "自我裝載"
+ "selfHostedServer": {
+ "message": "self-hosted"
},
"thirdParty": {
"message": "第三方"
diff --git a/apps/browser/src/auth/popup/login.component.html b/apps/browser/src/auth/popup/login.component.html
index d3db7069644..64c3048507e 100644
--- a/apps/browser/src/auth/popup/login.component.html
+++ b/apps/browser/src/auth/popup/login.component.html
@@ -44,7 +44,11 @@
-
+
-
+
+
+
-
+
@@ -112,7 +112,9 @@
selectedProviderType === providerType.OrganizationDuo
"
>
-
+
+
+
@@ -123,7 +125,7 @@
-
+
{{ "noTwoStepProviders" | i18n }}
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 dbe391ce4ab..d7cac8d44b2 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,7 +1,6 @@
import { mock, MockProxy } from "jest-mock-extended";
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 { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
@@ -14,7 +13,6 @@ describe("CipherContextMenuHandler", () => {
let mainContextMenuHandler: MockProxy
;
let authService: MockProxy;
let cipherService: MockProxy;
- let userVerificationService: MockProxy;
let sut: CipherContextMenuHandler;
@@ -22,17 +20,10 @@ describe("CipherContextMenuHandler", () => {
mainContextMenuHandler = mock();
authService = mock();
cipherService = mock();
- userVerificationService = mock();
- userVerificationService.hasMasterPassword.mockResolvedValue(true);
jest.spyOn(MainContextMenuHandler, "removeAll").mockResolvedValue();
- sut = new CipherContextMenuHandler(
- mainContextMenuHandler,
- authService,
- cipherService,
- userVerificationService
- );
+ sut = new CipherContextMenuHandler(mainContextMenuHandler, authService, cipherService);
});
afterEach(() => jest.resetAllMocks());
@@ -78,7 +69,7 @@ describe("CipherContextMenuHandler", () => {
expect(mainContextMenuHandler.noLogins).toHaveBeenCalledTimes(1);
});
- it("only adds valid ciphers", async () => {
+ it("only adds login ciphers including ciphers that require reprompt", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
mainContextMenuHandler.init.mockResolvedValue(true);
@@ -90,47 +81,6 @@ describe("CipherContextMenuHandler", () => {
name: "Test Cipher",
login: { username: "Test Username" },
};
-
- cipherService.getAllDecryptedForUrl.mockResolvedValue([
- null, // invalid cipher
- undefined, // invalid cipher
- { type: CipherType.Card }, // invalid cipher
- { type: CipherType.Login, reprompt: CipherRepromptType.Password }, // invalid cipher
- realCipher, // valid cipher
- ] as any[]);
-
- await sut.update("https://test.com");
-
- expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1);
-
- expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com");
-
- expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(2);
-
- expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith(
- "Test Cipher (Test Username)",
- "5",
- "https://test.com",
- realCipher
- );
- });
-
- it("adds ciphers with master password reprompt if the user does not have a master password", async () => {
- authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
-
- // User does not have a master password, or has one but hasn't logged in with it (key connector user or TDE user)
- userVerificationService.hasMasterPasswordAndMasterKeyHash.mockResolvedValue(false);
-
- mainContextMenuHandler.init.mockResolvedValue(true);
-
- const realCipher = {
- id: "5",
- type: CipherType.Login,
- reprompt: CipherRepromptType.None,
- name: "Test Cipher",
- login: { username: "Test Username" },
- };
-
const repromptCipher = {
id: "6",
type: CipherType.Login,
@@ -143,8 +93,8 @@ describe("CipherContextMenuHandler", () => {
null, // invalid cipher
undefined, // invalid cipher
{ type: CipherType.Card }, // invalid cipher
- repromptCipher, // valid cipher
realCipher, // valid cipher
+ repromptCipher,
] as any[]);
await sut.update("https://test.com");
@@ -153,7 +103,6 @@ describe("CipherContextMenuHandler", () => {
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com");
- // Should call this twice, once for each valid cipher
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(2);
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith(
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 1d1be8f8386..6140db260f5 100644
--- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts
+++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts
@@ -1,5 +1,4 @@
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 { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
import { Utils } from "@bitwarden/common/platform/misc/utils";
@@ -12,7 +11,6 @@ import {
authServiceFactory,
AuthServiceInitOptions,
} from "../../auth/background/service-factories/auth-service.factory";
-import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory";
import { Account } from "../../models/account";
import { CachedServices } from "../../platform/background/service-factories/factory-options";
import { BrowserApi } from "../../platform/browser/browser-api";
@@ -39,8 +37,7 @@ export class CipherContextMenuHandler {
constructor(
private mainContextMenuHandler: MainContextMenuHandler,
private authService: AuthService,
- private cipherService: CipherService,
- private userVerificationService: UserVerificationService
+ private cipherService: CipherService
) {}
static async create(cachedServices: CachedServices) {
@@ -69,9 +66,6 @@ export class CipherContextMenuHandler {
clipboardWriteCallback: NOT_IMPLEMENTED,
win: self,
},
- stateMigrationServiceOptions: {
- stateFactory: stateFactory,
- },
stateServiceOptions: {
stateFactory: stateFactory,
},
@@ -79,8 +73,7 @@ export class CipherContextMenuHandler {
return new CipherContextMenuHandler(
await MainContextMenuHandler.mv3Create(cachedServices),
await authServiceFactory(cachedServices, serviceOptions),
- await cipherServiceFactory(cachedServices, serviceOptions),
- await userVerificationServiceFactory(cachedServices, serviceOptions)
+ await cipherServiceFactory(cachedServices, serviceOptions)
);
}
@@ -180,11 +173,7 @@ export class CipherContextMenuHandler {
}
private async updateForCipher(url: string, cipher: CipherView) {
- if (
- cipher == null ||
- cipher.type !== CipherType.Login ||
- (await this.userVerificationService.hasMasterPasswordAndMasterKeyHash())
- ) {
+ if (cipher == null || cipher.type !== CipherType.Login) {
return;
}
diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts
index a9dbcbaacc5..021d15df89e 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
@@ -3,6 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended";
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 { 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";
@@ -63,6 +64,7 @@ describe("ContextMenuClickedHandler", () => {
let cipherService: MockProxy;
let totpService: MockProxy;
let eventCollectionService: MockProxy;
+ let userVerificationService: MockProxy;
let sut: ContextMenuClickedHandler;
@@ -82,7 +84,8 @@ describe("ContextMenuClickedHandler", () => {
authService,
cipherService,
totpService,
- eventCollectionService
+ eventCollectionService,
+ userVerificationService
);
});
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 38e605abe70..a6bff50a195 100644
--- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts
+++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts
@@ -1,6 +1,7 @@
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 { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { EventType } from "@bitwarden/common/enums";
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
@@ -14,6 +15,7 @@ import {
AuthServiceInitOptions,
} from "../../auth/background/service-factories/auth-service.factory";
import { totpServiceFactory } from "../../auth/background/service-factories/totp-service.factory";
+import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory";
import LockedVaultPendingNotificationsItem from "../../background/models/lockedVaultPendingNotificationsItem";
import { eventCollectionServiceFactory } from "../../background/service-factories/event-collection-service.factory";
import { Account } from "../../models/account";
@@ -56,7 +58,8 @@ export class ContextMenuClickedHandler {
private authService: AuthService,
private cipherService: CipherService,
private totpService: TotpService,
- private eventCollectionService: EventCollectionService
+ private eventCollectionService: EventCollectionService,
+ private userVerificationService: UserVerificationService
) {}
static async mv3Create(cachedServices: CachedServices) {
@@ -85,9 +88,6 @@ export class ContextMenuClickedHandler {
clipboardWriteCallback: NOT_IMPLEMENTED,
win: self,
},
- stateMigrationServiceOptions: {
- stateFactory: stateFactory,
- },
stateServiceOptions: {
stateFactory: stateFactory,
},
@@ -109,7 +109,8 @@ export class ContextMenuClickedHandler {
await authServiceFactory(cachedServices, serviceOptions),
await cipherServiceFactory(cachedServices, serviceOptions),
await totpServiceFactory(cachedServices, serviceOptions),
- await eventCollectionServiceFactory(cachedServices, serviceOptions)
+ await eventCollectionServiceFactory(cachedServices, serviceOptions),
+ await userVerificationServiceFactory(cachedServices, serviceOptions)
);
}
@@ -204,7 +205,7 @@ export class ContextMenuClickedHandler {
return;
}
- if (cipher.reprompt !== CipherRepromptType.None) {
+ if (await this.isPasswordRepromptRequired(cipher)) {
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
cipherId: cipher.id,
action: AUTOFILL_ID,
@@ -218,7 +219,7 @@ export class ContextMenuClickedHandler {
this.copyToClipboard({ text: cipher.login.username, tab: tab });
break;
case COPY_PASSWORD_ID:
- if (cipher.reprompt !== CipherRepromptType.None) {
+ if (await this.isPasswordRepromptRequired(cipher)) {
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
cipherId: cipher.id,
action: COPY_PASSWORD_ID,
@@ -230,7 +231,7 @@ export class ContextMenuClickedHandler {
break;
case COPY_VERIFICATIONCODE_ID:
- if (cipher.reprompt !== CipherRepromptType.None) {
+ if (await this.isPasswordRepromptRequired(cipher)) {
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
cipherId: cipher.id,
action: COPY_VERIFICATIONCODE_ID,
@@ -246,6 +247,13 @@ export class ContextMenuClickedHandler {
}
}
+ private async isPasswordRepromptRequired(cipher: CipherView): Promise {
+ return (
+ cipher.reprompt === CipherRepromptType.Password &&
+ (await this.userVerificationService.hasMasterPasswordAndMasterKeyHash())
+ );
+ }
+
private async getIdentifier(tab: chrome.tabs.Tab, info: chrome.contextMenus.OnClickData) {
return new Promise((resolve, reject) => {
BrowserApi.sendTabsMessage(
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 9b16aa266db..b9af3dd191f 100644
--- a/apps/browser/src/autofill/browser/main-context-menu-handler.ts
+++ b/apps/browser/src/autofill/browser/main-context-menu-handler.ts
@@ -79,9 +79,6 @@ export class MainContextMenuHandler {
logServiceOptions: {
isDev: false,
},
- stateMigrationServiceOptions: {
- stateFactory: stateFactory,
- },
stateServiceOptions: {
stateFactory: stateFactory,
},
diff --git a/apps/browser/src/autofill/constants.ts b/apps/browser/src/autofill/constants.ts
new file mode 100644
index 00000000000..7f3637180b0
--- /dev/null
+++ b/apps/browser/src/autofill/constants.ts
@@ -0,0 +1,13 @@
+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",
+} as const;
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 00000000000..706c6da4ee1
--- /dev/null
+++ b/apps/browser/src/autofill/content/abstractions/autofill-init.ts
@@ -0,0 +1,21 @@
+import AutofillScript from "../../models/autofill-script";
+
+type AutofillExtensionMessage = {
+ command: string;
+ tab?: chrome.tabs.Tab;
+ sender?: string;
+ fillScript?: AutofillScript;
+};
+
+type AutofillExtensionMessageHandlers = {
+ [key: string]: CallableFunction;
+ collectPageDetails: (message: { message: AutofillExtensionMessage }) => void;
+ collectPageDetailsImmediately: (message: { message: AutofillExtensionMessage }) => void;
+ fillForm: (message: { message: AutofillExtensionMessage }) => 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 00000000000..447fe31a8a3
--- /dev/null
+++ b/apps/browser/src/autofill/content/autofill-init.spec.ts
@@ -0,0 +1,175 @@
+import { mock } from "jest-mock-extended";
+
+import AutofillPageDetails from "../models/autofill-page-details";
+import AutofillScript from "../models/autofill-script";
+
+import { AutofillExtensionMessage } from "./abstractions/autofill-init";
+
+describe("AutofillInit", () => {
+ let bitwardenAutofillInit: any;
+
+ beforeEach(() => {
+ require("../content/autofill-init");
+ bitwardenAutofillInit = window.bitwardenAutofillInit;
+ });
+
+ afterEach(() => {
+ jest.resetModules();
+ jest.clearAllMocks();
+ });
+
+ describe("init", () => {
+ it("sets up the extension message listeners", () => {
+ jest.spyOn(bitwardenAutofillInit, "setupExtensionMessageListeners");
+
+ bitwardenAutofillInit.init();
+
+ expect(bitwardenAutofillInit.setupExtensionMessageListeners).toHaveBeenCalled();
+ });
+ });
+
+ describe("collectPageDetails", () => {
+ let extensionMessage: AutofillExtensionMessage;
+ let pageDetails: AutofillPageDetails;
+
+ beforeEach(() => {
+ extensionMessage = {
+ command: "collectPageDetails",
+ tab: mock(),
+ sender: "sender",
+ };
+ pageDetails = {
+ title: "title",
+ url: "http://example.com",
+ documentUrl: "documentUrl",
+ forms: {},
+ fields: [],
+ collectedTimestamp: 0,
+ };
+ jest
+ .spyOn(bitwardenAutofillInit.collectAutofillContentService, "getPageDetails")
+ .mockReturnValue(pageDetails);
+ });
+
+ it("returns collected page details for autofill if set to send the details in the response", async () => {
+ const response = await bitwardenAutofillInit["collectPageDetails"](extensionMessage, true);
+
+ expect(bitwardenAutofillInit.collectAutofillContentService.getPageDetails).toHaveBeenCalled();
+ expect(response).toEqual(pageDetails);
+ });
+
+ it("sends the collected page details for autofill using a background script message", async () => {
+ jest.spyOn(chrome.runtime, "sendMessage");
+
+ await bitwardenAutofillInit["collectPageDetails"](extensionMessage);
+
+ expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({
+ command: "collectPageDetailsResponse",
+ tab: extensionMessage.tab,
+ details: pageDetails,
+ sender: extensionMessage.sender,
+ });
+ });
+ });
+
+ describe("fillForm", () => {
+ it("will call the InsertAutofillContentService to fill the form", () => {
+ const fillScript = mock();
+ jest
+ .spyOn(bitwardenAutofillInit.insertAutofillContentService, "fillForm")
+ .mockImplementation();
+
+ bitwardenAutofillInit.fillForm(fillScript);
+
+ expect(bitwardenAutofillInit.insertAutofillContentService.fillForm).toHaveBeenCalledWith(
+ fillScript
+ );
+ });
+ });
+
+ describe("setupExtensionMessageListeners", () => {
+ it("sets up a chrome runtime on message listener", () => {
+ jest.spyOn(chrome.runtime.onMessage, "addListener");
+
+ bitwardenAutofillInit["setupExtensionMessageListeners"]();
+
+ expect(chrome.runtime.onMessage.addListener).toHaveBeenCalledWith(
+ bitwardenAutofillInit["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 false value if a extension message handler is not found with the given message command", () => {
+ message.command = "unknownCommand";
+
+ const response = bitwardenAutofillInit["handleExtensionMessage"](
+ message,
+ sender,
+ sendResponse
+ );
+
+ expect(response).toBe(false);
+ });
+
+ it("returns a false value if the message handler does not return a response", async () => {
+ const response1 = await bitwardenAutofillInit["handleExtensionMessage"](
+ message,
+ sender,
+ sendResponse
+ );
+ await Promise.resolve(response1);
+
+ expect(response1).not.toBe(false);
+
+ message.command = "fillForm";
+ message.fillScript = mock();
+
+ const response2 = await bitwardenAutofillInit["handleExtensionMessage"](
+ message,
+ sender,
+ sendResponse
+ );
+
+ expect(response2).toBe(false);
+ });
+
+ 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(bitwardenAutofillInit.collectAutofillContentService, "getPageDetails")
+ .mockReturnValue(pageDetails);
+
+ const response = await bitwardenAutofillInit["handleExtensionMessage"](
+ message,
+ sender,
+ sendResponse
+ );
+ await Promise.resolve(response);
+
+ expect(response).toBe(true);
+ expect(sendResponse).toHaveBeenCalledWith(pageDetails);
+ });
+ });
+});
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 00000000000..8b441ae0e20
--- /dev/null
+++ b/apps/browser/src/autofill/content/autofill-init.ts
@@ -0,0 +1,130 @@
+import AutofillPageDetails from "../models/autofill-page-details";
+import AutofillScript from "../models/autofill-script";
+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 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.fillScript),
+ };
+
+ /**
+ * AutofillInit constructor. Initializes the DomElementVisibilityService,
+ * CollectAutofillContentService and InsertAutofillContentService classes.
+ */
+ constructor() {
+ this.domElementVisibilityService = new DomElementVisibilityService();
+ this.collectAutofillContentService = new CollectAutofillContentService(
+ this.domElementVisibilityService
+ );
+ 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.
+ * @public
+ */
+ init() {
+ this.setupExtensionMessageListeners();
+ }
+
+ /**
+ * 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 {AutofillExtensionMessage} message
+ * @param {boolean} sendDetailsInResponse
+ * @returns {AutofillPageDetails | void}
+ * @private
+ */
+ 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 {AutofillScript} fillScript
+ * @private
+ */
+ private fillForm(fillScript: AutofillScript) {
+ this.insertAutofillContentService.fillForm(fillScript);
+ }
+
+ /**
+ * Sets up the extension message listeners
+ * for the content script.
+ * @private
+ */
+ private setupExtensionMessageListeners() {
+ chrome.runtime.onMessage.addListener(this.handleExtensionMessage);
+ }
+
+ /**
+ * Handles the extension messages
+ * sent to the content script.
+ * @param {AutofillExtensionMessage} message
+ * @param {chrome.runtime.MessageSender} sender
+ * @param {(response?: any) => void} sendResponse
+ * @returns {boolean}
+ * @private
+ */
+ 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 false;
+ }
+
+ const messageResponse = handler({ message, sender });
+ if (!messageResponse) {
+ return false;
+ }
+
+ Promise.resolve(messageResponse).then((response) => sendResponse(response));
+ return true;
+ };
+}
+
+(function () {
+ if (!window.bitwardenAutofillInit) {
+ window.bitwardenAutofillInit = new AutofillInit();
+ window.bitwardenAutofillInit.init();
+ }
+})();
diff --git a/apps/browser/src/autofill/content/autofiller.ts b/apps/browser/src/autofill/content/autofiller.ts
index 7fe9e5514a8..7f58e72c7d3 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/autofillv2.ts b/apps/browser/src/autofill/content/autofillv2.ts
deleted file mode 100644
index 65813b3afe6..00000000000
--- a/apps/browser/src/autofill/content/autofillv2.ts
+++ /dev/null
@@ -1,1399 +0,0 @@
-/* eslint-disable no-var, no-console, no-prototype-builtins */
-// These eslint rules are disabled because the original JS was not written with them in mind and we don't want to fix
-// them all now
-
-/*
- 1Password Extension
-
- Lovingly handcrafted by Dave Teare, Michael Fey, Rad Azzouz, and Roustem Karimov.
- Copyright (c) 2014 AgileBits. All rights reserved.
-
- ================================================================================
-
- Copyright (c) 2014 AgileBits Inc.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- */
-
-/*
- MODIFICATIONS FROM ORIGINAL
-
- 1. Populate isFirefox
- 2. Remove isChrome and isSafari since they are not used.
- 3. Unminify and format to meet Mozilla review requirements.
- 4. Remove unnecessary input types from getFormElements query selector and limit number of elements returned.
- 5. Remove fakeTested prop.
- 6. Rename com.agilebits.* stuff to com.bitwarden.*
- 7. Remove "some useful globals" on window
- 8. Add ability to autofill span[data-bwautofill] elements
- 9. Add new handler, for new command that responds with page details in response callback
- 10. Handle sandbox iframe and sandbox rule in CSP
- 11. Work on array of saved urls instead of just one to determine if we should autofill non-https sites
- 12. Remove setting of attribute com.browser.browser.userEdited on user-inputs
- 13. Handle null value URLs in urlNotSecure
- 14. Convert to Typescript, add typings and remove dead code (not marked with START/END MODIFICATION)
- */
-import AutofillForm from "../models/autofill-form";
-import AutofillPageDetails from "../models/autofill-page-details";
-import AutofillScript, {
- AutofillScriptOptions,
- FillScript,
- FillScriptOp,
-} from "../models/autofill-script";
-
-/**
- * The Document with additional custom properties added by this script
- */
-type AutofillDocument = Document & {
- elementsByOPID: Record;
- elementForOPID: (opId: string) => Element;
-};
-
-/**
- * A HTMLElement (usually a form element) with additional custom properties added by this script
- */
-type ElementWithOpId = T & {
- opid: string;
-};
-
-/**
- * This script's definition of a Form Element (only a subset of HTML form elements)
- * This is defined by getFormElements
- */
-type FormElement = HTMLInputElement | HTMLSelectElement | HTMLSpanElement;
-
-/**
- * A Form Element that we can set a value on (fill)
- */
-type FillableControl = HTMLInputElement | HTMLSelectElement;
-
-function collect(document: Document) {
- // START MODIFICATION
- var isFirefox =
- navigator.userAgent.indexOf("Firefox") !== -1 || navigator.userAgent.indexOf("Gecko/") !== -1;
- // END MODIFICATION
-
- (document as AutofillDocument).elementsByOPID = {};
-
- function getPageDetails(theDoc: Document, oneShotId: string) {
- // start helpers
-
- /**
- * 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: any, attrName: string) {
- var attrVal = el[attrName];
- if ("string" == typeof attrVal) {
- return attrVal;
- }
- attrVal = el.getAttribute(attrName);
- return "string" == typeof attrVal ? attrVal : null;
- }
-
- /**
- * Returns the value of the given element.
- * @param {HTMLElement} el
- * @returns {any} Value of the element
- */
- function getElementValue(el: any) {
- switch (toLowerString(el.type)) {
- case "checkbox":
- return el.checked ? "✓" : "";
-
- case "hidden":
- el = el.value;
- if (!el || "number" != typeof el.length) {
- return "";
- }
- 254 < el.length && (el = el.substr(0, 254) + "...SNIPPED");
- return el;
-
- default:
- // START MODIFICATION
- if (!el.type && el.tagName.toLowerCase() === "span") {
- return el.innerText;
- }
- // END MODIFICATION
- return el.value;
- }
- }
-
- /**
- * If `el` is a `
-
@@ -170,15 +151,140 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -190,8 +296,7 @@
type="number"
name="MaximumAccessCount"
aria-describedby="maximumAccessCountHelp"
- [(ngModel)]="send.maxAccessCount"
- [readonly]="disableSend"
+ formControlName="maxAccessCount"
/>
@@ -206,10 +311,9 @@
@@ -227,9 +331,8 @@
name="Password"
aria-describedby="passwordHelp"
class="monospaced"
- [(ngModel)]="password"
+ formControlName="password"
appInputVerbatim
- [readonly]="disableSend"
/>
@@ -264,8 +367,7 @@
name="Notes"
aria-describedby="notesHelp"
rows="6"
- [(ngModel)]="send.notes"
- [readonly]="disableSend"
+ formControlName="notes"
>
@@ -278,13 +380,7 @@
@@ -293,13 +389,7 @@
diff --git a/apps/browser/src/tools/popup/send/send-add-edit.component.ts b/apps/browser/src/tools/popup/send/send-add-edit.component.ts
index 1efd950c508..2d90957de7f 100644
--- a/apps/browser/src/tools/popup/send/send-add-edit.component.ts
+++ b/apps/browser/src/tools/popup/send/send-add-edit.component.ts
@@ -1,5 +1,6 @@
import { DatePipe, Location } from "@angular/common";
import { Component } from "@angular/core";
+import { FormBuilder } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
import { first } from "rxjs/operators";
@@ -47,7 +48,8 @@ export class SendAddEditComponent extends BaseAddEditComponent {
private popupUtilsService: PopupUtilsService,
logService: LogService,
sendApiService: SendApiService,
- dialogService: DialogService
+ dialogService: DialogService,
+ formBuilder: FormBuilder
) {
super(
i18nService,
@@ -60,7 +62,8 @@ export class SendAddEditComponent extends BaseAddEditComponent {
logService,
stateService,
sendApiService,
- dialogService
+ dialogService,
+ formBuilder
);
}
diff --git a/apps/browser/src/vault/popup/components/vault/view.component.ts b/apps/browser/src/vault/popup/components/vault/view.component.ts
index 57f9b676cd0..73381dce4d0 100644
--- a/apps/browser/src/vault/popup/components/vault/view.component.ts
+++ b/apps/browser/src/vault/popup/components/vault/view.component.ts
@@ -168,8 +168,8 @@ export class ViewComponent extends BaseViewComponent {
switch (this.loadAction) {
case AUTOFILL_ID:
- this.fillCipher();
- return;
+ await this.fillCipher();
+ break;
case COPY_USERNAME_ID:
await this.copy(this.cipher.login.username, "username", "Username");
break;
@@ -177,14 +177,14 @@ export class ViewComponent extends BaseViewComponent {
await this.copy(this.cipher.login.password, "password", "Password");
break;
case COPY_VERIFICATIONCODE_ID:
- await this.copy(this.cipher.login.totp, "verificationCodeTotp", "TOTP");
+ await this.copy(this.totpCode, "verificationCodeTotp", "TOTP");
break;
default:
break;
}
if (this.inPopout && this.loadAction) {
- this.close();
+ setTimeout(() => this.close(), 1000);
}
}
@@ -236,10 +236,6 @@ export class ViewComponent extends BaseViewComponent {
const didAutofill = await this.doAutofill();
if (didAutofill) {
this.platformUtilsService.showToast("success", null, this.i18nService.t("autoFillSuccess"));
-
- if (this.inPopout) {
- this.close();
- }
}
}
@@ -304,11 +300,8 @@ export class ViewComponent extends BaseViewComponent {
}
close() {
- if (this.senderTabId) {
+ if (this.inPopout && this.senderTabId) {
BrowserApi.focusTab(this.senderTabId);
- }
-
- if (this.inPopout) {
window.close();
return;
}
diff --git a/apps/browser/store/locales/el/copy.resx b/apps/browser/store/locales/el/copy.resx
index 496118ddf6e..01def6ea5af 100644
--- a/apps/browser/store/locales/el/copy.resx
+++ b/apps/browser/store/locales/el/copy.resx
@@ -155,7 +155,7 @@
Ένας ασφαλής και δωρεάν διαχειριστής κωδικών για όλες τις συσκευές σας
- Συγχρονίστε και αποκτήστε πρόσβαση στο vault σας από πολλές συσκευές
+ Συγχρονίστε και αποκτήστε πρόσβαση στο θησαυροφυλάκιό σας από πολλαπλές συσκευές
Διαχειριστείτε όλες τις συνδέσεις και τους κωδικούς σας με ασφάλεια
diff --git a/apps/browser/test.setup.ts b/apps/browser/test.setup.ts
index f87fa9c2c12..6feb163e0a6 100644
--- a/apps/browser/test.setup.ts
+++ b/apps/browser/test.setup.ts
@@ -30,9 +30,25 @@ const contextMenus = {
removeAll: jest.fn(),
};
+const i18n = {
+ getMessage: jest.fn(),
+};
+
+const tabs = {
+ executeScript: jest.fn(),
+ sendMessage: jest.fn(),
+};
+
+const scripting = {
+ executeScript: jest.fn(),
+};
+
// set chrome
global.chrome = {
+ i18n,
storage,
runtime,
contextMenus,
+ tabs,
+ scripting,
} as any;
diff --git a/apps/browser/tsconfig.spec.json b/apps/browser/tsconfig.spec.json
index de184bd7608..79b5f5bc4b6 100644
--- a/apps/browser/tsconfig.spec.json
+++ b/apps/browser/tsconfig.spec.json
@@ -1,4 +1,7 @@
{
"extends": "./tsconfig.json",
- "files": ["./test.setup.ts"]
+ "files": ["./test.setup.ts"],
+ "compilerOptions": {
+ "esModuleInterop": true
+ }
}
diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js
index 711d0a7e7ba..63174af21e9 100644
--- a/apps/browser/webpack.config.js
+++ b/apps/browser/webpack.config.js
@@ -14,10 +14,9 @@ if (process.env.NODE_ENV == null) {
}
const ENV = (process.env.ENV = process.env.NODE_ENV);
const manifestVersion = process.env.MANIFEST_VERSION == 3 ? 3 : 2;
-const autofillVersion = process.env.AUTOFILL_VERSION == 2 ? 2 : 1;
console.log(`Building Manifest Version ${manifestVersion} app`);
-console.log(`Using Autofill v${autofillVersion}`);
+
const envConfig = configurator.load(ENV);
configurator.log(envConfig);
@@ -153,6 +152,10 @@ const mainConfig = {
entry: {
"popup/polyfills": "./src/popup/polyfills.ts",
"popup/main": "./src/popup/main.ts",
+ "content/trigger-autofill-script-injection":
+ "./src/autofill/content/trigger-autofill-script-injection.ts",
+ "content/autofill": "./src/autofill/content/autofill.js",
+ "content/autofill-init": "./src/autofill/content/autofill-init.ts",
"content/autofiller": "./src/autofill/content/autofiller.ts",
"content/notificationBar": "./src/autofill/content/notification-bar.ts",
"content/contextMenuHandler": "./src/autofill/content/context-menu-handler.ts",
@@ -314,12 +317,4 @@ if (manifestVersion == 2) {
configs.push(backgroundConfig);
}
-if (autofillVersion == 2) {
- // Typescript refactors (WIP)
- mainConfig.entry["content/autofill"] = "./src/autofill/content/autofillv2.ts";
-} else {
- // Javascript (used in production)
- mainConfig.entry["content/autofill"] = "./src/autofill/content/autofill.js";
-}
-
module.exports = configs;
diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts
index 1bcaa1a2acf..42ba158ee72 100644
--- a/apps/cli/src/bw.ts
+++ b/apps/cli/src/bw.ts
@@ -37,7 +37,6 @@ import { EnvironmentService } from "@bitwarden/common/platform/services/environm
import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service";
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
import { NoopMessagingService } from "@bitwarden/common/platform/services/noop-messaging.service";
-import { StateMigrationService } from "@bitwarden/common/platform/services/state-migration.service";
import { StateService } from "@bitwarden/common/platform/services/state.service";
import { AuditService } from "@bitwarden/common/services/audit.service";
import { OrganizationUserServiceImplementation } from "@bitwarden/common/services/organization-user/organization-user.service.implementation";
@@ -136,7 +135,6 @@ export class Main {
keyConnectorService: KeyConnectorService;
userVerificationService: UserVerificationService;
stateService: StateService;
- stateMigrationService: StateMigrationService;
organizationService: OrganizationService;
providerService: ProviderService;
twoFactorService: TwoFactorService;
@@ -188,18 +186,11 @@ export class Main {
this.memoryStorageService = new MemoryStorageService();
- this.stateMigrationService = new StateMigrationService(
- this.storageService,
- this.secureStorageService,
- new StateFactory(GlobalState, Account)
- );
-
this.stateService = new StateService(
this.storageService,
this.secureStorageService,
this.memoryStorageService,
this.logService,
- this.stateMigrationService,
new StateFactory(GlobalState, Account)
);
diff --git a/apps/cli/src/program.ts b/apps/cli/src/program.ts
index 9eca236a3a0..8bca024b410 100644
--- a/apps/cli/src/program.ts
+++ b/apps/cli/src/program.ts
@@ -298,9 +298,12 @@ export class Program {
.option("-p, --passphrase", "Generate a passphrase.")
.option("--length ", "Length of the password.")
.option("--words ", "Number of words.")
+ .option("--minNumber ", "Minimum number of numeric characters.")
+ .option("--minSpecial ", "Minimum number of special characters.")
.option("--separator ", "Word separator.")
.option("-c, --capitalize", "Title case passphrase.")
.option("--includeNumber", "Passphrase includes number.")
+ .option("--ambiguous", "Avoid ambiguous characters.")
.on("--help", () => {
writeLn("\n Notes:");
writeLn("");
diff --git a/apps/cli/src/tools/generate.command.ts b/apps/cli/src/tools/generate.command.ts
index bd9ad88a04f..30436e7db71 100644
--- a/apps/cli/src/tools/generate.command.ts
+++ b/apps/cli/src/tools/generate.command.ts
@@ -1,5 +1,6 @@
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
+import { PasswordGeneratorOptions } from "@bitwarden/common/tools/generator/password/password-generator-options";
import { Response } from "../models/response";
import { StringResponse } from "../models/response/string.response";
@@ -13,7 +14,7 @@ export class GenerateCommand {
async run(cmdOptions: Record): Promise {
const normalizedOptions = new Options(cmdOptions);
- const options = {
+ const options: PasswordGeneratorOptions = {
uppercase: normalizedOptions.uppercase,
lowercase: normalizedOptions.lowercase,
number: normalizedOptions.number,
@@ -24,6 +25,9 @@ export class GenerateCommand {
numWords: normalizedOptions.words,
capitalize: normalizedOptions.capitalize,
includeNumber: normalizedOptions.includeNumber,
+ minNumber: normalizedOptions.minNumber,
+ minSpecial: normalizedOptions.minSpecial,
+ ambiguous: normalizedOptions.ambiguous,
};
const enforcedOptions = (await this.stateService.getIsAuthenticated())
@@ -47,6 +51,9 @@ class Options {
words: number;
capitalize: boolean;
includeNumber: boolean;
+ minNumber: number;
+ minSpecial: number;
+ ambiguous: boolean;
constructor(passedOptions: Record) {
this.uppercase = CliUtils.convertBooleanOption(passedOptions?.uppercase);
@@ -55,10 +62,13 @@ class Options {
this.special = CliUtils.convertBooleanOption(passedOptions?.special);
this.capitalize = CliUtils.convertBooleanOption(passedOptions?.capitalize);
this.includeNumber = CliUtils.convertBooleanOption(passedOptions?.includeNumber);
- this.length = passedOptions?.length != null ? parseInt(passedOptions?.length, null) : 14;
+ this.ambiguous = CliUtils.convertBooleanOption(passedOptions?.ambiguous);
+ this.length = CliUtils.convertNumberOption(passedOptions?.length, 14);
this.type = passedOptions?.passphrase ? "passphrase" : "password";
- this.separator = passedOptions?.separator == null ? "-" : passedOptions.separator + "";
- this.words = passedOptions?.words != null ? parseInt(passedOptions.words, null) : 3;
+ this.separator = CliUtils.convertStringOption(passedOptions?.separator, "-");
+ this.words = CliUtils.convertNumberOption(passedOptions?.words, 3);
+ this.minNumber = CliUtils.convertNumberOption(passedOptions?.minNumber, 1);
+ this.minSpecial = CliUtils.convertNumberOption(passedOptions?.minSpecial, 1);
if (!this.uppercase && !this.lowercase && !this.special && !this.number) {
this.lowercase = true;
diff --git a/apps/cli/src/utils.ts b/apps/cli/src/utils.ts
index f8780dbec63..5d77f6d3730 100644
--- a/apps/cli/src/utils.ts
+++ b/apps/cli/src/utils.ts
@@ -253,4 +253,20 @@ export class CliUtils {
static convertBooleanOption(optionValue: any) {
return optionValue || optionValue === "" ? true : false;
}
+
+ static convertNumberOption(optionValue: any, defaultValue: number) {
+ try {
+ if (optionValue != null) {
+ const numVal = parseInt(optionValue);
+ return !Number.isNaN(numVal) ? numVal : defaultValue;
+ }
+ return defaultValue;
+ } catch {
+ return defaultValue;
+ }
+ }
+
+ static convertStringOption(optionValue: any, defaultValue: string) {
+ return optionValue != null ? String(optionValue) : defaultValue;
+ }
}
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 82c77156c12..6855485510a 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -1,7 +1,7 @@
{
"name": "@bitwarden/desktop",
"description": "A secure and free password manager for all of your devices.",
- "version": "2023.8.3",
+ "version": "2023.8.4",
"keywords": [
"bitwarden",
"password",
diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts
index b5321a2bc83..39e2d2f8b11 100644
--- a/apps/desktop/src/app/app.component.ts
+++ b/apps/desktop/src/app/app.component.ts
@@ -232,7 +232,7 @@ export class AppComponent implements OnInit, OnDestroy {
break;
case "syncCompleted":
await this.updateAppMenu();
- await this.configService.fetchServerConfig();
+ this.configService.triggerServerConfigFetch();
break;
case "openSettings":
await this.openModal(SettingsComponent, this.settingsRef);
diff --git a/apps/desktop/src/app/app.module.ts b/apps/desktop/src/app/app.module.ts
index 3ac2ca29756..d14c40854cc 100644
--- a/apps/desktop/src/app/app.module.ts
+++ b/apps/desktop/src/app/app.module.ts
@@ -53,7 +53,6 @@ import { ExportComponent } from "./tools/export/export.component";
import { GeneratorComponent } from "./tools/generator.component";
import { PasswordGeneratorHistoryComponent } from "./tools/password-generator-history.component";
import { AddEditComponent as SendAddEditComponent } from "./tools/send/add-edit.component";
-import { EffluxDatesComponent as SendEffluxDatesComponent } from "./tools/send/efflux-dates.component";
import { SendComponent } from "./tools/send/send.component";
@NgModule({
@@ -87,7 +86,6 @@ import { SendComponent } from "./tools/send/send.component";
SearchComponent,
SendAddEditComponent,
SendComponent,
- SendEffluxDatesComponent,
SetPasswordComponent,
SetPinComponent,
SettingsComponent,
diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts
index 34300aed931..0d60a1140f8 100644
--- a/apps/desktop/src/app/services/init.service.ts
+++ b/apps/desktop/src/app/services/init.service.ts
@@ -11,6 +11,7 @@ import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
+import { ConfigService } from "@bitwarden/common/platform/services/config/config.service";
import { ContainerService } from "@bitwarden/common/platform/services/container.service";
import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { VaultTimeoutService } from "@bitwarden/common/services/vault-timeout/vault-timeout.service";
@@ -35,7 +36,8 @@ export class InitService {
private cryptoService: CryptoServiceAbstraction,
private nativeMessagingService: NativeMessagingService,
private themingService: AbstractThemingService,
- private encryptService: EncryptService
+ private encryptService: EncryptService,
+ private configService: ConfigService
) {}
init() {
@@ -71,6 +73,8 @@ export class InitService {
const containerService = new ContainerService(this.cryptoService, this.encryptService);
containerService.attachToGlobal(this.win);
+
+ this.configService.init();
};
}
}
diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts
index ded0366dc16..42208077c33 100644
--- a/apps/desktop/src/app/services/services.module.ts
+++ b/apps/desktop/src/app/services/services.module.ts
@@ -28,7 +28,6 @@ import {
} from "@bitwarden/common/platform/abstractions/log.service";
import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/common/platform/abstractions/messaging.service";
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
-import { StateMigrationService as StateMigrationServiceAbstraction } from "@bitwarden/common/platform/abstractions/state-migration.service";
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/platform/abstractions/system.service";
@@ -134,7 +133,6 @@ const RELOAD_CALLBACK = new InjectionToken<() => any>("RELOAD_CALLBACK");
SECURE_STORAGE,
MEMORY_STORAGE,
LogService,
- StateMigrationServiceAbstraction,
STATE_FACTORY,
STATE_SERVICE_USE_CACHE,
],
diff --git a/apps/desktop/src/app/tools/send/add-edit.component.html b/apps/desktop/src/app/tools/send/add-edit.component.html
index e9e1b319adb..d9f280be598 100644
--- a/apps/desktop/src/app/tools/send/add-edit.component.html
+++ b/apps/desktop/src/app/tools/send/add-edit.component.html
@@ -1,4 +1,4 @@
-
@@ -259,13 +286,12 @@
type="submit"
class="primary btn-submit"
appA11yTitle="{{ 'save' | i18n }}"
- [disabled]="form.loading"
*ngIf="!disableSend"
>
-