mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-19 11:15:21 +01:00
Merge branch 'master' into patrickhlauke-a11y-patch2
This commit is contained in:
commit
f359a1c2be
33
.github/workflows/build.yml
vendored
33
.github/workflows/build.yml
vendored
@ -6,13 +6,13 @@ on:
|
||||
branches-ignore:
|
||||
- 'l10n_master'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
inputs: {}
|
||||
|
||||
|
||||
jobs:
|
||||
cloc:
|
||||
name: CLOC
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
|
||||
@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
setup:
|
||||
name: Setup
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
outputs:
|
||||
repo_url: ${{ steps.gen_vars.outputs.repo_url }}
|
||||
adj_build_number: ${{ steps.gen_vars.outputs.adj_build_number }}
|
||||
@ -46,7 +46,7 @@ jobs:
|
||||
|
||||
locales-test:
|
||||
name: Locales Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
needs: setup
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
@ -78,8 +78,10 @@ jobs:
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: windows-latest
|
||||
needs: [setup, locales-test]
|
||||
runs-on: windows-2019
|
||||
needs:
|
||||
- setup
|
||||
- locales-test
|
||||
env:
|
||||
_BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }}
|
||||
steps:
|
||||
@ -109,6 +111,18 @@ jobs:
|
||||
- name: Gulp
|
||||
run: gulp ci
|
||||
|
||||
- name: Build sources for reviewers
|
||||
shell: cmd
|
||||
run: |
|
||||
mkdir dist\Source
|
||||
call git clone %_REPO_URL% dist\Source
|
||||
cd dist\Source
|
||||
call git checkout %GITHUB_SHA%
|
||||
call git submodule update --init --recursive
|
||||
cd ../
|
||||
del /S/Q "Source\.git\objects\pack\*"
|
||||
call 7z a browser-source-%_BUILD_NUMBER%.zip "Source\*"
|
||||
|
||||
- name: Upload Opera artifact
|
||||
uses: actions/upload-artifact@ee69f02b3dfdecd58bb31b4d133da38ba6fe3700
|
||||
with:
|
||||
@ -137,6 +151,13 @@ jobs:
|
||||
path: dist/dist-edge.zip
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload browser source
|
||||
uses: actions/upload-artifact@ee69f02b3dfdecd58bb31b4d133da38ba6fe3700
|
||||
with:
|
||||
name: browser-source-${{ env._BUILD_NUMBER }}.zip
|
||||
path: dist/browser-source-${{ env._BUILD_NUMBER }}.zip
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload coverage artifact
|
||||
if: false
|
||||
uses: actions/upload-artifact@ee69f02b3dfdecd58bb31b4d133da38ba6fe3700
|
||||
|
2
.github/workflows/crowdin-sync.yml
vendored
2
.github/workflows/crowdin-sync.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
||||
crowdin-sync:
|
||||
name: Autosync
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
env:
|
||||
_CROWDIN_PROJECT_ID: "268134"
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
|
206
.github/workflows/release.yml
vendored
206
.github/workflows/release.yml
vendored
@ -3,21 +3,15 @@ name: Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
release_tag_name_input:
|
||||
description: "Release Tag Name <X.X.X>"
|
||||
required: true
|
||||
inputs: {}
|
||||
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
name: Setup
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
outputs:
|
||||
tag_version: ${{ steps.create_tags.outputs.tag_version }}
|
||||
release_upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
repo_url: ${{ steps.gen_vars.outputs.repo_url }}
|
||||
adj_build_number: ${{ steps.gen_vars.outputs.adj_build_number }}
|
||||
release-version: ${{ steps.version.outputs.package-version }}
|
||||
steps:
|
||||
- name: Branch check
|
||||
run: |
|
||||
@ -30,54 +24,28 @@ jobs:
|
||||
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
|
||||
|
||||
- name: Get Package Version
|
||||
id: gen_vars
|
||||
shell: pwsh
|
||||
run: |
|
||||
$repo_url = "https://github.com/${env:GITHUB_REPOSITORY}.git"
|
||||
$build_num = [int]$env:GITHUB_RUN_NUMBER
|
||||
$adj_build_num = $build_num + 3000
|
||||
|
||||
echo "::set-output name=repo_url::$repo_url"
|
||||
echo "::set-output name=adj_build_number::$adj_build_num"
|
||||
|
||||
- name: Create Release Vars
|
||||
id: create_tags
|
||||
run: |
|
||||
case "${RELEASE_TAG_NAME_INPUT:0:1}" in
|
||||
v)
|
||||
echo "RELEASE_NAME=${RELEASE_TAG_NAME_INPUT:1}" >> $GITHUB_ENV
|
||||
echo "RELEASE_TAG_NAME=$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
|
||||
echo "::set-output name=tag_version::$RELEASE_TAG_NAME_INPUT"
|
||||
;;
|
||||
[0-9])
|
||||
echo "RELEASE_NAME=$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
|
||||
echo "RELEASE_TAG_NAME=v$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
|
||||
echo "::set-output name=tag_version::v$RELEASE_TAG_NAME_INPUT"
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
env:
|
||||
RELEASE_TAG_NAME_INPUT: ${{ github.event.inputs.release_tag_name_input }}
|
||||
|
||||
- name: Create Draft Release
|
||||
id: create_release
|
||||
uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ env.RELEASE_TAG_NAME }}
|
||||
release_name: Version ${{ env.RELEASE_NAME }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
ref: rc
|
||||
|
||||
- name: Check Release Version
|
||||
id: version
|
||||
run: |
|
||||
version=$( jq -r ".version" src/manifest.json)
|
||||
previous_release_tag_version=$(
|
||||
curl -sL https://api.github.com/repos/$GITHUB_REPOSITORY/releases/latest | jq -r ".tag_name"
|
||||
)
|
||||
|
||||
if [ "v$version" == "$previous_release_tag_version" ]; then
|
||||
echo "[!] Already released v$version. Please bump version to continue"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "::set-output name=package-version::$version"
|
||||
|
||||
|
||||
locales-test:
|
||||
name: Locales Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
needs: setup
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
@ -107,109 +75,43 @@ jobs:
|
||||
echo "Test passed!"
|
||||
fi
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: windows-latest
|
||||
needs: [setup, locales-test]
|
||||
env:
|
||||
_REPO_URL: ${{ needs.setup.outputs.repo_url }}
|
||||
_BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }}
|
||||
|
||||
release:
|
||||
name: Create GitHub Release
|
||||
runs-on: ubuntu-20.04
|
||||
needs:
|
||||
- setup
|
||||
- locales-test
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@46071b5c7a2e0c34e49c3cb8a0e792e86e18d5ea
|
||||
- name: Download latest RC build artifacts
|
||||
uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
|
||||
with:
|
||||
node-version: '14'
|
||||
workflow: build.yml
|
||||
workflow_conclusion: success
|
||||
branch: rc
|
||||
artifacts: 'browser-source-*.zip,
|
||||
dist-chrome-*.zip,
|
||||
dist-opera-*.zip,
|
||||
dist-firefox-*.zip,
|
||||
dist-edge-*.zip'
|
||||
|
||||
- name: Update NPM
|
||||
- name: Get build number
|
||||
id: get-build-number
|
||||
run: |
|
||||
npm install -g npm@7
|
||||
build_num=$(ls browser-source-* | grep -oE "[0-9]+")
|
||||
echo "::set-output name=build-number::$build_num"
|
||||
|
||||
- name: Print environment
|
||||
run: |
|
||||
node --version
|
||||
npm --version
|
||||
|
||||
- name: NPM setup & test
|
||||
run: |
|
||||
npm install
|
||||
npm run dist
|
||||
npm run test
|
||||
|
||||
- name: Gulp
|
||||
run: gulp ci
|
||||
|
||||
- name: Build sources for reviewers
|
||||
shell: cmd
|
||||
run: |
|
||||
mkdir dist\Source
|
||||
call git clone %_REPO_URL% dist\Source
|
||||
cd dist\Source
|
||||
call git checkout %GITHUB_SHA%
|
||||
call git submodule update --init --recursive
|
||||
cd ../
|
||||
del /S/Q "Source\.git\objects\pack\*"
|
||||
call 7z a browser-source-%_BUILD_NUMBER%.zip "Source\*"
|
||||
|
||||
- name: Upload Opera release asset
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Create release
|
||||
uses: ncipollo/release-action@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: dist-opera-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: dist/dist-opera.zip
|
||||
asset_content_type: application
|
||||
|
||||
- name: Upload Chrome release asset
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: dist-chrome-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: dist/dist-chrome.zip
|
||||
asset_content_type: application/zip
|
||||
|
||||
- name: Upload Firefox release asset
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: dist-firefox-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: dist/dist-firefox.zip
|
||||
asset_content_type: application/zip
|
||||
|
||||
- name: Upload Edge release asset
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: dist-edge-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: dist/dist-edge.zip
|
||||
asset_content_type: application/zip
|
||||
|
||||
- name: Upload browser source zip release asset
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: browser-source-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: dist/browser-source-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_content_type: application/zip
|
||||
|
||||
- name: Upload coverage release asset
|
||||
if: false
|
||||
uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.setup.outputs.release_upload_url }}
|
||||
asset_name: coverage-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_path: coverage/coverage-${{ env._BUILD_NUMBER }}.zip
|
||||
asset_content_type: application/zip
|
||||
artifacts: 'browser-source-${{ steps.get-build-number.outputs.build-number }}.zip,
|
||||
dist-chrome-${{ steps.get-build-number.outputs.build-number }}.zip,
|
||||
dist-opera-${{ steps.get-build-number.outputs.build-number }}.zip,
|
||||
dist-firefox-${{ steps.get-build-number.outputs.build-number }}.zip,
|
||||
dist-edge-${{ steps.get-build-number.outputs.build-number }}.zip'
|
||||
commit: ${{ github.sha }}
|
||||
tag: "v${{ needs.setup.outputs.release-version }}"
|
||||
name: "Version ${{ needs.setup.outputs.release-version }}"
|
||||
body: "<insert release notes here>"
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
draft: true
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/3C4iKO0.png" width="64" height="64"></a>
|
||||
<a href="https://addons.mozilla.org/firefox/addon/bitwarden-password-manager/" target="_blank"><img src="https://imgur.com/ihXsdDO.png" width="64" height="64"></a>
|
||||
<a href="https://www.microsoft.com/store/p/bitwarden-free-password-manager/9p6kxl0svnnl" target="_blank"><img src="https://imgur.com/vMcaXaw.png" width="64" height="64"></a>
|
||||
<a href="https://microsoftedge.microsoft.com/addons/detail/bitwarden-free-password/jbkfoedolllekgbhcbcoahefnbanhhlh" target="_blank"><img src="https://imgur.com/vMcaXaw.png" width="64" height="64"></a>
|
||||
<a href="https://addons.opera.com/extensions/details/bitwarden-free-password-manager/" target="_blank"><img src="https://imgur.com/nSJ9htU.png" width="64" height="64"></a>
|
||||
<a href="https://bitwarden.com/download/" target="_blank"><img src="https://imgur.com/ENbaWUu.png" width="64" height="64"></a>
|
||||
<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/EuDp4vP.png" width="64" height="64"></a>
|
||||
|
12
gulpfile.js
12
gulpfile.js
@ -2,7 +2,6 @@ const gulp = require('gulp'),
|
||||
gulpif = require('gulp-if'),
|
||||
filter = require('gulp-filter'),
|
||||
replace = require('gulp-replace'),
|
||||
googleWebFonts = require('gulp-google-webfonts'),
|
||||
jeditor = require("gulp-json-editor"),
|
||||
child = require('child_process'),
|
||||
zip = require('gulp-zip'),
|
||||
@ -204,15 +203,6 @@ function stdOutProc(proc) {
|
||||
proc.stderr.on('data', (data) => console.error(data.toString()));
|
||||
}
|
||||
|
||||
function webfonts() {
|
||||
return gulp.src('./webfonts.list')
|
||||
.pipe(googleWebFonts({
|
||||
fontsDir: 'webfonts',
|
||||
cssFilename: 'webfonts.css'
|
||||
}))
|
||||
.pipe(gulp.dest(paths.cssDir));
|
||||
}
|
||||
|
||||
function ciCoverage(cb) {
|
||||
return gulp.src(paths.coverage + '**/*')
|
||||
.pipe(filter(['**', '!coverage/coverage*.zip']))
|
||||
@ -231,5 +221,3 @@ exports['dist:safari:dmg'] = distSafariDmg;
|
||||
exports.dist = gulp.parallel(distFirefox, distChrome, distOpera, distEdge);
|
||||
exports['ci:coverage'] = ciCoverage;
|
||||
exports.ci = ciCoverage;
|
||||
exports.webfonts = webfonts;
|
||||
exports.build = webfonts;
|
||||
|
2
jslib
2
jslib
@ -1 +1 @@
|
||||
Subproject commit 83548a6753a974c57cb373b529a4da3ea5c3b5c0
|
||||
Subproject commit 91b73fa77727a12c788c00eef4f32065c23b6314
|
3879
package-lock.json
generated
3879
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -9,10 +9,10 @@
|
||||
"symlink:win": "rmdir /S /Q .\\jslib && cmd /c mklink /J .\\jslib ..\\jslib",
|
||||
"symlink:mac": "npm run symlink:lin",
|
||||
"symlink:lin": "rm -rf ./jslib && ln -s ../jslib ./jslib",
|
||||
"build": "gulp build && webpack",
|
||||
"build:watch": "gulp build && webpack --watch",
|
||||
"build:prod": "gulp build && cross-env NODE_ENV=production webpack",
|
||||
"build:prod:watch": "gulp build && cross-env NODE_ENV=production webpack --watch",
|
||||
"build": "webpack",
|
||||
"build:watch": "webpack --watch",
|
||||
"build:prod": "cross-env NODE_ENV=production webpack",
|
||||
"build:prod:watch": "cross-env NODE_ENV=production webpack --watch",
|
||||
"clean:l10n": "git push origin --delete l10n_master",
|
||||
"dist": "npm run build:prod && gulp dist",
|
||||
"dist:firefox": "npm run build:prod && gulp dist:firefox",
|
||||
@ -42,7 +42,6 @@
|
||||
"file-loader": "^6.2.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-filter": "^7.0.0",
|
||||
"gulp-google-webfonts": "^4.0.0",
|
||||
"gulp-if": "^3.0.0",
|
||||
"gulp-json-editor": "^2.5.5",
|
||||
"gulp-replace": "^1.1.0",
|
||||
|
@ -331,7 +331,7 @@
|
||||
"message": "Etibarsız ana şifrə"
|
||||
},
|
||||
"vaultTimeout": {
|
||||
"message": "Anbara müraciət vaxtı bitdi"
|
||||
"message": "Anbara müraciət bitəcək"
|
||||
},
|
||||
"lockNow": {
|
||||
"message": "İndi kilidlə"
|
||||
|
@ -501,7 +501,7 @@
|
||||
"message": "Edited item"
|
||||
},
|
||||
"deleteItemConfirmation": {
|
||||
"message": "Are you sure you want to delete this item?"
|
||||
"message": "Do you really want to send to the bin?"
|
||||
},
|
||||
"deletedItem": {
|
||||
"message": "Sent item to bin"
|
||||
@ -600,7 +600,7 @@
|
||||
"description": "Light color"
|
||||
},
|
||||
"solarizedDark": {
|
||||
"message": "Solarised Dark",
|
||||
"message": "Solarized Dark",
|
||||
"description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
|
||||
},
|
||||
"exportVault": {
|
||||
@ -638,7 +638,7 @@
|
||||
"message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?"
|
||||
},
|
||||
"moveToOrganization": {
|
||||
"message": "Move to organisation"
|
||||
"message": "Move to Organisation"
|
||||
},
|
||||
"share": {
|
||||
"message": "Share"
|
||||
@ -909,7 +909,7 @@
|
||||
"message": "The environment URLs have been saved."
|
||||
},
|
||||
"enableAutoFillOnPageLoad": {
|
||||
"message": "Enable auto-fill on page load"
|
||||
"message": "Enable Auto-fill on Page Load"
|
||||
},
|
||||
"enableAutoFillOnPageLoadDesc": {
|
||||
"message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
|
||||
@ -1116,7 +1116,7 @@
|
||||
"message": "City / town"
|
||||
},
|
||||
"stateProvince": {
|
||||
"message": "State / Union territory"
|
||||
"message": "County"
|
||||
},
|
||||
"zipPostalCode": {
|
||||
"message": "Postcode"
|
||||
@ -1429,13 +1429,13 @@
|
||||
"message": "By checking this box you agree to the following:"
|
||||
},
|
||||
"acceptPoliciesError": {
|
||||
"message": "Terms of Service and Privacy Policy have not been acknowledged."
|
||||
"message": "Terms of service and privacy policy have not been acknowledged."
|
||||
},
|
||||
"termsOfService": {
|
||||
"message": "Terms of Service"
|
||||
"message": "Terms of service"
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Privacy Policy"
|
||||
"message": "Privacy policy"
|
||||
},
|
||||
"hintEqualsPassword": {
|
||||
"message": "Your password hint cannot be the same as your password."
|
||||
@ -1465,7 +1465,7 @@
|
||||
"message": "Unable to enable biometrics"
|
||||
},
|
||||
"errorEnableBiometricDesc": {
|
||||
"message": "Action was canceled by the desktop application"
|
||||
"message": "Action was cancelled by the desktop application"
|
||||
},
|
||||
"nativeMessagingInvalidEncryptionDesc": {
|
||||
"message": "Desktop application invalidated the secure communication channel. Please retry this operation"
|
||||
@ -1477,7 +1477,7 @@
|
||||
"message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
|
||||
},
|
||||
"nativeMessagingWrongUserTitle": {
|
||||
"message": "Account missmatch"
|
||||
"message": "Account mismatch"
|
||||
},
|
||||
"biometricsNotEnabledTitle": {
|
||||
"message": "Biometrics not enabled"
|
||||
@ -1504,10 +1504,10 @@
|
||||
"message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
|
||||
},
|
||||
"personalOwnershipSubmitError": {
|
||||
"message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
|
||||
"message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organisation and choose from available Collections."
|
||||
},
|
||||
"personalOwnershipPolicyInEffect": {
|
||||
"message": "An organization policy is affecting your ownership options."
|
||||
"message": "An organisation policy is affecting your ownership options."
|
||||
},
|
||||
"excludedDomains": {
|
||||
"message": "Excluded Domains"
|
||||
|
@ -635,7 +635,7 @@
|
||||
"message": "Aprende sobre Organizaciones"
|
||||
},
|
||||
"learnOrgConfirmation": {
|
||||
"message": "Bitwarden te permite compartir tus objetos de bóveda con otros usando una organización. ¿Quieres visitar el sitio web de bitwarden.com para saber más?"
|
||||
"message": "Bitwarden te permite compartir objetos de tu caja fuerte con otros usando una organización. ¿Quieres visitar el sitio web de bitwarden.com para saber más?"
|
||||
},
|
||||
"moveToOrganization": {
|
||||
"message": "Mover a la Organización"
|
||||
|
@ -638,7 +638,7 @@
|
||||
"message": "Bitwarden võimaldab sul hoidla sisu teiste kasutajatega jagada, kasutades selleks organisatsiooni kontot. Soovid külastada lehekülge bitwarden.com ja selle kohta rohkem lugeda?"
|
||||
},
|
||||
"moveToOrganization": {
|
||||
"message": "Teisalda organisatsioonile"
|
||||
"message": "Teisalda organisatsiooni"
|
||||
},
|
||||
"share": {
|
||||
"message": "Jaga"
|
||||
|
@ -312,7 +312,7 @@
|
||||
"message": "Holvisi on lukittu. Syötä pääsalasana jatkaaksesi."
|
||||
},
|
||||
"unlock": {
|
||||
"message": "Avaa lukitus"
|
||||
"message": "Avaa"
|
||||
},
|
||||
"loggedInAsOn": {
|
||||
"message": "Kirjautuneena tunnuksella $EMAIL$ palveluun $HOSTNAME$.",
|
||||
@ -638,7 +638,7 @@
|
||||
"message": "Bitwardenin avulla voit jakaa holvisi sisältöä muiden kanssa organisaatiotiliä käyttäen. Haluatko lukea bitwarden.com-sivustolta lisää?"
|
||||
},
|
||||
"moveToOrganization": {
|
||||
"message": "Siirrä organisaatioon"
|
||||
"message": "Siirrä organisaatiolle"
|
||||
},
|
||||
"share": {
|
||||
"message": "Jaa"
|
||||
@ -657,7 +657,7 @@
|
||||
}
|
||||
},
|
||||
"moveToOrgDesc": {
|
||||
"message": "Valitse organisaatio, johon haluat siirtää kohteen. Tämä siirtää kohteen organisaation omistukseen, etkä tämän jälkeen ole enää sen suora omistaja."
|
||||
"message": "Valitse organisaatio, jolle haluat siirtää kohteen. Tämä siirtää kohteen organisaation omistukseen, etkä tämän jälkeen ole enää sen suora omistaja."
|
||||
},
|
||||
"learnMore": {
|
||||
"message": "Lue lisää"
|
||||
@ -1292,10 +1292,10 @@
|
||||
"description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
|
||||
},
|
||||
"unlockWithPin": {
|
||||
"message": "Avaa lukitus PIN-koodilla"
|
||||
"message": "Avaa PIN-koodilla"
|
||||
},
|
||||
"setYourPinCode": {
|
||||
"message": "Aseta PIN-koodisi Bitwardenin avausta varten. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos sovelluksesta."
|
||||
"message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos laajennuksesta."
|
||||
},
|
||||
"pinRequired": {
|
||||
"message": "PIN-koodi vaaditaan."
|
||||
|
@ -482,7 +482,7 @@
|
||||
"message": "यूआरआइ"
|
||||
},
|
||||
"uriPosition": {
|
||||
"message": "यू.आर.ऐ",
|
||||
"message": "URI $POSITION$",
|
||||
"description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
|
||||
"placeholders": {
|
||||
"position": {
|
||||
@ -501,10 +501,10 @@
|
||||
"message": "संपादित आइटम "
|
||||
},
|
||||
"deleteItemConfirmation": {
|
||||
"message": "क्या आप वास्तव में कचरे में भेजना चाहते हैं?"
|
||||
"message": "क्या आप वास्तव में थ्रैश में भेजना चाहते हैं?"
|
||||
},
|
||||
"deletedItem": {
|
||||
"message": "कचरा में भेजे"
|
||||
"message": "थ्रैश में भेजे"
|
||||
},
|
||||
"overwritePassword": {
|
||||
"message": "Overwrite Password"
|
||||
@ -687,7 +687,7 @@
|
||||
"message": "Add New Attachment"
|
||||
},
|
||||
"noAttachments": {
|
||||
"message": "कोई अटैचमेंट नहीं"
|
||||
"message": "कोई अटैचमेंट नहीं।"
|
||||
},
|
||||
"attachmentSaved": {
|
||||
"message": "अटैचमेंट बच गया है।"
|
||||
@ -696,10 +696,10 @@
|
||||
"message": "फ़ाइल"
|
||||
},
|
||||
"selectFile": {
|
||||
"message": "फ़ाइल का चयन करें|"
|
||||
"message": "फ़ाइल का चयन करें।"
|
||||
},
|
||||
"maxFileSize": {
|
||||
"message": "अधिकतम फाइल आकार 500 MB है"
|
||||
"message": "अधिकतम फाइल आकार 500 MB है।"
|
||||
},
|
||||
"featureUnavailable": {
|
||||
"message": "Feature Unavailable"
|
||||
@ -792,7 +792,7 @@
|
||||
}
|
||||
},
|
||||
"verificationCodeEmailSent": {
|
||||
"message": "ईमेल $EMAIL$ को भेजा गया|",
|
||||
"message": "ईमेल $EMAIL$ को भेजा गया।",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"content": "$1",
|
||||
@ -966,7 +966,7 @@
|
||||
"message": "New Custom Field"
|
||||
},
|
||||
"dragToSort": {
|
||||
"message": "सॉर्ट करने के लिए खींचें"
|
||||
"message": "सॉर्ट करने के लिए ड्रैग करें"
|
||||
},
|
||||
"cfTypeText": {
|
||||
"message": "शब्द"
|
||||
@ -1255,7 +1255,7 @@
|
||||
"description": "ex. Date this password was updated"
|
||||
},
|
||||
"neverLockWarning": {
|
||||
"message": "क्या आप सुनिश्चित हैं कि आप \"कभी नहीं\" विकल्प का उपयोग करना चाहते हैं?\"कभी नहीं\" के लिए अपने लॉक विकल्प को सेट करना आपके डिवाइस पर आपकी वॉल्ट की एन्क्रिप्शन कुंजी को स्टोर करता है।यदि आप इस विकल्प का उपयोग करते हैं तो आपको यह सुनिश्चित करना चाहिए कि आप अपने डिवाइस को ठीक से सुरक्षित रखें।"
|
||||
"message": "क्या आप सुनिश्चित हैं कि आप \"कभी नहीं\" विकल्प का उपयोग करना चाहते हैं?\"कभी नहीं\" के लिए अपने लॉक विकल्प को सेट करना आपके डिवाइस पर आपकी वॉल्ट की एन्क्रिप्शन कुंजी को स्टोर करता है। यदि आप इस विकल्प का उपयोग करते हैं तो आपको यह सुनिश्चित करना चाहिए कि आप अपने डिवाइस को ठीक से सुरक्षित रखें।"
|
||||
},
|
||||
"noOrganizationsList": {
|
||||
"message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
|
||||
@ -1264,7 +1264,7 @@
|
||||
"message": "सूची में कोई संग्रह नहीं है।"
|
||||
},
|
||||
"ownership": {
|
||||
"message": "\nमालिकी"
|
||||
"message": "मालिकी"
|
||||
},
|
||||
"whoOwnsThisItem": {
|
||||
"message": "इस आइटम का मालिक कौन है?"
|
||||
|
@ -620,7 +620,7 @@
|
||||
"message": "Ez az exportálás titkosítás nélkül tartalmazza a széfadatokat. Nem célszerű az exportált fájlt nem biztonságos csatornákon tárolni és tovább küldeni (például emailben). A felhasználás után erősen ajánlott a törlés."
|
||||
},
|
||||
"encExportKeyWarningDesc": {
|
||||
"message": "Ez az exportálás titkosítja az adatokat a fiók titkosítási kulcsával. Ha a fiók titkosítási kulcsa megváltozik, akkor ismét exportálni kell, különben az exportált fájl visszafejtése nem lehetséges."
|
||||
"message": "Ez az exportálás titkosítja az adatokat a fiók titkosítási kulcsával. Ha valaha a diók forgatási kulcsa más lesz, akkor újra exportálni kell, mert nem lehet visszafejteni ezt az exportálási fájlt."
|
||||
},
|
||||
"encExportAccountWarningDesc": {
|
||||
"message": "A fiók titkosítási kulcsai minden Bitwarden felhasználói fiókhoz egyediek, ezért nem importálhatunk titkosított exportálást egy másik fiókba."
|
||||
@ -699,7 +699,7 @@
|
||||
"message": "Válassz ki egy fájlt."
|
||||
},
|
||||
"maxFileSize": {
|
||||
"message": "A naximális fájl méret 500 MB."
|
||||
"message": "A naximális fájlméret 500 MB."
|
||||
},
|
||||
"featureUnavailable": {
|
||||
"message": "Ez a funkció nem érhető el."
|
||||
@ -1513,10 +1513,10 @@
|
||||
"message": "Kizárt domainek"
|
||||
},
|
||||
"excludedDomainsDesc": {
|
||||
"message": "A Bitwarden nem fog rákérdezni a bejelentkezési adatok mentésére a megadott domaineken. Frissítsd az oldalt a változtatások életbe lépéséhez."
|
||||
"message": "A Bitwarden nem fogja kérni a domainek bejelentkezési adatainak mentését. A változások életbe lépéséhez frissíteni kell az oldalt."
|
||||
},
|
||||
"excludedDomainsInvalidDomain": {
|
||||
"message": "$DOMAIN$ egy érvénytelen domain.",
|
||||
"message": "$DOMAIN$ nem érvényes domain.",
|
||||
"placeholders": {
|
||||
"domain": {
|
||||
"content": "$1",
|
||||
@ -1547,7 +1547,7 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"maxAccessCountReached": {
|
||||
"message": "A hozzáférések száma elérte a beállított maximumot."
|
||||
"message": "A maximális hozzáférések száma elérésre került."
|
||||
},
|
||||
"expired": {
|
||||
"message": "Lejárt"
|
||||
@ -1576,7 +1576,7 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendLink": {
|
||||
"message": "Send linkje",
|
||||
"message": "Send hivatkozás",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"disabled": {
|
||||
@ -1686,7 +1686,7 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"createdSend": {
|
||||
"message": "A Küldés létrehozva",
|
||||
"message": "A Send létrejött.",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"editedSend": {
|
||||
@ -1697,10 +1697,10 @@
|
||||
"message": "A fájl kiválasztásához nyissuk meg a kiterjesztést az oldalsávon (ha lehetséges) vagy kattintsunk erre a sávra új ablak felbukkanásához."
|
||||
},
|
||||
"sendFirefoxFileWarning": {
|
||||
"message": "Firefox esetén: nyisd meg a kiegészítőt, vagy erre a feliratra kattintva új ablak nyílik a fájl kiválasztásához"
|
||||
"message": "Firefox esetén nyissuk meg a bővítményt az oldalsávon vafy erre a hirdetőtáblára kattintva új felbukkanó ablak nyílik meg."
|
||||
},
|
||||
"sendSafariFileWarning": {
|
||||
"message": "Safari esetén: erre a feliratra kattintva új ablak nyílik a fájl kiválasztásához"
|
||||
"message": "A fájl kiválasztásához Safariban kattintsunk erre a hirdetőtáblára kattintva új ablak nyílik meg."
|
||||
},
|
||||
"sendFileCalloutHeader": {
|
||||
"message": "Mielőtt belevágnánk"
|
||||
@ -1710,7 +1710,7 @@
|
||||
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
|
||||
},
|
||||
"sendFirefoxCustomDatePopoutMessage2": {
|
||||
"message": "kattints ide",
|
||||
"message": "kattintás ide",
|
||||
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
|
||||
},
|
||||
"sendFirefoxCustomDatePopoutMessage3": {
|
||||
@ -1718,19 +1718,19 @@
|
||||
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
|
||||
},
|
||||
"expirationDateIsInvalid": {
|
||||
"message": "A megadott lejárati idő nem érvényes"
|
||||
"message": "A megadott lejárati idő nem érvényes."
|
||||
},
|
||||
"deletionDateIsInvalid": {
|
||||
"message": "A megadott törlési dátum nem érvényes"
|
||||
"message": "A megadott törlési dátum nem érvényes."
|
||||
},
|
||||
"expirationDateAndTimeRequired": {
|
||||
"message": "Lejárati dátum és idő megadása szükséges"
|
||||
"message": "Lejárati dátum és idő megadása szükséges."
|
||||
},
|
||||
"deletionDateAndTimeRequired": {
|
||||
"message": "Törlési dátum és idő megadása szükséges"
|
||||
"message": "Törlési dátum és idő megadása szükséges."
|
||||
},
|
||||
"dateParsingError": {
|
||||
"message": "Hiba történt a törlési és a lejárati dátum mentésekor"
|
||||
"message": "Hiba történt a törlési és a lejárati dátum mentésekor."
|
||||
},
|
||||
"hideEmail": {
|
||||
"message": "Saját email cím elrejtése a címzettek elől."
|
||||
|
@ -600,7 +600,7 @@
|
||||
"description": "Light color"
|
||||
},
|
||||
"solarizedDark": {
|
||||
"message": "Solarized Dark",
|
||||
"message": "Gelap Solarized",
|
||||
"description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
|
||||
},
|
||||
"exportVault": {
|
||||
@ -657,7 +657,7 @@
|
||||
}
|
||||
},
|
||||
"moveToOrgDesc": {
|
||||
"message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
|
||||
"message": "Pilihlah sebuah organisasi yang Anda ingin memindahkan item ini. Memindahkan bearti memberikan kepemilikan kepada organisasi tersebut. Anda tidak akan lagi menjadi pemilik item ini."
|
||||
},
|
||||
"learnMore": {
|
||||
"message": "Pelajari lebih lanjut"
|
||||
@ -822,7 +822,7 @@
|
||||
"message": "Buka tab baru"
|
||||
},
|
||||
"webAuthnAuthenticate": {
|
||||
"message": "Authenticate WebAuthn"
|
||||
"message": "Autentikasi dengan WebAuthn."
|
||||
},
|
||||
"loginUnavailable": {
|
||||
"message": "Info Masuk Tidak Tersedia"
|
||||
@ -867,7 +867,7 @@
|
||||
"message": "FIDO2 WebAuthn"
|
||||
},
|
||||
"webAuthnDesc": {
|
||||
"message": "Use any WebAuthn enabled security key to access your account."
|
||||
"message": "Gunakan kunci yang mendukung WebAUthn untuk mengakses akun anda."
|
||||
},
|
||||
"emailTitle": {
|
||||
"message": "Email"
|
||||
@ -918,22 +918,22 @@
|
||||
"message": "Fitur ini saat ini adalah fitur eksperimental. Gunakan dengan risiko Anda sendiri."
|
||||
},
|
||||
"defaultAutoFillOnPageLoad": {
|
||||
"message": "Default autofill setting for login items"
|
||||
"message": "Konfigurasi autofill standard untuk item login."
|
||||
},
|
||||
"defaultAutoFillOnPageLoadDesc": {
|
||||
"message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
|
||||
"message": "Setelah mengaktifkan Auto-Fill waktu website terbuka, kamu dapat mengaktifkan atau meng-nonaktifkan feature ini untuk setiap item. Ini adalah konfigurasi standard untuk item yang tidak dikonfigurasi terpisah."
|
||||
},
|
||||
"itemAutoFillOnPageLoad": {
|
||||
"message": "Auto-fill on Page Load (if enabled in Options)"
|
||||
"message": "Auto-fill waktu website terbuka (Jika diaktifkan di Options)"
|
||||
},
|
||||
"autoFillOnPageLoadUseDefault": {
|
||||
"message": "Gunakan pengaturan baku"
|
||||
},
|
||||
"autoFillOnPageLoadYes": {
|
||||
"message": "Auto-fill on page load"
|
||||
"message": "Auto-Fill ketika website baru terbuka"
|
||||
},
|
||||
"autoFillOnPageLoadNo": {
|
||||
"message": "Do not auto-fill on page load"
|
||||
"message": "Jangan Auto-Fill ketika website baru terbuka"
|
||||
},
|
||||
"commandOpenPopup": {
|
||||
"message": "Buka popup brankas"
|
||||
@ -990,10 +990,10 @@
|
||||
"message": "Ikon Situs Web menyediakan gambar yang mudah dikenali di sebelah item info masuk di dalam brankas Anda."
|
||||
},
|
||||
"disableBadgeCounter": {
|
||||
"message": "Disable Badge Counter"
|
||||
"message": "Matikan angka penghitung "
|
||||
},
|
||||
"disableBadgeCounterDesc": {
|
||||
"message": "Badge counter indicates how many logins you have for the current page in your vault."
|
||||
"message": "Angka penghitung menandakan jumlah login yang kamu punya untuk website saat ini yang ada di dalam vault kamu."
|
||||
},
|
||||
"cardholderName": {
|
||||
"message": "Nama Pemegang Kartu"
|
||||
@ -1694,7 +1694,7 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendLinuxChromiumFileWarning": {
|
||||
"message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
|
||||
"message": "Untuk memilih file ini, buka Extension di sidebar (jika memungkinkan) atau keluarkan menjadi window baru dengan menekan gambar ini."
|
||||
},
|
||||
"sendFirefoxFileWarning": {
|
||||
"message": "Untuk memilih file menggunakan Firefox, buka ekstensi di sidebar atau keluar ke jendela baru dengan mengklik banner ini."
|
||||
@ -1736,10 +1736,10 @@
|
||||
"message": "Sembunyikan alamat surel dari penerima."
|
||||
},
|
||||
"sendOptionsPolicyInEffect": {
|
||||
"message": "One or more organization policies are affecting your Send options."
|
||||
"message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan feature Send anda."
|
||||
},
|
||||
"passwordPrompt": {
|
||||
"message": "Master password re-prompt"
|
||||
"message": "Master password ditanyakan kembali"
|
||||
},
|
||||
"passwordConfirmation": {
|
||||
"message": "Konfirmasi sandi utama"
|
||||
|
@ -600,7 +600,7 @@
|
||||
"description": "Light color"
|
||||
},
|
||||
"solarizedDark": {
|
||||
"message": "Solarized Dark",
|
||||
"message": "Solarized ダーク",
|
||||
"description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
|
||||
},
|
||||
"exportVault": {
|
||||
@ -816,13 +816,13 @@
|
||||
"message": "セキュリティキーを USB ポートに挿入し、ボタンがある場合はボタンをタッチしてください。"
|
||||
},
|
||||
"webAuthnNewTab": {
|
||||
"message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
|
||||
"message": "WebAuthn 2FA 認証を開始するには、下のボタンをクリックして新しいタブを開き、新しいタブの指示に従ってください。"
|
||||
},
|
||||
"webAuthnNewTabOpen": {
|
||||
"message": "新しいタブを開く"
|
||||
},
|
||||
"webAuthnAuthenticate": {
|
||||
"message": "Authenticate WebAuthn"
|
||||
"message": "WebAuthn の認証"
|
||||
},
|
||||
"loginUnavailable": {
|
||||
"message": "ログインできません。"
|
||||
@ -867,7 +867,7 @@
|
||||
"message": "FIDO2 WebAuthn"
|
||||
},
|
||||
"webAuthnDesc": {
|
||||
"message": "Use any WebAuthn enabled security key to access your account."
|
||||
"message": "アカウントにアクセスするに WebAuthn 対応のセキュリティキーを使用します。"
|
||||
},
|
||||
"emailTitle": {
|
||||
"message": "メールアドレス"
|
||||
|
@ -7,7 +7,7 @@
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "Drošs un bezmaksas paroļu pārvaldnieks priekš visām jūsu ierīcēm.",
|
||||
"message": "Drošs bezmaksas paroļu pārvaldnieks visām Tavām ierīcēm.",
|
||||
"description": "Extension description"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -924,16 +924,16 @@
|
||||
"message": "Etter aktivering av auto-utfylling på sidelasser, kan du aktivere eller deaktivere funksjonen for individuelle innloggingselementer. Dette er standardinnstillingen for innloggingselementer som ikke er satt opp separat."
|
||||
},
|
||||
"itemAutoFillOnPageLoad": {
|
||||
"message": "Auto-fill on Page Load (if enabled in Options)"
|
||||
"message": "Auto-utfyll på sideinnlastning (hvis aktivert i Alternativer)"
|
||||
},
|
||||
"autoFillOnPageLoadUseDefault": {
|
||||
"message": "Use default setting"
|
||||
"message": "Bruk standardinnstillinger"
|
||||
},
|
||||
"autoFillOnPageLoadYes": {
|
||||
"message": "Auto-fill on page load"
|
||||
"message": "Auto-utfyll ved innlasting av side"
|
||||
},
|
||||
"autoFillOnPageLoadNo": {
|
||||
"message": "Do not auto-fill on page load"
|
||||
"message": "Ikke fyll automatisk når du laster inn siden"
|
||||
},
|
||||
"commandOpenPopup": {
|
||||
"message": "Åpne hvelv-vindu"
|
||||
@ -990,10 +990,10 @@
|
||||
"message": "Nettstedsikoner sørger for et gjenkjennelig bilde ved siden av hver innloggingsgjenstand i hvelvet ditt."
|
||||
},
|
||||
"disableBadgeCounter": {
|
||||
"message": "Disable Badge Counter"
|
||||
"message": "Deaktiver Badge Teller"
|
||||
},
|
||||
"disableBadgeCounterDesc": {
|
||||
"message": "Badge counter indicates how many logins you have for the current page in your vault."
|
||||
"message": "Bade-teller indikerer hvor mange innlogginger du har for den nåværende siden i hvelvet ditt."
|
||||
},
|
||||
"cardholderName": {
|
||||
"message": "Kortholderens navn"
|
||||
@ -1498,10 +1498,10 @@
|
||||
"message": "Uten tillatelse til å kommunisere med Bitwardens skrivebordsprogram kan vi ikke tilgjengeligjøre biometri i nettleserutvidelsen. Prøv igjen."
|
||||
},
|
||||
"nativeMessaginPermissionSidebarTitle": {
|
||||
"message": "Permission request error"
|
||||
"message": "Feil ved forespørsel om tillatelse"
|
||||
},
|
||||
"nativeMessaginPermissionSidebarDesc": {
|
||||
"message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
|
||||
"message": "Denne handlingen kan ikke gjøres i sidestolpen, prøv på nytt i sprettoppvinduet eller popvindu."
|
||||
},
|
||||
"personalOwnershipSubmitError": {
|
||||
"message": "På grunn av bedrifsretningslinjer er du begrenset fra å lagre objekter til ditt personlige hvelv. Endre alternativ for eierskap til en organisasjon og velg blant tilgjengelige samlinger."
|
||||
@ -1510,13 +1510,13 @@
|
||||
"message": "En bedriftsretningslinje påvirker dine eierskapsinnstillinger."
|
||||
},
|
||||
"excludedDomains": {
|
||||
"message": "Excluded Domains"
|
||||
"message": "Ekskluderte domener"
|
||||
},
|
||||
"excludedDomainsDesc": {
|
||||
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
|
||||
"message": "Bitwarden vil ikke be om å lagre innloggingsdetaljer for disse domenene. Du må oppdatere siden for at endringene skal tre i kraft."
|
||||
},
|
||||
"excludedDomainsInvalidDomain": {
|
||||
"message": "$DOMAIN$ is not a valid domain",
|
||||
"message": "$DOMAIN$ er ikke et gyldig domene",
|
||||
"placeholders": {
|
||||
"domain": {
|
||||
"content": "$1",
|
||||
@ -1547,7 +1547,7 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"maxAccessCountReached": {
|
||||
"message": "Max access count reached"
|
||||
"message": "Maksimalt antall tilganger nådd"
|
||||
},
|
||||
"expired": {
|
||||
"message": "Utløpt"
|
||||
@ -1602,17 +1602,17 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendNameDesc": {
|
||||
"message": "A friendly name to describe this Send.",
|
||||
"message": "Et vennlig navn for å beskrive dette Send.",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendFileDesc": {
|
||||
"message": "The file you want to send."
|
||||
"message": "Filen du vil send."
|
||||
},
|
||||
"deletionDate": {
|
||||
"message": "Dato for sletting"
|
||||
},
|
||||
"deletionDateDesc": {
|
||||
"message": "The Send will be permanently deleted on the specified date and time.",
|
||||
"message": "Send-en vil bli slettet permanent på den angitte dato og klokkeslett.",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"expirationDate": {
|
||||
@ -1682,25 +1682,25 @@
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendDisabledWarning": {
|
||||
"message": "Due to an enterprise policy, you are only able to delete an existing Send.",
|
||||
"message": "På grunn av en virksomhetsregel kan du kun slette en eksisterende Send.",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"createdSend": {
|
||||
"message": "Created Send",
|
||||
"message": "Opprettet Send",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"editedSend": {
|
||||
"message": "Edited Send",
|
||||
"message": "Redigerte Send",
|
||||
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
|
||||
},
|
||||
"sendLinuxChromiumFileWarning": {
|
||||
"message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
|
||||
"message": "For å velge en fil, åpne utvidelsen i sidepanelet (hvis mulig) eller poppe ut til et nytt vindu ved å klikke på dette banneret."
|
||||
},
|
||||
"sendFirefoxFileWarning": {
|
||||
"message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
|
||||
"message": "For å velge en fil med Firefox må du åpne utvidelsen i sidestolpen eller sprette ut til et nytt vindu ved å klikke på dette banneret."
|
||||
},
|
||||
"sendSafariFileWarning": {
|
||||
"message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
|
||||
"message": "For å velge en fil med Safari, popp ut i et nytt vindu ved å klikke på dette banneret."
|
||||
},
|
||||
"sendFileCalloutHeader": {
|
||||
"message": "Før du starter"
|
||||
@ -1739,7 +1739,7 @@
|
||||
"message": "En eller flere av organisasjons retningslinjer påvirker generatorinnstillingene dine."
|
||||
},
|
||||
"passwordPrompt": {
|
||||
"message": "Master password re-prompt"
|
||||
"message": "Forespørsel om hovedpassord på nytt"
|
||||
},
|
||||
"passwordConfirmation": {
|
||||
"message": "Superpassord bekreftelse"
|
||||
|
@ -2,7 +2,7 @@
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extName__",
|
||||
"short_name": "__MSG_appName__",
|
||||
"version": "1.52.1",
|
||||
"version": "1.53.0",
|
||||
"description": "__MSG_extDesc__",
|
||||
"default_locale": "en",
|
||||
"author": "Bitwarden Inc.",
|
||||
|
@ -1,52 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
<title>Bitwarden</title>
|
||||
<meta charset="utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<table class="outter-table" cellpadding="0" cellspacing="0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width="24">
|
||||
<a href="https://vault.bitwarden.com" target="_blank" id="logo-link" aria-hidden="true">
|
||||
<img id="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVBQTFRFAAAAMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzjZa7EAAAAHB0Uk5TAGOSmJRPBP/wZ5ygx4CC4ZDDBsWdD86RJeX5dF7+3j4Hq78Rj/pY824x2B7tJoS7mgIc2Rqhyid69g6V/FQFe/sN0RTAGcxO4rwVickfrlDIpRsKeZdI94UD6tXmZCO1/TAIWulwn+zumy8B0DPPwmJoSmgAAAFHSURBVHicY2AAAkYmZsKAhZWNAQbYiQIcnCRqYOciVQM3VTXw8CIDPn6CGgQYkAGb4KiGUQ2jGoaTBiFhkJgI8RpExUBi4sRrkJAECklJE69BRhYoJCcP50sS0KCgCBJSUoYLqKji16CmDhSR1UAIaGrh1aCtAxKR1EUS0sOngU0fLGJgiKTByBi3BhNTsICZObIjDS0scWmwsgZL2djaoYSblb0sdg3m3A5gvrUhAypwdMKqwdkFot7JlQEdmLhhamBz94DwPJ0x1DMweLmgaxD1toFwfHyxqAcmGD8bZA1s/gGQ+JQNDMKqnoEhOEQdriE0LDAcwpKMCMahnoEhki8KpiE6BsrgiBXCqR4I4uITUEMrMBGfciBISo5CUp6SSkA5CCSmpUOVZ2RmZROhgYFNPgesXjjXjrBiCDC0zQvP52TDKgcAwC5BBQq6zvAAAAAASUVORK5CYII=" />
|
||||
</a>
|
||||
</td>
|
||||
<td id="content"></td>
|
||||
<td align="right" width="15">
|
||||
<button type="button" class="neutral" id="close-button">
|
||||
<img id="close" alt="X" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeBAMAAADJHrORAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABJQTFRFAAAAMzMzMzMzMzMzMzMzMzMzbxxq5QAAAAZ0Uk5TAECg/2CfwOuXQgAAAJVJREFUeJxVkdEJwzAMRNXgAQpZINAu0Fz7b3AHyP7T1MrppNQfMuI9sE42s7vp3Lws7+zHMcsDPdqGz8SAhAEctgIhNDhiDYyNVw+8p5ZYgrCExBS+iSmgMIXCEhJTKMy+Yobf//BF0Hv9gp8lcPKRAifPPSiYBAULoXJTWHNyJy/f917vbv4fCtZOslSwcZLKMf/zB2MLKtNp5GuwAAAAAElFTkSuQmCC" />
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="outer-wrapper">
|
||||
<div class="logo">
|
||||
<a href="https://vault.bitwarden.com" target="_blank" id="logo-link">
|
||||
<img id="logo" alt="Bitwarden" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVBQTFRFAAAAMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzjZa7EAAAAHB0Uk5TAGOSmJRPBP/wZ5ygx4CC4ZDDBsWdD86RJeX5dF7+3j4Hq78Rj/pY824x2B7tJoS7mgIc2Rqhyid69g6V/FQFe/sN0RTAGcxO4rwVickfrlDIpRsKeZdI94UD6tXmZCO1/TAIWulwn+zumy8B0DPPwmJoSmgAAAFHSURBVHicY2AAAkYmZsKAhZWNAQbYiQIcnCRqYOciVQM3VTXw8CIDPn6CGgQYkAGb4KiGUQ2jGoaTBiFhkJgI8RpExUBi4sRrkJAECklJE69BRhYoJCcP50sS0KCgCBJSUoYLqKji16CmDhSR1UAIaGrh1aCtAxKR1EUS0sOngU0fLGJgiKTByBi3BhNTsICZObIjDS0scWmwsgZL2djaoYSblb0sdg3m3A5gvrUhAypwdMKqwdkFot7JlQEdmLhhamBz94DwPJ0x1DMweLmgaxD1toFwfHyxqAcmGD8bZA1s/gGQ+JQNDMKqnoEhOEQdriE0LDAcwpKMCMahnoEhki8KpiE6BsrgiBXCqR4I4uITUEMrMBGfciBISo5CUp6SSkA5CCSmpUOVZ2RmZROhgYFNPgesXjjXjrBiCDC0zQvP52TDKgcAwC5BBQq6zvAAAAAASUVORK5CYII=" />
|
||||
</a>
|
||||
</div>
|
||||
<div id="content"></div>
|
||||
<div>
|
||||
<button type="button" class="neutral" id="close-button">
|
||||
<img id="close" alt="X" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeBAMAAADJHrORAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABJQTFRFAAAAMzMzMzMzMzMzMzMzMzMzbxxq5QAAAAZ0Uk5TAECg/2CfwOuXQgAAAJVJREFUeJxVkdEJwzAMRNXgAQpZINAu0Fz7b3AHyP7T1MrppNQfMuI9sE42s7vp3Lws7+zHMcsDPdqGz8SAhAEctgIhNDhiDYyNVw+8p5ZYgrCExBS+iSmgMIXCEhJTKMy+Yobf//BF0Hv9gp8lcPKRAifPPSiYBAULoXJTWHNyJy/f917vbv4fCtZOslSwcZLKMf/zB2MLKtNp5GuwAAAAAElFTkSuQmCC" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="templates" style="display: none;">
|
||||
<table class="inner-table" cellpadding="0" cellspacing="0" id="template-add">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="add-text"></td>
|
||||
<td align="right">
|
||||
<button class="never-save link"></button>
|
||||
</td>
|
||||
<td align="right" class="add-buttons">
|
||||
<select class="select-folder"></select>
|
||||
<button class="add-save"></button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="inner-table" cellpadding="0" cellspacing="0" id="template-change">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="change-text"></td>
|
||||
<td align="right" class="change-buttons">
|
||||
<button type="button" class="change-save"></button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="inner-wrapper" id="template-add">
|
||||
<div class="add-text"></div>
|
||||
<div class="add-buttons">
|
||||
<button class="never-save link"></button>
|
||||
<select class="select-folder"></select>
|
||||
<button class="add-save"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-wrapper" id="template-change">
|
||||
<div class="change-text"></div>
|
||||
<div class="change-buttons">
|
||||
<button class="change-save"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="template-alert"></div>
|
||||
</div>
|
||||
</body>
|
||||
|
@ -8,6 +8,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
i18n.close = chrome.i18n.getMessage('close');
|
||||
i18n.yes = chrome.i18n.getMessage('yes');
|
||||
i18n.never = chrome.i18n.getMessage('never');
|
||||
i18n.folder = chrome.i18n.getMessage('folder');
|
||||
i18n.notificationAddSave = chrome.i18n.getMessage('notificationAddSave');
|
||||
i18n.notificationNeverSave = chrome.i18n.getMessage('notificationNeverSave');
|
||||
i18n.notificationAddDesc = chrome.i18n.getMessage('notificationAddDesc');
|
||||
@ -39,6 +40,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
document.querySelector('#template-add .add-save').textContent = i18n.notificationAddSave;
|
||||
document.querySelector('#template-add .never-save').textContent = i18n.notificationNeverSave;
|
||||
document.querySelector('#template-add .select-folder').style.display = 'initial';
|
||||
document.querySelector('#template-add .select-folder').setAttribute('aria-label', i18n.folder);
|
||||
document.querySelector('#template-change .change-save').textContent = i18n.notificationChangeSave;
|
||||
}
|
||||
|
||||
|
@ -9,31 +9,35 @@
|
||||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
.outer-wrapper {
|
||||
padding: 0 10px;
|
||||
border-bottom: 2px solid #175ddc;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto 1fr;
|
||||
column-gap: 10px;
|
||||
grid-column-gap: 10px;
|
||||
box-sizing: border-box;
|
||||
height: 42px;
|
||||
}
|
||||
|
||||
.outter-table > tbody > tr > td {
|
||||
padding: 0 0 0 10px;
|
||||
border-bottom: 2px solid #175DDC;
|
||||
height: 40px;
|
||||
.outer-wrapper > * {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.outter-table > tbody > tr > td:last-child {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.inner-table td {
|
||||
padding: 0 10px 0 0;
|
||||
.inner-wrapper {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 1fr;
|
||||
column-gap: 10px;
|
||||
grid-column-gap: 10px;
|
||||
}
|
||||
|
||||
.inner-table td:last-child {
|
||||
padding: 0;
|
||||
}
|
||||
#content .change-buttons {
|
||||
justify-self: end;
|
||||
}
|
||||
|
||||
.inner-table td button {
|
||||
margin-left: 5px;
|
||||
}
|
||||
.wrapper > *, .inner-wrapper > * {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
@ -84,12 +88,13 @@ button.neutral {
|
||||
}
|
||||
|
||||
body[class*='lang-en'] .add-buttons {
|
||||
width: 50px;
|
||||
width: 175px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
body[class*='lang-en'] .add-buttons {
|
||||
width: 320px;
|
||||
width: 420px;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -51,7 +51,7 @@ export class LockComponent extends BaseLockComponent {
|
||||
}, 100);
|
||||
}
|
||||
|
||||
async unlockBiometric() {
|
||||
async unlockBiometric(): Promise<boolean> {
|
||||
if (!this.biometricLock) {
|
||||
return;
|
||||
}
|
||||
@ -68,8 +68,13 @@ export class LockComponent extends BaseLockComponent {
|
||||
showConfirmButton: false,
|
||||
});
|
||||
|
||||
await super.unlockBiometric();
|
||||
const success = await super.unlockBiometric();
|
||||
|
||||
Swal.close();
|
||||
// Avoid closing the error dialogs
|
||||
if (success) {
|
||||
Swal.close();
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.se
|
||||
import { StateService } from 'jslib-common/abstractions/state.service';
|
||||
import { StorageService } from 'jslib-common/abstractions/storage.service';
|
||||
import { SyncService } from 'jslib-common/abstractions/sync.service';
|
||||
import { UserService } from 'jslib-common/abstractions/user.service';
|
||||
|
||||
import { LoginComponent as BaseLoginComponent } from 'jslib-angular/components/login.component';
|
||||
|
||||
@ -24,14 +23,10 @@ export class LoginComponent extends BaseLoginComponent {
|
||||
protected stateService: StateService, protected environmentService: EnvironmentService,
|
||||
protected passwordGenerationService: PasswordGenerationService,
|
||||
protected cryptoFunctionService: CryptoFunctionService, storageService: StorageService,
|
||||
syncService: SyncService, private userService: UserService) {
|
||||
syncService: SyncService) {
|
||||
super(authService, router, platformUtilsService, i18nService, stateService, environmentService, passwordGenerationService, cryptoFunctionService, storageService);
|
||||
super.onSuccessfulLogin = async () => {
|
||||
await syncService.fullSync(true).then(async () => {
|
||||
if (await this.userService.getForcePasswordReset()) {
|
||||
this.router.navigate(['update-temp-password']);
|
||||
}
|
||||
});
|
||||
await syncService.fullSync(true);
|
||||
};
|
||||
super.successRoute = '/tabs/vault';
|
||||
}
|
||||
|
@ -31,13 +31,6 @@ export class SetPasswordComponent extends BaseSetPasswordComponent {
|
||||
syncService: SyncService, route: ActivatedRoute) {
|
||||
super(i18nService, cryptoService, messagingService, userService, passwordGenerationService,
|
||||
platformUtilsService, policyService, router, apiService, syncService, route);
|
||||
super.onSuccessfulChangePassword = async () => {
|
||||
if (await this.userService.getForcePasswordReset()) {
|
||||
this.router.navigate(['update-temp-password']);
|
||||
} else {
|
||||
this.router.navigate([this.successRoute]);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
get masterPasswordScoreWidth() {
|
||||
|
@ -15,7 +15,6 @@ import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.se
|
||||
import { StateService } from 'jslib-common/abstractions/state.service';
|
||||
import { StorageService } from 'jslib-common/abstractions/storage.service';
|
||||
import { SyncService } from 'jslib-common/abstractions/sync.service';
|
||||
import { UserService } from 'jslib-common/abstractions/user.service';
|
||||
|
||||
import { SsoComponent as BaseSsoComponent } from 'jslib-angular/components/sso.component';
|
||||
import { BrowserApi } from '../../browser/browserApi';
|
||||
@ -30,7 +29,7 @@ export class SsoComponent extends BaseSsoComponent {
|
||||
storageService: StorageService, stateService: StateService,
|
||||
platformUtilsService: PlatformUtilsService, apiService: ApiService,
|
||||
cryptoFunctionService: CryptoFunctionService, passwordGenerationService: PasswordGenerationService,
|
||||
syncService: SyncService, environmentService: EnvironmentService, private userService: UserService) {
|
||||
syncService: SyncService, environmentService: EnvironmentService) {
|
||||
super(authService, router, i18nService, route, storageService, stateService, platformUtilsService,
|
||||
apiService, cryptoFunctionService, environmentService, passwordGenerationService);
|
||||
|
||||
@ -45,13 +44,5 @@ export class SsoComponent extends BaseSsoComponent {
|
||||
const thisWindow = window.open('', '_self');
|
||||
thisWindow.close();
|
||||
};
|
||||
|
||||
super.onSuccessfulLoginNavigate = async () => {
|
||||
if (await this.userService.getForcePasswordReset()) {
|
||||
this.router.navigate(['update-temp-password']);
|
||||
} else {
|
||||
this.router.navigate([this.successRoute]);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.se
|
||||
import { StateService } from 'jslib-common/abstractions/state.service';
|
||||
import { StorageService } from 'jslib-common/abstractions/storage.service';
|
||||
import { SyncService } from 'jslib-common/abstractions/sync.service';
|
||||
import { UserService } from 'jslib-common/abstractions/user.service';
|
||||
|
||||
import { BroadcasterService } from 'jslib-angular/services/broadcaster.service';
|
||||
|
||||
@ -45,16 +44,11 @@ export class TwoFactorComponent extends BaseTwoFactorComponent {
|
||||
environmentService: EnvironmentService, private ngZone: NgZone,
|
||||
private broadcasterService: BroadcasterService, private changeDetectorRef: ChangeDetectorRef,
|
||||
private popupUtilsService: PopupUtilsService, stateService: StateService,
|
||||
storageService: StorageService, route: ActivatedRoute, private messagingService: MessagingService,
|
||||
private userService: UserService) {
|
||||
storageService: StorageService, route: ActivatedRoute, private messagingService: MessagingService) {
|
||||
super(authService, router, i18nService, apiService, platformUtilsService, window, environmentService,
|
||||
stateService, storageService, route);
|
||||
super.onSuccessfulLogin = async () => {
|
||||
return syncService.fullSync(true).then(async () => {
|
||||
if (await this.userService.getForcePasswordReset()) {
|
||||
this.router.navigate(['update-temp-password']);
|
||||
}
|
||||
});
|
||||
super.onSuccessfulLogin = () => {
|
||||
return syncService.fullSync(true);
|
||||
};
|
||||
super.successRoute = '/tabs/vault';
|
||||
this.webAuthnNewTab = this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari();
|
||||
|
@ -40,6 +40,7 @@ import { SettingsComponent } from './settings/settings.component';
|
||||
import { SyncComponent } from './settings/sync.component';
|
||||
import { VaultTimeoutInputComponent } from './settings/vault-timeout-input.component';
|
||||
|
||||
import { AddEditCustomFieldsComponent } from './vault/add-edit-custom-fields.component';
|
||||
import { AddEditComponent } from './vault/add-edit.component';
|
||||
import { AttachmentsComponent } from './vault/attachments.component';
|
||||
import { CiphersComponent } from './vault/ciphers.component';
|
||||
@ -48,6 +49,7 @@ import { CurrentTabComponent } from './vault/current-tab.component';
|
||||
import { GroupingsComponent } from './vault/groupings.component';
|
||||
import { PasswordHistoryComponent } from './vault/password-history.component';
|
||||
import { ShareComponent } from './vault/share.component';
|
||||
import { ViewCustomFieldsComponent } from './vault/view-custom-fields.component';
|
||||
import { ViewComponent } from './vault/view.component';
|
||||
|
||||
import { EffluxDatesComponent as SendEffluxDatesComponent } from './send/efflux-dates.component';
|
||||
@ -248,6 +250,8 @@ registerLocaleData(localeZhTw, 'zh-TW');
|
||||
PasswordRepromptComponent,
|
||||
SetPinComponent,
|
||||
VaultTimeoutInputComponent,
|
||||
AddEditCustomFieldsComponent,
|
||||
ViewCustomFieldsComponent,
|
||||
],
|
||||
entryComponents: [],
|
||||
providers: [
|
||||
|
@ -1,4 +1,4 @@
|
||||
@import "../css/webfonts.css";
|
||||
@import "../../../jslib/angular/src/scss/webfonts.css";
|
||||
@import "variables.scss";
|
||||
@import "base.scss";
|
||||
@import "grid.scss";
|
||||
|
53
src/popup/vault/add-edit-custom-fields.component.html
Normal file
53
src/popup/vault/add-edit-custom-fields.component.html
Normal file
@ -0,0 +1,53 @@
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
{{'customFields' | i18n}}
|
||||
</div>
|
||||
<div class="box-content">
|
||||
<!-- Current custom fields -->
|
||||
<div cdkDropList (cdkDropListDropped)="drop($event)" *ngIf="cipher.hasFields">
|
||||
<div class="box-content-row box-content-row-multi box-draggable-row" appBoxRow cdkDrag
|
||||
*ngFor="let f of cipher.fields; let i = index; trackBy:trackByFunction"
|
||||
[ngClass]="{'box-content-row-checkbox': f.type === fieldType.Boolean}">
|
||||
<a href="#" appStopClick (click)="removeField(f)" appA11yTitle="{{'remove' | i18n}}">
|
||||
<i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
|
||||
</a>
|
||||
<label for="fieldName{{i}}" class="sr-only">{{'name' | i18n}}</label>
|
||||
<label for="fieldValue{{i}}" class="sr-only">{{'value' | i18n}}</label>
|
||||
<div class="row-main">
|
||||
<input id="fieldName{{i}}" type="text" name="Field.Name{{i}}" [(ngModel)]="f.name" class="row-label"
|
||||
placeholder="{{'name' | i18n}}" appInputVerbatim>
|
||||
<!--Custom Field: Text-->
|
||||
<input id="fieldValue{{i}}" type="text" name="Field.Value{{i}}" [(ngModel)]="f.value"
|
||||
*ngIf="f.type === fieldType.Text" placeholder="{{'value' | i18n}}" appInputVerbatim>
|
||||
<!--Custom Field: Hidden-->
|
||||
<input id="fieldValue{{i}}" type="{{f.showValue ? 'text' : 'password'}}" name="Field.Value{{i}}"
|
||||
[(ngModel)]="f.value" class="monospaced" appInputVerbatim *ngIf="f.type === fieldType.Hidden"
|
||||
placeholder="{{'value' | i18n}}" [disabled]="!cipher.viewPassword && !f.newField">
|
||||
</div>
|
||||
<!--Custom Field: Boolean-->
|
||||
<input id="fieldValue{{i}}" name="Field.Value{{i}}" type="checkbox" [(ngModel)]="f.value"
|
||||
*ngIf="f.type === fieldType.Boolean" appTrueFalseValue trueValue="true" falseValue="false">
|
||||
<div class="action-buttons" *ngIf="f.type === fieldType.Hidden && (cipher.viewPassword || f.newField)">
|
||||
<a class="row-btn" href="#" appStopClick appBlurClick appA11yTitle="{{'toggleVisibility' | i18n}}"
|
||||
(click)="toggleFieldValue(f)">
|
||||
<i class="fa fa-lg" aria-hidden="true"
|
||||
[ngClass]="{'fa-eye': !f.showValue, 'fa-eye-slash': f.showValue}"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="drag-handle" appA11yTitle="{{'dragToSort' | i18n}}" cdkDragHandle>
|
||||
<i class="fa fa-bars" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Add new custom field -->
|
||||
<div class="box-content-row box-content-row-newmulti" appBoxRow>
|
||||
<a href="#" appStopClick (click)="addField()">
|
||||
<i class="fa fa-plus-circle fa-fw fa-lg" aria-hidden="true"></i> {{'newCustomField' | i18n}}
|
||||
</a>
|
||||
<label for="addFieldType" class="sr-only">{{'type' | i18n}}</label>
|
||||
<select id="addFieldType" name="AddFieldType" [(ngModel)]="addFieldType" class="field-type">
|
||||
<option *ngFor="let o of addFieldTypeOptions" [ngValue]="o.value">{{o.name}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
18
src/popup/vault/add-edit-custom-fields.component.ts
Normal file
18
src/popup/vault/add-edit-custom-fields.component.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import {
|
||||
AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent
|
||||
} from 'jslib-angular/components/add-edit-custom-fields.component';
|
||||
|
||||
import { EventService } from 'jslib-common/abstractions/event.service';
|
||||
import { I18nService } from 'jslib-common/abstractions/i18n.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-vault-add-edit-custom-fields',
|
||||
templateUrl: 'add-edit-custom-fields.component.html',
|
||||
})
|
||||
export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {
|
||||
constructor(i18nService: I18nService, eventService: EventService) {
|
||||
super(i18nService, eventService);
|
||||
}
|
||||
}
|
@ -324,56 +324,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
{{'customFields' | i18n}}
|
||||
</div>
|
||||
<div class="box-content">
|
||||
<div cdkDropList (cdkDropListDropped)="drop($event)" *ngIf="cipher.hasFields">
|
||||
<div class="box-content-row box-content-row-multi box-draggable-row" appBoxRow cdkDrag
|
||||
*ngFor="let f of cipher.fields; let i = index; trackBy:trackByFunction"
|
||||
[ngClass]="{'box-content-row-checkbox': f.type === fieldType.Boolean}">
|
||||
<button type="button" appStopClick (click)="removeField(f)" appA11yTitle="{{'remove' | i18n}}">
|
||||
<i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
|
||||
</button>
|
||||
<label for="fieldName{{i}}" class="sr-only">{{'name' | i18n}}</label>
|
||||
<label for="fieldValue{{i}}" class="sr-only">{{'value' | i18n}}</label>
|
||||
<div class="row-main">
|
||||
<input id="fieldName{{i}}" type="text" name="Field.Name{{i}}" [(ngModel)]="f.name"
|
||||
class="row-label" placeholder="{{'name' | i18n}}" appInputVerbatim>
|
||||
<input id="fieldValue{{i}}" type="text" name="Field.Value{{i}}" [(ngModel)]="f.value"
|
||||
*ngIf="f.type === fieldType.Text" placeholder="{{'value' | i18n}}" appInputVerbatim>
|
||||
<input id="fieldValue{{i}}" type="{{f.showValue ? 'text' : 'password'}}"
|
||||
name="Field.Value{{i}}" [(ngModel)]="f.value" class="monospaced" appInputVerbatim
|
||||
*ngIf="f.type === fieldType.Hidden" placeholder="{{'value' | i18n}}"
|
||||
[disabled]="!cipher.viewPassword && !f.newField">
|
||||
</div>
|
||||
<input id="fieldValue{{i}}" name="Field.Value{{i}}" type="checkbox" [(ngModel)]="f.value"
|
||||
*ngIf="f.type === fieldType.Boolean" appTrueFalseValue trueValue="true" falseValue="false">
|
||||
<div class="action-buttons"
|
||||
*ngIf="f.type === fieldType.Hidden && (cipher.viewPassword || f.newField)">
|
||||
<button type="button" class="row-btn" appStopClick appBlurClick
|
||||
appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="toggleFieldValue(f)">
|
||||
<i class="fa fa-lg" aria-hidden="true"
|
||||
[ngClass]="{'fa-eye': !f.showValue, 'fa-eye-slash': f.showValue}"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="drag-handle" appA11yTitle="{{'dragToSort' | i18n}}" cdkDragHandle>
|
||||
<i class="fa fa-bars" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-content-row box-content-row-newmulti" appBoxRow>
|
||||
<button type="button" appStopClick (click)="addField()">
|
||||
<i class="fa fa-plus-circle fa-fw fa-lg" aria-hidden="true"></i> {{'newCustomField' | i18n}}
|
||||
</button>
|
||||
<label for="addFieldType" class="sr-only">{{'type' | i18n}}</label>
|
||||
<select id="addFieldType" name="AddFieldType" [(ngModel)]="addFieldType" class="field-type">
|
||||
<option *ngFor="let o of addFieldTypeOptions" [ngValue]="o.value">{{o.name}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<app-vault-add-edit-custom-fields [cipher]="cipher" [editMode]="editMode"></app-vault-add-edit-custom-fields>
|
||||
<div class="box" *ngIf="allowOwnershipOptions()">
|
||||
<div class="box-header">
|
||||
{{'ownership' | i18n}}
|
||||
|
@ -156,7 +156,12 @@ export class CurrentTabComponent implements OnInit, OnDestroy {
|
||||
this.platformUtilsService.copyToClipboard(this.totpCode, { window: window });
|
||||
}
|
||||
if (this.popupUtilsService.inPopup(window)) {
|
||||
BrowserApi.closePopup(window);
|
||||
if (this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari()) {
|
||||
BrowserApi.closePopup(window);
|
||||
} else {
|
||||
// Slight delay to fix bug in Chromium browsers where popup closes without copying totp to clipboard
|
||||
setTimeout(() => BrowserApi.closePopup(window), 50);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
this.ngZone.run(() => {
|
||||
|
37
src/popup/vault/view-custom-fields.component.html
Normal file
37
src/popup/vault/view-custom-fields.component.html
Normal file
@ -0,0 +1,37 @@
|
||||
<ng-container>
|
||||
<div class="box-header">
|
||||
{{'customFields' | i18n}}
|
||||
</div>
|
||||
<div class="box-content">
|
||||
<div class="box-content-row box-content-row-flex" *ngFor="let field of cipher.fields">
|
||||
<div class="row-main">
|
||||
<span class="row-label">{{field.name}}</span>
|
||||
<div *ngIf="field.type === fieldType.Text">
|
||||
{{field.value || ' '}}
|
||||
</div>
|
||||
<div *ngIf="field.type === fieldType.Hidden">
|
||||
<span [hidden]="!field.showValue" class="monospaced show-whitespace">{{field.value}}</span>
|
||||
<span [hidden]="field.showValue" class="monospaced">{{field.maskedValue}}</span>
|
||||
</div>
|
||||
<div *ngIf="field.type === fieldType.Boolean">
|
||||
<i class="fa fa-check-square-o" *ngIf="field.value === 'true'" aria-hidden="true"></i>
|
||||
<i class="fa fa-square-o" *ngIf="field.value !== 'true'" aria-hidden="true"></i>
|
||||
<span class="sr-only">{{field.value}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="action-buttons">
|
||||
<a class="row-btn" href="#" appStopClick appA11yTitle="{{'toggleVisibility' | i18n}}"
|
||||
*ngIf="field.type === fieldType.Hidden && cipher.viewPassword"
|
||||
(click)="toggleFieldValue(field)">
|
||||
<i class="fa fa-lg" aria-hidden="true"
|
||||
[ngClass]="{'fa-eye': !field.showValue, 'fa-eye-slash': field.showValue}"></i>
|
||||
</a>
|
||||
<a class="row-btn" href="#" appStopClick appA11yTitle="{{'copyValue' | i18n}}"
|
||||
*ngIf="field.value && field.type !== fieldType.Boolean && !(field.type === fieldType.Hidden && !cipher.viewPassword)"
|
||||
(click)="copy(field.value, 'value', field.type === fieldType.Hidden ? 'H_Field' : 'Field')">
|
||||
<i class="fa fa-lg fa-clone" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
19
src/popup/vault/view-custom-fields.component.ts
Normal file
19
src/popup/vault/view-custom-fields.component.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import {
|
||||
Component,
|
||||
} from '@angular/core';
|
||||
|
||||
import { EventService } from 'jslib-common/abstractions/event.service';
|
||||
|
||||
import {
|
||||
ViewCustomFieldsComponent as BaseViewCustomFieldsComponent
|
||||
} from 'jslib-angular/components/view-custom-fields.component';
|
||||
|
||||
@Component({
|
||||
selector: 'app-vault-view-custom-fields',
|
||||
templateUrl: 'view-custom-fields.component.html',
|
||||
})
|
||||
export class ViewCustomFieldsComponent extends BaseViewCustomFieldsComponent {
|
||||
constructor(eventService: EventService) {
|
||||
super(eventService);
|
||||
}
|
||||
}
|
@ -202,7 +202,7 @@
|
||||
(click)="launch(u)">
|
||||
<i class="fa fa-lg fa-share-square-o" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="row-btn" appStopClick appA11yTitle="{{'copyUri' | i18n}}"
|
||||
<button type="button" class="row-btn"appStopClick appA11yTitle="{{'copyUri' | i18n}}"
|
||||
(click)="copy(u.uri, u.isWebsite ? 'website' : 'uri', 'URI')">
|
||||
<i class="fa fa-lg fa-clone" aria-hidden="true"></i>
|
||||
</button>
|
||||
@ -221,41 +221,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="box" *ngIf="cipher.hasFields">
|
||||
<div class="box-header">
|
||||
{{'customFields' | i18n}}
|
||||
</div>
|
||||
<div class="box-content">
|
||||
<div class="box-content-row box-content-row-flex" *ngFor="let field of cipher.fields">
|
||||
<div class="row-main">
|
||||
<span class="row-label">{{field.name}}</span>
|
||||
<div *ngIf="field.type === fieldType.Text">
|
||||
{{field.value || ' '}}
|
||||
</div>
|
||||
<div *ngIf="field.type === fieldType.Hidden">
|
||||
<span [hidden]="!field.showValue" class="monospaced show-whitespace">{{field.value}}</span>
|
||||
<span [hidden]="field.showValue" class="monospaced">{{field.maskedValue}}</span>
|
||||
</div>
|
||||
<div *ngIf="field.type === fieldType.Boolean">
|
||||
<i class="fa fa-check-square-o" *ngIf="field.value === 'true'" aria-hidden="true"></i>
|
||||
<i class="fa fa-square-o" *ngIf="field.value !== 'true'" aria-hidden="true"></i>
|
||||
<span class="sr-only">{{field.value}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="action-buttons">
|
||||
<button type="button" class="row-btn" appStopClick appA11yTitle="{{'toggleVisibility' | i18n}}"
|
||||
*ngIf="field.type === fieldType.Hidden && cipher.viewPassword"
|
||||
(click)="toggleFieldValue(field)">
|
||||
<i class="fa fa-lg" aria-hidden="true"
|
||||
[ngClass]="{'fa-eye': !field.showValue, 'fa-eye-slash': field.showValue}"></i>
|
||||
</button>
|
||||
<button type="button" class="row-btn" appStopClick appA11yTitle="{{'copyValue' | i18n}}"
|
||||
*ngIf="field.value && field.type !== fieldType.Boolean && !(field.type === fieldType.Hidden && !cipher.viewPassword)"
|
||||
(click)="copy(field.value, 'value', field.type === fieldType.Hidden ? 'H_Field' : 'Field')">
|
||||
<i class="fa fa-lg fa-clone" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<app-vault-view-custom-fields [cipher]="cipher" [promptPassword]="promptPassword.bind(this)"
|
||||
[copy]="copy.bind(this)"></app-vault-view-custom-fields>
|
||||
</div>
|
||||
<div class="box" *ngIf="cipher.hasAttachments && (canAccessPremium || cipher.organizationId) && showAttachments">
|
||||
<div class="box-header">
|
||||
@ -269,12 +236,12 @@
|
||||
<i class="fa fa-download fa-fw row-sub-icon" *ngIf="!attachment.downloading" aria-hidden="true"></i>
|
||||
<i class="fa fa-spinner fa-fw fa-spin row-sub-icon" *ngIf="attachment.downloading"
|
||||
aria-hidden="true"></i>
|
||||
</button>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box list">
|
||||
<div class="box-content single-line">
|
||||
<button type="button" class="box-content-row" appStopClick appBlurClick (click)="fillCipher()"
|
||||
<<button type="button" class="box-content-row" appStopClick appBlurClick (click)="fillCipher()"
|
||||
*ngIf="cipher.type !== cipherType.SecureNote && !cipher.isDeleted && !inPopout">
|
||||
<div class="row-main text-primary">
|
||||
<div class="icon text-primary" aria-hidden="true">
|
||||
|
@ -124,15 +124,32 @@
|
||||
<value>A secure and free password manager for all of your devices</value>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Bitwarden is the easiest and safest way to store all of your logins and passwords while conveniently keeping them synced between all of your devices.
|
||||
<value>Bitwarden, Inc. is the parent company of 8bit Solutions LLC.
|
||||
|
||||
Password theft is a serious problem. The websites and apps that you use are under attack every day. Security breaches occur and your passwords are stolen. When you reuse the same passwords across apps and websites, hackers can easily access your email, bank, and other important accounts.
|
||||
NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS & WORLD REPORT, CNET, AND MORE.
|
||||
|
||||
Security experts recommend that you use a different, randomly generated password for every account that you create. But how do you manage all those passwords? Bitwarden makes it easy for you to create, store, and access your passwords.
|
||||
Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go.
|
||||
|
||||
Bitwarden stores all of your logins in an encrypted vault that syncs across all of your devices. Since it's fully encrypted before it ever leaves your device, only you have access to your data. Not even the team at Bitwarden can read your data, even if we wanted to. Your data is sealed with AES-256 bit encryption, salted hashing, and PBKDF2 SHA-256.
|
||||
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
|
||||
|
||||
Bitwarden is 100% open source software. The source code for Bitwarden is hosted on GitHub and everyone is free to review, audit, and contribute to the Bitwarden codebase.</value>
|
||||
Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone.
|
||||
|
||||
Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues.
|
||||
|
||||
Why Choose Bitwarden:
|
||||
|
||||
World-Class Encryption
|
||||
Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private.
|
||||
|
||||
Built-in Password Generator
|
||||
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
|
||||
|
||||
Global Translations
|
||||
Bitwarden translations exist in 40 languages and are growing, thanks to our global community.
|
||||
|
||||
Cross-Platform Applications
|
||||
Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more.
|
||||
</value>
|
||||
</data>
|
||||
<data name="AssetTitle" xml:space="preserve">
|
||||
<value>A secure and free password manager for all of your devices</value>
|
||||
|
@ -124,15 +124,32 @@
|
||||
<value>Un gestor de contraseñas seguro y gratuito para todos tus dispositivos</value>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Bitwarden es la manera más fácil y segura de guardar todos tus usuarios y contraseñas, manteniéndolos sincronizados entre todos tus dispositivos.
|
||||
<value>Bitwarden, Inc. es la compañía matriz de 8bit Solutions LLC.
|
||||
|
||||
El robo de contraseñas es un grave problema. Las páginas web y aplicaciones que usas son atacadas cada día. Las brechas de seguridad ocurren y tus contraseñas pueden ser robadas. Cuando usas la misma contraseña en diferentes aplicaciones o sitios web, los piratas informáticos pueden acceder fácilmente a tu correo electrónico, cuenta bancaria y otras cuentas importantes.
|
||||
NOMBRADO EL MEJOR ADMINITRADOR DE CONTRASEÑAS POR THE VERGE, U.S. NEWS & WORLD REPORT Y CNET, ENTRE OTROS.
|
||||
|
||||
Los expertos en seguridad recomiendan utilizar contraseñas generadas aleatoriamente y diferentes para cada cuenta que tengas. ¿Pero cómo puedes gestionar todos esos datos? Bitwarden te facilita la creación, almacenamiento y acceso a tus contraseñas.
|
||||
Administra, almacena, protege y comparte contraseñas ilimitadas entre dispositivos ilimitados desde cualquier parte. Bitwarden ofrece soluciones de administración de contraseñas de código abierto para todos, ya sea en casa, en el trabajo o mientras viajas.
|
||||
|
||||
Bitwarden guarda todos tus datos de acceso a los sitios en una caja fuerte cifrada y sincronizada a través de todos tus dispositivos. Dado que la información está completamente cifrada en tu propio dispositivo, solo tú tienes acceso a ella. Ni siquiera el equipo de Bitwarden podría leerla aunque quisiera. Tus datos están sellados con cifrado AES de 256 bits, _salted hashing_ y PBKDF2 SHA-256.
|
||||
Genera contraseñas fuertes, únicas y aleatorias basadas en los requisitos de seguridad de cada sitio web que frecuentes.
|
||||
|
||||
Bitwarden es un software 100% de código abierto. El código fuente de Bitwarden está alojado en GitHub y cualquier persona puede revisarlo libremente y auditarlo o contribuir al conjunto de código de Bitwarden.</value>
|
||||
Bitwarden Send transmite rápidamente información cifrada --- archivos y texto simple -- de forma directa a cualquier persona.
|
||||
|
||||
Bitwarden ofrece los planes Teams y Enterprise para que puedas compartir contraseñas de forma segura entre colegas de la misma empresa.
|
||||
|
||||
Por qué elegir Bitwarden:
|
||||
|
||||
Cifrado de clase mundial
|
||||
Las contraseñas están protegidas con un cifrado avanzado de extremo a extremo (AES-256 bits, salted hashtag, y PBKDF2 SHA-256) para que tu información permanezca segura y privada.
|
||||
|
||||
Generador de contraseñas incorporado
|
||||
Genera contraseñas fuertes, únicas y aleatorias basadas en los requisitos de seguridad de cada sitio web que frecuentes.
|
||||
|
||||
Traducciones Globales
|
||||
Existen traducciones de Bitwarden en 40 idiomas y van en aumento, gracias a nuestra comunidad global.
|
||||
|
||||
Aplicaciones multiplataforma
|
||||
Protege y comparte información confidencial de tu bóveda Bitwarden desde cualquier navegador, dispositivo móvil, aplicación de escritorio y más.
|
||||
</value>
|
||||
</data>
|
||||
<data name="AssetTitle" xml:space="preserve">
|
||||
<value>Un gestor de contraseñas seguro y gratuito para todos tus dispositivos</value>
|
||||
|
@ -124,15 +124,31 @@
|
||||
<value>Siguran i besplatan upravitelj lozinki za sve vaše uređaje</value>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Bitwarden je jednostavan i siguran način pohrane svih tvojih korisničkih imena i lozinki, a sinkronizacija im omogućuje jednostavan pristup na svim tvojim uređajima.
|
||||
<value>Bitwarden, Inc. je vlasnik tvrtke 8bit Solutions LLC.
|
||||
|
||||
Krađa lozinki je ozbiljan problem. Web mjesta i aplikacije koje upotrebljavaš, svakog su dana izložene pokušajima napada, pri čemu može doći do curenja podataka, a tvoje lozinke mogu biti ukradene. Upotrebljavaš li jednu te istu lozinku na više mjesta, u slučaju njezinog curenja, neautorizirane osobe mogu vrlo lako pristupiti ostalim uslugama koje su zaštićene tom istom lozinkom, kao npr. tvoja e-pošta, internet bankarsrtvo i druge važne usluge.
|
||||
THE VERGE, U.S. NEWS & WORLD REPORT, CNET I DRUGI ODABRALI SU BITWARDEN NAJBOLJIM UPRAVITELJEM LOZINKI.
|
||||
|
||||
Sigurnosni stručnjaci preporučuju korištenje jedinstvene, nasumično generirane lozinke za svaki račun koji stvoriš. No kako upravljati svim tim lozinkama? Bitwarden na siguran način olakšava generiranje složenih, sigurnih lozinki i njihovu pohranu s pripadajućim korisničkim imenima.
|
||||
Upravljajte, spremajte, osigurajte i dijelite neograničen broj lozinki na neograničenom broju uređaja bilo gdje. Bitwarden omogućuje upravljanje lozinkama, bazirano na otvorenom kodu, svima, bilo kod kuće, na poslu ili u pokretu.
|
||||
|
||||
Bitwarden tvoje podatke pohranjuje u šifrirani trezor koji je sinkroniziran i lako dostupan na svim tvojim uređajima. Budući je trezor u potpunosti šifriran prije nego li napusti uređaj, jedino ti imaš pristup podacima u trezoru. Čak niti tim u Bitwardenu ne može vidjeti tvoje podatke zapečaćene AES-256 bitnim šifriranjem, salted hashom i PBKDF2 SHA-256.
|
||||
Generirajte jake, jedinstvene i nasumične lozinke bazirane na sigurnosnim zahtjevima za svaku web stranicu koju često posjećujete.
|
||||
|
||||
Bitwarden je usredotočen na softver otvorenog kôda. Izvorni kôd za Bitwarden smješten je na GitHub-u i svatko ga može pregledati, revidirati i doprinijeti Bitwarden kodnoj bazi.</value>
|
||||
Bitwarden Send omoguzćuje jednostavno i brzo slanje šifriranih podataka --- datoteki ili teksta -- direktno, bilo kome.
|
||||
|
||||
Bitwarden nudi Teams i Enterprise planove za tvrtke kako biste sigurno mogli dijeliti lozinke s kolegama na poslu.
|
||||
|
||||
Zašto odabrati Bitwarden?
|
||||
|
||||
Svjetski priznata enkripcija
|
||||
Lozinke su zaštićene naprednim end-to-end šifriranjem (AES-256 bit, salted hashtag i PBKDF2 SHA-256) kako bi vaši osobni podaci ostali sigurni i samo vaši.
|
||||
|
||||
Ugrađen generator lozinki
|
||||
Generirajte jake, jedinstvene i nasumične lozinke bazirane na sigurnosnim zahtjevima za svako web mjesto koje često posjećujete.
|
||||
|
||||
Svjetski dostupan
|
||||
Bitwarden je, zahvaljujući našoj globalnoj zajednici, dostupan na više od 40 jezika.
|
||||
|
||||
Podržani svi OS
|
||||
Osigurajte i sigurno dijelite osjetljive podatke sadržane u vašem Bitwarden trezoru iz bilo kojeg preglednika, mobilnog uređaja ili stolnog računala s bilo kojim OS.</value>
|
||||
</data>
|
||||
<data name="AssetTitle" xml:space="preserve">
|
||||
<value>Siguran i besplatan upravitelj lozinki za sve tvoje uređaje</value>
|
||||
@ -144,7 +160,7 @@ Bitwarden je usredotočen na softver otvorenog kôda. Izvorni kôd za Bitwarden
|
||||
<value>Upravljaj svojim korisničkim imenima i lozinkama iz sigurnog trezora</value>
|
||||
</data>
|
||||
<data name="ScreenshotAutofill" xml:space="preserve">
|
||||
<value>Brza auto-ispuna vjerodajnica za prijavu za bilo koju web stranicu</value>
|
||||
<value>Brza auto-ispuna vjerodajnica za prijavu na bilo kojoj web stranici</value>
|
||||
</data>
|
||||
<data name="ScreenshotMenu" xml:space="preserve">
|
||||
<value>Tvoj trezor je lako dostupan iz izbornika desnim klikom</value>
|
||||
|
@ -124,13 +124,27 @@
|
||||
<value>Egy biztonságos és ingyenes jelszókezelő az összes eszközre.</value>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>A Bitwarden a legkönnyebb és legbiztonságosabb módja a bejelentkezések és jelszavak tárolására miközben szinkronba tarja ezeket az összes eszközön.
|
||||
<value>A Bitwarden, Inc. a 8bit Solutions LLC anyavállalata.
|
||||
|
||||
A jelszólopás egy komoly probléma. A használt webhelyek és alkalmazások támadás alatt állnak minden nap. Biztonsági jogsértések történnek és ellopják a jelszavakat. Amikor ugyanazt a jelszót használjuk több webhelyen, alkalmazáson, akkor a hackerek könnyen hozzáférhetnek az emailfiókhoz, banki fiókhoz és egyéb fontos bejelentkezéshez
|
||||
A VERGE, A US NEWS & WORLD REPORT, a CNET ÉS MÁSOK LEGJOBB JELSZÓKEZELŐJE.
|
||||
|
||||
A biztonság szakértők azt javasolják, hogy használjunk különböző véletlenszerű jelszavakat minden bejelentkezésnél. De hogyan tartható észben az összes jelszó? A Bitwarden megkönnyíti a jelszavak létrehozását, tárolását és elérését.
|
||||
Korlátlan számú jelszavak kezelése, tárolása, védelme és megosztása korlátlan eszközökön bárhonnan. A Bitwarden nyílt forráskódú jelszókezelési megoldásokat kínál mindenkinek, legyen az otthon, a munkahelyen vagy útközben.
|
||||
|
||||
A Bitwarden egy titkosított széfben tárolja az összes bejelentkezés és szinkronizálja őket az összes eszközön. Mivel ezek az adatok teljesen titkosítva vannak még az eszköz elhagyása előtt, így csak a tulajdonos érheti el ezeket. Még maga a Bitwarden csapata se tudja elolvasni az adatokat, még ha akarnák, akkor sem. Az adatok AES-256 bites titkosítással, egy úgynevezett 'salted hasing' módszerrel és PBKDF2 SHA-256 titkosítással vannak védve.</value>
|
||||
Hozzunk létre erős, egyedi és véletlenszerű jelszavakat a biztonsági követelmények alapján minden webhelyre, amelyet gyakran látogatunk.
|
||||
|
||||
A Bitwarden Send gyorsan továbbítja a titkosított információkat-fájlokat és egyszerű szöveget közvetlenül bárkinek.
|
||||
|
||||
A Bitwarden csapatokat és vállalati terveket kínál a vállalatok számára, így biztonságosan megoszthatja jelszavait kollégáival.
|
||||
|
||||
Miért válasszuk a Bitwardent:
|
||||
|
||||
Világszínvonalú titkosítási jelszavak fejlett végpontok közötti titkosítással (AES-256 bit, titkosított hashtag és PBKDF2 SHA-256) védettek, így az adatok biztonságban és titokban maradnak.
|
||||
|
||||
Beépített jelszógenerátor A biztonsági követelmények alapján erős, egyedi és véletlenszerű jelszavakat hozhat létre minden gyakran látogatott webhelyen.
|
||||
|
||||
Globális fordítások
|
||||
|
||||
A Bitwarden fordítások 40 nyelven léteznek és globális közösségünknek köszönhetően egyre bővülnek. Többplatformos alkalmazások Biztonságos és megoszthatja az érzékeny adatokat a Bitwarden Széfben bármely böngészőből, mobileszközről vagy asztali operációs rendszerből stb.</value>
|
||||
</data>
|
||||
<data name="AssetTitle" xml:space="preserve">
|
||||
<value>Egy biztonságos és ingyenes jelszókezelő az összes eszközre</value>
|
||||
|
@ -1 +0,0 @@
|
||||
Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext
|
Loading…
Reference in New Issue
Block a user