mirror of
https://github.com/bitwarden/web
synced 2025-12-06 00:03:28 +00:00
Compare commits
112 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1aa93e7737 | ||
|
|
a0864f5f67 | ||
|
|
6e9f71f942 | ||
|
|
65211372df | ||
|
|
2ca8d8817a | ||
|
|
ec266ea657 | ||
|
|
d117aa5139 | ||
|
|
4534b7d4dc | ||
|
|
707fe01d77 | ||
|
|
0e09ba0dd5 | ||
|
|
989560f23c | ||
|
|
844a9f934f | ||
|
|
b5348c593a | ||
|
|
7f809ba541 | ||
|
|
f9058fcddc | ||
|
|
05c9957fd2 | ||
|
|
675739d24f | ||
|
|
10be0867ad | ||
|
|
d2a4b85bdd | ||
|
|
782061ac5e | ||
|
|
8d98e9e6f9 | ||
|
|
4aa75e9376 | ||
|
|
c6d6eecb43 | ||
|
|
1d6d7b8aa8 | ||
|
|
68ed8e51bd | ||
|
|
d4dd962193 | ||
|
|
7dfb70eb8e | ||
|
|
53675eeba7 | ||
|
|
6399973bfa | ||
|
|
f1384f5dc1 | ||
|
|
027cad9e52 | ||
|
|
dffcff48a0 | ||
|
|
0391f31b3a | ||
|
|
eb7b0ba92f | ||
|
|
3a136e1464 | ||
|
|
8792bcabcb | ||
|
|
c362fc4677 | ||
|
|
f471fe62ea | ||
|
|
f19aa96f3e | ||
|
|
2d6b4f1216 | ||
|
|
22a8f766c7 | ||
|
|
86bc6fa807 | ||
|
|
14b094cfe0 | ||
|
|
d90b36bd33 | ||
|
|
18b800ff7a | ||
|
|
7ab56a9616 | ||
|
|
6f8352033b | ||
|
|
188ac5051a | ||
|
|
335e0dd575 | ||
|
|
67b187f884 | ||
|
|
c2d262ea1d | ||
|
|
8683465d70 | ||
|
|
8c9705eec0 | ||
|
|
d14a8bc301 | ||
|
|
72aceedab4 | ||
|
|
7c5ee1bd00 | ||
|
|
26aa79db1a | ||
|
|
2629aaf368 | ||
|
|
3973ebc00f | ||
|
|
6cddb5f3ba | ||
|
|
7c55da8cc6 | ||
|
|
0c9f122719 | ||
|
|
1d941baff1 | ||
|
|
e5226d7ffc | ||
|
|
aa3d69cb94 | ||
|
|
e68d386d3d | ||
|
|
b322f20c81 | ||
|
|
7d7a9f3dc6 | ||
|
|
977a5e868f | ||
|
|
41ff511165 | ||
|
|
aadbb970b6 | ||
|
|
1873ce41b6 | ||
|
|
ff51e4cc36 | ||
|
|
73b87f2e97 | ||
|
|
1444c99458 | ||
|
|
85c3056223 | ||
|
|
4a815b0bdf | ||
|
|
b7525e1e7e | ||
|
|
c3f64fe9c4 | ||
|
|
34f6bc2403 | ||
|
|
9ecec972ca | ||
|
|
80febf97d3 | ||
|
|
71073874eb | ||
|
|
f3dfeac125 | ||
|
|
f12e73519e | ||
|
|
19f7dda4cc | ||
|
|
221397b159 | ||
|
|
91766ecea3 | ||
|
|
191be134f9 | ||
|
|
56d279ae1e | ||
|
|
3e61464dac | ||
|
|
85ca10dbb3 | ||
|
|
eaf08c45d9 | ||
|
|
bcb44e8cf7 | ||
|
|
d215e0716e | ||
|
|
f635162832 | ||
|
|
c892480086 | ||
|
|
ea49d17c47 | ||
|
|
39c32b0e62 | ||
|
|
5cdfa35a76 | ||
|
|
147b3ff993 | ||
|
|
662c229de1 | ||
|
|
c90cb2ae6e | ||
|
|
864d070656 | ||
|
|
e8ac2b561a | ||
|
|
c71a432ce4 | ||
|
|
e3ca470a6a | ||
|
|
e7c6fbf423 | ||
|
|
6cef5e614d | ||
|
|
33cf77559f | ||
|
|
b5085d8004 | ||
|
|
80af20ef54 |
2
jslib
2
jslib
Submodule jslib updated: 3429b57db4...2f6426deb4
9772
package-lock.json
generated
9772
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
107
package.json
107
package.json
@@ -1,91 +1,92 @@
|
||||
{
|
||||
"name": "bitwarden-web",
|
||||
"version": "2.1.0",
|
||||
"version": "2.4.0",
|
||||
"scripts": {
|
||||
"sub:init": "git submodule update --init --recursive",
|
||||
"sub:update": "git submodule update --remote",
|
||||
"sub:pull": "git submodule foreach git pull",
|
||||
"postinstall": "npm run sub:init",
|
||||
"build": "gulp prebuild && webpack --config webpack.config.js",
|
||||
"build:watch": "gulp prebuild && webpack-serve --config webpack.config.js",
|
||||
"build:prod": "gulp prebuild && cross-env NODE_ENV=production webpack --config webpack.config.js",
|
||||
"build:prod:watch": "gulp prebuild && cross-env NODE_ENV=production webpack-serve --config webpack.config.js",
|
||||
"build:selfhost": "gulp prebuild && cross-env SELF_HOST=true webpack-serve --config webpack.config.js",
|
||||
"build:selfhost:watch": "gulp prebuild && cross-env SELF_HOST=true webpack-serve --config webpack.config.js",
|
||||
"build:selfhost:prod": "gulp prebuild && cross-env SELF_HOST=true NODE_ENV=production webpack --config webpack.config.js",
|
||||
"build:selfhost:prod:watch": "gulp prebuild && cross-env SELF_HOST=true NODE_ENV=production webpack-serve --config webpack.config.js",
|
||||
"build": "gulp prebuild && webpack",
|
||||
"build:watch": "gulp prebuild && webpack-dev-server",
|
||||
"build:prod": "gulp prebuild && cross-env NODE_ENV=production webpack",
|
||||
"build:prod:watch": "gulp prebuild && cross-env NODE_ENV=production webpack-dev-server",
|
||||
"build:selfhost": "gulp prebuild && cross-env SELF_HOST=true webpack-dev-server",
|
||||
"build:selfhost:watch": "gulp prebuild && cross-env SELF_HOST=true webpack-dev-server",
|
||||
"build:selfhost:prod": "gulp prebuild && cross-env SELF_HOST=true NODE_ENV=production webpack",
|
||||
"build:selfhost:prod:watch": "gulp prebuild && cross-env SELF_HOST=true NODE_ENV=production webpack-dev-server",
|
||||
"clean:l10n": "git push origin --delete l10n_master",
|
||||
"dist": "npm run build:prod && gulp postdist",
|
||||
"dist:selfhost": "npm run build:selfhost:prod && gulp postdist",
|
||||
"deploy": "npm run dist && gh-pages -d build",
|
||||
"deploy:preview": "npm run dist && gh-pages -d build -r git@github.com:kspearrin/web-preview.git",
|
||||
"deploy:dev": "npm run dist && gh-pages -d build -r git@github.com:kspearrin/bitwarden-web-dev.git",
|
||||
"lint": "tslint src/**/*.ts || true",
|
||||
"lint:fix": "tslint src/**/*.ts --fix"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular/compiler-cli": "5.2.0",
|
||||
"@ngtools/webpack": "1.10.2",
|
||||
"@types/jquery": "^3.3.2",
|
||||
"@types/lunr": "2.1.5",
|
||||
"@types/node": "8.0.19",
|
||||
"@types/node-forge": "0.6.10",
|
||||
"@types/papaparse": "4.1.33",
|
||||
"@angular/compiler-cli": "^6.1.7",
|
||||
"@ngtools/webpack": "^6.2.1",
|
||||
"@types/jquery": "^3.3.6",
|
||||
"@types/lunr": "^2.1.6",
|
||||
"@types/node-forge": "^0.7.5",
|
||||
"@types/papaparse": "^4.5.3",
|
||||
"@types/webcrypto": "^0.0.28",
|
||||
"@types/webpack": "^4.4.11",
|
||||
"angular2-template-loader": "^0.6.2",
|
||||
"clean-webpack-plugin": "^0.1.19",
|
||||
"copy-webpack-plugin": "^4.5.1",
|
||||
"cross-env": "^5.1.4",
|
||||
"css-loader": "^0.28.11",
|
||||
"copy-webpack-plugin": "^4.5.2",
|
||||
"cross-env": "^5.2.0",
|
||||
"css-loader": "^1.0.0",
|
||||
"del": "^3.0.0",
|
||||
"extract-text-webpack-plugin": "next",
|
||||
"file-loader": "^1.1.11",
|
||||
"file-loader": "^2.0.0",
|
||||
"gh-pages": "^1.2.0",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-google-webfonts": "^2.0.0",
|
||||
"html-loader": "^0.5.5",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"node-sass": "^4.7.2",
|
||||
"sass-loader": "^7.0.2",
|
||||
"style-loader": "^0.21.0",
|
||||
"ts-loader": "^4.3.1",
|
||||
"tslint": "^5.10.0",
|
||||
"node-sass": "^4.9.3",
|
||||
"sass-loader": "^7.1.0",
|
||||
"style-loader": "^0.23.0",
|
||||
"ts-loader": "^5.1.0",
|
||||
"tslint": "^5.11.0",
|
||||
"tslint-loader": "^3.6.0",
|
||||
"typescript": "^2.7.2",
|
||||
"webpack": "^4.10.2",
|
||||
"webpack-cli": "^3.0.2",
|
||||
"webpack-serve": "^1.0.2"
|
||||
"webpack": "^4.18.0",
|
||||
"webpack-cli": "^3.1.0",
|
||||
"webpack-dev-server": "^3.1.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "5.2.0",
|
||||
"@angular/common": "5.2.0",
|
||||
"@angular/compiler": "5.2.0",
|
||||
"@angular/core": "5.2.0",
|
||||
"@angular/forms": "5.2.0",
|
||||
"@angular/http": "5.2.0",
|
||||
"@angular/platform-browser": "5.2.0",
|
||||
"@angular/platform-browser-dynamic": "5.2.0",
|
||||
"@angular/router": "5.2.0",
|
||||
"@angular/upgrade": "5.2.0",
|
||||
"angular2-toaster": "4.0.2",
|
||||
"angulartics2": "5.0.1",
|
||||
"bootstrap": "4.1.1",
|
||||
"core-js": "2.4.1",
|
||||
"@angular/animations": "6.1.7",
|
||||
"@angular/common": "6.1.7",
|
||||
"@angular/compiler": "6.1.7",
|
||||
"@angular/core": "6.1.7",
|
||||
"@angular/forms": "6.1.7",
|
||||
"@angular/http": "6.1.7",
|
||||
"@angular/platform-browser": "6.1.7",
|
||||
"@angular/platform-browser-dynamic": "6.1.7",
|
||||
"@angular/router": "6.1.7",
|
||||
"@angular/upgrade": "6.1.7",
|
||||
"@aspnet/signalr": "1.0.4",
|
||||
"@aspnet/signalr-protocol-msgpack": "1.0.4",
|
||||
"angular2-toaster": "6.1.0",
|
||||
"angulartics2": "6.3.0",
|
||||
"bootstrap": "4.1.3",
|
||||
"braintree-web-drop-in": "1.13.0",
|
||||
"core-js": "2.5.7",
|
||||
"duo_web_sdk": "git+https://github.com/duosecurity/duo_web_sdk.git",
|
||||
"font-awesome": "4.7.0",
|
||||
"jquery": "3.3.1",
|
||||
"lunr": "2.1.6",
|
||||
"mousetrap": "1.6.1",
|
||||
"ngx-infinite-scroll": "0.8.4",
|
||||
"node-forge": "0.7.1",
|
||||
"papaparse": "4.3.5",
|
||||
"popper.js": "1.14.3",
|
||||
"lunr": "2.3.3",
|
||||
"ngx-infinite-scroll": "6.0.1",
|
||||
"node-forge": "0.7.6",
|
||||
"papaparse": "4.6.0",
|
||||
"popper.js": "1.14.4",
|
||||
"qrious": "4.0.2",
|
||||
"rxjs": "5.5.6",
|
||||
"rxjs": "6.3.2",
|
||||
"sweetalert": "2.1.0",
|
||||
"tldjs": "2.0.0",
|
||||
"web-animations-js": "2.3.1",
|
||||
"webcrypto-shim": "0.1.4",
|
||||
"whatwg-fetch": "^2.0.4",
|
||||
"zone.js": "0.8.19"
|
||||
"whatwg-fetch": "3.0.0",
|
||||
"zone.js": "0.8.26"
|
||||
}
|
||||
}
|
||||
|
||||
0
src/.nojekyll
Normal file
0
src/.nojekyll
Normal file
@@ -1,11 +1,9 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
|
||||
import { HintComponent as BaseHintComponent } from 'jslib/angular/components/hint.component';
|
||||
|
||||
@@ -14,9 +12,8 @@ import { HintComponent as BaseHintComponent } from 'jslib/angular/components/hin
|
||||
templateUrl: 'hint.component.html',
|
||||
})
|
||||
export class HintComponent extends BaseHintComponent {
|
||||
constructor(router: Router, analytics: Angulartics2,
|
||||
toasterService: ToasterService, i18nService: I18nService,
|
||||
apiService: ApiService) {
|
||||
super(router, analytics, toasterService, i18nService, apiService);
|
||||
constructor(router: Router, i18nService: I18nService,
|
||||
apiService: ApiService, platformUtilsService: PlatformUtilsService) {
|
||||
super(router, i18nService, apiService, platformUtilsService);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,9 +4,6 @@ import {
|
||||
} from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
@@ -22,13 +19,11 @@ import { LockComponent as BaseLockComponent } from 'jslib/angular/components/loc
|
||||
templateUrl: 'lock.component.html',
|
||||
})
|
||||
export class LockComponent extends BaseLockComponent implements OnInit {
|
||||
constructor(router: Router, analytics: Angulartics2,
|
||||
toasterService: ToasterService, i18nService: I18nService,
|
||||
constructor(router: Router, i18nService: I18nService,
|
||||
platformUtilsService: PlatformUtilsService, messagingService: MessagingService,
|
||||
userService: UserService, cryptoService: CryptoService,
|
||||
private routerService: RouterService) {
|
||||
super(router, analytics, toasterService, i18nService, platformUtilsService,
|
||||
messagingService, userService, cryptoService);
|
||||
super(router, i18nService, platformUtilsService, messagingService, userService, cryptoService);
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
|
||||
@@ -4,11 +4,9 @@ import {
|
||||
Router,
|
||||
} from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { AuthService } from 'jslib/abstractions/auth.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { StateService } from 'jslib/abstractions/state.service';
|
||||
import { StorageService } from 'jslib/abstractions/storage.service';
|
||||
|
||||
@@ -20,10 +18,10 @@ import { LoginComponent as BaseLoginComponent } from 'jslib/angular/components/l
|
||||
})
|
||||
export class LoginComponent extends BaseLoginComponent {
|
||||
constructor(authService: AuthService, router: Router,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
i18nService: I18nService, private route: ActivatedRoute,
|
||||
storageService: StorageService, private stateService: StateService) {
|
||||
super(authService, router, analytics, toasterService, i18nService, storageService);
|
||||
storageService: StorageService, private stateService: StateService,
|
||||
platformUtilsService: PlatformUtilsService) {
|
||||
super(authService, router, platformUtilsService, i18nService, storageService);
|
||||
this.onSuccessfulLoginNavigate = this.goAfterLogIn;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ export class RecoverDeleteComponent {
|
||||
async submit() {
|
||||
try {
|
||||
const request = new DeleteRecoverRequest();
|
||||
request.email = this.email.toLowerCase();
|
||||
request.email = this.email.trim().toLowerCase();
|
||||
this.formPromise = this.apiService.postAccountRecoverDelete(request);
|
||||
await this.formPromise;
|
||||
this.analytics.eventTrack.next({ action: 'Started Delete Recovery' });
|
||||
|
||||
@@ -5,6 +5,7 @@ import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { AuthService } from 'jslib/abstractions/auth.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
|
||||
@@ -22,15 +23,15 @@ export class RecoverTwoFactorComponent {
|
||||
|
||||
constructor(private router: Router, private apiService: ApiService,
|
||||
private analytics: Angulartics2, private toasterService: ToasterService,
|
||||
private i18nService: I18nService, private cryptoService: CryptoService) {
|
||||
}
|
||||
private i18nService: I18nService, private cryptoService: CryptoService,
|
||||
private authService: AuthService) { }
|
||||
|
||||
async submit() {
|
||||
try {
|
||||
const request = new TwoFactorRecoveryRequest();
|
||||
request.recoveryCode = this.recoveryCode.replace(/\s/g, '').toLowerCase();
|
||||
request.email = this.email.toLowerCase();
|
||||
const key = await this.cryptoService.makeKey(this.masterPassword, request.email);
|
||||
request.email = this.email.trim().toLowerCase();
|
||||
const key = await this.authService.makePreloginKey(this.masterPassword, request.email);
|
||||
request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, key);
|
||||
this.formPromise = this.apiService.postTwoFactorRecover(request);
|
||||
await this.formPromise;
|
||||
|
||||
@@ -4,9 +4,6 @@ import {
|
||||
Router,
|
||||
} from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { AuthService } from 'jslib/abstractions/auth.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
@@ -25,11 +22,10 @@ export class RegisterComponent extends BaseRegisterComponent {
|
||||
showTerms = true;
|
||||
|
||||
constructor(authService: AuthService, router: Router,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
i18nService: I18nService, cryptoService: CryptoService,
|
||||
apiService: ApiService, private route: ActivatedRoute,
|
||||
stateService: StateService, platformUtilsService: PlatformUtilsService) {
|
||||
super(authService, router, analytics, toasterService, i18nService, cryptoService, apiService, stateService);
|
||||
super(authService, router, i18nService, cryptoService, apiService, stateService, platformUtilsService);
|
||||
this.showTerms = !platformUtilsService.isSelfHost();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { AuthService } from 'jslib/abstractions/auth.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
@@ -18,8 +15,7 @@ import {
|
||||
})
|
||||
export class TwoFactorOptionsComponent extends BaseTwoFactorOptionsComponent {
|
||||
constructor(authService: AuthService, router: Router,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
i18nService: I18nService, platformUtilsService: PlatformUtilsService) {
|
||||
super(authService, router, analytics, toasterService, i18nService, platformUtilsService, window);
|
||||
super(authService, router, i18nService, platformUtilsService, window);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,9 +7,6 @@ import {
|
||||
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { TwoFactorOptionsComponent } from './two-factor-options.component';
|
||||
|
||||
import { ModalComponent } from '../modal.component';
|
||||
@@ -33,12 +30,10 @@ export class TwoFactorComponent extends BaseTwoFactorComponent {
|
||||
@ViewChild('twoFactorOptions', { read: ViewContainerRef }) twoFactorOptionsModal: ViewContainerRef;
|
||||
|
||||
constructor(authService: AuthService, router: Router,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
i18nService: I18nService, apiService: ApiService,
|
||||
platformUtilsService: PlatformUtilsService, private stateService: StateService,
|
||||
environmentService: EnvironmentService, private componentFactoryResolver: ComponentFactoryResolver) {
|
||||
super(authService, router, analytics, toasterService, i18nService, apiService,
|
||||
platformUtilsService, window, environmentService);
|
||||
super(authService, router, i18nService, apiService, platformUtilsService, window, environmentService);
|
||||
this.onSuccessfulLoginNavigate = this.goAfterLogIn;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,10 @@ import * as _swal from 'sweetalert';
|
||||
import { SweetAlert } from 'sweetalert/typings/core';
|
||||
|
||||
import {
|
||||
BodyOutputType,
|
||||
Toast,
|
||||
ToasterConfig,
|
||||
ToasterContainerComponent,
|
||||
ToasterService,
|
||||
} from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
@@ -14,7 +17,9 @@ import {
|
||||
NgZone,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
SecurityContext,
|
||||
} from '@angular/core';
|
||||
import { DomSanitizer } from '@angular/platform-browser';
|
||||
import {
|
||||
NavigationEnd,
|
||||
Router,
|
||||
@@ -31,8 +36,10 @@ import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { FolderService } from 'jslib/abstractions/folder.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { LockService } from 'jslib/abstractions/lock.service';
|
||||
import { NotificationsService } from 'jslib/abstractions/notifications.service';
|
||||
import { PasswordGenerationService } from 'jslib/abstractions/passwordGeneration.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { SearchService } from 'jslib/abstractions/search.service';
|
||||
import { SettingsService } from 'jslib/abstractions/settings.service';
|
||||
import { SyncService } from 'jslib/abstractions/sync.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
@@ -45,6 +52,7 @@ import { RouterService } from './services/router.service';
|
||||
const BroadcasterSubscriptionId = 'AppComponent';
|
||||
// Hack due to Angular 5.2 bug
|
||||
const swal: SweetAlert = _swal as any;
|
||||
const IdleTimeout = 60000 * 10; // 10 minutes
|
||||
|
||||
@Component({
|
||||
selector: 'app-root',
|
||||
@@ -59,6 +67,8 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
});
|
||||
|
||||
private lastActivity: number = null;
|
||||
private idleTimer: number = null;
|
||||
private isIdle = false;
|
||||
|
||||
constructor(private angulartics2GoogleAnalytics: Angulartics2GoogleAnalytics,
|
||||
private broadcasterService: BroadcasterService, private userService: UserService,
|
||||
@@ -70,7 +80,8 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
private platformUtilsService: PlatformUtilsService, private ngZone: NgZone,
|
||||
private lockService: LockService, private storageService: StorageService,
|
||||
private cryptoService: CryptoService, private collectionService: CollectionService,
|
||||
private routerService: RouterService) { }
|
||||
private sanitizer: DomSanitizer, private searchService: SearchService,
|
||||
private notificationsService: NotificationsService) { }
|
||||
|
||||
ngOnInit() {
|
||||
this.ngZone.runOutsideAngular(() => {
|
||||
@@ -86,8 +97,9 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
this.ngZone.run(async () => {
|
||||
switch (message.command) {
|
||||
case 'loggedIn':
|
||||
case 'unlocked':
|
||||
case 'loggedOut':
|
||||
case 'unlocked':
|
||||
this.notificationsService.updateConnection(false);
|
||||
break;
|
||||
case 'logout':
|
||||
this.logOut(!!message.expired);
|
||||
@@ -96,6 +108,7 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
await this.lockService.lock();
|
||||
break;
|
||||
case 'locked':
|
||||
this.notificationsService.updateConnection(false);
|
||||
this.router.navigate(['lock']);
|
||||
break;
|
||||
case 'syncStarted':
|
||||
@@ -118,6 +131,15 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
this.router.navigate(['settings/premium']);
|
||||
}
|
||||
break;
|
||||
case 'showToast':
|
||||
this.showToast(message);
|
||||
break;
|
||||
case 'analyticsEventTrack':
|
||||
this.analytics.eventTrack.next({
|
||||
action: message.action,
|
||||
properties: { label: message.label },
|
||||
});
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -157,6 +179,7 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
this.passwordGenerationService.clear(),
|
||||
]);
|
||||
|
||||
this.searchService.clearIndex();
|
||||
this.authService.logOut(async () => {
|
||||
this.analytics.eventTrack.next({ action: 'Logged Out' });
|
||||
if (expired) {
|
||||
@@ -175,5 +198,56 @@ export class AppComponent implements OnDestroy, OnInit {
|
||||
|
||||
this.lastActivity = now;
|
||||
this.storageService.save(ConstantsService.lastActiveKey, now);
|
||||
|
||||
// Idle states
|
||||
if (this.isIdle) {
|
||||
this.isIdle = false;
|
||||
this.idleStateChanged();
|
||||
}
|
||||
if (this.idleTimer != null) {
|
||||
window.clearTimeout(this.idleTimer);
|
||||
this.idleTimer = null;
|
||||
}
|
||||
this.idleTimer = window.setTimeout(() => {
|
||||
if (!this.isIdle) {
|
||||
this.isIdle = true;
|
||||
this.idleStateChanged();
|
||||
}
|
||||
}, IdleTimeout);
|
||||
}
|
||||
|
||||
private showToast(msg: any) {
|
||||
const toast: Toast = {
|
||||
type: msg.type,
|
||||
title: msg.title,
|
||||
};
|
||||
if (typeof (msg.text) === 'string') {
|
||||
toast.body = msg.text;
|
||||
} else if (msg.text.length === 1) {
|
||||
toast.body = msg.text[0];
|
||||
} else {
|
||||
let message = '';
|
||||
msg.text.forEach((t: string) =>
|
||||
message += ('<p>' + this.sanitizer.sanitize(SecurityContext.HTML, t) + '</p>'));
|
||||
toast.body = message;
|
||||
toast.bodyOutputType = BodyOutputType.TrustedHtml;
|
||||
}
|
||||
if (msg.options != null) {
|
||||
if (msg.options.trustedHtml === true) {
|
||||
toast.bodyOutputType = BodyOutputType.TrustedHtml;
|
||||
}
|
||||
if (msg.options.timeout != null && msg.options.timeout > 0) {
|
||||
toast.timeout = msg.options.timeout;
|
||||
}
|
||||
}
|
||||
this.toasterService.popAsync(toast);
|
||||
}
|
||||
|
||||
private idleStateChanged() {
|
||||
if (this.isIdle) {
|
||||
this.notificationsService.disconnectFromInactivity();
|
||||
} else {
|
||||
this.notificationsService.reconnectFromActivity();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ import { AccountComponent } from './settings/account.component';
|
||||
import { AdjustPaymentComponent } from './settings/adjust-payment.component';
|
||||
import { AdjustStorageComponent } from './settings/adjust-storage.component';
|
||||
import { ChangeEmailComponent } from './settings/change-email.component';
|
||||
import { ChangeKdfComponent } from './settings/change-kdf.component';
|
||||
import { ChangePasswordComponent } from './settings/change-password.component';
|
||||
import { CreateOrganizationComponent } from './settings/create-organization.component';
|
||||
import { DeauthorizeSessionsComponent } from './settings/deauthorize-sessions.component';
|
||||
@@ -140,8 +141,11 @@ import localeCs from '@angular/common/locales/cs';
|
||||
import localeDa from '@angular/common/locales/da';
|
||||
import localeDe from '@angular/common/locales/de';
|
||||
import localeEs from '@angular/common/locales/es';
|
||||
import localeEt from '@angular/common/locales/et';
|
||||
import localeFr from '@angular/common/locales/fr';
|
||||
import localeIt from '@angular/common/locales/it';
|
||||
import localeNb from '@angular/common/locales/nb';
|
||||
import localeNl from '@angular/common/locales/nl';
|
||||
import localePl from '@angular/common/locales/pl';
|
||||
import localePtBr from '@angular/common/locales/pt';
|
||||
import localePtPt from '@angular/common/locales/pt-PT';
|
||||
@@ -154,8 +158,11 @@ registerLocaleData(localeCs, 'cs');
|
||||
registerLocaleData(localeDa, 'da');
|
||||
registerLocaleData(localeDe, 'de');
|
||||
registerLocaleData(localeEs, 'es');
|
||||
registerLocaleData(localeEt, 'et');
|
||||
registerLocaleData(localeFr, 'fr');
|
||||
registerLocaleData(localeIt, 'it');
|
||||
registerLocaleData(localeNb, 'nb');
|
||||
registerLocaleData(localeNl, 'nl');
|
||||
registerLocaleData(localePl, 'pl');
|
||||
registerLocaleData(localePtBr, 'pt-BR');
|
||||
registerLocaleData(localePtPt, 'pt-PT');
|
||||
@@ -176,7 +183,7 @@ registerLocaleData(localeZhCn, 'zh-CN');
|
||||
clearQueryParams: true,
|
||||
},
|
||||
}),
|
||||
ToasterModule,
|
||||
ToasterModule.forRoot(),
|
||||
],
|
||||
declarations: [
|
||||
AcceptOrganizationComponent,
|
||||
@@ -198,6 +205,7 @@ registerLocaleData(localeZhCn, 'zh-CN');
|
||||
BulkShareComponent,
|
||||
CalloutComponent,
|
||||
ChangeEmailComponent,
|
||||
ChangeKdfComponent,
|
||||
ChangePasswordComponent,
|
||||
CiphersComponent,
|
||||
CollectionsComponent,
|
||||
|
||||
@@ -14,4 +14,4 @@ if (process.env.ENV === 'production') {
|
||||
enableProdMode();
|
||||
}
|
||||
|
||||
platformBrowserDynamic().bootstrapModule(AppModule);
|
||||
platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true });
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let g of groups; let i = index">
|
||||
<td class="table-list-checkbox" (click)="check(g)">
|
||||
<input type="checkbox" [(ngModel)]="g.checked" name="Groups[{{i}}].Checked" [disabled]="g.accessAll">
|
||||
<input type="checkbox" [(ngModel)]="g.checked" name="Groups[{{i}}].Checked" [disabled]="g.accessAll" appStopProp>
|
||||
</td>
|
||||
<td (click)="check(g)">
|
||||
<span appStopProp>
|
||||
|
||||
@@ -103,6 +103,10 @@ export class CollectionAddEditComponent implements OnInit {
|
||||
}
|
||||
|
||||
async submit() {
|
||||
if (this.orgKey == null) {
|
||||
throw new Error('No encryption key for this organization.');
|
||||
}
|
||||
|
||||
const request = new CollectionRequest();
|
||||
request.name = (await this.cryptoService.encrypt(this.name, this.orgKey)).encryptedString;
|
||||
request.groups = this.groups.filter((g) => (g as any).checked && !g.accessAll)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let c of collections; let i = index">
|
||||
<td class="table-list-checkbox" (click)="check(c)">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td (click)="check(c)">
|
||||
<span appStopProp>{{c.name}}</span>
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let c of collections; let i = index">
|
||||
<td class="table-list-checkbox" (click)="check(c)">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td (click)="check(c)">
|
||||
<span appStopProp>{{c.name}}</span>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let g of groups; let i = index">
|
||||
<td class="table-list-checkbox" (click)="check(g)">
|
||||
<input type="checkbox" [(ngModel)]="g.checked" name="Groups[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="g.checked" name="Groups[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td (click)="check(g)">
|
||||
<span appStopProp>{{g.name}}</span>
|
||||
|
||||
@@ -32,13 +32,6 @@
|
||||
<div class="secondary-header border-0 mb-0">
|
||||
<h1>{{'taxInformation' | i18n}}</h1>
|
||||
</div>
|
||||
<div class="mb-3" *ngIf="org && (org.businessAddress1 || org.businessTaxNumber)">
|
||||
<div>{{org.businessAddress1}}</div>
|
||||
<div>{{org.businessAddress2}}</div>
|
||||
<div>{{org.businessAddress3}}</div>
|
||||
<div>{{org.businessCountry}}</div>
|
||||
<div>{{org.businessTaxNumber}}</div>
|
||||
</div>
|
||||
<p>{{'taxInformationDesc' | i18n}}</p>
|
||||
<a href="https://bitwarden.com/contact/" target="_blank" rel="noopener" class="btn btn-outline-secondary">
|
||||
{{'contactSupport' | i18n}}
|
||||
@@ -50,6 +43,8 @@
|
||||
<div class="card-body">
|
||||
<p>{{'dangerZoneDesc' | i18n}}</p>
|
||||
<button type="button" class="btn btn-outline-danger" (click)="deleteOrganization()">{{'deleteOrganization' | i18n}}</button>
|
||||
<button type="button" class="btn btn-outline-danger" (click)="purgeVault()">{{'purgeVault' | i18n}}</button>
|
||||
</div>
|
||||
</div>
|
||||
<ng-template #deleteOrganizationTemplate></ng-template>
|
||||
<ng-template #purgeOrganizationTemplate></ng-template>
|
||||
|
||||
@@ -17,6 +17,7 @@ import { OrganizationUpdateRequest } from 'jslib/models/request/organizationUpda
|
||||
import { OrganizationResponse } from 'jslib/models/response/organizationResponse';
|
||||
|
||||
import { ModalComponent } from '../../modal.component';
|
||||
import { PurgeVaultComponent } from '../../settings/purge-vault.component';
|
||||
import { DeleteOrganizationComponent } from './delete-organization.component';
|
||||
|
||||
@Component({
|
||||
@@ -25,6 +26,7 @@ import { DeleteOrganizationComponent } from './delete-organization.component';
|
||||
})
|
||||
export class AccountComponent {
|
||||
@ViewChild('deleteOrganizationTemplate', { read: ViewContainerRef }) deleteModalRef: ViewContainerRef;
|
||||
@ViewChild('purgeOrganizationTemplate', { read: ViewContainerRef }) purgeModalRef: ViewContainerRef;
|
||||
|
||||
loading = true;
|
||||
org: OrganizationResponse;
|
||||
@@ -78,4 +80,19 @@ export class AccountComponent {
|
||||
this.modal = null;
|
||||
});
|
||||
}
|
||||
|
||||
purgeVault() {
|
||||
if (this.modal != null) {
|
||||
this.modal.close();
|
||||
}
|
||||
|
||||
const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent);
|
||||
this.modal = this.purgeModalRef.createComponent(factory).instance;
|
||||
const childComponent = this.modal.show<PurgeVaultComponent>(PurgeVaultComponent, this.purgeModalRef);
|
||||
childComponent.organizationId = this.organizationId;
|
||||
|
||||
this.modal.onClosed.subscribe(async () => {
|
||||
this.modal = null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,6 @@ export class AdjustSeatsComponent {
|
||||
}
|
||||
|
||||
get adjustedSeatTotal(): number {
|
||||
return this.seatAdjustment * this.seatAdjustment;
|
||||
return this.seatAdjustment * this.seatPrice;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,8 @@ export class OrganizationBillingComponent implements OnInit {
|
||||
}
|
||||
|
||||
get isExpired() {
|
||||
return this.billing != null && this.billing.expiration != null && this.billing.expiration < new Date();
|
||||
return this.billing != null && this.billing.expiration != null &&
|
||||
new Date(this.billing.expiration) < new Date();
|
||||
}
|
||||
|
||||
get subscriptionMarkedForCancel() {
|
||||
@@ -256,11 +257,11 @@ export class OrganizationBillingComponent implements OnInit {
|
||||
case PlanType.EnterpriseMonthly:
|
||||
return 4;
|
||||
case PlanType.EnterpriseAnnually:
|
||||
return 3;
|
||||
return 36;
|
||||
case PlanType.TeamsMonthly:
|
||||
return 2.5;
|
||||
case PlanType.TeamsAnnually:
|
||||
return 2;
|
||||
return 24;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import { ActivatedRoute } from '@angular/router';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { TwoFactorProviderType } from 'jslib/enums/twoFactorProviderType';
|
||||
|
||||
@@ -18,10 +18,10 @@ import { TwoFactorSetupComponent as BaseTwoFactorSetupComponent } from '../../se
|
||||
templateUrl: '../../settings/two-factor-setup.component.html',
|
||||
})
|
||||
export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent {
|
||||
constructor(apiService: ApiService, tokenService: TokenService,
|
||||
constructor(apiService: ApiService, userService: UserService,
|
||||
componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService,
|
||||
private route: ActivatedRoute) {
|
||||
super(apiService, tokenService, componentFactoryResolver, messagingService);
|
||||
super(apiService, userService, componentFactoryResolver, messagingService);
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { Component } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
|
||||
@@ -8,7 +5,6 @@ import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { ExportService } from 'jslib/abstractions/export.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { ExportComponent as BaseExportComponent } from '../../tools/export.component';
|
||||
|
||||
@@ -19,12 +15,10 @@ import { ExportComponent as BaseExportComponent } from '../../tools/export.compo
|
||||
export class ExportComponent extends BaseExportComponent {
|
||||
organizationId: string;
|
||||
|
||||
constructor(analytics: Angulartics2, toasterService: ToasterService,
|
||||
cryptoService: CryptoService, userService: UserService,
|
||||
i18nService: I18nService, platformUtilsService: PlatformUtilsService,
|
||||
exportService: ExportService, private route: ActivatedRoute) {
|
||||
super(analytics, toasterService, cryptoService, userService, i18nService, platformUtilsService,
|
||||
exportService);
|
||||
constructor(cryptoService: CryptoService, i18nService: I18nService,
|
||||
platformUtilsService: PlatformUtilsService, exportService: ExportService,
|
||||
private route: ActivatedRoute) {
|
||||
super(cryptoService, i18nService, platformUtilsService, exportService);
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
||||
@@ -3,9 +3,6 @@ import {
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { AuditService } from 'jslib/abstractions/audit.service';
|
||||
import { CipherService } from 'jslib/abstractions/cipher.service';
|
||||
@@ -15,8 +12,8 @@ import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { PasswordGenerationService } from 'jslib/abstractions/passwordGeneration.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { StateService } from 'jslib/abstractions/state.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { TotpService } from 'jslib/abstractions/totp.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { CipherData } from 'jslib/models/data/cipherData';
|
||||
import { Cipher } from 'jslib/models/domain/cipher';
|
||||
@@ -31,17 +28,16 @@ import { AddEditComponent as BaseAddEditComponent } from '../../vault/add-edit.c
|
||||
})
|
||||
export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
organization: Organization;
|
||||
originalCipher: Cipher = null;
|
||||
|
||||
constructor(cipherService: CipherService, folderService: FolderService,
|
||||
i18nService: I18nService, platformUtilsService: PlatformUtilsService,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
auditService: AuditService, stateService: StateService,
|
||||
tokenService: TokenService, totpService: TotpService,
|
||||
userService: UserService, totpService: TotpService,
|
||||
passwordGenerationService: PasswordGenerationService, private apiService: ApiService,
|
||||
messagingService: MessagingService) {
|
||||
super(cipherService, folderService, i18nService, platformUtilsService, analytics,
|
||||
toasterService, auditService, stateService, tokenService, totpService, passwordGenerationService,
|
||||
messagingService);
|
||||
super(cipherService, folderService, i18nService, platformUtilsService, auditService, stateService,
|
||||
userService, totpService, passwordGenerationService, messagingService);
|
||||
}
|
||||
|
||||
protected async loadCipher() {
|
||||
@@ -49,14 +45,19 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
return await super.loadCipher();
|
||||
}
|
||||
const response = await this.apiService.getCipherAdmin(this.cipherId);
|
||||
return new Cipher(new CipherData(response));
|
||||
const data = new CipherData(response);
|
||||
this.originalCipher = new Cipher(data);
|
||||
return new Cipher(data);
|
||||
}
|
||||
|
||||
protected encryptCipher() {
|
||||
if (!this.editMode) {
|
||||
this.cipher.organizationId = this.organization.id;
|
||||
}
|
||||
return super.encryptCipher();
|
||||
if (!this.organization.isAdmin) {
|
||||
return super.encryptCipher();
|
||||
}
|
||||
return this.cipherService.encrypt(this.cipher, null, this.originalCipher);
|
||||
}
|
||||
|
||||
protected async saveCipher(cipher: Cipher) {
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { CipherService } from 'jslib/abstractions/cipher.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { CipherData } from 'jslib/models/data/cipherData';
|
||||
import { Cipher } from 'jslib/models/domain/cipher';
|
||||
@@ -23,12 +20,10 @@ import { AttachmentsComponent as BaseAttachmentsComponent } from '../../vault/at
|
||||
export class AttachmentsComponent extends BaseAttachmentsComponent {
|
||||
organization: Organization;
|
||||
|
||||
constructor(cipherService: CipherService, analytics: Angulartics2,
|
||||
toasterService: ToasterService, i18nService: I18nService,
|
||||
cryptoService: CryptoService, tokenService: TokenService,
|
||||
constructor(cipherService: CipherService, i18nService: I18nService,
|
||||
cryptoService: CryptoService, userService: UserService,
|
||||
platformUtilsService: PlatformUtilsService, private apiService: ApiService) {
|
||||
super(cipherService, analytics, toasterService, i18nService, cryptoService, tokenService,
|
||||
platformUtilsService);
|
||||
super(cipherService, i18nService, cryptoService, userService, platformUtilsService);
|
||||
}
|
||||
|
||||
protected async loadCipher() {
|
||||
|
||||
@@ -11,6 +11,7 @@ import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { CipherService } from 'jslib/abstractions/cipher.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { SearchService } from 'jslib/abstractions/search.service';
|
||||
|
||||
import { CipherData } from 'jslib/models/data/cipherData';
|
||||
import { Cipher } from 'jslib/models/domain/cipher';
|
||||
@@ -29,10 +30,13 @@ export class CiphersComponent extends BaseCiphersComponent {
|
||||
organization: Organization;
|
||||
accessEvents = false;
|
||||
|
||||
constructor(cipherService: CipherService, analytics: Angulartics2,
|
||||
protected allCiphers: CipherView[] = [];
|
||||
|
||||
constructor(searchService: SearchService, analytics: Angulartics2,
|
||||
toasterService: ToasterService, i18nService: I18nService,
|
||||
platformUtilsService: PlatformUtilsService, private apiService: ApiService) {
|
||||
super(cipherService, analytics, toasterService, i18nService, platformUtilsService);
|
||||
platformUtilsService: PlatformUtilsService, cipherService: CipherService,
|
||||
private apiService: ApiService) {
|
||||
super(searchService, analytics, toasterService, i18nService, platformUtilsService, cipherService);
|
||||
}
|
||||
|
||||
async load(filter: (cipher: CipherView) => boolean = null) {
|
||||
@@ -60,12 +64,28 @@ export class CiphersComponent extends BaseCiphersComponent {
|
||||
this.loaded = true;
|
||||
}
|
||||
|
||||
applyFilter(filter: (cipher: CipherView) => boolean = null) {
|
||||
async applyFilter(filter: (cipher: CipherView) => boolean = null) {
|
||||
if (this.organization.isAdmin) {
|
||||
super.applyFilter(filter);
|
||||
await super.applyFilter(filter);
|
||||
} else {
|
||||
const f = (c: CipherView) => c.organizationId === this.organization.id && (filter == null || filter(c));
|
||||
super.applyFilter(f);
|
||||
await super.applyFilter(f);
|
||||
}
|
||||
}
|
||||
|
||||
search(timeout: number = null) {
|
||||
if (!this.organization.isAdmin) {
|
||||
return super.search(timeout);
|
||||
}
|
||||
this.searchPending = false;
|
||||
let filteredCiphers = this.allCiphers;
|
||||
if (this.filter != null) {
|
||||
filteredCiphers = filteredCiphers.filter(this.filter);
|
||||
}
|
||||
if (this.searchText == null || this.searchText.trim().length < 2) {
|
||||
this.ciphers = filteredCiphers;
|
||||
} else {
|
||||
this.ciphers = this.searchService.searchCiphersBasic(filteredCiphers, this.searchText);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
import { Location } from '@angular/common';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
ComponentFactoryResolver,
|
||||
NgZone,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
ViewChild,
|
||||
ViewContainerRef,
|
||||
@@ -16,6 +19,8 @@ import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { SyncService } from 'jslib/abstractions/sync.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { BroadcasterService } from 'jslib/angular/services/broadcaster.service';
|
||||
|
||||
import { Organization } from 'jslib/models/domain/organization';
|
||||
import { CipherView } from 'jslib/models/view/cipherView';
|
||||
|
||||
@@ -30,11 +35,13 @@ import { CiphersComponent } from './ciphers.component';
|
||||
import { CollectionsComponent } from './collections.component';
|
||||
import { GroupingsComponent } from './groupings.component';
|
||||
|
||||
const BroadcasterSubscriptionId = 'OrgVaultComponent';
|
||||
|
||||
@Component({
|
||||
selector: 'app-org-vault',
|
||||
templateUrl: 'vault.component.html',
|
||||
})
|
||||
export class VaultComponent implements OnInit {
|
||||
export class VaultComponent implements OnInit, OnDestroy {
|
||||
@ViewChild(GroupingsComponent) groupingsComponent: GroupingsComponent;
|
||||
@ViewChild(CiphersComponent) ciphersComponent: CiphersComponent;
|
||||
@ViewChild('attachments', { read: ViewContainerRef }) attachmentsModalRef: ViewContainerRef;
|
||||
@@ -52,7 +59,9 @@ export class VaultComponent implements OnInit {
|
||||
constructor(private route: ActivatedRoute, private userService: UserService,
|
||||
private location: Location, private router: Router,
|
||||
private syncService: SyncService, private i18nService: I18nService,
|
||||
private componentFactoryResolver: ComponentFactoryResolver, private messagingService: MessagingService) { }
|
||||
private componentFactoryResolver: ComponentFactoryResolver, private messagingService: MessagingService,
|
||||
private broadcasterService: BroadcasterService, private ngZone: NgZone,
|
||||
private changeDetectorRef: ChangeDetectorRef) { }
|
||||
|
||||
ngOnInit() {
|
||||
this.route.parent.params.subscribe(async (params) => {
|
||||
@@ -62,8 +71,24 @@ export class VaultComponent implements OnInit {
|
||||
this.ciphersComponent.organization = this.organization;
|
||||
|
||||
this.route.queryParams.subscribe(async (qParams) => {
|
||||
this.ciphersComponent.searchText = this.groupingsComponent.searchText = qParams.search;
|
||||
if (!this.organization.isAdmin) {
|
||||
await this.syncService.fullSync(false);
|
||||
this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {
|
||||
this.ngZone.run(async () => {
|
||||
switch (message.command) {
|
||||
case 'syncCompleted':
|
||||
if (message.successfully) {
|
||||
await Promise.all([
|
||||
this.groupingsComponent.load(),
|
||||
this.ciphersComponent.refresh(),
|
||||
]);
|
||||
this.changeDetectorRef.detectChanges();
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
await this.groupingsComponent.load();
|
||||
|
||||
@@ -84,7 +109,6 @@ export class VaultComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
this.ciphersComponent.searchText = this.groupingsComponent.searchText = qParams.search;
|
||||
if (qParams.viewEvents != null) {
|
||||
const cipher = this.ciphersComponent.ciphers.filter((c) => c.id === qParams.viewEvents);
|
||||
if (cipher.length > 0) {
|
||||
@@ -95,6 +119,10 @@ export class VaultComponent implements OnInit {
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
||||
}
|
||||
|
||||
async clearGroupingFilters() {
|
||||
this.ciphersComponent.showAddNew = true;
|
||||
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchVault');
|
||||
@@ -124,7 +152,7 @@ export class VaultComponent implements OnInit {
|
||||
if (collectionId === 'unassigned') {
|
||||
return c.collectionIds == null || c.collectionIds.length === 0;
|
||||
} else {
|
||||
return c.collectionIds.indexOf(collectionId) > -1;
|
||||
return c.collectionIds != null && c.collectionIds.indexOf(collectionId) > -1;
|
||||
}
|
||||
};
|
||||
if (load) {
|
||||
@@ -139,6 +167,7 @@ export class VaultComponent implements OnInit {
|
||||
|
||||
filterSearchText(searchText: string) {
|
||||
this.ciphersComponent.searchText = searchText;
|
||||
this.ciphersComponent.search(200);
|
||||
}
|
||||
|
||||
editCipherAttachments(cipher: CipherView) {
|
||||
|
||||
@@ -47,8 +47,8 @@ export class EventService {
|
||||
case EventType.User_ChangedPassword:
|
||||
msg = this.i18nService.t('changedPassword');
|
||||
break;
|
||||
case EventType.User_Enabled2fa:
|
||||
msg = this.i18nService.t('enabled2fa');
|
||||
case EventType.User_Updated2fa:
|
||||
msg = this.i18nService.t('enabledUpdated2fa');
|
||||
break;
|
||||
case EventType.User_Disabled2fa:
|
||||
msg = this.i18nService.t('disabled2fa');
|
||||
@@ -124,6 +124,9 @@ export class EventService {
|
||||
case EventType.Organization_Updated:
|
||||
msg = this.i18nService.t('editedOrgSettings');
|
||||
break;
|
||||
case EventType.Organization_PurgedVault:
|
||||
msg = this.i18nService.t('purgedOrganizationVault');
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,9 @@ import { ExportService } from 'jslib/services/export.service';
|
||||
import { FolderService } from 'jslib/services/folder.service';
|
||||
import { ImportService } from 'jslib/services/import.service';
|
||||
import { LockService } from 'jslib/services/lock.service';
|
||||
import { NotificationsService } from 'jslib/services/notifications.service';
|
||||
import { PasswordGenerationService } from 'jslib/services/passwordGeneration.service';
|
||||
import { SearchService } from 'jslib/services/search.service';
|
||||
import { SettingsService } from 'jslib/services/settings.service';
|
||||
import { StateService } from 'jslib/services/state.service';
|
||||
import { SyncService } from 'jslib/services/sync.service';
|
||||
@@ -63,10 +65,12 @@ import { ImportService as ImportServiceAbstraction } from 'jslib/abstractions/im
|
||||
import { LockService as LockServiceAbstraction } from 'jslib/abstractions/lock.service';
|
||||
import { LogService as LogServiceAbstraction } from 'jslib/abstractions/log.service';
|
||||
import { MessagingService as MessagingServiceAbstraction } from 'jslib/abstractions/messaging.service';
|
||||
import { NotificationsService as NotificationsServiceAbstraction } from 'jslib/abstractions/notifications.service';
|
||||
import {
|
||||
PasswordGenerationService as PasswordGenerationServiceAbstraction,
|
||||
} from 'jslib/abstractions/passwordGeneration.service';
|
||||
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from 'jslib/abstractions/platformUtils.service';
|
||||
import { SearchService as SearchServiceAbstraction } from 'jslib/abstractions/search.service';
|
||||
import { SettingsService as SettingsServiceAbstraction } from 'jslib/abstractions/settings.service';
|
||||
import { StateService as StateServiceAbstraction } from 'jslib/abstractions/state.service';
|
||||
import { StorageService as StorageServiceAbstraction } from 'jslib/abstractions/storage.service';
|
||||
@@ -79,7 +83,7 @@ const i18nService = new I18nService(window.navigator.language, 'locales');
|
||||
const stateService = new StateService();
|
||||
const broadcasterService = new BroadcasterService();
|
||||
const messagingService = new BroadcasterMessagingService(broadcasterService);
|
||||
const platformUtilsService = new WebPlatformUtilsService(i18nService);
|
||||
const platformUtilsService = new WebPlatformUtilsService(i18nService, messagingService);
|
||||
const storageService: StorageServiceAbstraction = new HtmlStorageService(platformUtilsService);
|
||||
const secureStorageService: StorageServiceAbstraction = new MemoryStorageService();
|
||||
const cryptoFunctionService: CryptoFunctionServiceAbstraction = new WebCryptoFunctionService(window,
|
||||
@@ -90,26 +94,30 @@ const tokenService = new TokenService(storageService);
|
||||
const appIdService = new AppIdService(storageService);
|
||||
const apiService = new ApiService(tokenService, platformUtilsService,
|
||||
async (expired: boolean) => messagingService.send('logout', { expired: expired }));
|
||||
const environmentService = new EnvironmentService(apiService, storageService);
|
||||
const userService = new UserService(tokenService, storageService);
|
||||
const settingsService = new SettingsService(userService, storageService);
|
||||
export let searchService: SearchService = null;
|
||||
const cipherService = new CipherService(cryptoService, userService, settingsService,
|
||||
apiService, storageService, i18nService, platformUtilsService);
|
||||
apiService, storageService, i18nService, () => searchService);
|
||||
const folderService = new FolderService(cryptoService, userService, apiService, storageService,
|
||||
i18nService, cipherService);
|
||||
const collectionService = new CollectionService(cryptoService, userService, storageService, i18nService);
|
||||
searchService = new SearchService(cipherService, platformUtilsService);
|
||||
const lockService = new LockService(cipherService, folderService, collectionService,
|
||||
cryptoService, platformUtilsService, storageService, messagingService, null);
|
||||
cryptoService, platformUtilsService, storageService, messagingService, searchService, null);
|
||||
const syncService = new SyncService(userService, apiService, settingsService,
|
||||
folderService, cipherService, cryptoService, collectionService, storageService, messagingService,
|
||||
async (expired: boolean) => messagingService.send('logout', { expired: expired }));
|
||||
const passwordGenerationService = new PasswordGenerationService(cryptoService, storageService);
|
||||
const totpService = new TotpService(storageService, cryptoFunctionService);
|
||||
const containerService = new ContainerService(cryptoService, platformUtilsService);
|
||||
const containerService = new ContainerService(cryptoService);
|
||||
const authService = new AuthService(cryptoService, apiService,
|
||||
userService, tokenService, appIdService, i18nService, platformUtilsService, messagingService);
|
||||
const exportService = new ExportService(folderService, cipherService, apiService);
|
||||
const importService = new ImportService(cipherService, folderService, apiService, i18nService, collectionService);
|
||||
const notificationsService = new NotificationsService(userService, syncService, appIdService,
|
||||
apiService, cryptoService, async () => messagingService.send('logout', { expired: true }));
|
||||
const environmentService = new EnvironmentService(apiService, storageService, notificationsService);
|
||||
const auditService = new AuditService(cryptoFunctionService, apiService);
|
||||
|
||||
const analytics = new Analytics(window, () => platformUtilsService.isDev() || platformUtilsService.isSelfHost(),
|
||||
@@ -122,8 +130,11 @@ export function initFactory(): Function {
|
||||
const isDev = platformUtilsService.isDev();
|
||||
if (!isDev && platformUtilsService.isSelfHost()) {
|
||||
environmentService.baseUrl = window.location.origin;
|
||||
} else {
|
||||
environmentService.notificationsUrl = isDev ? 'http://localhost:61840' :
|
||||
'https://notifications.bitwarden.com'; // window.location.origin + '/notifications';
|
||||
}
|
||||
await apiService.setUrls({
|
||||
apiService.setUrls({
|
||||
base: isDev ? null : window.location.origin,
|
||||
api: isDev ? 'http://localhost:4000' : null,
|
||||
identity: isDev ? 'http://localhost:33656' : null,
|
||||
@@ -135,11 +146,12 @@ export function initFactory(): Function {
|
||||
// api: 'https://api.bitwarden.com',
|
||||
// identity: 'https://identity.bitwarden.com',
|
||||
});
|
||||
setTimeout(() => notificationsService.init(environmentService), 3000);
|
||||
|
||||
lockService.init(true);
|
||||
const locale = await storageService.get<string>(ConstantsService.localeKey);
|
||||
await i18nService.init(locale);
|
||||
await authService.init();
|
||||
authService.init();
|
||||
const htmlEl = window.document.documentElement;
|
||||
htmlEl.classList.add('locale_' + i18nService.translationLocale);
|
||||
let theme = await storageService.get<string>(ConstantsService.themeKey);
|
||||
@@ -188,7 +200,9 @@ export function initFactory(): Function {
|
||||
{ provide: StorageServiceAbstraction, useValue: storageService },
|
||||
{ provide: StateServiceAbstraction, useValue: stateService },
|
||||
{ provide: ExportServiceAbstraction, useValue: exportService },
|
||||
{ provide: SearchServiceAbstraction, useValue: searchService },
|
||||
{ provide: ImportServiceAbstraction, useValue: importService },
|
||||
{ provide: NotificationsServiceAbstraction, useValue: notificationsService },
|
||||
{ provide: CryptoFunctionServiceAbstraction, useValue: cryptoFunctionService },
|
||||
{
|
||||
provide: APP_INITIALIZER,
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
<h1>{{'changeMasterPassword' | i18n}}</h1>
|
||||
</div>
|
||||
<app-change-password></app-change-password>
|
||||
<div class="secondary-header">
|
||||
<h1>{{'encKeySettings' | i18n}}</h1>
|
||||
</div>
|
||||
<app-change-kdf></app-change-kdf>
|
||||
<div class="secondary-header text-danger border-0 mb-0">
|
||||
<h1>{{'dangerZone' | i18n}}</h1>
|
||||
</div>
|
||||
|
||||
@@ -9,6 +9,7 @@ import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { EmailRequest } from 'jslib/models/request/emailRequest';
|
||||
import { EmailTokenRequest } from 'jslib/models/request/emailTokenRequest';
|
||||
@@ -27,7 +28,8 @@ export class ChangeEmailComponent {
|
||||
|
||||
constructor(private apiService: ApiService, private i18nService: I18nService,
|
||||
private analytics: Angulartics2, private toasterService: ToasterService,
|
||||
private cryptoService: CryptoService, private messagingService: MessagingService) { }
|
||||
private cryptoService: CryptoService, private messagingService: MessagingService,
|
||||
private userService: UserService) { }
|
||||
|
||||
async submit() {
|
||||
const hasEncKey = await this.cryptoService.hasEncKey();
|
||||
@@ -36,7 +38,7 @@ export class ChangeEmailComponent {
|
||||
return;
|
||||
}
|
||||
|
||||
this.newEmail = this.newEmail.toLowerCase();
|
||||
this.newEmail = this.newEmail.trim().toLowerCase();
|
||||
if (!this.tokenSent) {
|
||||
const request = new EmailTokenRequest();
|
||||
request.newEmail = this.newEmail;
|
||||
@@ -51,11 +53,12 @@ export class ChangeEmailComponent {
|
||||
request.token = this.token;
|
||||
request.newEmail = this.newEmail;
|
||||
request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, null);
|
||||
const newKey = await this.cryptoService.makeKey(this.masterPassword, this.newEmail);
|
||||
const kdf = await this.userService.getKdf();
|
||||
const kdfIterations = await this.userService.getKdfIterations();
|
||||
const newKey = await this.cryptoService.makeKey(this.masterPassword, this.newEmail, kdf, kdfIterations);
|
||||
request.newMasterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, newKey);
|
||||
const encKey = await this.cryptoService.getEncKey();
|
||||
const newEncKey = await this.cryptoService.encrypt(encKey.key, newKey);
|
||||
request.key = newEncKey.encryptedString;
|
||||
const newEncKey = await this.cryptoService.remakeEncKey(newKey);
|
||||
request.key = newEncKey[1].encryptedString;
|
||||
try {
|
||||
this.formPromise = this.apiService.postEmail(request);
|
||||
await this.formPromise;
|
||||
|
||||
47
src/app/settings/change-kdf.component.html
Normal file
47
src/app/settings/change-kdf.component.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<app-callout type="warning">{{'loggedOutWarning' | i18n}}</app-callout>
|
||||
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate autocomplete="off">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-group">
|
||||
<label for="kdfMasterPassword">{{'masterPass' | i18n}}</label>
|
||||
<input id="kdfMasterPassword" type="password" name="MasterPasswordHash" class="form-control" [(ngModel)]="masterPassword"
|
||||
required appInputVerbatim>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-group mb-0">
|
||||
<label for="kdf">{{'kdfAlgorithm' | i18n}}</label>
|
||||
<a class="ml-auto" href="https://en.wikipedia.org/wiki/Key_derivation_function" target="_blank" rel="noopener" title="{{'learnMore' | i18n}}">
|
||||
<i class="fa fa-question-circle-o"></i>
|
||||
</a>
|
||||
<select id="kdf" name="Kdf" [(ngModel)]="kdf" class="form-control" required>
|
||||
<option *ngFor="let o of kdfOptions" [ngValue]="o.value">{{o.name}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-group mb-0">
|
||||
<label for="kdfIterations">{{'kdfIterations' | i18n}}</label>
|
||||
<a class="ml-auto" href="https://en.wikipedia.org/wiki/PBKDF2" target="_blank" rel="noopener" title="{{'learnMore' | i18n}}">
|
||||
<i class="fa fa-question-circle-o"></i>
|
||||
</a>
|
||||
<input id="kdfIterations" type="number" min="5000" max="1000000" name="KdfIterations" class="form-control" [(ngModel)]="kdfIterations"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="form-group">
|
||||
<div class="small form-text text-muted">
|
||||
<p>{{'kdfIterationsDesc' | i18n : (100000 | number)}}</p>
|
||||
<strong>{{'warning' | i18n}}</strong>: {{'kdfIterationsWarning' | i18n : (50000 | number)}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
|
||||
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i>
|
||||
<span>{{'changeKdf' | i18n}}</span>
|
||||
</button>
|
||||
</form>
|
||||
69
src/app/settings/change-kdf.component.ts
Normal file
69
src/app/settings/change-kdf.component.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { KdfRequest } from 'jslib/models/request/kdfRequest';
|
||||
|
||||
import { KdfType } from 'jslib/enums/kdfType';
|
||||
|
||||
@Component({
|
||||
selector: 'app-change-kdf',
|
||||
templateUrl: 'change-kdf.component.html',
|
||||
})
|
||||
export class ChangeKdfComponent implements OnInit {
|
||||
masterPassword: string;
|
||||
kdfIterations: number;
|
||||
kdf = KdfType.PBKDF2_SHA256;
|
||||
kdfOptions: any[] = [];
|
||||
formPromise: Promise<any>;
|
||||
|
||||
constructor(private apiService: ApiService, private i18nService: I18nService,
|
||||
private analytics: Angulartics2, private toasterService: ToasterService,
|
||||
private cryptoService: CryptoService, private messagingService: MessagingService,
|
||||
private userService: UserService) {
|
||||
this.kdfOptions = [
|
||||
{ name: 'PBKDF2 SHA-256', value: KdfType.PBKDF2_SHA256 },
|
||||
];
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
this.kdf = await this.userService.getKdf();
|
||||
this.kdfIterations = await this.userService.getKdfIterations();
|
||||
}
|
||||
|
||||
async submit() {
|
||||
const hasEncKey = await this.cryptoService.hasEncKey();
|
||||
if (!hasEncKey) {
|
||||
this.toasterService.popAsync('error', null, this.i18nService.t('updateKey'));
|
||||
return;
|
||||
}
|
||||
|
||||
const request = new KdfRequest();
|
||||
request.kdf = this.kdf;
|
||||
request.kdfIterations = this.kdfIterations;
|
||||
request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, null);
|
||||
const email = await this.userService.getEmail();
|
||||
const newKey = await this.cryptoService.makeKey(this.masterPassword, email, this.kdf, this.kdfIterations);
|
||||
request.newMasterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, newKey);
|
||||
const newEncKey = await this.cryptoService.remakeEncKey(newKey);
|
||||
request.key = newEncKey[1].encryptedString;
|
||||
try {
|
||||
this.formPromise = this.apiService.postAccountKdf(request);
|
||||
await this.formPromise;
|
||||
this.analytics.eventTrack.next({ action: 'Changed KDF' });
|
||||
this.toasterService.popAsync('success', this.i18nService.t('encKeySettingsChanged'),
|
||||
this.i18nService.t('logBackIn'));
|
||||
this.messagingService.send('logout');
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,17 @@
|
||||
<input id="currentMasterPassword" type="password" name="MasterPasswordHash" class="form-control" [(ngModel)]="currentMasterPassword"
|
||||
required appInputVerbatim>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-group">
|
||||
<label for="newMasterPassword">{{'newMasterPass' | i18n}}</label>
|
||||
<input id="newMasterPassword" type="password" name="NewMasterPasswordHash" class="form-control" [(ngModel)]="newMasterPassword"
|
||||
required appInputVerbatim autocomplete="new-password">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-group">
|
||||
<label for="confirmNewMasterPassword">{{'confirmNewMasterPass' | i18n}}</label>
|
||||
<input id="confirmNewMasterPassword" type="password" name="ConfirmNewMasterPasswordHash" class="form-control" [(ngModel)]="confirmNewMasterPassword"
|
||||
|
||||
@@ -54,11 +54,12 @@ export class ChangePasswordComponent {
|
||||
const request = new PasswordRequest();
|
||||
request.masterPasswordHash = await this.cryptoService.hashPassword(this.currentMasterPassword, null);
|
||||
const email = await this.userService.getEmail();
|
||||
const newKey = await this.cryptoService.makeKey(this.newMasterPassword, email);
|
||||
const kdf = await this.userService.getKdf();
|
||||
const kdfIterations = await this.userService.getKdfIterations();
|
||||
const newKey = await this.cryptoService.makeKey(this.newMasterPassword, email, kdf, kdfIterations);
|
||||
request.newMasterPasswordHash = await this.cryptoService.hashPassword(this.newMasterPassword, newKey);
|
||||
const encKey = await this.cryptoService.getEncKey();
|
||||
const newEncKey = await this.cryptoService.encrypt(encKey.key, newKey);
|
||||
request.key = newEncKey.encryptedString;
|
||||
const newEncKey = await this.cryptoService.remakeEncKey(newKey);
|
||||
request.key = newEncKey[1].encryptedString;
|
||||
try {
|
||||
this.formPromise = this.apiService.postPassword(request);
|
||||
await this.formPromise;
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
<small>• {{'trackAuditLogs' | i18n}}</small>
|
||||
<small>• {{'syncUsersFromDirectory' | i18n}}</small>
|
||||
<small>• {{'onPremHostingOptional' | i18n}}</small>
|
||||
<small>• {{'usersGetPremium' | i18n}}</small>
|
||||
<small>• {{'priorityCustomerSupport' | i18n}}</small>
|
||||
<small>• {{'xDayFreeTrial' | i18n : '7'}}</small>
|
||||
<span>{{'costPerUser' | i18n : (3 | currency:'$')}} /{{'month' | i18n}}</span>
|
||||
|
||||
@@ -161,10 +161,8 @@ export class CreateOrganizationComponent implements OnInit {
|
||||
}
|
||||
|
||||
async finalize(orgId: string) {
|
||||
await Promise.all([
|
||||
this.apiService.refreshIdentityToken(),
|
||||
this.syncService.fullSync(true),
|
||||
]);
|
||||
await this.apiService.refreshIdentityToken();
|
||||
await this.syncService.fullSync(true);
|
||||
this.analytics.eventTrack.next({ action: 'Created Organization' });
|
||||
this.toasterService.popAsync('success', this.i18nService.t('organizationCreated'),
|
||||
this.i18nService.t('organizationReadyToGo'));
|
||||
|
||||
@@ -55,7 +55,7 @@ export class PaymentComponent implements OnInit {
|
||||
this.platformUtilsService.isDev() ? Keys.stripeTest : Keys.stripeLive);
|
||||
};
|
||||
this.btScript = window.document.createElement('script');
|
||||
this.btScript.src = 'https://js.braintreegateway.com/web/dropin/1.4.0/js/dropin.min.js';
|
||||
this.btScript.src = 'scripts/dropin.js';
|
||||
this.btScript.async = true;
|
||||
|
||||
this.cardExpMonthOptions = [
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
<div class="page-header">
|
||||
<h1>{{'goPremium' | i18n}}</h1>
|
||||
</div>
|
||||
<app-callout type="info" *ngIf="canAccessPremium" title="{{'youHavePremiumAccess' | i18n}}" icon="fa-star">
|
||||
{{'alreadyPremiumFromOrg' | i18n}}
|
||||
</app-callout>
|
||||
<app-callout type="success">
|
||||
<p>{{'premiumUpgradeUnlockFeatures' | i18n}}</p>
|
||||
<ul class="fa-ul">
|
||||
|
||||
@@ -14,6 +14,7 @@ import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { SyncService } from 'jslib/abstractions/sync.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { PaymentComponent } from './payment.component';
|
||||
|
||||
@@ -24,6 +25,7 @@ import { PaymentComponent } from './payment.component';
|
||||
export class PremiumComponent implements OnInit {
|
||||
@ViewChild(PaymentComponent) paymentComponent: PaymentComponent;
|
||||
|
||||
canAccessPremium = false;
|
||||
selfHosted = false;
|
||||
premiumPrice = 10;
|
||||
storageGbPrice = 4;
|
||||
@@ -35,11 +37,12 @@ export class PremiumComponent implements OnInit {
|
||||
private analytics: Angulartics2, private toasterService: ToasterService,
|
||||
platformUtilsService: PlatformUtilsService, private tokenService: TokenService,
|
||||
private router: Router, private messagingService: MessagingService,
|
||||
private syncService: SyncService) {
|
||||
private syncService: SyncService, private userService: UserService) {
|
||||
this.selfHosted = platformUtilsService.isSelfHost();
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
this.canAccessPremium = await this.userService.canAccessPremium();
|
||||
const premium = await this.tokenService.getPremium();
|
||||
if (premium) {
|
||||
this.router.navigate(['/settings/billing']);
|
||||
@@ -87,10 +90,8 @@ export class PremiumComponent implements OnInit {
|
||||
}
|
||||
|
||||
async finalizePremium() {
|
||||
await Promise.all([
|
||||
this.apiService.refreshIdentityToken(),
|
||||
this.syncService.fullSync(true),
|
||||
]);
|
||||
await this.apiService.refreshIdentityToken();
|
||||
await this.syncService.fullSync(true);
|
||||
this.analytics.eventTrack.next({ action: 'Signed Up Premium' });
|
||||
this.toasterService.popAsync('success', null, this.i18nService.t('premiumUpdated'));
|
||||
this.messagingService.send('purchasedPremium');
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>{{'purgeVaultDesc' | i18n}}</p>
|
||||
<p>{{(organizationId ? 'purgeOrgVaultDesc' : 'purgeVaultDesc') | i18n}}</p>
|
||||
<app-callout type="warning">{{'purgeVaultWarning' | i18n}}</app-callout>
|
||||
<label for="masterPassword">{{'masterPass' | i18n}}</label>
|
||||
<input id="masterPassword" type="password" name="MasterPasswordHash" class="form-control" [(ngModel)]="masterPassword" required
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import { Component } from '@angular/core';
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
} from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
@@ -15,6 +18,8 @@ import { PasswordVerificationRequest } from 'jslib/models/request/passwordVerifi
|
||||
templateUrl: 'purge-vault.component.html',
|
||||
})
|
||||
export class PurgeVaultComponent {
|
||||
@Input() organizationId?: string = null;
|
||||
|
||||
masterPassword: string;
|
||||
formPromise: Promise<any>;
|
||||
|
||||
@@ -32,11 +37,17 @@ export class PurgeVaultComponent {
|
||||
const request = new PasswordVerificationRequest();
|
||||
request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, null);
|
||||
try {
|
||||
this.formPromise = this.apiService.postPurgeCiphers(request);
|
||||
this.formPromise = this.apiService.postPurgeCiphers(request, this.organizationId);
|
||||
await this.formPromise;
|
||||
this.analytics.eventTrack.next({ action: 'Purged Vault' });
|
||||
this.analytics.eventTrack.next({
|
||||
action: this.organizationId != null ? 'Purged Organization Vault' : 'Purged Vault',
|
||||
});
|
||||
this.toasterService.popAsync('success', null, this.i18nService.t('vaultPurged'));
|
||||
this.router.navigate(['vault']);
|
||||
if (this.organizationId != null) {
|
||||
this.router.navigate(['organizations', this.organizationId, 'vault']);
|
||||
} else {
|
||||
this.router.navigate(['vault']);
|
||||
}
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,15 +21,15 @@
|
||||
<div class="mx-4">
|
||||
<h3 class="mb-0">
|
||||
{{p.name}}
|
||||
<i class="fa fa-check text-success fa-fw" *ngIf="p.enabled" title="{{'enabled' | i18n}}"></i>
|
||||
<a href="#" appStopClick class="badge badge-primary" *ngIf="!premium && p.premium" (click)="premiumRequired()">
|
||||
<i class="fa fa-check text-success fa-fw" *ngIf="p.enabled && canAccessPremium" title="{{'enabled' | i18n}}"></i>
|
||||
<a href="#" appStopClick class="badge badge-primary" *ngIf="!canAccessPremium && p.premium" (click)="premiumRequired()">
|
||||
{{'premium' | i18n}}
|
||||
</a>
|
||||
</h3>
|
||||
{{p.description}}
|
||||
</div>
|
||||
<div class="ml-auto">
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" [disabled]="!premium && p.premium" (click)="manage(p.type)">
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" [disabled]="!canAccessPremium && p.premium" (click)="manage(p.type)">
|
||||
{{'manage' | i18n}}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
|
||||
import { ApiService } from 'jslib/abstractions/api.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { TwoFactorProviders } from 'jslib/services/auth.service';
|
||||
|
||||
@@ -38,16 +38,16 @@ export class TwoFactorSetupComponent implements OnInit {
|
||||
|
||||
organizationId: string;
|
||||
providers: any[] = [];
|
||||
premium: boolean;
|
||||
canAccessPremium: boolean;
|
||||
loading = true;
|
||||
|
||||
private modal: ModalComponent = null;
|
||||
|
||||
constructor(protected apiService: ApiService, protected tokenService: TokenService,
|
||||
constructor(protected apiService: ApiService, protected userService: UserService,
|
||||
protected componentFactoryResolver: ComponentFactoryResolver, protected messagingService: MessagingService) { }
|
||||
|
||||
async ngOnInit() {
|
||||
this.premium = this.tokenService.getPremium();
|
||||
this.canAccessPremium = await this.userService.canAccessPremium();
|
||||
|
||||
for (const key in TwoFactorProviders) {
|
||||
if (!TwoFactorProviders.hasOwnProperty(key)) {
|
||||
@@ -128,8 +128,7 @@ export class TwoFactorSetupComponent implements OnInit {
|
||||
}
|
||||
|
||||
async premiumRequired() {
|
||||
const premium = await this.tokenService.getPremium();
|
||||
if (!premium) {
|
||||
if (!this.canAccessPremium) {
|
||||
this.messagingService.send('premiumRequired');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<div class="modal fade">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h2 class="modal-title">
|
||||
@@ -23,43 +23,66 @@
|
||||
<li>{{'twoFactorU2fSupportWeb' | i18n}}</li>
|
||||
</ul>
|
||||
</app-callout>
|
||||
<ng-container *ngIf="!enabled">
|
||||
<img src="../../images/two-factor/4.png" class="float-right ml-5" alt="">
|
||||
<p>{{'twoFactorU2fAdd' | i18n}}:</p>
|
||||
<ol>
|
||||
<li>{{'twoFactorU2fPlugIn' | i18n}}</li>
|
||||
<li>{{'twoFactorU2fTouchButton' | i18n}}</li>
|
||||
</ol>
|
||||
<hr>
|
||||
<div class="text-center">
|
||||
<ng-container *ngIf="u2fListening">
|
||||
<p>
|
||||
<i class="fa fa-spinner fa-spin fa-2x text-muted"></i>
|
||||
</p>
|
||||
{{'twoFactorU2fWaiting' | i18n}}...
|
||||
</ng-container>
|
||||
<ng-container *ngIf="u2fResponse">
|
||||
<p>
|
||||
<i class="fa fa-check-circle fa-2x text-success"></i>
|
||||
</p>
|
||||
{{'twoFactorU2fClickEnable' | i18n}}
|
||||
</ng-container>
|
||||
<ng-container *ngIf="u2fError">
|
||||
<p>
|
||||
<i class="fa fa-warning fa-2x text-danger"></i>
|
||||
</p>
|
||||
{{'twoFactorU2fProblemReading' | i18n}}
|
||||
<img src="../../images/two-factor/4.png" class="float-right ml-5" alt="">
|
||||
<ul class="fa-ul">
|
||||
<li *ngFor="let k of keys; let i = index" #removeKeyBtn [appApiAction]="k.removePromise">
|
||||
<i class="fa-li fa fa-key"></i>
|
||||
<strong *ngIf="!k.configured || !k.name">{{'u2fkeyX' | i18n : i + 1}}</strong>
|
||||
<strong *ngIf="k.configured && k.name">{{k.name}}</strong>
|
||||
<i class="fa fa-fw" [ngClass]="{'fa-check text-success': !k.compromised, 'fa-exclamation-triangle text-warning': k.compromised}"
|
||||
*ngIf="k.configured && !removeKeyBtn.loading" title="{{(k.compromised ? 'keyCompromised' : 'enabled') | i18n}}"></i>
|
||||
<ng-container *ngIf="keysConfiguredCount > 1 && k.configured">
|
||||
<i class="fa fa-spin fa-spinner text-muted fa-fw" title="{{'loading' | i18n}}" *ngIf="removeKeyBtn.loading"></i>
|
||||
-
|
||||
<a href="#" appStopClick (click)="remove(k)">{{'remove' | i18n}}</a>
|
||||
</ng-container>
|
||||
</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<p>{{'twoFactorU2fAdd' | i18n}}:</p>
|
||||
<ol>
|
||||
<li>{{'twoFactorU2fGiveName' | i18n}}</li>
|
||||
<li>{{'twoFactorU2fPlugInReadKey' | i18n}}</li>
|
||||
<li>{{'twoFactorU2fTouchButton' | i18n}}</li>
|
||||
<li>{{'twoFactorU2fSaveForm' | i18n}}</li>
|
||||
</ol>
|
||||
<div class="row">
|
||||
<div class="form-group col-6">
|
||||
<label for="name">{{'name' | i18n}}</label>
|
||||
<input id="name" type="text" name="Name" class="form-control" [(ngModel)]="name" [disabled]="!keyIdAvailable">
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" (click)="readKey()" class="btn btn-outline-secondary mr-2" [disabled]="readKeyBtn.loading || u2fListening || !keyIdAvailable"
|
||||
#readKeyBtn [appApiAction]="challengePromise">
|
||||
{{'readKey' | i18n}}
|
||||
</button>
|
||||
<ng-container *ngIf="readKeyBtn.loading">
|
||||
<i class="fa fa-spinner fa-spin text-muted"></i>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="!readKeyBtn.loading">
|
||||
<ng-container *ngIf="u2fListening">
|
||||
<i class="fa fa-spinner fa-spin text-muted"></i>
|
||||
{{'twoFactorU2fWaiting' | i18n}}...
|
||||
</ng-container>
|
||||
<ng-container *ngIf="u2fResponse">
|
||||
<i class="fa fa-check-circle text-success"></i>
|
||||
{{'twoFactorU2fClickSave' | i18n}}
|
||||
</ng-container>
|
||||
<ng-container *ngIf="u2fError">
|
||||
<i class="fa fa-warning text-danger"></i>
|
||||
{{'twoFactorU2fProblemReadingTryAgain' | i18n}}
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary" [disabled]="form.loading || (!enabled && !u2fResponse)">
|
||||
<button type="submit" class="btn btn-primary" [disabled]="form.loading || !u2fResponse">
|
||||
<i class="fa fa-spinner fa-spin" *ngIf="form.loading" title="{{'loading' | i18n}}"></i>
|
||||
<ng-container *ngIf="!form.loading">
|
||||
<span *ngIf="!enabled">{{'enable' | i18n}}</span>
|
||||
<span *ngIf="enabled">{{'disable' | i18n}}</span>
|
||||
</ng-container>
|
||||
<span *ngIf="!form.loading">{{'save' | i18n}}</span>
|
||||
</button>
|
||||
<button #disableBtn type="button" class="btn btn-outline-secondary btn-submit" [appApiAction]="disablePromise"
|
||||
[disabled]="disableBtn.loading" (click)="disable()" *ngIf="enabled">
|
||||
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i>
|
||||
<span>{{'disableAllKeys' | i18n}}</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import {
|
||||
Component,
|
||||
NgZone,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
@@ -12,6 +13,9 @@ import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
|
||||
import { TwoFactorProviderType } from 'jslib/enums/twoFactorProviderType';
|
||||
|
||||
import { PasswordVerificationRequest } from 'jslib/models/request/passwordVerificationRequest';
|
||||
import { UpdateTwoFactorU2fDeleteRequest } from 'jslib/models/request/updateTwoFactorU2fDeleteRequest';
|
||||
import { UpdateTwoFactorU2fRequest } from 'jslib/models/request/updateTwoFactorU2fRequest';
|
||||
import {
|
||||
ChallengeResponse,
|
||||
@@ -26,18 +30,21 @@ import { TwoFactorBaseComponent } from './two-factor-base.component';
|
||||
})
|
||||
export class TwoFactorU2fComponent extends TwoFactorBaseComponent implements OnInit, OnDestroy {
|
||||
type = TwoFactorProviderType.U2f;
|
||||
u2fChallenge: ChallengeResponse;
|
||||
name: string;
|
||||
keys: any[];
|
||||
keyIdAvailable: number = null;
|
||||
keysConfiguredCount = 0;
|
||||
u2fError: boolean;
|
||||
u2fListening: boolean;
|
||||
u2fResponse: string;
|
||||
challengePromise: Promise<ChallengeResponse>;
|
||||
formPromise: Promise<any>;
|
||||
|
||||
private closed = false;
|
||||
private u2fScript: HTMLScriptElement;
|
||||
|
||||
constructor(apiService: ApiService, i18nService: I18nService,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
platformUtilsService: PlatformUtilsService) {
|
||||
platformUtilsService: PlatformUtilsService, private ngZone: NgZone) {
|
||||
super(apiService, i18nService, analytics, toasterService, platformUtilsService);
|
||||
this.u2fScript = window.document.createElement('script');
|
||||
this.u2fScript.src = 'scripts/u2f.js';
|
||||
@@ -49,28 +56,24 @@ export class TwoFactorU2fComponent extends TwoFactorBaseComponent implements OnI
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.closed = true;
|
||||
window.document.body.removeChild(this.u2fScript);
|
||||
}
|
||||
|
||||
auth(authResponse: any) {
|
||||
super.auth(authResponse);
|
||||
this.processResponse(authResponse.response);
|
||||
this.readDevice();
|
||||
}
|
||||
|
||||
submit() {
|
||||
if (this.enabled) {
|
||||
return super.disable(this.formPromise);
|
||||
} else {
|
||||
return this.enable();
|
||||
if (this.u2fResponse == null || this.keyIdAvailable == null) {
|
||||
// Should never happen.
|
||||
return Promise.reject();
|
||||
}
|
||||
}
|
||||
|
||||
protected enable() {
|
||||
const request = new UpdateTwoFactorU2fRequest();
|
||||
request.masterPasswordHash = this.masterPasswordHash;
|
||||
request.deviceResponse = this.u2fResponse;
|
||||
request.id = this.keyIdAvailable;
|
||||
request.name = this.name;
|
||||
|
||||
return super.enable(async () => {
|
||||
this.formPromise = this.apiService.putTwoFactorU2f(request);
|
||||
@@ -79,38 +82,97 @@ export class TwoFactorU2fComponent extends TwoFactorBaseComponent implements OnI
|
||||
});
|
||||
}
|
||||
|
||||
private readDevice() {
|
||||
if (this.closed || this.enabled) {
|
||||
disable() {
|
||||
return super.disable(this.formPromise);
|
||||
}
|
||||
|
||||
async remove(key: any) {
|
||||
if (this.keysConfiguredCount <= 1 || key.removePromise != null) {
|
||||
return;
|
||||
}
|
||||
const name = key.name != null ? key.name : this.i18nService.t('u2fkeyX', key.id);
|
||||
const confirmed = await this.platformUtilsService.showDialog(
|
||||
this.i18nService.t('removeU2fConfirmation'), name,
|
||||
this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
|
||||
if (!confirmed) {
|
||||
return;
|
||||
}
|
||||
const request = new UpdateTwoFactorU2fDeleteRequest();
|
||||
request.id = key.id;
|
||||
request.masterPasswordHash = this.masterPasswordHash;
|
||||
try {
|
||||
key.removePromise = this.apiService.deleteTwoFactorU2f(request);
|
||||
const response = await key.removePromise;
|
||||
key.removePromise = null;
|
||||
await this.processResponse(response);
|
||||
} catch { }
|
||||
}
|
||||
|
||||
async readKey() {
|
||||
if (this.keyIdAvailable == null) {
|
||||
return;
|
||||
}
|
||||
const request = new PasswordVerificationRequest();
|
||||
request.masterPasswordHash = this.masterPasswordHash;
|
||||
try {
|
||||
this.challengePromise = this.apiService.getTwoFactorU2fChallenge(request);
|
||||
const challenge = await this.challengePromise;
|
||||
this.readDevice(challenge);
|
||||
} catch { }
|
||||
}
|
||||
|
||||
private readDevice(u2fChallenge: ChallengeResponse) {
|
||||
// tslint:disable-next-line
|
||||
console.log('listening for key...');
|
||||
this.resetU2f(true);
|
||||
(window as any).u2f.register(u2fChallenge.appId, [{
|
||||
version: u2fChallenge.version,
|
||||
challenge: u2fChallenge.challenge,
|
||||
}], [], (data: any) => {
|
||||
this.ngZone.run(() => {
|
||||
this.u2fListening = false;
|
||||
if (data.errorCode) {
|
||||
this.u2fError = true;
|
||||
// tslint:disable-next-line
|
||||
console.log('error: ' + data.errorCode);
|
||||
return;
|
||||
}
|
||||
this.u2fResponse = JSON.stringify(data);
|
||||
});
|
||||
}, 15);
|
||||
}
|
||||
|
||||
private resetU2f(listening = false) {
|
||||
this.u2fResponse = null;
|
||||
this.u2fError = false;
|
||||
this.u2fListening = true;
|
||||
|
||||
(window as any).u2f.register(this.u2fChallenge.appId, [{
|
||||
version: this.u2fChallenge.version,
|
||||
challenge: this.u2fChallenge.challenge,
|
||||
}], [], (data: any) => {
|
||||
this.u2fListening = false;
|
||||
if (data.errorCode === 5) {
|
||||
this.readDevice();
|
||||
return;
|
||||
} else if (data.errorCode) {
|
||||
this.u2fError = true;
|
||||
// tslint:disable-next-line
|
||||
console.log('error: ' + data.errorCode);
|
||||
return;
|
||||
}
|
||||
this.u2fResponse = JSON.stringify(data);
|
||||
}, 10);
|
||||
this.u2fListening = listening;
|
||||
}
|
||||
|
||||
private processResponse(response: TwoFactorU2fResponse) {
|
||||
this.u2fChallenge = response.challenge;
|
||||
this.resetU2f();
|
||||
this.keys = [];
|
||||
this.keyIdAvailable = null;
|
||||
this.name = null;
|
||||
this.keysConfiguredCount = 0;
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
if (response.keys != null) {
|
||||
const key = response.keys.filter((k) => k.id === i);
|
||||
if (key.length > 0) {
|
||||
this.keysConfiguredCount++;
|
||||
this.keys.push({
|
||||
id: i, name: key[0].name,
|
||||
configured: true,
|
||||
compromised: key[0].compromised,
|
||||
removePromise: null,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
}
|
||||
this.keys.push({ id: i, name: null, configured: false, compromised: false, removePromise: null });
|
||||
if (this.keyIdAvailable == null) {
|
||||
this.keyIdAvailable = i;
|
||||
}
|
||||
}
|
||||
this.enabled = response.enabled;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,8 +51,7 @@ export class UserBillingComponent implements OnInit {
|
||||
return;
|
||||
}
|
||||
|
||||
const premium = this.tokenService.getPremium();
|
||||
if (premium) {
|
||||
if (this.tokenService.getPremium()) {
|
||||
this.loading = true;
|
||||
this.billing = await this.apiService.getUserBilling();
|
||||
} else {
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { ExportService } from 'jslib/abstractions/export.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { ExportComponent as BaseExportComponent } from 'jslib/angular/components/export.component';
|
||||
|
||||
@@ -16,17 +12,14 @@ import { ExportComponent as BaseExportComponent } from 'jslib/angular/components
|
||||
templateUrl: 'export.component.html',
|
||||
})
|
||||
export class ExportComponent extends BaseExportComponent {
|
||||
constructor(analytics: Angulartics2, toasterService: ToasterService,
|
||||
cryptoService: CryptoService, userService: UserService,
|
||||
i18nService: I18nService, platformUtilsService: PlatformUtilsService,
|
||||
exportService: ExportService) {
|
||||
super(analytics, toasterService, cryptoService, userService, i18nService, platformUtilsService,
|
||||
exportService, window);
|
||||
constructor(cryptoService: CryptoService, i18nService: I18nService,
|
||||
platformUtilsService: PlatformUtilsService, exportService: ExportService) {
|
||||
super(cryptoService, i18nService, platformUtilsService, exportService, window);
|
||||
}
|
||||
|
||||
protected saved() {
|
||||
super.saved();
|
||||
this.masterPassword = null;
|
||||
this.toasterService.popAsync('success', null, this.i18nService.t('exportSuccess'));
|
||||
this.platformUtilsService.showToast('success', null, this.i18nService.t('exportSuccess'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,6 +153,15 @@
|
||||
check all of the fields, change the "Output format" to "CSV", and then click the "Start" button to save the CSV
|
||||
file.
|
||||
</ng-container>
|
||||
<ng-container *ngIf="format === 'passpackcsv'">
|
||||
Log into the Passpack website vault and navigate to "Settings" → "Export", then click the "Download" button to save
|
||||
the CSV file.
|
||||
</ng-container>
|
||||
<ng-container *ngIf="format === 'passmanjson'">
|
||||
Open your Passman vault and click on "Settings" in the bottom left corner. In the "Settings" window switch to the
|
||||
"Export credentials" tab and choose "JSON" as the export type. Enter your vault's passphrase and click the "Export"
|
||||
button to save the JSON file.
|
||||
</ng-container>
|
||||
</app-callout>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
|
||||
@@ -129,7 +129,7 @@ export class ImportComponent implements OnInit {
|
||||
reader.onload = (evt) => {
|
||||
if (this.format === 'lastpasscsv' && file.type === 'text/html') {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(evt.target.result, 'text/html');
|
||||
const doc = parser.parseFromString((evt.target as any).result, 'text/html');
|
||||
const pre = doc.querySelector('pre');
|
||||
if (pre != null) {
|
||||
resolve(pre.textContent);
|
||||
@@ -139,7 +139,7 @@ export class ImportComponent implements OnInit {
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(evt.target.result);
|
||||
resolve((evt.target as any).result);
|
||||
};
|
||||
reader.onerror = () => {
|
||||
reject();
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
@@ -16,9 +13,8 @@ import {
|
||||
templateUrl: 'password-generator-history.component.html',
|
||||
})
|
||||
export class PasswordGeneratorHistoryComponent extends BasePasswordGeneratorHistoryComponent {
|
||||
constructor(passwordGenerationService: PasswordGenerationService, analytics: Angulartics2,
|
||||
platformUtilsService: PlatformUtilsService, i18nService: I18nService,
|
||||
toasterService: ToasterService) {
|
||||
super(passwordGenerationService, analytics, platformUtilsService, i18nService, toasterService, window);
|
||||
constructor(passwordGenerationService: PasswordGenerationService, platformUtilsService: PlatformUtilsService,
|
||||
i18nService: I18nService) {
|
||||
super(passwordGenerationService, platformUtilsService, i18nService, window);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,42 +6,69 @@
|
||||
{{password}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-4">
|
||||
<label for="length">{{'length' | i18n}}</label>
|
||||
<input id="length" class="form-control" type="number" min="5" max="128" [(ngModel)]="options.length" (input)="saveOptions()">
|
||||
</div>
|
||||
<div class="form-group col-4">
|
||||
<label for="min-number">{{'minNumbers' | i18n}}</label>
|
||||
<input id="min-number" class="form-control" type="number" min="0" max="9" (input)="saveOptions()" [(ngModel)]="options.minNumber">
|
||||
</div>
|
||||
<div class="form-group col-4">
|
||||
<label for="min-special">{{'minSpecial' | i18n}}</label>
|
||||
<input id="min-special" class="form-control" type="number" min="0" max="9" (input)="saveOptions()" [(ngModel)]="options.minSpecial">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-check">
|
||||
<input id="uppercase" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.uppercase">
|
||||
<label for="uppercase" class="form-check-label">A-Z</label>
|
||||
<div class="form-check form-check-inline">
|
||||
<input id="generate-password" name="type" value="password" class="form-check-input" type="radio" (change)="saveOptions()"
|
||||
[(ngModel)]="options.type">
|
||||
<label for="generate-password" class="form-check-label">{{'password' | i18n}}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="lowercase" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.lowercase">
|
||||
<label for="lowercase" class="form-check-label">a-z</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="numbers" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.number">
|
||||
<label for="numbers" class="form-check-label">0-9</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="special" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.special">
|
||||
<label for="special" class="form-check-label">!@#$%^&*</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="ambiguous" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="avoidAmbiguous">
|
||||
<label for="ambiguous" class="form-check-label">{{'ambiguous' | i18n}}</label>
|
||||
<div class="form-check form-check-inline">
|
||||
<input id="generate-passphrase" name="type" value="passphrase" class="form-check-input" type="radio" (change)="saveOptions()"
|
||||
[(ngModel)]="options.type">
|
||||
<label for="generate-passphrase" class="form-check-label">{{'passphrase' | i18n}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" *ngIf="options.type === 'passphrase'">
|
||||
<div class="form-group col-4">
|
||||
<label for="num-words">{{'numWords' | i18n}}</label>
|
||||
<input id="num-words" class="form-control" type="number" min="3" max="20" [(ngModel)]="options.numWords" (blur)="saveOptions()">
|
||||
</div>
|
||||
<div class="form-group col-4">
|
||||
<label for="word-separator">{{'wordSeparator' | i18n}}</label>
|
||||
<input id="word-separator" class="form-control" type="text" maxlength="1" [(ngModel)]="options.wordSeparator"
|
||||
(blur)="saveOptions()">
|
||||
</div>
|
||||
</div>
|
||||
<ng-container *ngIf="options.type === 'password'">
|
||||
<div class="row">
|
||||
<div class="form-group col-4">
|
||||
<label for="length">{{'length' | i18n}}</label>
|
||||
<input id="length" class="form-control" type="number" min="5" max="128" [(ngModel)]="options.length" (blur)="saveOptions()">
|
||||
</div>
|
||||
<div class="form-group col-4">
|
||||
<label for="min-number">{{'minNumbers' | i18n}}</label>
|
||||
<input id="min-number" class="form-control" type="number" min="0" max="9" (input)="saveOptions()"
|
||||
[(ngModel)]="options.minNumber">
|
||||
</div>
|
||||
<div class="form-group col-4">
|
||||
<label for="min-special">{{'minSpecial' | i18n}}</label>
|
||||
<input id="min-special" class="form-control" type="number" min="0" max="9" (input)="saveOptions()"
|
||||
[(ngModel)]="options.minSpecial">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-check">
|
||||
<input id="uppercase" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.uppercase">
|
||||
<label for="uppercase" class="form-check-label">A-Z</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="lowercase" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.lowercase">
|
||||
<label for="lowercase" class="form-check-label">a-z</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="numbers" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.number">
|
||||
<label for="numbers" class="form-check-label">0-9</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="special" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="options.special">
|
||||
<label for="special" class="form-check-label">!@#$%^&*</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input id="ambiguous" class="form-check-input" type="checkbox" (change)="saveOptions()" [(ngModel)]="avoidAmbiguous">
|
||||
<label for="ambiguous" class="form-check-label">{{'ambiguous' | i18n}}</label>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<div class="d-flex">
|
||||
<div>
|
||||
<button type="button" class="btn btn-primary" (click)="regenerate()">
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import {
|
||||
Component,
|
||||
ComponentFactoryResolver,
|
||||
@@ -28,10 +25,9 @@ export class PasswordGeneratorComponent extends BasePasswordGeneratorComponent {
|
||||
|
||||
private modal: ModalComponent = null;
|
||||
|
||||
constructor(passwordGenerationService: PasswordGenerationService, analytics: Angulartics2,
|
||||
platformUtilsService: PlatformUtilsService, i18nService: I18nService,
|
||||
toasterService: ToasterService, private componentFactoryResolver: ComponentFactoryResolver) {
|
||||
super(passwordGenerationService, analytics, platformUtilsService, i18nService, toasterService, window);
|
||||
constructor(passwordGenerationService: PasswordGenerationService, platformUtilsService: PlatformUtilsService,
|
||||
i18nService: I18nService, private componentFactoryResolver: ComponentFactoryResolver) {
|
||||
super(passwordGenerationService, platformUtilsService, i18nService, window);
|
||||
}
|
||||
|
||||
history() {
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<div class="col-6 form-group totp d-flex align-items-end" [ngClass]="{'low': totpLow}">
|
||||
<div *ngIf="!cipher.login.totp || !totpCode">
|
||||
<img src="../../images/totp-countdown.png" title="{{'verificationCodeTotp' | i18n}}" class="ml-2">
|
||||
<a href="#" appStopClick class="badge badge-primary ml-3" (click)="premiumRequired()" *ngIf="!organization && !cipher.organizationId && !isPremium">
|
||||
<a href="#" appStopClick class="badge badge-primary ml-3" (click)="premiumRequired()" *ngIf="!organization && !cipher.organizationId && !canAccessPremium">
|
||||
{{'premium' | i18n}}
|
||||
</a>
|
||||
<a href="#" appStopClick class="badge badge-primary ml-3" (click)="upgradeOrganization()" *ngIf="(organization && !organization.useTotp) || (cipher.organizationId && !cipher.organizationUseTotp)">
|
||||
|
||||
@@ -3,9 +3,6 @@ import {
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { CipherType } from 'jslib/enums/cipherType';
|
||||
|
||||
import { AuditService } from 'jslib/abstractions/audit.service';
|
||||
@@ -16,8 +13,8 @@ import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { PasswordGenerationService } from 'jslib/abstractions/passwordGeneration.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { StateService } from 'jslib/abstractions/state.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { TotpService } from 'jslib/abstractions/totp.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { AddEditComponent as BaseAddEditComponent } from 'jslib/angular/components/add-edit.component';
|
||||
import { LoginUriView } from 'jslib/models/view/loginUriView';
|
||||
@@ -27,7 +24,7 @@ import { LoginUriView } from 'jslib/models/view/loginUriView';
|
||||
templateUrl: 'add-edit.component.html',
|
||||
})
|
||||
export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
isPremium: boolean;
|
||||
canAccessPremium: boolean;
|
||||
totpCode: string;
|
||||
totpCodeFormatted: string;
|
||||
totpDash: number;
|
||||
@@ -41,12 +38,10 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
|
||||
constructor(cipherService: CipherService, folderService: FolderService,
|
||||
i18nService: I18nService, platformUtilsService: PlatformUtilsService,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
auditService: AuditService, stateService: StateService,
|
||||
protected tokenService: TokenService, protected totpService: TotpService,
|
||||
protected userService: UserService, protected totpService: TotpService,
|
||||
protected passwordGenerationService: PasswordGenerationService, protected messagingService: MessagingService) {
|
||||
super(cipherService, folderService, i18nService, platformUtilsService, analytics,
|
||||
toasterService, auditService, stateService);
|
||||
super(cipherService, folderService, i18nService, platformUtilsService, auditService, stateService);
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
@@ -55,9 +50,9 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
this.hasPasswordHistory = this.cipher.hasPasswordHistory;
|
||||
this.cleanUp();
|
||||
|
||||
this.isPremium = this.tokenService.getPremium();
|
||||
this.canAccessPremium = await this.userService.canAccessPremium();
|
||||
if (this.cipher.type === CipherType.Login && this.cipher.login.totp &&
|
||||
(this.cipher.organizationUseTotp || this.isPremium)) {
|
||||
(this.cipher.organizationUseTotp || this.canAccessPremium)) {
|
||||
await this.totpUpdateCode();
|
||||
const interval = this.totpService.getTimeInterval(this.cipher.login.totp);
|
||||
await this.totpTick(interval);
|
||||
@@ -77,7 +72,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
return;
|
||||
}
|
||||
|
||||
this.analytics.eventTrack.next({ action: 'Launched Login URI' });
|
||||
this.platformUtilsService.eventTrack('Launched Login URI');
|
||||
this.platformUtilsService.launchUri(uri.uri);
|
||||
}
|
||||
|
||||
@@ -86,9 +81,9 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
return;
|
||||
}
|
||||
|
||||
this.analytics.eventTrack.next({ action: 'Copied ' + aType });
|
||||
this.platformUtilsService.copyToClipboard(value, { doc: window.document });
|
||||
this.toasterService.popAsync('info', null,
|
||||
this.platformUtilsService.eventTrack('Copied ' + aType);
|
||||
this.platformUtilsService.copyToClipboard(value, { window: window });
|
||||
this.platformUtilsService.showToast('info', null,
|
||||
this.i18nService.t('valueCopied', this.i18nService.t(typeI18nKey)));
|
||||
}
|
||||
|
||||
@@ -102,8 +97,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
}
|
||||
|
||||
async premiumRequired() {
|
||||
const premium = await this.tokenService.getPremium();
|
||||
if (!premium) {
|
||||
if (!this.canAccessPremium) {
|
||||
this.messagingService.send('premiumRequired');
|
||||
return;
|
||||
}
|
||||
@@ -158,5 +152,4 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit {
|
||||
await this.totpUpdateCode();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { CipherService } from 'jslib/abstractions/cipher.service';
|
||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { AttachmentsComponent as BaseAttachmentsComponent } from 'jslib/angular/components/attachments.component';
|
||||
|
||||
@@ -16,11 +13,9 @@ import { AttachmentsComponent as BaseAttachmentsComponent } from 'jslib/angular/
|
||||
templateUrl: 'attachments.component.html',
|
||||
})
|
||||
export class AttachmentsComponent extends BaseAttachmentsComponent {
|
||||
constructor(cipherService: CipherService, analytics: Angulartics2,
|
||||
toasterService: ToasterService, i18nService: I18nService,
|
||||
cryptoService: CryptoService, tokenService: TokenService,
|
||||
constructor(cipherService: CipherService, i18nService: I18nService,
|
||||
cryptoService: CryptoService, userService: UserService,
|
||||
platformUtilsService: PlatformUtilsService) {
|
||||
super(cipherService, analytics, toasterService, i18nService, cryptoService, tokenService,
|
||||
platformUtilsService, window);
|
||||
super(cipherService, i18nService, cryptoService, userService, platformUtilsService, window);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let c of collections; let i = index" (click)="check(c)">
|
||||
<td class="table-list-checkbox">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td>
|
||||
<span appStopProp>{{c.name}}</span>
|
||||
@@ -46,7 +46,7 @@
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
|
||||
<button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave" [ngClass]="{loading:form.loading}">
|
||||
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i>
|
||||
<span>{{'save' | i18n}}</span>
|
||||
</button>
|
||||
|
||||
@@ -67,12 +67,14 @@ export class BulkShareComponent implements OnInit {
|
||||
|
||||
async submit() {
|
||||
const checkedCollectionIds = this.collections.filter((c) => (c as any).checked).map((c) => c.id);
|
||||
this.formPromise = this.cipherService.shareManyWithServer(this.shareableCiphers, this.organizationId,
|
||||
checkedCollectionIds);
|
||||
await this.formPromise;
|
||||
this.onShared.emit();
|
||||
this.analytics.eventTrack.next({ action: 'Bulk Shared Items' });
|
||||
this.toasterService.popAsync('success', null, this.i18nService.t('sharedItems'));
|
||||
try {
|
||||
this.formPromise = this.cipherService.shareManyWithServer(this.shareableCiphers, this.organizationId,
|
||||
checkedCollectionIds);
|
||||
await this.formPromise;
|
||||
this.onShared.emit();
|
||||
this.analytics.eventTrack.next({ action: 'Bulk Shared Items' });
|
||||
this.toasterService.popAsync('success', null, this.i18nService.t('sharedItems'));
|
||||
} catch { }
|
||||
}
|
||||
|
||||
check(c: CollectionView, select?: boolean) {
|
||||
@@ -83,4 +85,15 @@ export class BulkShareComponent implements OnInit {
|
||||
const collections = select ? this.collections : this.writeableCollections;
|
||||
collections.forEach((c) => this.check(c, select));
|
||||
}
|
||||
|
||||
get canSave() {
|
||||
if (this.shareableCiphers != null && this.shareableCiphers.length > 0 && this.collections != null) {
|
||||
for (let i = 0; i < this.collections.length; i++) {
|
||||
if ((this.collections[i] as any).checked) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<ng-container *ngIf="(ciphers | searchCiphers: searchText) as searchedCiphers">
|
||||
<table class="table table-hover table-list table-ciphers" *ngIf="searchedCiphers.length > 0">
|
||||
<ng-container *ngIf="ciphers">
|
||||
<table class="table table-hover table-list table-ciphers" *ngIf="ciphers.length > 0">
|
||||
<tbody>
|
||||
<tr *ngFor="let c of searchedCiphers">
|
||||
<tr *ngFor="let c of ciphers">
|
||||
<td (click)="checkCipher(c)" class="table-list-checkbox" *ngIf="!organization">
|
||||
<input type="checkbox" [(ngModel)]="c.checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" appStopProp>
|
||||
</td>
|
||||
<td (click)="checkCipher(c)" class="table-list-icon">
|
||||
<app-vault-icon [cipher]="c"></app-vault-icon>
|
||||
</td>
|
||||
<td (click)="checkCipher(c)" class="reduced-lh">
|
||||
<td (click)="checkCipher(c)" class="reduced-lh wrap">
|
||||
<a href="#" appStopClick appStopProp (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
|
||||
<i class="fa fa-share-alt" appStopProp *ngIf="!organization && c.organizationId" title="{{'shared' | i18n}}"></i>
|
||||
<i class="fa fa-paperclip" appStopProp *ngIf="c.hasAttachments" title="{{'attachments' | i18n}}"></i>
|
||||
@@ -52,7 +52,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="no-items" *ngIf="searchedCiphers.length === 0">
|
||||
<div class="no-items" *ngIf="ciphers.length === 0">
|
||||
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!loaded" title="{{'loading' | i18n}}"></i>
|
||||
<ng-container *ngIf="loaded">
|
||||
<p>{{'noItemsInList' | i18n}}</p>
|
||||
|
||||
@@ -12,6 +12,7 @@ import { Angulartics2 } from 'angulartics2';
|
||||
import { CipherService } from 'jslib/abstractions/cipher.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
import { SearchService } from 'jslib/abstractions/search.service';
|
||||
|
||||
import { CiphersComponent as BaseCiphersComponent } from 'jslib/angular/components/ciphers.component';
|
||||
|
||||
@@ -38,10 +39,10 @@ export class CiphersComponent extends BaseCiphersComponent implements OnDestroy
|
||||
|
||||
private searchPipe: SearchCiphersPipe;
|
||||
|
||||
constructor(cipherService: CipherService, protected analytics: Angulartics2,
|
||||
constructor(searchService: SearchService, protected analytics: Angulartics2,
|
||||
protected toasterService: ToasterService, protected i18nService: I18nService,
|
||||
protected platformUtilsService: PlatformUtilsService) {
|
||||
super(cipherService);
|
||||
protected platformUtilsService: PlatformUtilsService, protected cipherService: CipherService) {
|
||||
super(searchService);
|
||||
this.searchPipe = new SearchCiphersPipe(platformUtilsService);
|
||||
}
|
||||
|
||||
@@ -118,7 +119,7 @@ export class CiphersComponent extends BaseCiphersComponent implements OnDestroy
|
||||
}
|
||||
|
||||
this.analytics.eventTrack.next({ action: 'Copied ' + aType.toLowerCase() + ' from listing.' });
|
||||
this.platformUtilsService.copyToClipboard(value, { doc: window.document });
|
||||
this.platformUtilsService.copyToClipboard(value, { window: window });
|
||||
this.toasterService.popAsync('info', null,
|
||||
this.i18nService.t('valueCopied', this.i18nService.t(typeI18nKey)));
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let c of collections; let i = index" (click)="check(c)">
|
||||
<td class="table-list-checkbox">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td>
|
||||
<span appStopProp>{{c.name}}</span>
|
||||
|
||||
@@ -47,7 +47,7 @@ export class CollectionsComponent implements OnInit, OnDestroy {
|
||||
this.selectAll(false);
|
||||
if (this.collectionIds != null) {
|
||||
this.collections.forEach((c) => {
|
||||
(c as any).checked = this.collectionIds.indexOf(c.id) > -1;
|
||||
(c as any).checked = this.collectionIds != null && this.collectionIds.indexOf(c.id) > -1;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { ToasterService } from 'angular2-toaster';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
|
||||
import { FolderService } from 'jslib/abstractions/folder.service';
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
@@ -17,8 +14,7 @@ import {
|
||||
})
|
||||
export class FolderAddEditComponent extends BaseFolderAddEditComponent {
|
||||
constructor(folderService: FolderService, i18nService: I18nService,
|
||||
analytics: Angulartics2, toasterService: ToasterService,
|
||||
platformUtilsService: PlatformUtilsService) {
|
||||
super(folderService, i18nService, analytics, toasterService, platformUtilsService);
|
||||
super(folderService, i18nService, platformUtilsService);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<tbody>
|
||||
<tr *ngFor="let c of collections; let i = index" (click)="check(c)">
|
||||
<td class="table-list-checkbox">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked">
|
||||
<input type="checkbox" [(ngModel)]="c.checked" name="Collection[{{i}}].Checked" appStopProp>
|
||||
</td>
|
||||
<td>
|
||||
<span appStopProp>{{c.name}}</span>
|
||||
@@ -49,7 +49,7 @@
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading" *ngIf="organizations && organizations.length">
|
||||
<button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave" [ngClass]="{loading:form.loading}" *ngIf="organizations && organizations.length">
|
||||
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i>
|
||||
<span>{{'save' | i18n}}</span>
|
||||
</button>
|
||||
|
||||
@@ -97,4 +97,15 @@ export class ShareComponent implements OnInit, OnDestroy {
|
||||
const collections = select ? this.collections : this.writeableCollections;
|
||||
collections.forEach((c) => this.check(c, select));
|
||||
}
|
||||
|
||||
get canSave() {
|
||||
if (this.collections != null) {
|
||||
for (let i = 0; i < this.collections.length; i++) {
|
||||
if ((this.collections[i] as any).checked) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
import { Location } from '@angular/common';
|
||||
import {
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
ComponentFactoryResolver,
|
||||
NgZone,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
ViewChild,
|
||||
ViewContainerRef,
|
||||
@@ -40,11 +43,15 @@ import { SyncService } from 'jslib/abstractions/sync.service';
|
||||
import { TokenService } from 'jslib/abstractions/token.service';
|
||||
import { UserService } from 'jslib/abstractions/user.service';
|
||||
|
||||
import { BroadcasterService } from 'jslib/angular/services/broadcaster.service';
|
||||
|
||||
const BroadcasterSubscriptionId = 'VaultComponent';
|
||||
|
||||
@Component({
|
||||
selector: 'app-vault',
|
||||
templateUrl: 'vault.component.html',
|
||||
})
|
||||
export class VaultComponent implements OnInit {
|
||||
export class VaultComponent implements OnInit, OnDestroy {
|
||||
@ViewChild(GroupingsComponent) groupingsComponent: GroupingsComponent;
|
||||
@ViewChild(CiphersComponent) ciphersComponent: CiphersComponent;
|
||||
@ViewChild(OrganizationsComponent) organizationsComponent: OrganizationsComponent;
|
||||
@@ -74,25 +81,27 @@ export class VaultComponent implements OnInit {
|
||||
private i18nService: I18nService, private componentFactoryResolver: ComponentFactoryResolver,
|
||||
private tokenService: TokenService, private cryptoService: CryptoService,
|
||||
private messagingService: MessagingService, private userService: UserService,
|
||||
private platformUtilsService: PlatformUtilsService, private toasterService: ToasterService) { }
|
||||
private platformUtilsService: PlatformUtilsService, private toasterService: ToasterService,
|
||||
private broadcasterService: BroadcasterService, private ngZone: NgZone,
|
||||
private changeDetectorRef: ChangeDetectorRef) { }
|
||||
|
||||
async ngOnInit() {
|
||||
this.showVerifyEmail = !(await this.tokenService.getEmailVerified());
|
||||
this.showBrowserOutdated = window.navigator.userAgent.indexOf('MSIE') !== -1;
|
||||
const hasEncKey = await this.cryptoService.hasEncKey();
|
||||
this.showUpdateKey = !hasEncKey;
|
||||
const isPremium = await this.tokenService.getPremium();
|
||||
|
||||
this.route.queryParams.subscribe(async (params) => {
|
||||
await this.syncService.fullSync(false);
|
||||
|
||||
this.showUpdateKey = !(await this.cryptoService.hasEncKey());
|
||||
const canAccessPremium = await this.userService.canAccessPremium();
|
||||
this.showPremiumCallout = !this.showVerifyEmail && !canAccessPremium &&
|
||||
!this.platformUtilsService.isSelfHost();
|
||||
|
||||
await Promise.all([
|
||||
this.groupingsComponent.load(),
|
||||
this.organizationsComponent.load(),
|
||||
]);
|
||||
|
||||
this.showPremiumCallout = !this.showVerifyEmail && !isPremium &&
|
||||
!this.platformUtilsService.isSelfHost() && !(await this.inOrgWithPremium());
|
||||
|
||||
if (params == null) {
|
||||
this.groupingsComponent.selectedAll = true;
|
||||
await this.ciphersComponent.load();
|
||||
@@ -117,9 +126,30 @@ export class VaultComponent implements OnInit {
|
||||
this.groupingsComponent.selectedAll = true;
|
||||
await this.ciphersComponent.load();
|
||||
}
|
||||
|
||||
this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {
|
||||
this.ngZone.run(async () => {
|
||||
switch (message.command) {
|
||||
case 'syncCompleted':
|
||||
if (message.successfully) {
|
||||
await Promise.all([
|
||||
this.groupingsComponent.load(),
|
||||
this.organizationsComponent.load(),
|
||||
this.ciphersComponent.load(this.ciphersComponent.filter),
|
||||
]);
|
||||
this.changeDetectorRef.detectChanges();
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
||||
}
|
||||
|
||||
async clearGroupingFilters() {
|
||||
this.ciphersComponent.showAddNew = true;
|
||||
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchVault');
|
||||
@@ -159,7 +189,7 @@ export class VaultComponent implements OnInit {
|
||||
async filterCollection(collectionId: string) {
|
||||
this.ciphersComponent.showAddNew = false;
|
||||
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchCollection');
|
||||
await this.ciphersComponent.load((c) => c.collectionIds.indexOf(collectionId) > -1);
|
||||
await this.ciphersComponent.load((c) => c.collectionIds != null && c.collectionIds.indexOf(collectionId) > -1);
|
||||
this.clearFilters();
|
||||
this.collectionId = collectionId;
|
||||
this.go();
|
||||
@@ -167,11 +197,12 @@ export class VaultComponent implements OnInit {
|
||||
|
||||
filterSearchText(searchText: string) {
|
||||
this.ciphersComponent.searchText = searchText;
|
||||
this.ciphersComponent.search(200);
|
||||
}
|
||||
|
||||
async editCipherAttachments(cipher: CipherView) {
|
||||
const premium = await this.tokenService.getPremium();
|
||||
if (cipher.organizationId == null && !premium) {
|
||||
const canAccessPremium = await this.userService.canAccessPremium();
|
||||
if (cipher.organizationId == null && !canAccessPremium) {
|
||||
this.messagingService.send('premiumRequired');
|
||||
return;
|
||||
} else if (cipher.organizationId != null) {
|
||||
@@ -444,14 +475,4 @@ export class VaultComponent implements OnInit {
|
||||
const url = this.router.createUrlTree(['vault'], { queryParams: queryParams }).toString();
|
||||
this.location.go(url);
|
||||
}
|
||||
|
||||
private async inOrgWithPremium() {
|
||||
const orgs = await this.userService.getAllOrganizations();
|
||||
for (let i = 0; i < orgs.length; i++) {
|
||||
if (orgs[i].usersGetPremium) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Heslo"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Poznámky"
|
||||
},
|
||||
@@ -616,7 +619,7 @@
|
||||
}
|
||||
},
|
||||
"enterVerificationCodeApp": {
|
||||
"message": "Zadejte 6-místný kód z ověřovací aplikace."
|
||||
"message": "Zadejte 6místný kód z ověřovací aplikace."
|
||||
},
|
||||
"enterVerificationCodeEmail": {
|
||||
"message": "Zadejte 6místný kód z e-mailu, který byl zaslán na $EMAIL$.",
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Délka"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Historie hesel"
|
||||
},
|
||||
@@ -852,11 +861,44 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Potvrzení nového hesla"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Nastavení šifrovacího klíče"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF algoritmus"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF iterace"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Vyšší hodnota KDF iterací pomáhá chránit vaše hlavní heslo před útokem hrubou silou (brute force attack). Doporučujeme nastavit hodnotu $VALUE$ nebo vyšší.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Nastavení příliš vysoké hodnoty počtu KDF iterací může mít za následek špatný výkon při přihlašování (a odemykání) aplikace Bitwarden na zařízeních se slabým procesorem. Doporučujeme hodnotu navyšovat přírůstkově po $INCREMENT$ a vyzkoušet všechna vaše zařízení.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Změnit KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Nastavení šifrovacího klíče bylo změněno"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Nebezpečná zóna"
|
||||
},
|
||||
"dangerZoneDesc": {
|
||||
"message": "Opatrně tyto akce se nedají vrátit!"
|
||||
"message": "Opatrně. Tyto akce se nedají vrátit!"
|
||||
},
|
||||
"deauthorizeSessions": {
|
||||
"message": "Zrušit autorizaci relací"
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Vymazat celý trezor"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Pokračujte níže ke smazání všech položek a složek ve vašem trezoru. Položky sdílené s organizací nebudou smazány."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Vymazání trezoru je trvalé. Tuto akci nelze vrátit zpět."
|
||||
},
|
||||
@@ -969,7 +1017,7 @@
|
||||
"message": "Doménová pravidla"
|
||||
},
|
||||
"domainRulesDesc": {
|
||||
"message": "Pokud máte stejné přihlašovací údaje napříč různými doménami, můžete je označit jako \"ekvivalentní\". Bitwarden za vás již vytvořil seznam globálních domén."
|
||||
"message": "Pokud máte stejné přihlašovací údaje napříč různými doménami, můžete je označit jako „ekvivalentní“. Bitwarden za vás již vytvořil seznam globálních domén."
|
||||
},
|
||||
"globalEqDomains": {
|
||||
"message": "Globální ekvivalentní domény"
|
||||
@@ -990,7 +1038,7 @@
|
||||
"message": "Přidat vlastní doménu"
|
||||
},
|
||||
"newCustomDomainDesc": {
|
||||
"message": "Zadejte seznam domén oddělených čárkou. Povolené jsou pouze \"základní\" domény a proto nezadávejte subdomény. Například zadejte \"bitwarden.com\" místo \"vault.bitwarden.com\". Můžete také zadat \"androidapp:\/\/package.name\" pokud chcete přiřadit Android aplikaci k ostatním webovým doménám."
|
||||
"message": "Zadejte seznam domén oddělených čárkou. Povolené jsou pouze „základní“ domény. Nezadávejte subdomény. Například zadejte „bitwarden.com“, nikoliv „vault.bitwarden.com“. Můžete také zadat „androidapp:\/\/package.name“ pokud chcete přiřadit Android aplikaci k ostatním webovým doménám."
|
||||
},
|
||||
"customDomainX": {
|
||||
"message": "Vlastní doména $INDEX$",
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Pro použití této funkce je potřebné prémiové členství."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Máte prémiový přístup"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Již máte přístup k prémiovým funkcím díky organizaci, které jste členem."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Správa"
|
||||
},
|
||||
@@ -1082,7 +1136,7 @@
|
||||
"message": "Klíč"
|
||||
},
|
||||
"twoStepAuthenticatorEnterCode": {
|
||||
"message": "Zadejte 6-místný kód z ověřovací aplikace"
|
||||
"message": "Zadejte 6místný kód z ověřovací aplikace"
|
||||
},
|
||||
"twoStepAuthenticatorReaddDesc": {
|
||||
"message": "V případě potřeby přidání do jiného zařízení, je níže zobrazen QR kód (nebo klíč) vyžadovaný ověřovací aplikací."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Podpora NFC"
|
||||
},
|
||||
@@ -1160,7 +1223,7 @@
|
||||
"message": "Zadejte e-mail, na který si přejete dostávat ověřovací kódy"
|
||||
},
|
||||
"twoFactorEmailEnterCode": {
|
||||
"message": "Zadejte 6-místný kód zaslaný na e-mail"
|
||||
"message": "Zadejte 6místný kód zaslaný na e-mail"
|
||||
},
|
||||
"sendEmail": {
|
||||
"message": "Odeslat e-mail"
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Přidání bezpečnostního klíče FIDO U2F k vašemu účtu"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Připojte bezpečnostní klíč do portu USB počítače."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Pokud má bezpečnostní klíč tlačítko, zmáčkněte jej."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Z důvodu omezení různých platforem, nemůže být FIDO U2F použit ve všech aplikacích Bitwarden. Měli byste povolit jiný způsob dvoufázového přihlášení pro případy, kdy nelze FIDO U2F použít. Podporované platformy:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Čeká se na stisknutí tlačítka na bezpečnostním klíči"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Klepněte níže na tlačítko \"Povolit\" pro povolení tohoto bezpečnostního klíče pro dvoufázové přihlášení."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Došlo k potížím při čtení bezpečnostního klíče."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Váše kód pro obnovení dvoufázového přihlášení"
|
||||
@@ -1206,7 +1284,7 @@
|
||||
"message": "Hlášení o úniku dat"
|
||||
},
|
||||
"breachDesc": {
|
||||
"message": "\"Únik\" je incident, při kterém se podařilo hackerům nelegální cestou získat údaje z webových stránek a následně je také zveřejnit. Zkontrolujte prosím kompromitovaná data (e-mailové adresy, hesla, kreditní karty, ...) a proveďte příslušná opatření (např. změňte heslo)."
|
||||
"message": "„Únik“ je incident, při kterém se podařilo hackerům nelegální cestou získat údaje z webových stránek a následně je také zveřejnit. Zkontrolujte prosím kompromitovaná data (e-mailové adresy, hesla, kreditní karty, …) a proveďte příslušná opatření (např. změňte heslo)."
|
||||
},
|
||||
"breachCheckUsernameEmail": {
|
||||
"message": "Zkontrolujte všechna uživatelská jména nebo e-mailové adresy, které používáte."
|
||||
@@ -1269,10 +1347,10 @@
|
||||
"description": "Another way of saying \"Get a premium membership\""
|
||||
},
|
||||
"premiumUpdated": {
|
||||
"message": "You've upgraded to premium."
|
||||
"message": "Povýšili jste na premium."
|
||||
},
|
||||
"premiumUpgradeUnlockFeatures": {
|
||||
"message": "Upgrade your account to a premium membership and unlock some great additional features."
|
||||
"message": "Povyšte svůj účet na prémiové členství a odemkněte další skvělé funkce."
|
||||
},
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 GB šifrovaného uložiště."
|
||||
@@ -1340,7 +1418,7 @@
|
||||
"message": "Částka bude stržena okamžitě a poté opakovaně každý rok. Plán můžete kdykoli zrušit."
|
||||
},
|
||||
"paymentChargedWithTrial": {
|
||||
"message": "Vybraný plán obsahuje bezplatnou 7denní zkušební dobu. Částka z vašeho účtu nebude stržena, dokud tato zkušební doba neuplyne. Stržení platby a fakturace bude následně probíhat opakovaně každý $ INTERVAL $. Plán můžete kdykoli zrušit.",
|
||||
"message": "Vybraný plán obsahuje bezplatnou 7denní zkušební dobu. Částka z vašeho účtu nebude stržena, dokud tato zkušební doba neuplyne. Stržení platby a fakturace bude následně probíhat opakovaně každý $INTERVAL$. Plán můžete kdykoli zrušit.",
|
||||
"placeholders": {
|
||||
"interval": {
|
||||
"content": "$1",
|
||||
@@ -1418,7 +1496,7 @@
|
||||
"message": "Odebrat uložiště"
|
||||
},
|
||||
"subscriptionStorage": {
|
||||
"message": "Your subscription has a total of $MAX_STORAGE$ GB of encrypted file storage. You are currently using $USED_STORAGE$.",
|
||||
"message": "Vaše předplatné zahrnuje celkem $MAX_STORAGE$ GB místa v šifrovaném úložišti. Aktuálně používáte $USED_STORAGE$.",
|
||||
"placeholders": {
|
||||
"max_storage": {
|
||||
"content": "$1",
|
||||
@@ -1650,7 +1728,7 @@
|
||||
"message": "Create unlimited collections"
|
||||
},
|
||||
"gbEncryptedFileStorage": {
|
||||
"message": "$SIZE$ encrypted file storage",
|
||||
"message": "$SIZE$ šifrovaného úložiště",
|
||||
"placeholders": {
|
||||
"size": {
|
||||
"content": "$1",
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "On-premise hosting (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Users get access to premium membership features"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Control user access with groups"
|
||||
},
|
||||
@@ -1677,7 +1758,7 @@
|
||||
"message": "Přednostní zákaznická podpora"
|
||||
},
|
||||
"xDayFreeTrial": {
|
||||
"message": "$COUNT$ day free trial, cancel anytime",
|
||||
"message": "$COUNT$denní zkušební verze, možno kdykoliv zrušit",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Heslo účtu bylo změněno"
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Dvoufázové přihlášení bylo povoleno"
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Dvoufázové přihlášení bylo zakázáno"
|
||||
@@ -2076,7 +2157,7 @@
|
||||
"message": "Invited user(s)."
|
||||
},
|
||||
"resendInvitation": {
|
||||
"message": "Resend Invitation"
|
||||
"message": "Znovu poslat pozvánku"
|
||||
},
|
||||
"hasBeenReinvited": {
|
||||
"message": "$USER$ has been reinvited.",
|
||||
@@ -2088,10 +2169,10 @@
|
||||
}
|
||||
},
|
||||
"confirm": {
|
||||
"message": "Confirm"
|
||||
"message": "Potvrdit"
|
||||
},
|
||||
"hasBeenConfirmed": {
|
||||
"message": "$USER$ has been confirmed.",
|
||||
"message": "Uživatel $USER$ byl potvrzen.",
|
||||
"placeholders": {
|
||||
"user": {
|
||||
"content": "$1",
|
||||
@@ -2100,16 +2181,16 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Confirm Users"
|
||||
"message": "Potvrdit uživatele"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Start Date"
|
||||
"message": "Datum začátku"
|
||||
},
|
||||
"endDate": {
|
||||
"message": "End Date"
|
||||
"message": "Datum konce"
|
||||
},
|
||||
"verifyEmail": {
|
||||
"message": "Ověřit e-mail"
|
||||
@@ -2232,7 +2313,7 @@
|
||||
"message": "Bank account has been verified."
|
||||
},
|
||||
"bankAccount": {
|
||||
"message": "Bank Account"
|
||||
"message": "Bankovní účet"
|
||||
},
|
||||
"amountX": {
|
||||
"message": "Amount $COUNT$",
|
||||
@@ -2245,17 +2326,17 @@
|
||||
}
|
||||
},
|
||||
"routingNumber": {
|
||||
"message": "Routing Number",
|
||||
"message": "Směrovací číslo",
|
||||
"description": "Bank account routing number"
|
||||
},
|
||||
"accountNumber": {
|
||||
"message": "Account Number"
|
||||
"message": "Číslo účtu"
|
||||
},
|
||||
"accountHolderName": {
|
||||
"message": "Account Holder Name"
|
||||
"message": "Jméno majitele účtu"
|
||||
},
|
||||
"bankAccountType": {
|
||||
"message": "Account Type"
|
||||
"message": "Typ účtu"
|
||||
},
|
||||
"bankAccountTypeCompany": {
|
||||
"message": "Company (Business)"
|
||||
@@ -2264,7 +2345,7 @@
|
||||
"message": "Individual (Personal)"
|
||||
},
|
||||
"enterInstallationId": {
|
||||
"message": "Enter your installation id"
|
||||
"message": "Zadejte ID instalace"
|
||||
},
|
||||
"addSeats": {
|
||||
"message": "Add Seats",
|
||||
@@ -2308,19 +2389,19 @@
|
||||
"message": "Key Updated"
|
||||
},
|
||||
"updateKeyTitle": {
|
||||
"message": "Update Key"
|
||||
"message": "Aktualizovat klíč"
|
||||
},
|
||||
"updateEncryptionKey": {
|
||||
"message": "Update Encryption Key"
|
||||
"message": "Aktualizovat šifrovací klíč"
|
||||
},
|
||||
"updateEncryptionKeyShortDesc": {
|
||||
"message": "You are currently using an outdated encryption scheme."
|
||||
"message": "Používáte zastaralé šifrovací schéma."
|
||||
},
|
||||
"updateEncryptionKeyDesc": {
|
||||
"message": "We've moved to larger encryption keys that provide better security and access to newer features. Updating your encryption key is quick and easy. Just type your master password below. This update will eventually become mandatory."
|
||||
"message": "Přešli jsme na delší šifrovací klíče, které poskytují vyšší úroveň zabezpečení a přístup k novým funkcím. Aktualizace vašeho šifrovacího klíče je rychlá a snadná. Stačí níže zadat vaše hlavní heslo. Provedení této aktualizace může být v budoucnu povinné."
|
||||
},
|
||||
"updateEncryptionKeyWarning": {
|
||||
"message": "After updating your encryption key, you are required to log out and back in to all Bitwarden applications that you are currently using (such as the mobile app or browser extensions). Failure to log out and back in (which downloads your new encryption key) may result in data corruption. We will attempt to log you out automatically, however, it may be delayed."
|
||||
"message": "Po aktualizace šifrovacího klíče dojde k odhlášení a budete se muset opětovně přihlásit do všech Bitwarden aplikací, které aktuálně používáte (např. mobilní aplikace či rozšíření pro prohlížeč). Nezdaří-li se odhlášení a opětovné přihlášení (během něhož bude stažen nový šifrovací klíč), může dojít k poškození údajů. Pokusíme se vás automaticky odhlásit, nicméně, může to chvíli trvat."
|
||||
},
|
||||
"subscription": {
|
||||
"message": "Odběr"
|
||||
@@ -2329,13 +2410,13 @@
|
||||
"message": "Načítání"
|
||||
},
|
||||
"upgrade": {
|
||||
"message": "Upgrade"
|
||||
"message": "Povýšit"
|
||||
},
|
||||
"upgradeOrganization": {
|
||||
"message": "Upgrade Organization"
|
||||
},
|
||||
"upgradeOrganizationDesc": {
|
||||
"message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features."
|
||||
"message": "Tato funkce je nedostupná pro bezplatné organizace. Přejděte na placené členství a odemkněte více funkcí."
|
||||
},
|
||||
"createOrganizationStep1": {
|
||||
"message": "Create Organization: Step 1"
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Adgangskode"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Adgangssætning"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Noter"
|
||||
},
|
||||
@@ -74,7 +77,7 @@
|
||||
"message": "Kørekortnummer"
|
||||
},
|
||||
"email": {
|
||||
"message": "Email"
|
||||
"message": "E-mail"
|
||||
},
|
||||
"phone": {
|
||||
"message": "Telefon"
|
||||
@@ -171,7 +174,7 @@
|
||||
"message": "Tilføj mappe"
|
||||
},
|
||||
"editFolder": {
|
||||
"message": "Rediger mappe"
|
||||
"message": "Redigér mappe"
|
||||
},
|
||||
"baseDomain": {
|
||||
"message": "Grund-domæne"
|
||||
@@ -205,7 +208,7 @@
|
||||
"message": "Slå synlighed til\/fra"
|
||||
},
|
||||
"generatePassword": {
|
||||
"message": "Generer adgangskode"
|
||||
"message": "Generér adgangskode"
|
||||
},
|
||||
"checkPassword": {
|
||||
"message": "Undersøg om adgangskoden er blevet afsløret."
|
||||
@@ -226,7 +229,7 @@
|
||||
"message": "Gem"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Annuller"
|
||||
"message": "Annullér"
|
||||
},
|
||||
"canceled": {
|
||||
"message": "Annulleret"
|
||||
@@ -244,7 +247,7 @@
|
||||
"message": "Fjern favorit"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Rediger"
|
||||
"message": "Redigér"
|
||||
},
|
||||
"searchCollection": {
|
||||
"message": "Søg i samling"
|
||||
@@ -332,7 +335,7 @@
|
||||
"message": "Tilføj element"
|
||||
},
|
||||
"editItem": {
|
||||
"message": "Rediger element"
|
||||
"message": "Redigér element"
|
||||
},
|
||||
"ex": {
|
||||
"message": "eks.",
|
||||
@@ -355,27 +358,27 @@
|
||||
}
|
||||
},
|
||||
"copyValue": {
|
||||
"message": "Kopier værdi",
|
||||
"message": "Kopiér værdi",
|
||||
"description": "Copy value to clipboard"
|
||||
},
|
||||
"copyPassword": {
|
||||
"message": "Kopier adgangskode",
|
||||
"message": "Kopiér adgangskode",
|
||||
"description": "Copy password to clipboard"
|
||||
},
|
||||
"copyUsername": {
|
||||
"message": "Kopier brugernavn",
|
||||
"message": "Kopiér brugernavn",
|
||||
"description": "Copy username to clipboard"
|
||||
},
|
||||
"copyNumber": {
|
||||
"message": "Kopier nummer",
|
||||
"message": "Kopiér nummer",
|
||||
"description": "Copy credit card number"
|
||||
},
|
||||
"copySecurityCode": {
|
||||
"message": "Kopier sikkerhedskode",
|
||||
"message": "Kopiér sikkerhedskode",
|
||||
"description": "Copy credit card security code (CVV)"
|
||||
},
|
||||
"copyUri": {
|
||||
"message": "Kopier URI",
|
||||
"message": "Kopiér URI",
|
||||
"description": "Copy URI to clipboard"
|
||||
},
|
||||
"myVault": {
|
||||
@@ -475,16 +478,16 @@
|
||||
"message": "Slettede mappe"
|
||||
},
|
||||
"loggedOut": {
|
||||
"message": "Logget af"
|
||||
"message": "Logget ud"
|
||||
},
|
||||
"loginExpired": {
|
||||
"message": "Din login-session er udløbet."
|
||||
},
|
||||
"logOutConfirmation": {
|
||||
"message": "Er du sikker på, at du vil logge af?"
|
||||
"message": "Er du sikker på, at du vil logge ud?"
|
||||
},
|
||||
"logOut": {
|
||||
"message": "Log af"
|
||||
"message": "Log ud"
|
||||
},
|
||||
"ok": {
|
||||
"message": "Ok"
|
||||
@@ -508,7 +511,7 @@
|
||||
"message": "Indsend"
|
||||
},
|
||||
"emailAddressDesc": {
|
||||
"message": "Du bruger din emailadresse til at logge ind."
|
||||
"message": "Du bruger din e-mailadresse til at logge ind."
|
||||
},
|
||||
"yourName": {
|
||||
"message": "Dit navn"
|
||||
@@ -541,16 +544,16 @@
|
||||
"message": "Adgangskodetip"
|
||||
},
|
||||
"enterEmailToGetHint": {
|
||||
"message": "Indtast din kontos emailadresse for at modtage dit hovedadgangskodetip."
|
||||
"message": "Indtast din kontos e-mailadresse for at modtage dit hovedadgangskodetip."
|
||||
},
|
||||
"getMasterPasswordHint": {
|
||||
"message": "Få hovedadgangskodetip"
|
||||
},
|
||||
"emailRequired": {
|
||||
"message": "Emailadresse er påkrævet."
|
||||
"message": "E-mailadresse er påkrævet."
|
||||
},
|
||||
"invalidEmail": {
|
||||
"message": "Ugyldig emailadresse."
|
||||
"message": "Ugyldig e-mailadresse."
|
||||
},
|
||||
"masterPassRequired": {
|
||||
"message": "Hovedadgangskode er påkrævet."
|
||||
@@ -565,13 +568,13 @@
|
||||
"message": "Din nye konto er oprettet! Du kan nu logge ind."
|
||||
},
|
||||
"masterPassSent": {
|
||||
"message": "Vi har sendt dig en email med dit hovedadgangskodetip."
|
||||
"message": "Vi har sendt dig en e-mail med dit hovedadgangskodetip."
|
||||
},
|
||||
"unexpectedError": {
|
||||
"message": "Der opstod en uventet fejl."
|
||||
},
|
||||
"emailAddress": {
|
||||
"message": "Emailadresse"
|
||||
"message": "E-mailadresse"
|
||||
},
|
||||
"yourVaultIsLocked": {
|
||||
"message": "Din boks er låst. Bekræft din hovedadgangskode for at fortsætte."
|
||||
@@ -680,7 +683,7 @@
|
||||
"message": "YubiKey OTP sikkerhedsnøgle"
|
||||
},
|
||||
"yubiKeyDesc": {
|
||||
"message": "Brug en YubiKey til at få adgang til din konto. Virker med YubiKey 4, 4 Nano, 4C og NEO enheder."
|
||||
"message": "Brug en YubiKey til at få adgang til din konto. Virker med YubiKey 4 serien, 5 serien og NEO enheder."
|
||||
},
|
||||
"duoDesc": {
|
||||
"message": "Bekræft med Duo Security ved hjælp af Duo Mobile app, SMS, telefonopkald eller U2F sikkerhedsnøgle.",
|
||||
@@ -697,10 +700,10 @@
|
||||
"message": "FIDO U2F sikkerhedsnøgle"
|
||||
},
|
||||
"emailTitle": {
|
||||
"message": "Email"
|
||||
"message": "E-mail"
|
||||
},
|
||||
"emailDesc": {
|
||||
"message": "Bekræftelseskoder vil blive emailet til dig."
|
||||
"message": "Bekræftelseskoder vil blive e-mailet til dig."
|
||||
},
|
||||
"continue": {
|
||||
"message": "Fortsæt"
|
||||
@@ -718,7 +721,7 @@
|
||||
"message": "Vælg en organisation, som du ønsker at dele disse elementer med. Deling overfører ejerskab af elementerne til organisationen. Du vil ikke længere være den direkte ejer af disse elementer, når de er blevet delt."
|
||||
},
|
||||
"collectionsDesc": {
|
||||
"message": "Rediger de samlinger, som dette element deles med. Kun organisationsbrugere med adgang til disse samlinger vil kunne se dette element."
|
||||
"message": "Redigér de samlinger, som dette element deles med. Kun organisationsbrugere med adgang til disse samlinger vil kunne se dette element."
|
||||
},
|
||||
"deleteSelectedItemsDesc": {
|
||||
"message": "Du har valgt $COUNT$ element(er), der skal slettes. Er du sikker på, at du vil slette alle disse elementer?",
|
||||
@@ -759,19 +762,19 @@
|
||||
"message": "Bekræftelseskode (TOTP)"
|
||||
},
|
||||
"copyVerificationCode": {
|
||||
"message": "Kopier bekræftelseskoden"
|
||||
"message": "Kopiér verifikationskoden"
|
||||
},
|
||||
"warning": {
|
||||
"message": "Advarsel"
|
||||
},
|
||||
"exportWarning": {
|
||||
"message": "Denne eksport indeholder dine ikke-krypterede data i .csv-format. Du bør ikke gemme eller sende den over usikre kanaler (f.eks. email). Slet den umiddelbart efter at du er færdig med at bruge den."
|
||||
"message": "Denne eksport indeholder dine ikke-krypterede data i .csv-format. Du bør ikke gemme eller sende den over usikre kanaler (f.eks. e-mail). Slet den umiddelbart efter at du er færdig med at bruge den."
|
||||
},
|
||||
"exportMasterPassword": {
|
||||
"message": "Indtast din hovedadgangskode for at eksportere dine data fra boksen."
|
||||
},
|
||||
"exportVault": {
|
||||
"message": "Eksporter boks"
|
||||
"message": "Eksportér boks"
|
||||
},
|
||||
"exportSuccess": {
|
||||
"message": "Dine boksdata er blevet eksporteret."
|
||||
@@ -790,11 +793,17 @@
|
||||
"message": "Undgå tvetydige tegn"
|
||||
},
|
||||
"regeneratePassword": {
|
||||
"message": "Regenerer adgangskode"
|
||||
"message": "Regenerér adgangskode"
|
||||
},
|
||||
"length": {
|
||||
"message": "Længde"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Antal ord"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Ordseparator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Adgangskodehistorik"
|
||||
},
|
||||
@@ -808,16 +817,16 @@
|
||||
"message": "Konto opdateret"
|
||||
},
|
||||
"changeEmail": {
|
||||
"message": "Skift email"
|
||||
"message": "Skift e-mail"
|
||||
},
|
||||
"newEmail": {
|
||||
"message": "Ny email"
|
||||
"message": "Ny e-mail"
|
||||
},
|
||||
"code": {
|
||||
"message": "Kode"
|
||||
},
|
||||
"changeEmailDesc": {
|
||||
"message": "Vi har sendt en bekræftelseskode til $EMAIL$. Tjek venligst din email for denne kode og indtast den nedenfor for at afslutte emailadresse-ændringen.",
|
||||
"message": "Vi har sendt en bekræftelseskode til $EMAIL$. Tjek venligst din e-mail for denne kode og indtast den nedenfor for at afslutte e-mailadresseændringen.",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"content": "$1",
|
||||
@@ -829,7 +838,7 @@
|
||||
"message": "Ved at fortsætte vil du blive logget ud af din nuværende session, og du skal logge ind igen. Aktive sessioner på andre enheder kan fortsat forblive aktive i op til én time."
|
||||
},
|
||||
"emailChanged": {
|
||||
"message": "Email ændret"
|
||||
"message": "E-mail ændret"
|
||||
},
|
||||
"logBackIn": {
|
||||
"message": "Log venligst ind igen."
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Bekræft ny hovedadgangskode"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Indstillinger for krypteringsnøgle"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF algoritme"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF iterationer"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Flere KDF iterationer kan hjælpe med at beskytte din hovedadgangskode imod brute force angreb. Vi anbefaler en værdi på $VALUE$ eller mere.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Hvis du indstiller dine KDF iterationer for højt, kan det resultere i dårlig ydeevne, når du logger ind på (og låser op for) Bitwarden på enheder med langsomme CPU'er. Vi anbefaler at du øger værdien i trin på $INCREMENT$ og derefter tester alle dine enheder.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Ændre KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Krypteringsnøgleindstillinger ændret"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Farezone"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Tøm boks"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Organisationsboks tømt."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Fortsæt nedenfor for at slette alle elementer og mapper i din boks. Elementer, der tilhører en organisation du deler med, slettes ikke."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Fortsæt nedenfor for at slette alle elementer i organisationens boks."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Tømning af din boks er permanent. Det kan ikke fortrydes."
|
||||
},
|
||||
@@ -904,7 +952,7 @@
|
||||
"message": "Værktøjer"
|
||||
},
|
||||
"importData": {
|
||||
"message": "Importer data"
|
||||
"message": "Importér data"
|
||||
},
|
||||
"importSuccess": {
|
||||
"message": "Data er blevet importeret til din boks med success."
|
||||
@@ -922,7 +970,7 @@
|
||||
"message": "Vælg importfil"
|
||||
},
|
||||
"orCopyPasteFileContents": {
|
||||
"message": "eller kopier\/indsæt importfilens indhold"
|
||||
"message": "eller kopiér\/indsæt importfilens indhold"
|
||||
},
|
||||
"instructionsFor": {
|
||||
"message": "$NAME$ Instruktioner",
|
||||
@@ -956,7 +1004,7 @@
|
||||
"message": "Webikoner vises som et genkendeligt billede ved siden af hvert loginelement i din boks."
|
||||
},
|
||||
"enableGravatars": {
|
||||
"message": "Aktiver Gravatars",
|
||||
"message": "Aktivér Gravatars",
|
||||
"description": "'Gravatar' is the name of a service. See www.gravatar.com"
|
||||
},
|
||||
"enableGravatarsDesc": {
|
||||
@@ -1024,7 +1072,7 @@
|
||||
"description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc."
|
||||
},
|
||||
"enable": {
|
||||
"message": "Aktiver"
|
||||
"message": "Aktivér"
|
||||
},
|
||||
"enabled": {
|
||||
"message": "Aktiveret"
|
||||
@@ -1042,11 +1090,17 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Premium-medlemskab kræves for at anvende denne funktion."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Du har premium adgang"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Du har allerede adgang til premium-funktioner på grund af en organisation, du er medlem af."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Administrer"
|
||||
"message": "Håndtér"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktiver"
|
||||
"message": "Deaktivér"
|
||||
},
|
||||
"twoStepLoginProviderEnabled": {
|
||||
"message": "Denne to-trins-login udbyder er aktiveret på din konto."
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Tilføj en ny YubiKey til din konto"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Sæt YubiKey'en (NEO eller 4-serien) i din computers USB-port."
|
||||
"message": "Sæt YubiKey'en i din computers USB-port."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Vælg det første tomme YubiKey-indtastningsfelt nedenfor."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F nøgle $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC understøttelse"
|
||||
},
|
||||
@@ -1139,7 +1202,7 @@
|
||||
"message": "YubiKeys opdateret"
|
||||
},
|
||||
"disableAllKeys": {
|
||||
"message": "Deaktiver alle nøgler"
|
||||
"message": "Deaktivér alle nøgler"
|
||||
},
|
||||
"twoFactorDuoDesc": {
|
||||
"message": "Indtast Bitwarden-programoplysningerne fra dit Duo-administrationspanel."
|
||||
@@ -1154,26 +1217,41 @@
|
||||
"message": "API værtsnavn"
|
||||
},
|
||||
"twoFactorEmailDesc": {
|
||||
"message": "Følg disse trin for at konfigurere to-trins-login med email:"
|
||||
"message": "Følg disse trin for at konfigurere to-trins-login med e-mail:"
|
||||
},
|
||||
"twoFactorEmailEnterEmail": {
|
||||
"message": "Indtast den email, som du ønsker skal modtage verifikationskoder"
|
||||
"message": "Indtast den e-mail, som du ønsker skal modtage verifikationskoder"
|
||||
},
|
||||
"twoFactorEmailEnterCode": {
|
||||
"message": "Indtast den 6-cifrede verifikationskode fra emailen"
|
||||
"message": "Indtast den 6-cifrede verifikationskode fra e-mailen"
|
||||
},
|
||||
"sendEmail": {
|
||||
"message": "Send email"
|
||||
"message": "Send e-mail"
|
||||
},
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Tilføj en FIDO U2F sikkerhedsnøgle til din konto"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Sæt sikkerhedsnøglen i computerens USB-port."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Er du sikker på, at du vil fjerne denne sikkerhedsnøgle?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Læs nøgle"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Nøglen er kompromitteret."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Giv sikkerhedsnøglen et brugervenligt navn til at identificere den."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Sæt sikkerhedsnøglen i computerens USB-port, og klik på knappen \"Læs nøgle\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Hvis sikkerhedsnøglen har en knap, skal du trykke på den."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Gem formularen."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "På grund af platformbegrænsninger kan FIDO U2F ikke bruges på alle Bitwarden-applikationer. Du bør aktivere en anden to-trins login udbyder, så du kan få adgang til din konto, når FIDO U2F ikke kan benyttes. Understøttede platforme:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Venter på at du trykker på knappen på din sikkerhedsnøgle"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Klik på knappen \"Aktiver\" nedenfor for at benytte denne sikkerhedsnøgle til to-trins-login."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Klik på \"Gem\" knappen nedenfor for at aktivere denne sikkerhedsnøgle til to-trins login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Der opstod et problem med at læse sikkerhedsnøglen."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Der opstod et problem med at læse sikkerhedsnøglen. Prøv igen."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Din Bitwarden to-trins-login gendannelseskode"
|
||||
@@ -1206,10 +1284,10 @@
|
||||
"message": "Datalæk rapport"
|
||||
},
|
||||
"breachDesc": {
|
||||
"message": "Et \"læk\" er en hændelse, hvor et websteds data er blevet ulovligt tilgået til af hackere og derefter offentliggjort. Gennemgå de typer af data, der blev kompromitteret (emailadresser, adgangskoder, kreditkort osv.) og træf passende foranstaltninger, som f.eks. ændring af adgangskoder."
|
||||
"message": "Et \"læk\" er en hændelse, hvor et websteds data er blevet ulovligt tilgået til af hackere og derefter offentliggjort. Gennemgå de typer af data, der blev kompromitteret (e-mailadresser, adgangskoder, kreditkort osv.) og træf passende foranstaltninger, som f.eks. ændring af adgangskoder."
|
||||
},
|
||||
"breachCheckUsernameEmail": {
|
||||
"message": "Kontroller eventuelle brugernavne eller emailadresser, som du bruger."
|
||||
"message": "Kontroller eventuelle brugernavne eller e-mailadresser, som du bruger."
|
||||
},
|
||||
"checkBreaches": {
|
||||
"message": "Kontroller læk"
|
||||
@@ -1406,7 +1484,7 @@
|
||||
"message": "Opdaterede licens"
|
||||
},
|
||||
"manageSubscription": {
|
||||
"message": "Administrer abonnement"
|
||||
"message": "Håndtér abonnement"
|
||||
},
|
||||
"storage": {
|
||||
"message": "Lager"
|
||||
@@ -1510,10 +1588,10 @@
|
||||
"message": "For at oprette en lokal-hosted organisation, skal du uploade en gyldig licensfil."
|
||||
},
|
||||
"accountEmailMustBeVerified": {
|
||||
"message": "Din kontos emailadresse skal verificeres."
|
||||
"message": "Din kontos e-mailadresse skal verificeres."
|
||||
},
|
||||
"newOrganizationDesc": {
|
||||
"message": "Organisationer giver dig mulighed for at dele dele af din boks med andre såvel som at administrere relaterede brugere i en bestemt enhed som f.eks. en familie, et lille team eller et stort firma."
|
||||
"message": "Organisationer giver dig mulighed for at dele dele af din boks med andre såvel som at håndtere relaterede brugere i en bestemt enhed som f.eks. en familie, et lille team eller et stort firma."
|
||||
},
|
||||
"generalInformation": {
|
||||
"message": "Generelle oplysninger"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Lokal-hosting (valgfri)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Brugere får adgang til premium-medlemskabsfunktioner"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Kontroller brugeradgang med grupper"
|
||||
},
|
||||
@@ -1737,7 +1818,7 @@
|
||||
"message": "Tilføj gruppe"
|
||||
},
|
||||
"editGroup": {
|
||||
"message": "Rediger Gruppe"
|
||||
"message": "Redigér Gruppe"
|
||||
},
|
||||
"deleteGroupConfirmation": {
|
||||
"message": "Er du sikker på, at du vil slette denne gruppe?"
|
||||
@@ -1770,22 +1851,22 @@
|
||||
"message": "Tilføj samling"
|
||||
},
|
||||
"editCollection": {
|
||||
"message": "Rediger samling"
|
||||
"message": "Redigér samling"
|
||||
},
|
||||
"deleteCollectionConfirmation": {
|
||||
"message": "Er du sikker på, at du vil slette denne samling?"
|
||||
},
|
||||
"editUser": {
|
||||
"message": "Rediger bruger"
|
||||
"message": "Redigér bruger"
|
||||
},
|
||||
"inviteUser": {
|
||||
"message": "Inviter bruger"
|
||||
},
|
||||
"inviteUserDesc": {
|
||||
"message": "Inviter en ny bruger til din organisation ved at indtaste emailadressen på deres Bitwarden-konto nedenfor. Hvis de ikke allerede har en Bitwarden-konto, bliver de bedt om at oprette en ny konto."
|
||||
"message": "Inviter en ny bruger til din organisation ved at indtaste e-mailadressen på deres Bitwarden-konto nedenfor. Hvis de ikke allerede har en Bitwarden-konto, bliver de bedt om at oprette en ny konto."
|
||||
},
|
||||
"inviteMultipleEmailDesc": {
|
||||
"message": "Du kan invitere op til $COUNT$ brugere ad gangen ved at kommaseparere en liste med emailadresser.",
|
||||
"message": "Du kan invitere op til $COUNT$ brugere ad gangen ved at kommaseparere en liste med e-mailadresser.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1815,13 +1896,13 @@
|
||||
"message": "Ejer"
|
||||
},
|
||||
"ownerDesc": {
|
||||
"message": "Den bruger med højeste rettigheder, som kan administrere alle aspekter af din organisation."
|
||||
"message": "Den bruger med højeste rettigheder, som kan håndtere alle aspekter af din organisation."
|
||||
},
|
||||
"admin": {
|
||||
"message": "Administrator"
|
||||
},
|
||||
"adminDesc": {
|
||||
"message": "Administratorer kan få adgang til og styre alle elementer, samlinger og brugere i din organisation."
|
||||
"message": "Administratorer kan få adgang til og håndtere alle elementer, samlinger og brugere i din organisation."
|
||||
},
|
||||
"user": {
|
||||
"message": "Bruger"
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Ændrede konto kodeord."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Aktiverede to-trins-login."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Aktiverede\/opdaterede to-trins login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Deaktiverede to-trins-login."
|
||||
@@ -2070,7 +2151,7 @@
|
||||
"message": "Gruppeadgang"
|
||||
},
|
||||
"groupAccessUserDesc": {
|
||||
"message": "Rediger de grupper, som denne bruger tilhører."
|
||||
"message": "Redigér de grupper, som denne bruger tilhører."
|
||||
},
|
||||
"invitedUsers": {
|
||||
"message": "Inviterede bruger(e)."
|
||||
@@ -2112,22 +2193,22 @@
|
||||
"message": "Slutdato"
|
||||
},
|
||||
"verifyEmail": {
|
||||
"message": "Bekræft email"
|
||||
"message": "Bekræft e-mail"
|
||||
},
|
||||
"verifyEmailDesc": {
|
||||
"message": "Bekræft din emailadresse for at låse op for adgangen til alle funktioner."
|
||||
"message": "Bekræft din e-mailadresse for at låse op for adgangen til alle funktioner."
|
||||
},
|
||||
"verifyEmailFirst": {
|
||||
"message": "Din kontos emailadresse skal først verificeres."
|
||||
"message": "Din kontos e-mailadresse skal først verificeres."
|
||||
},
|
||||
"checkInboxForVerification": {
|
||||
"message": "Tjek din email-indbakke for et bekræftelseslink."
|
||||
"message": "Tjek din e-mail indbakke for et bekræftelseslink."
|
||||
},
|
||||
"emailVerified": {
|
||||
"message": "Din email er blevet bekræftet."
|
||||
"message": "Din e-mail er blevet bekræftet."
|
||||
},
|
||||
"emailVerifiedFailed": {
|
||||
"message": "Kan ikke bekræfte din email. Prøv at sende en ny verifikations-email."
|
||||
"message": "Kan ikke bekræfte din e-mail. Prøv at sende en ny verifikations-email."
|
||||
},
|
||||
"updateBrowser": {
|
||||
"message": "Opdater browser"
|
||||
@@ -2145,13 +2226,13 @@
|
||||
"message": "Invitation accepteret"
|
||||
},
|
||||
"inviteAcceptedDesc": {
|
||||
"message": "Du kan få adgang til denne organisation, når en administrator bekræfter dit medlemskab. Vi sender dig en email, når dette sker."
|
||||
"message": "Du kan få adgang til denne organisation, når en administrator bekræfter dit medlemskab. Vi sender dig en e-mail, når dette sker."
|
||||
},
|
||||
"inviteAcceptFailed": {
|
||||
"message": "Kan ikke acceptere invitationen. Bed en organisations-administrator om at sende en ny invitation."
|
||||
},
|
||||
"rememberEmail": {
|
||||
"message": "Husk email"
|
||||
"message": "Husk e-mail"
|
||||
},
|
||||
"recoverAccountTwoStepDesc": {
|
||||
"message": "Hvis du ikke kan få adgang til din konto via dine normale to-trins-login metoder, kan du bruge din to-trins-login gendannelseskode til at deaktivere alle to-trins-udbydere på din konto."
|
||||
@@ -2166,10 +2247,10 @@
|
||||
"message": "Få mere at vide"
|
||||
},
|
||||
"deleteRecoverDesc": {
|
||||
"message": "Indtast din emailadresse nedenfor for at gendanne og slette din konto."
|
||||
"message": "Indtast din e-mailadresse nedenfor for at gendanne og slette din konto."
|
||||
},
|
||||
"deleteRecoverEmailSent": {
|
||||
"message": "Hvis din konto findes, har vi sendt dig en email med yderligere instruktioner."
|
||||
"message": "Hvis din konto findes, har vi sendt dig en e-mail med yderligere instruktioner."
|
||||
},
|
||||
"deleteRecoverConfirmDesc": {
|
||||
"message": "Du har bedt om at få slettet din Bitwarden-konto. Klik på knappen nedenfor for at bekræfte."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Passwort"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notizen"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Länge"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Kennwort-Historie"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Neues Master-Passwort bestätigen"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Einstellungen des Verschlüsselungsschlüssels"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF-Algorithmus"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF-Iterationen"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Eine höhere Anzahl von KDF-Iterationen hilft dabei, dein Master-Passwort besser vor Brute-Force-Angriffen zu schützen. Wir empfehlen einen Wert von $VALUE$ oder mehr.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Wenn Sie die Anzahl der KDF-Iterationen zu hoch setzen, kann es sein, dass das Einloggen in (und Entsperren von) Bitwarden auf langsameren Geräten länger dauert. Wir empfehlen, dass Sie den Wert wiederholt um $INCREMENT$ anheben und auf all ihren Geräten testen.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "KDF ändern"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Einstellungen des Verschlüsselungsschlüssels wurden geändert"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Gefahrenzone"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Tresor leeren"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Gehen Sie wie folgt vor, um alle Einträge und Ordner in Ihrem Tresor zu löschen. Einträge, die zu einer Organisation gehören, die Sie mit anderen teilen, werden nicht gelöscht."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Die Leerung des Tresor ist permanent. Sie kann nicht rückgängig gemacht werden."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Für diese Funktion ist eine Premium-Mitgliedschaft notwendig."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Sie haben Zugriff auf Premium-Funktionen"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Wegen einer Organisation, bei der Sie Mitglied sind, haben Sie bereits Zugriff auf Premium-Funktionen."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Verwalten"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC-Unterstützung"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Fügen Sie Ihrem Konto einen FIDO U2F-Sicherheitsschlüssel hinzu"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Stecken Sie den Sicherheitsschlüssel in USB-Port Ihres Computers."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Wenn der Sicherheitsschlüssel eine Taste hat, drücken Sie die."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Aufgrund von Plattformbeschränkungen kann FIDO U2F nicht mit allen Bitwarden-Anwendungen verwendet werden. Sie sollten einen anderen Zwei-Faktor-Authentifizierungsanbieter aktivieren, damit Sie auf Ihr Konto zugreifen können, wenn FIDO U2F nicht verwendet werden kann. Unterstützte Plattformen sind:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Es wird darauf gewartet, dass Sie die Taste Ihres Sicherheitsschlüssels betätigen"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Klicken Sie unten auf \"Aktivieren\", um diesen Sicherheitsschlüssel für die Zwei-Faktor-Anmeldung zu verwenden."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Es gab ein Problem beim Lesen des Sicherheitsschlüssels."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Ihr Wiederherstellungsschlüssel für die Zwei-Faktor-Anmeldung in Bitwarden"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Hosting auf eigenem Server (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Mitglieder erhalten Zugriff auf Premium-Funktionen"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Zugriffskontrolle durch Gruppen"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Benutzerpasswort geändert."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Zwei-Faktor-Anmeldung aktiviert."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Zwei-Faktor-Anmeldung deaktiviert."
|
||||
@@ -2100,7 +2181,7 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Bestätigen Sie die Benutzer"
|
||||
"message": "Benutzer bestätigen"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "Sie haben Nutzer, die ihre Einladung angenommen haben, aber noch bestätigt werden müssen. Benutzer haben erst Zugriff auf die Organisation, wenn sie bestätigt wurden."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Password"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notes"
|
||||
},
|
||||
@@ -683,7 +686,7 @@
|
||||
"message": "YubiKey OTP Security Key"
|
||||
},
|
||||
"yubiKeyDesc": {
|
||||
"message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
|
||||
"message": "Use a YubiKey to access your account. Works with YubiKey 4 series, 5 series, and NEO devices."
|
||||
},
|
||||
"duoDesc": {
|
||||
"message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
|
||||
@@ -798,6 +801,12 @@
|
||||
"length": {
|
||||
"message": "Length"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Password History"
|
||||
},
|
||||
@@ -855,6 +864,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirm New Master Password"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Encryption Key Settings"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF Algorithm"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF Iterations"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker. We recommend a value of $VALUE$ or more.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Setting your KDF iterations too high could result in poor performance when logging into (and unlocking) Bitwarden on devices with slower CPUs. We recommend that you increase the value in increments of $INCREMENT$ and then test all of your devices.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Change KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Encryption Key Settings Changed"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Danger Zone"
|
||||
},
|
||||
@@ -876,9 +918,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Purge Vault"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Purging your vault is permanent. It cannot be undone."
|
||||
},
|
||||
@@ -1045,6 +1093,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "A premium membership is required to use this feature."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "You have premium access"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "You already have access to premium features because of an organization you are a member of."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Manage"
|
||||
},
|
||||
@@ -1100,7 +1154,7 @@
|
||||
"message": "Add a new YubiKey to your account"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Plug the YubiKey (NEO or 4 series) into your computer's USB port."
|
||||
"message": "Plug the YubiKey into your computer's USB port."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Select the first empty YubiKey input field below."
|
||||
@@ -1129,6 +1183,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC Support"
|
||||
},
|
||||
@@ -1171,12 +1234,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Add a FIDO U2F security key to your account"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Plug the security key into your computer's USB port."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "If the security key has a button, touch it."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:"
|
||||
},
|
||||
@@ -1186,11 +1264,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Waiting for you to touch the button on your security key"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Click the \"Enable\" button below to enable this security key for two-step login."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "There was a problem reading the security key."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Your Bitwarden two-step login recovery code"
|
||||
@@ -1664,6 +1742,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "On-premise hosting (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Users get access to premium membership features"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Control user access with groups"
|
||||
},
|
||||
@@ -1871,8 +1952,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Changed account password."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Enabled two-step login."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Disabled two-step login."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Contraseña"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Frase de contraseña"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notas"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Longitud"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Número de palabras"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Separador de palabras"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Historial de contraseñas"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirma la nueva contraseña maestra"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Configuración de clave de cifrado"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Algoritmo KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Iteraciones de KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Mientras más iteraciones KDF, mejor la protección a su contraseña maestra de ser descubierta por un ataque de fuerza bruta. Recomendamos un valor de $VALUE$ o más.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Establecer las iteraciones KDF con un valor muy alto, podría resultar en un rendimiento pobre al ingresar, y\/o desbloquear Bitwarden en dispositivos con CPUs lentos. Recomendamos que aumente el valor en incrementos de $INCREMENT$ y luego pruebe en todos sus dispositivos.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Modificar KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Se cambió la configuración de clave de cifrado"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Zona peligrosa"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Purgar caja fuerte"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Bóveda de organización purgada."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Proceder eliminará todos los elementos y carpetas de tu caja fuerte. Los elementos que petenezcan a una organización con la que compartes contenido, no serán eliminados."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceda a continuación para eliminar todos los elementos de la bóveda de la organización."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Purgar tu caja fuerte es permanente. No se puede deshacer."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Se quiere membrasía Premium para poder utilizar esta característica."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Usted tiene acceso premium"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Ya tiene acceso a las características premium, debido a que es miembro de una organización."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Gestionar"
|
||||
},
|
||||
@@ -1100,7 +1154,7 @@
|
||||
"message": "Conecta la YubiKey (NEO o serie 4) al puerto USB de tu ordenador."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Select in the first empty YubiKey input field below."
|
||||
"message": "Elija el primer campo de entrada vacío de YubiKey de abajo."
|
||||
},
|
||||
"twoFactorYubikeyTouchButton": {
|
||||
"message": "Toca el botón del YubiKey."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Llave U2F $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Soporte NFC"
|
||||
},
|
||||
@@ -1168,14 +1231,29 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Agregar una clave de seguridad U2F FIDO a su cuenta"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Conecte la llave de seguridad al puerto USB de su ordenador."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "¿Estás seguro de que quieres eliminar esta clave de seguridad?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Leer llave"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "La clave está comprometida."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Asigne un nombre descriptivo a la llave de seguridad."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Conecte la llave de seguridad al puerto USB de su ordenador y haga clic en el botón \"Leer llave\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Si la clave de seguridad tiene un botón, tócalo."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Guarda el formulario."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Debido a las limitaciones de la plataforma, FIDO U2F no puede utilizarse en todas las aplicaciones de Bitwarden. Debe habilitar otro proveedor de inicio de sesión de dos pasos para que puede acceder a su cuenta cuando FIDO U2F no pueda utilizarse. Plataformas soportadas:"
|
||||
"message": "Debido a limitaciones de la plataforma, FIDO U2F no puede ser usado en todas las aplicaciones de Bitwarden. Debería habilitar otro proveedor de inicio de sesión de dos pasos, para que pueda acceder a su cuenta cuando FIDO U2F no pueda ser utilizado. Plataformas soportadas:"
|
||||
},
|
||||
"twoFactorU2fSupportWeb": {
|
||||
"message": "Bóveda web y extensiones de navegador en un escritorio\/portátil con un navegador compatible con U2F (Chrome, Opera, Vivaldi, o Firefox con FIDO U2F activado)."
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Esperando que toque el botón de su clave de seguridad"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Haga clic en el botón \"Habilitar\" a continuación para habilitar esta clave de seguridad para el inicio de sesión en dos pasos."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Haga clic en el botón \"guardar\" para habilitar esta clave de seguridad para el inicio de sesión de dos pasos."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Hubo un problema leyendo la clave de seguridad."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Hubo un problema al leer la clave de seguridad. Inténtalo de nuevo."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Su código de recuperación de inicio de sesión de dos pasos Bitwarden"
|
||||
@@ -1196,7 +1274,7 @@
|
||||
"message": "Aún no ha habilitado ningún proveedor de inicio de sesión de dos pasos. Después de haber habilitado un proveedor de inicio de sesión de dos pasos, puede volver aquí para ver el código de recuperación."
|
||||
},
|
||||
"printCode": {
|
||||
"message": "Imprimir Código",
|
||||
"message": "Imprimir código",
|
||||
"description": "Print 2FA recovery code"
|
||||
},
|
||||
"reports": {
|
||||
@@ -1253,7 +1331,7 @@
|
||||
"message": "Usuarios afectados"
|
||||
},
|
||||
"breachOccurred": {
|
||||
"message": "Violación ocurrida"
|
||||
"message": "Se ha producido una filtración"
|
||||
},
|
||||
"breachReported": {
|
||||
"message": "Infracción notificada"
|
||||
@@ -1272,7 +1350,7 @@
|
||||
"message": "Has actualizado a premium."
|
||||
},
|
||||
"premiumUpgradeUnlockFeatures": {
|
||||
"message": "Actualice su cuenta a una membresía Premium y desbloquear algunas características adicionales."
|
||||
"message": "Actualice su cuenta a una membresía premium y desbloquee estupendas características adicionales."
|
||||
},
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 GB de almacenamiento de archivos cifrados."
|
||||
@@ -1287,7 +1365,7 @@
|
||||
"message": "Atención prioritaria al cliente."
|
||||
},
|
||||
"premiumSignUpFuture": {
|
||||
"message": "Todas las funciones Premium futuras. ¡próximamente!"
|
||||
"message": "Acceso a nuevas características premium en el futuro. ¡Hay más en camino!"
|
||||
},
|
||||
"premiumPrice": {
|
||||
"message": "Todo por sólo $PRICE$ \/año!",
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Alojamiento propio (opcional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Los usuarios obtienen acceso a las características de una membresía premium"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Control el acceso de usuarios con grupos"
|
||||
},
|
||||
@@ -1821,7 +1902,7 @@
|
||||
"message": "Administrador"
|
||||
},
|
||||
"adminDesc": {
|
||||
"message": " Admins can access and manage all items, collections and users in your organization."
|
||||
"message": "Los administradores pueden acceder y gestionar todos los elementos, coleccionefs y usuarios de la organización."
|
||||
},
|
||||
"user": {
|
||||
"message": "Usuario"
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Contraseña de la cuenta cambiada."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Autenticación en dos pasos habilitada."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Autenticación en dos pasos habilitado\/actualizado."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Autenticación en dos pasos deshabilitada."
|
||||
@@ -2181,7 +2262,7 @@
|
||||
"message": "Eliminar organización"
|
||||
},
|
||||
"deleteOrganizationDesc": {
|
||||
"message": "Proceed below to delete this organization and all associated data. Individual user accounts will remain, though they will not be associated to this organization anymore. "
|
||||
"message": "Continua el proceso para eliminar esta organización y todos los datos asociados a ella. Las cuentas de usuario individuales se mantendrán, aunque no estarán asociadas con la organización a partir de ahora."
|
||||
},
|
||||
"deleteOrganizationWarning": {
|
||||
"message": "Eliminar la organización es permanente. No se puede deshacer."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2487
src/locales/fi/messages.json
Normal file
2487
src/locales/fi/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Mot de passe"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Phrase de passe"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notes"
|
||||
},
|
||||
@@ -158,7 +161,7 @@
|
||||
"message": "Booléen"
|
||||
},
|
||||
"remove": {
|
||||
"message": "Supprimer"
|
||||
"message": "Retirer"
|
||||
},
|
||||
"unassigned": {
|
||||
"message": "Non attribué"
|
||||
@@ -780,10 +783,10 @@
|
||||
"message": "Générateur de mot de passe"
|
||||
},
|
||||
"minNumbers": {
|
||||
"message": "Minimum de chiffres"
|
||||
"message": "Nombre minimum de chiffres"
|
||||
},
|
||||
"minSpecial": {
|
||||
"message": "Minimum de caractères spéciaux",
|
||||
"message": "Nombre minimum de caractères spéciaux",
|
||||
"description": "Minimum Special Characters"
|
||||
},
|
||||
"ambiguous": {
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Longueur"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Nombre de mots"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Séparateur de mots"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Historique des mots de passe"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirmer le nouveau mot de passe maître"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Paramètres de la clé de chiffrement"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Algorithme KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Nombre d'itérations de KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Un nombre plus élevé d'itérations de KDF peut aider à protéger votre mot de passe maître contre une attaque par force brute. Nous recommandons une valeur de $VALUE$ ou plus.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Si vous définissez un nombre d'itérations KDF trop élevé, les performances risquent d'être mauvaises lorsque vous vous connectez (et déverrouillez) Bitwarden sur des périphériques dont les processeurs sont plus lents. Nous vous recommandons d'augmenter la valeur par incréments de $INCREMENT$, puis de tester tous vos appareils.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Modifier KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Paramètres de la clé de chiffrement modifiés"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Zone de danger"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Effacer le coffre"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Le coffre de l'organisation a été effacé."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Poursuivez ci-dessous pour supprimer tous les éléments et dossiers de votre coffre. Les éléments qui appartiennent à une organisation avec laquelle vous partagez ne seront pas supprimés."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Poursuivez ci-dessous pour supprimer tous les éléments du coffre de votre organisation."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "L'effacement votre coffre est définitif. Cette action ne peut pas être annulée."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Une adhésion premium est requise pour utiliser cette fonctionnalité."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Vous avez un accès premium"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Vous avez déjà accès aux fonctionnalités premium grâce à une organisation dont vous êtes membre."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Gérer"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Clé U2F $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Support du NFC"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Ajouter une clé de sécurité FIDO U2F à votre compte"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Branchez la clé de sécurité sur un port USB de votre ordinateur."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Êtes-vous certain de vouloir retirer cette clé de sécurité ?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Lire la clé"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "La clé est compromise."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Donnez un nom convivial à la clé de sécurité pour l'identifier."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Branchez la clé de sécurité sur un port USB de votre ordinateur et cliquez sur le bouton \"Lire la clé\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Si la clé de sécurité a un bouton, touchez-le."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Sauvegarder le contenu du formulaire."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "En raison de limitations de plateforme, FIDO U2F n'est pas utilisable sur toutes les applications Bitwarden. Vous devriez activer un autre fournisseur de connexion en deux étapes afin de pouvoir accéder à votre compte lorsque vous ne pouvez pas utiliser FIDO U2F. Plateformes prises en charge :"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Attente de l'appui sur le bouton de votre clé de sécurité"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Cliquez sur le bouton « Activer » ci-dessous pour activer cette clé de sécurité pour une connexion en deux étapes."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Cliquez sur le bouton « Sauvegarder » ci-dessous pour activer cette clé de sécurité pour une connexion en deux étapes."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Un problème est survenu lors de la lecture de la clé de sécurité."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Un problème est survenu lors de la lecture de la clé de sécurité. Veuillez réessayer."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Votre code de récupération de connexion en deux étapes Bitwarden"
|
||||
@@ -1308,7 +1386,7 @@
|
||||
"message": "# Go additionnels"
|
||||
},
|
||||
"additionalStorageDesc": {
|
||||
"message": "Votre plan comprend $SIZE$ de stockage de fichiers chiffrés. Vous pouvez ajouter du stockage supplémentaire pour $PRICE$ par Go\/an.",
|
||||
"message": "Votre offre comprend $SIZE$ de stockage de fichiers chiffrés. Vous pouvez ajouter du stockage supplémentaire pour $PRICE$ par Go\/an.",
|
||||
"placeholders": {
|
||||
"size": {
|
||||
"content": "$1",
|
||||
@@ -1340,7 +1418,7 @@
|
||||
"message": "Votre mode de paiement sera facturé immédiatement et de manière récurrente chaque année. Vous pouvez annuler à tout moment."
|
||||
},
|
||||
"paymentChargedWithTrial": {
|
||||
"message": "Votre plan comprend un essai gratuit de 7 jours. Votre mode de paiement ne sera pas facturé avant la fin de la période d'essai. La facturation se fera sur une base récurrente chaque $INTERVAL$. Vous pouvez annuler à tout moment.",
|
||||
"message": "Votre offre comprend un essai gratuit de 7 jours. Votre mode de paiement ne sera pas facturé avant la fin de la période d'essai. La facturation se fera sur une base récurrente chaque $INTERVAL$. Vous pouvez annuler à tout moment.",
|
||||
"placeholders": {
|
||||
"interval": {
|
||||
"content": "$1",
|
||||
@@ -1373,7 +1451,7 @@
|
||||
"message": "Rétablir l’abonnement"
|
||||
},
|
||||
"reinstateConfirmation": {
|
||||
"message": "Êtes-vous sûr de vouloir supprimer la demande d’annulation en attente et rétablir votre abonnement ?"
|
||||
"message": "Êtes-vous sûr de vouloir retirer la demande d’annulation en attente et rétablir votre abonnement ?"
|
||||
},
|
||||
"reinstated": {
|
||||
"message": "Votre abonnement a été rétabli."
|
||||
@@ -1415,7 +1493,7 @@
|
||||
"message": "Ajouter du stockage"
|
||||
},
|
||||
"removeStorage": {
|
||||
"message": "Supprimer le stockage"
|
||||
"message": "Retirer du stockage"
|
||||
},
|
||||
"subscriptionStorage": {
|
||||
"message": "Votre abonnement a un total de $MAX_STORAGE$ Go de stockage de fichiers chiffrés. Vous utilisez actuellement $USED_STORAGE$.",
|
||||
@@ -1462,7 +1540,7 @@
|
||||
"message": "Go de stockage à ajouter"
|
||||
},
|
||||
"gbStorageRemove": {
|
||||
"message": "Go de stockage à supprimer"
|
||||
"message": "Go de stockage à retirer"
|
||||
},
|
||||
"storageAddNote": {
|
||||
"message": "L'ajout d'espace de stockage entraînera des ajustements sur vos totaux de facturation et facturera immédiatement le moyen de paiement enregistré. La première facturation sera calculée au prorata du reste du cycle de facturation en cours."
|
||||
@@ -1471,7 +1549,7 @@
|
||||
"message": "La suppression d'espace de stockage entraînera des ajustements sur vos totaux de facturation qui seront calculés au prorata et portés au crédit de votre prochaine facturation."
|
||||
},
|
||||
"adjustedStorage": {
|
||||
"message": "Ajusté à $AMOUNT$ GB de stockage.",
|
||||
"message": "$AMOUNT$ Go de stockage mis à jour.",
|
||||
"placeholders": {
|
||||
"amount": {
|
||||
"content": "$1",
|
||||
@@ -1504,16 +1582,16 @@
|
||||
}
|
||||
},
|
||||
"uploadLicenseFilePremium": {
|
||||
"message": "Pour mettre à niveau votre compte vers un abonnement premium, vous devez télécharger un fichier de licence valide."
|
||||
"message": "Pour mettre à niveau votre compte vers un abonnement premium, vous devez fournir un fichier de licence valide."
|
||||
},
|
||||
"uploadLicenseFileOrg": {
|
||||
"message": "Pour créer sur un site hébergé un organisation vous devez télécharger un fichier de licence valide."
|
||||
"message": "Pour créer une organisation sur une instance auto-hébergée vous devez fournir un fichier de licence valide."
|
||||
},
|
||||
"accountEmailMustBeVerified": {
|
||||
"message": "Votre adresse de messagerie principale doit être vérifiée."
|
||||
"message": "L'adresse e-mail de votre compte doit être vérifiée."
|
||||
},
|
||||
"newOrganizationDesc": {
|
||||
"message": "Les organisations permettent de partager des parties de votre coffre-fort avec les autres ainsi que de gérer des utilisateurs pour une entité spécifique comme une famille, une petite équipe ou une grande entreprise."
|
||||
"message": "Les organisations permettent de partager des parties de votre coffre-fort avec d'autres personnes ainsi que de gérer des utilisateurs pour une entité spécifique comme une famille, une petite équipe ou une grande entreprise."
|
||||
},
|
||||
"generalInformation": {
|
||||
"message": "Informations générales"
|
||||
@@ -1531,22 +1609,22 @@
|
||||
"message": "Nom de l'entreprise"
|
||||
},
|
||||
"chooseYourPlan": {
|
||||
"message": "Choisissez votre plan"
|
||||
"message": "Choisissez votre offre"
|
||||
},
|
||||
"users": {
|
||||
"message": "Utilisateurs"
|
||||
},
|
||||
"userSeats": {
|
||||
"message": "Nombre de sièges utilisateurs"
|
||||
"message": "Licences utilisateur"
|
||||
},
|
||||
"additionalUserSeats": {
|
||||
"message": "Sièges d'utilisateurs supplémentaires"
|
||||
"message": "Licences utilisateur supplémentaires"
|
||||
},
|
||||
"userSeatsDesc": {
|
||||
"message": "# des sièges utilisateurs"
|
||||
"message": "Nombre de licences utilisateur"
|
||||
},
|
||||
"userSeatsAdditionalDesc": {
|
||||
"message": "Votre plan offre $BASE_SEATS$ accès utilisateurs. Vous pouvez ajouter des utilisateurs supplémentaires pour $SEAT_PRICE$ par utilisateur\/mois.",
|
||||
"message": "Votre offre comprend $BASE_SEATS$ licences utilisateurs. Vous pouvez ajouter des utilisateurs supplémentaires pour $SEAT_PRICE$ par utilisateur\/mois.",
|
||||
"placeholders": {
|
||||
"base_seats": {
|
||||
"content": "$1",
|
||||
@@ -1559,14 +1637,14 @@
|
||||
}
|
||||
},
|
||||
"userSeatsHowManyDesc": {
|
||||
"message": "De combien de comptes utilisateur avez-vous besoin ? Vous pouvez également en ajouter ultérieurement si besoin."
|
||||
"message": "De combien de licences utilisateur avez-vous besoin ? Vous pouvez également en ajouter ultérieurement si besoin."
|
||||
},
|
||||
"planNameFree": {
|
||||
"message": "Gratuit",
|
||||
"description": "Free as in 'free beer'."
|
||||
},
|
||||
"planDescFree": {
|
||||
"message": "Pour les utilisateurs de test ou utilisateurs individuels à partager avec $COUNT$ autres utilisateurs.",
|
||||
"message": "Pour tester ou pour les utilisateurs individuels qui souhaitent partager avec $COUNT$ autre(s) utilisateur(s).",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1578,25 +1656,25 @@
|
||||
"message": "Familles"
|
||||
},
|
||||
"planDescFamilies": {
|
||||
"message": "Pour utilisation personnelle, pour partager avec la famille et les amis."
|
||||
"message": "Pour une utilisation personnelle, pour partager avec la famille et les amis."
|
||||
},
|
||||
"planNameTeams": {
|
||||
"message": "Équipes"
|
||||
},
|
||||
"planDescTeams": {
|
||||
"message": "Pour les entreprises et autres petites équipes."
|
||||
"message": "Pour les entreprises et autres équipes."
|
||||
},
|
||||
"planNameEnterprise": {
|
||||
"message": "Entreprise"
|
||||
},
|
||||
"planDescEnterprise": {
|
||||
"message": "Pour entreprises et autres grandes organisations."
|
||||
"message": "Pour les entreprises et autres grandes organisations."
|
||||
},
|
||||
"freeForever": {
|
||||
"message": "Gratuit pour toujours"
|
||||
},
|
||||
"includesXUsers": {
|
||||
"message": "inclus $COUNT$ utilisateurs",
|
||||
"message": "comprend $COUNT$ utilisateurs",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1635,7 +1713,7 @@
|
||||
}
|
||||
},
|
||||
"addShareLimitedUsers": {
|
||||
"message": "Ajoutez et partagez jusqu'à $COUNT$ utilisateurs",
|
||||
"message": "Ajoutez et partagez avec jusqu'à $COUNT$ utilisateurs",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1644,10 +1722,10 @@
|
||||
}
|
||||
},
|
||||
"addShareUnlimitedUsers": {
|
||||
"message": "Ajouter et partager avec un nombre illimité d'utilisateurs"
|
||||
"message": "Ajoutez et partagez avec un nombre illimité d'utilisateurs"
|
||||
},
|
||||
"createUnlimitedCollections": {
|
||||
"message": "Créer un nombre illimité de collections"
|
||||
"message": "Créez un nombre illimité de collections"
|
||||
},
|
||||
"gbEncryptedFileStorage": {
|
||||
"message": "$SIZE$ de stockage de fichiers chiffrés",
|
||||
@@ -1659,19 +1737,22 @@
|
||||
}
|
||||
},
|
||||
"onPremHostingOptional": {
|
||||
"message": "Hébergement à la demande (optionnel)"
|
||||
"message": "Hébergement local (optionnel)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Les utilisateurs auront accès aux fonctionnalités premium"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Contrôler l'accès des utilisateurs avec des groupes"
|
||||
"message": "Contrôlez l'accès des utilisateurs avec des groupes"
|
||||
},
|
||||
"syncUsersFromDirectory": {
|
||||
"message": "Synchroniser vos utilisateurs et les groupes à partir d’un répertoire"
|
||||
"message": "Synchronisez vos utilisateurs et vos groupes à partir d’un répertoire"
|
||||
},
|
||||
"trackAuditLogs": {
|
||||
"message": "Suivre les actions avec les logs d'audit"
|
||||
"message": "Suivez les actions des utilisateurs avec les journaux d'audit"
|
||||
},
|
||||
"enforce2faDuo": {
|
||||
"message": "Appliquer 2FA avec Duo"
|
||||
"message": "Forcez l'authentification double facteurs (2FA) avec Duo"
|
||||
},
|
||||
"priorityCustomerSupport": {
|
||||
"message": "Support client prioritaire"
|
||||
@@ -1698,7 +1779,7 @@
|
||||
"message": "L'organisation a été créée"
|
||||
},
|
||||
"organizationReadyToGo": {
|
||||
"message": "Votre nouvelle organisation est prête!"
|
||||
"message": "Votre nouvelle organisation est prête !"
|
||||
},
|
||||
"leave": {
|
||||
"message": "Quitter"
|
||||
@@ -1716,7 +1797,7 @@
|
||||
"message": "Obtenir de l'aide"
|
||||
},
|
||||
"getApps": {
|
||||
"message": "Téléchargez l'app"
|
||||
"message": "Télécharger les applications"
|
||||
},
|
||||
"loggedInAs": {
|
||||
"message": "Connecté en tant que"
|
||||
@@ -1746,22 +1827,22 @@
|
||||
"message": "Êtes-vous sûr de vouloir retirer cet utilisateur ?"
|
||||
},
|
||||
"externalId": {
|
||||
"message": "Id externe"
|
||||
"message": "Identifiant externe"
|
||||
},
|
||||
"externalIdGroupDesc": {
|
||||
"message": "L’id externe est utilisé pour lier ce groupe à un système externe tel qu’un répertoire utilisateur."
|
||||
"message": "L’identifiant externe est utilisé pour lier ce groupe à un système externe tel qu’un répertoire utilisateur."
|
||||
},
|
||||
"accessControl": {
|
||||
"message": "Contrôle d’accès"
|
||||
},
|
||||
"groupAccessAllItems": {
|
||||
"message": "Ce groupe peut accéder et modifier tous les éléments."
|
||||
"message": "Ce groupe peut voir et modifier tous les éléments."
|
||||
},
|
||||
"groupAccessSelectedCollections": {
|
||||
"message": "Ce groupe peut accéder uniquement aux collections sélectionnées."
|
||||
},
|
||||
"readOnly": {
|
||||
"message": "En lecture seule"
|
||||
"message": "Lecture seule"
|
||||
},
|
||||
"newCollection": {
|
||||
"message": "Nouvelle collection"
|
||||
@@ -1770,7 +1851,7 @@
|
||||
"message": "Ajouter une collection"
|
||||
},
|
||||
"editCollection": {
|
||||
"message": "Éditer la collection"
|
||||
"message": "Modifier la collection"
|
||||
},
|
||||
"deleteCollectionConfirmation": {
|
||||
"message": "Êtes-vous sûr de vouloir supprimer cette collection?"
|
||||
@@ -1782,7 +1863,7 @@
|
||||
"message": "Inviter un utilisateur"
|
||||
},
|
||||
"inviteUserDesc": {
|
||||
"message": "Invitez un nouvel utilisateur de votre organisation en entrant son adresse e-mail de compte Bitwarden ci-dessous. Si ils n’ont pas déjà un compte Bitwarden, il leur sera demané de créer un nouveau compte."
|
||||
"message": "Invitez de nouveaux utilisateurs à votre organisation en entrant leur adresse e-mail de compte Bitwarden ci-dessous. S'ils n’ont pas déjà un compte Bitwarden, il leur sera demandé d'en créer un nouveau."
|
||||
},
|
||||
"inviteMultipleEmailDesc": {
|
||||
"message": "Vous pouvez inviter jusqu'à $COUNT$ utilisateurs à la fois en séparant les adresses e-mail par une virgule.",
|
||||
@@ -1794,7 +1875,7 @@
|
||||
}
|
||||
},
|
||||
"userAccessAllItems": {
|
||||
"message": "Cet utilisateur peut accéder et modifier tous les éléments."
|
||||
"message": "Cet utilisateur peut voir et modifier tous les éléments."
|
||||
},
|
||||
"userAccessSelectedCollections": {
|
||||
"message": "Cet utilisateur peut accéder uniquement aux collections sélectionnées."
|
||||
@@ -1818,16 +1899,16 @@
|
||||
"message": "L’utilisateur avec l’accès le plus élevé qui peut gérer tous les aspects de votre organisation."
|
||||
},
|
||||
"admin": {
|
||||
"message": "Admin"
|
||||
"message": "Administrateur"
|
||||
},
|
||||
"adminDesc": {
|
||||
"message": " Les Admins peuvent accéder et gérer tous les éléments, les collections et les utilisateurs de votre organisation."
|
||||
"message": " Les administrateurs peuvent voir et gérer tous les éléments, les collections et les utilisateurs de votre organisation."
|
||||
},
|
||||
"user": {
|
||||
"message": "Utilisateur"
|
||||
},
|
||||
"userDesc": {
|
||||
"message": "Un utilisateur avec l’accès aux collections de votre organisation."
|
||||
"message": "Un utilisateur normal avec accès aux collections de votre organisation."
|
||||
},
|
||||
"all": {
|
||||
"message": "Tous"
|
||||
@@ -1839,13 +1920,13 @@
|
||||
"message": "Horodatage"
|
||||
},
|
||||
"event": {
|
||||
"message": "Événement"
|
||||
"message": "Évènement"
|
||||
},
|
||||
"unknown": {
|
||||
"message": "Inconnu"
|
||||
},
|
||||
"loadMore": {
|
||||
"message": "Plus de Résultats"
|
||||
"message": "Plus de résultats"
|
||||
},
|
||||
"mobile": {
|
||||
"message": "Mobile",
|
||||
@@ -1860,7 +1941,7 @@
|
||||
"description": "Desktop app"
|
||||
},
|
||||
"webVault": {
|
||||
"message": "Coffre-fort web"
|
||||
"message": "Coffre web"
|
||||
},
|
||||
"loggedIn": {
|
||||
"message": "Connecté."
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Mot de passe changé."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Connexion en deux étapes activée."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Connexion en deux étapes activée\/mise à jour."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Connexion en deux étapes désactivée."
|
||||
@@ -1881,7 +1962,7 @@
|
||||
"message": "Tentative de connexion avec mot de passe incorrect."
|
||||
},
|
||||
"failedLogin2fa": {
|
||||
"message": "Tentative de connexion échouée avec login en deux étapes incorrect."
|
||||
"message": "Tentative de connexion échouée avec deuxième facteur incorrect."
|
||||
},
|
||||
"editedOrgSettings": {
|
||||
"message": "Paramètres de l’organisation modifiés."
|
||||
@@ -1896,7 +1977,7 @@
|
||||
}
|
||||
},
|
||||
"editedItemId": {
|
||||
"message": "Élément $ID$ édité.",
|
||||
"message": "Élément $ID$ modifié.",
|
||||
"placeholders": {
|
||||
"id": {
|
||||
"content": "$1",
|
||||
@@ -1914,7 +1995,7 @@
|
||||
}
|
||||
},
|
||||
"sharedItemId": {
|
||||
"message": "Partage de l'élément $ID$.",
|
||||
"message": "Élément $ID$ partagé.",
|
||||
"placeholders": {
|
||||
"id": {
|
||||
"content": "$1",
|
||||
@@ -1977,7 +2058,7 @@
|
||||
}
|
||||
},
|
||||
"removedUserId": {
|
||||
"message": "Utilisateur $ID$ supprimé.",
|
||||
"message": "Utilisateur $ID$ retiré.",
|
||||
"placeholders": {
|
||||
"id": {
|
||||
"content": "$1",
|
||||
@@ -2067,16 +2148,16 @@
|
||||
"message": "Type d'utilisateur"
|
||||
},
|
||||
"groupAccess": {
|
||||
"message": "Accès des groupes"
|
||||
"message": "Accès groupes"
|
||||
},
|
||||
"groupAccessUserDesc": {
|
||||
"message": "Modifier les groupes auxquels appartient cet utilisateur."
|
||||
},
|
||||
"invitedUsers": {
|
||||
"message": "Utilisateurs invités."
|
||||
"message": "Utilisateur(s) invité(s)."
|
||||
},
|
||||
"resendInvitation": {
|
||||
"message": "Renvoyer l'Invitation"
|
||||
"message": "Renvoyer l'invitation"
|
||||
},
|
||||
"hasBeenReinvited": {
|
||||
"message": "$USER$ a été réinvité.",
|
||||
@@ -2106,34 +2187,34 @@
|
||||
"message": "Vous avez des utilisateurs qui ont accepté leur invitation mais ils doivent être confirmés. Les utilisateurs n'auront pas accès à l'organisation jusqu'à ce qu'ils soient confirmés."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Date de départ"
|
||||
"message": "Date de début"
|
||||
},
|
||||
"endDate": {
|
||||
"message": "Date de Fin"
|
||||
"message": "Date de fin"
|
||||
},
|
||||
"verifyEmail": {
|
||||
"message": "Vérifier l'adresse email"
|
||||
"message": "Vérifier l'adresse e-mail"
|
||||
},
|
||||
"verifyEmailDesc": {
|
||||
"message": "Vérifiez l'adresse mail de votre compte pour débloquer l'ensemble des fonctionnalités."
|
||||
"message": "Vérifiez l'adresse e-mail de votre compte pour débloquer l'ensemble des fonctionnalités."
|
||||
},
|
||||
"verifyEmailFirst": {
|
||||
"message": "Votre adresse de messagerie principale doit d'abord être vérifiée."
|
||||
"message": "L'adresse e-mail de votre compte doit d'abord être vérifiée."
|
||||
},
|
||||
"checkInboxForVerification": {
|
||||
"message": "Vérifiez votre email pour le lien de vérification."
|
||||
"message": "Vérifiez votre boîte de réception pour le lien de vérification."
|
||||
},
|
||||
"emailVerified": {
|
||||
"message": "Votre adresse e-mail a été vérifiée."
|
||||
},
|
||||
"emailVerifiedFailed": {
|
||||
"message": "Impossible de vérifier votre adresse mail. Essayez de renvoyer un nouveau mail de vérification."
|
||||
"message": "Impossible de vérifier votre adresse e-mail. Essayez de renvoyer un nouvel e-mail de vérification."
|
||||
},
|
||||
"updateBrowser": {
|
||||
"message": "Mettre à jour le navigateur"
|
||||
},
|
||||
"updateBrowserDesc": {
|
||||
"message": "Vous utilisez un navigateur non supporté, Le coffre-fort web pourrait ne pas fonctionner correctement."
|
||||
"message": "Vous utilisez un navigateur non supporté. Le coffre web pourrait ne pas fonctionner correctement."
|
||||
},
|
||||
"joinOrganization": {
|
||||
"message": "Rejoindre l'organisation"
|
||||
@@ -2145,28 +2226,28 @@
|
||||
"message": "Invitation acceptée"
|
||||
},
|
||||
"inviteAcceptedDesc": {
|
||||
"message": "Vous pouvez accéder à cette organisation une fois qu’un administrateur confirme votre adhésion. Nous vous enverrons un email quand cela se produit."
|
||||
"message": "Vous pouvez accéder à cette organisation une fois qu’un administrateur aura confirmé votre adhésion. Nous vous enverrons un e-mail lorsque ce sera fait."
|
||||
},
|
||||
"inviteAcceptFailed": {
|
||||
"message": "Impossible d’accepter l’invitation. Demander à un administrateur d’organisation d’envoyer une nouvelle invitation."
|
||||
"message": "Impossible d’accepter l’invitation. Demandez à un administrateur de l'organisation d’envoyer une nouvelle invitation."
|
||||
},
|
||||
"rememberEmail": {
|
||||
"message": "Se souvenir de l'e-mail"
|
||||
},
|
||||
"recoverAccountTwoStepDesc": {
|
||||
"message": "Si vous ne pouvez pas accéder à votre compte grâce à vos méthodes de connexion normale en deux étapes, vous pouvez utiliser votre code de récupération de login en deux étapes pour désactiver tous les fournisseurs en deux étapes sur votre compte."
|
||||
"message": "Si vous ne pouvez pas accéder à votre compte grâce à vos méthodes de connexion en deux étapes habituelles, vous pouvez utiliser votre code de récupération de connexion en deux étapes pour désactiver tous les fournisseurs en deux étapes sur votre compte."
|
||||
},
|
||||
"recoverAccountTwoStep": {
|
||||
"message": "Récupérer votre compte d'authentification à deux étapes"
|
||||
},
|
||||
"twoStepRecoverDisabled": {
|
||||
"message": "Ce fournisseur de connexion en deux étapes a été désactivé sur votre compte."
|
||||
"message": "L'authentification en deux étapes a été désactivée sur votre compte."
|
||||
},
|
||||
"learnMore": {
|
||||
"message": "En savoir plus"
|
||||
},
|
||||
"deleteRecoverDesc": {
|
||||
"message": "Entrez votre adresse email ci-dessous pour récupérer et supprimer votre compte."
|
||||
"message": "Entrez votre adresse e-mail ci-dessous pour récupérer et supprimer votre compte."
|
||||
},
|
||||
"deleteRecoverEmailSent": {
|
||||
"message": "Si votre compte existe, nous vous avons envoyé un e-mail avec des instructions supplémentaires."
|
||||
@@ -2181,55 +2262,55 @@
|
||||
"message": "Supprimer l'organisation"
|
||||
},
|
||||
"deleteOrganizationDesc": {
|
||||
"message": "Confirmez ci-dessous pour supprimer cette organisation ainsi que toutes les données associées. Les comptes des utilisateurs restent inchangés mais ils ne seront plus associés à cette organisation. "
|
||||
"message": "Poursuivez ci-dessous pour supprimer cette organisation ainsi que toutes les données associées. Les comptes des utilisateurs restent inchangés mais ils ne seront plus associés à cette organisation. "
|
||||
},
|
||||
"deleteOrganizationWarning": {
|
||||
"message": "La suppression d'une organisation est permanente. Elle ne peut être annulée."
|
||||
"message": "La suppression d'une organisation est définitive. Elle ne peut être annulée."
|
||||
},
|
||||
"organizationDeleted": {
|
||||
"message": "Organisation supprimée"
|
||||
},
|
||||
"organizationDeletedDesc": {
|
||||
"message": "L’organisation et toutes ses données associées a été supprimées."
|
||||
"message": "L’organisation et toutes les données associées ont été supprimées."
|
||||
},
|
||||
"organizationUpdated": {
|
||||
"message": "Organisation mise à jour"
|
||||
},
|
||||
"taxInformation": {
|
||||
"message": "Information fiscale"
|
||||
"message": "Informations fiscales"
|
||||
},
|
||||
"taxInformationDesc": {
|
||||
"message": "Veuillez contacter le support pour fournir (ou mettre à jour) des renseignements fiscaux pour vos factures."
|
||||
"message": "Veuillez contacter le support pour fournir (ou mettre à jour) les informations fiscales pour vos factures."
|
||||
},
|
||||
"billingPlan": {
|
||||
"message": "Pack",
|
||||
"message": "Offre",
|
||||
"description": "A billing plan\/package. For example: families, teams, enterprise, etc."
|
||||
},
|
||||
"changeBillingPlan": {
|
||||
"message": "Changement de pack",
|
||||
"message": "Changer d'offre",
|
||||
"description": "A billing plan\/package. For example: families, teams, enterprise, etc."
|
||||
},
|
||||
"changeBillingPlanDesc": {
|
||||
"message": "Contacter l’assistance clientèle si vous souhaitez modifier votre plan. Veuillez vous assurer que vous disposez d’une méthode de paiement actif ajoutée au compte.",
|
||||
"message": "Contactez le support client si vous souhaitez changer d'offre. Veuillez vous assurer que vous disposez d’un moyen de paiement actif sur votre compte.",
|
||||
"description": "A billing plan\/package. For example: families, teams, enterprise, etc."
|
||||
},
|
||||
"invoice": {
|
||||
"message": "Facture"
|
||||
},
|
||||
"verifyBankAccount": {
|
||||
"message": "Vérification du compte bancaire"
|
||||
"message": "Vérifier le compte bancaire"
|
||||
},
|
||||
"verifyBankAccountDesc": {
|
||||
"message": "Nous avons effectué deux faibles dépôts sur votre compte bancaire (cela peut prendre 1-2 jours ouvrés pour les voir). Saisissez ces montants pour valider le compte bancaire."
|
||||
"message": "Nous avons effectué deux dépôts d'un faible montant sur votre compte bancaire (ils peuvent prendre 1-2 jours ouvrés pour apparaître). Saisissez ces montants pour valider le compte bancaire."
|
||||
},
|
||||
"verifyBankAccountInitialDesc": {
|
||||
"message": "Le paiement avec un compte bancaire est seulement disponible pour les clients résidant aux États-Unis. Il vous sera demandé de valider votre compte bancaire. Nous effectuerons deux faibles dépôts sous 1-2 jours ouvrés. Saisissez les montants sur la page de facturation de votre organisation pour valider votre compte bancaire."
|
||||
"message": "Le paiement avec un compte bancaire est seulement disponible pour les clients résidant aux États-Unis. Il vous sera demandé de valider votre compte bancaire. Nous effectuerons deux dépôts d'un faible montant sous 1-2 jours ouvrés. Saisissez ces montants sur la page de facturation de votre organisation pour valider votre compte bancaire."
|
||||
},
|
||||
"verifyBankAccountFailureWarning": {
|
||||
"message": "Une erreur lors de la validation de votre compte bancaire annulera le paiement et votre abonnement sera désactivé."
|
||||
},
|
||||
"verifiedBankAccount": {
|
||||
"message": "Votre compte bancaire a été vérifié."
|
||||
"message": "Le compte bancaire a été vérifié."
|
||||
},
|
||||
"bankAccount": {
|
||||
"message": "Compte bancaire"
|
||||
@@ -2258,7 +2339,7 @@
|
||||
"message": "Type de compte"
|
||||
},
|
||||
"bankAccountTypeCompany": {
|
||||
"message": "Entreprise (Professionnel)"
|
||||
"message": "Entreprise (professionnel)"
|
||||
},
|
||||
"bankAccountTypeIndividual": {
|
||||
"message": "Individuel (personnel)"
|
||||
@@ -2267,11 +2348,11 @@
|
||||
"message": "Entrez votre id d’installation"
|
||||
},
|
||||
"addSeats": {
|
||||
"message": "Ajouter des sièges",
|
||||
"message": "Ajouter des licences",
|
||||
"description": "Seat = User Seat"
|
||||
},
|
||||
"removeSeats": {
|
||||
"message": "Retirer les sièges",
|
||||
"message": "Retirer des licences",
|
||||
"description": "Seat = User Seat"
|
||||
},
|
||||
"subscriptionUserSeats": {
|
||||
@@ -2284,19 +2365,19 @@
|
||||
}
|
||||
},
|
||||
"seatsToAdd": {
|
||||
"message": "Sièges à ajouter"
|
||||
"message": "Licences à ajouter"
|
||||
},
|
||||
"seatsToRemove": {
|
||||
"message": "Sièges à enlever"
|
||||
"message": "Licences à retirer"
|
||||
},
|
||||
"seatsAddNote": {
|
||||
"message": "L'ajout de sièges utilisateur va entraîner des ajustements sur votre facturation globale et débiter immédiatement la méthode de paiement courante. Le premier paiement sera calculée au prorata du reste de l’actuel cycle de facturation."
|
||||
"message": "L'ajout de licences utilisateur entraînera des ajustements sur vos totaux de facturation et facturera immédiatement le moyen de paiement enregistré. La première facturation sera calculée au prorata du reste du cycle de facturation en cours."
|
||||
},
|
||||
"seatsRemoveNote": {
|
||||
"message": "La suppression de sièges utilisateur va entraîner des ajustements sur votre facturation globale, ils seront calculés au prorata en tant que crédit pour votre prochaine facturation."
|
||||
"message": "La suppression de licences utilisateur entraînera des ajustements sur vos totaux de facturation qui seront calculés au prorata et portés au crédit de votre prochaine facturation."
|
||||
},
|
||||
"adjustedSeats": {
|
||||
"message": "$AMOUNT$ comptes utilisateurs mis à jour.",
|
||||
"message": "$AMOUNT$ licences utilisateurs mis à jour.",
|
||||
"placeholders": {
|
||||
"amount": {
|
||||
"content": "$1",
|
||||
@@ -2314,13 +2395,13 @@
|
||||
"message": "Mettre à jour la clé de chiffrement"
|
||||
},
|
||||
"updateEncryptionKeyShortDesc": {
|
||||
"message": "Vous utilisez un moyen de chiffrement obsolète."
|
||||
"message": "Vous utilisez actuellement un moyen de chiffrement obsolète."
|
||||
},
|
||||
"updateEncryptionKeyDesc": {
|
||||
"message": "Nous sommes passés à des clés de chiffrement plus importantes qui fournissent une meilleure sécurité et offrent de nouvelles fonctionnalités. La mise à jour de votre clé de chiffrement est rapide et facile.\nTapez simplement votre mot de passe maître ci-dessous. Cette mise à jour deviendra peut-être obligatoire."
|
||||
"message": "Nous sommes passés à des clés de chiffrement plus longues qui fournissent une meilleure sécurité et permettent l'accès à de nouvelles fonctionnalités. La mise à jour de votre clé de chiffrement est rapide et facile. Tapez simplement votre mot de passe maître ci-dessous. Cette mise à jour deviendra peut-être obligatoire."
|
||||
},
|
||||
"updateEncryptionKeyWarning": {
|
||||
"message": "Après avoir mis à jour votre clé de chiffrement, vous devrez vous reconnecter sur toutes les applications Bitwarden que vous utilisez actuellement (comme l'appli mobile, les extensions de navigateur). Une erreur lors de la réconnexion (téléchargement de la nouvelle clé) peut amener à une corruption des données. Nous allons essayer de vous déconnecter automatiquement, mais cela demande un peu de temps."
|
||||
"message": "Après avoir mis à jour votre clé de chiffrement, vous devrez vous reconnecter sur toutes les applications Bitwarden que vous utilisez actuellement (comme par exemple l'application mobile ou les extensions de navigateur). Le fait de ne pas vous déconnecter et de vous reconnecter (ce qui télécharge votre nouvelle clé de chiffrement) pourrait entraîner une corruption des données. Nous allons essayer de vous déconnecter automatiquement, mais cela demande un peu de temps."
|
||||
},
|
||||
"subscription": {
|
||||
"message": "Abonnement"
|
||||
@@ -2335,10 +2416,10 @@
|
||||
"message": "Mettre à jour l'organisation"
|
||||
},
|
||||
"upgradeOrganizationDesc": {
|
||||
"message": "Cette fonctionnalité n'est pas disponible pour les organisations gratuites. Passez à un plan payé pour déverouiller plus de fonctionnalités."
|
||||
"message": "Cette fonctionnalité n'est pas disponible pour les organisations gratuites. Passez à une offre payante pour déverouiller plus de fonctionnalités."
|
||||
},
|
||||
"createOrganizationStep1": {
|
||||
"message": "Créer une organisation: Etape 1"
|
||||
"message": "Créer une organisation: Étape 1"
|
||||
},
|
||||
"createOrganizationCreatePersonalAccount": {
|
||||
"message": "Avant de créer votre organisation, vous devez d’abord créer un compte personnel gratuit."
|
||||
@@ -2347,14 +2428,14 @@
|
||||
"message": "Remboursé"
|
||||
},
|
||||
"nothingSelected": {
|
||||
"message": "Vous n'avez rien selectionné."
|
||||
"message": "Vous n'avez rien sélectionné."
|
||||
},
|
||||
"submitAgreePolicies": {
|
||||
"message": "En cliquant sur le bouton « Soumettre », vous acceptez les politiques suivantes :",
|
||||
"description": "A policy is something like Terms of Service, Privacy Policy, etc."
|
||||
},
|
||||
"termsOfService": {
|
||||
"message": "\"Conditions d'utilisation\""
|
||||
"message": "Conditions d'utilisation"
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Politique de confidentialité"
|
||||
@@ -2387,7 +2468,7 @@
|
||||
"message": "4 heures"
|
||||
},
|
||||
"onRefresh": {
|
||||
"message": "Au rafraîchissement du navigateur"
|
||||
"message": "Au rechargement de la page"
|
||||
},
|
||||
"dateUpdated": {
|
||||
"message": "Mis à jour",
|
||||
|
||||
2487
src/locales/hu/messages.json
Normal file
2487
src/locales/hu/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "パスワード"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "メモ"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Length"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Password History"
|
||||
},
|
||||
@@ -817,7 +826,7 @@
|
||||
"message": "Code"
|
||||
},
|
||||
"changeEmailDesc": {
|
||||
"message": "We have emailed a verification code to $EMAIL$. Please check your email for this code and enter it below to finalize your the email address change.",
|
||||
"message": "認証コードのメールを $EMAIL$ に送信しました。メールアドレスの変更を完了するには、メールを確認してコードを以下に入力してください。",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"content": "$1",
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirm New Master Password"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Encryption Key Settings"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF Algorithm"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF Iterations"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker. We recommend a value of $VALUE$ or more.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Setting your KDF iterations too high could result in poor performance when logging into (and unlocking) Bitwarden on devices with slower CPUs. We recommend that you increase the value in increments of $INCREMENT$ and then test all of your devices.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Change KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Encryption Key Settings Changed"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Danger Zone"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Purge Vault"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Purging your vault is permanent. It cannot be undone."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "A premium membership is required to use this feature."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "You have premium access"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "You already have access to premium features because of an organization you are a member of."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Manage"
|
||||
},
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Add a new YubiKey to your account"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Plug the YubiKey (NEO or 4 series) into your computer's USB port."
|
||||
"message": "YubiKey をコンピューターの USB ポートに挿入してください。"
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "最初の未入力の YubiKey 入力フィールドを選択してください。"
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC Support"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Add a FIDO U2F security key to your account"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Plug the security key into your computer's USB port."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "If the security key has a button, touch it."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Waiting for you to touch the button on your security key"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Click the \"Enable\" button below to enable this security key for two-step login."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "There was a problem reading the security key."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Your Bitwarden two-step login recovery code"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "On-premise hosting (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Users get access to premium membership features"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Control user access with groups"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Changed account password."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Enabled two-step login."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Disabled two-step login."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Passord"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notater"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Lengde"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Antall ord"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Passordhistorikk"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Bekreft det nye superpassordet"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Innstillinger for krypteringsnøkkel"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF Algoritmen"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF gjentakelser"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Høyere KDF gjentakelser kan beskytte hovedpassordet fra blir brute tvunget av angriperen. Verdien $VALUE$ eller mer anbefales.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Setting your KDF iterations too high could result in poor performance when logging into (and unlocking) Bitwarden on devices with slower CPUs. We recommend that you increase the value in increments of $INCREMENT$ and then test all of your devices.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Endre KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Encryption Key Settings Changed"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Faresone"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Tøm hvelvet"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Fortsett nedenfor for å slette alle gjenstander og mapper i ditt hvelv. Gjenstander som tilhører en organisasjon som du deler med, vil ikke bli slettet."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Å tømme hvelvet ditt er permanent. Det kan ikke bli angret på."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Et Premium-medlemskap er påkrevd for å bruke denne funksjonen."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Du har premium tilgang"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Du har allerede tilgang til premiumfunksjoner på grunn av en organisasjon du er medlem av."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Behandle"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC-støtte"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Legg til en FIDO U2F-sikkerhetsnøkkel til din konto"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Sett inn sikkerhetsnøkkelen i din datamaskins USB-port."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Er du sikker på at du vil fjerne denne sikkerhetsnøkkelen?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Dersom sikkerhetsnøkkelen har en knapp, trykk på den."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Lagre skjemaet."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "På grunn av plattformbegrensninger, kan FIDO U2F ikke bli brukt på alle Bitwarden-apper. Du burde skru på en annen 2-trinnsinnloggingsleverandør, sånn at du kan få tilgang til din konto når FIDO U2F ikke kan bli brukt. Støttede plattformer:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Venter på at du skal trykke på knappen på din sikkerhetsnøkkel"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Klikk på «Aktiver»-knappen nedenfor for å aktivere denne sikkerhetsnøkkelen for 2-trinnsinnlogging."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Det var et problem med å lese sikkerhetsnøkkelen."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Din 2-trinnsinnloggingsgjenopprettingskode for Bitwarden"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Lokal betjening (valgfritt)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Brukerne får tilgang til premium medlemskap funksjoner"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Kontroller brukertilgang med grupper"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Endret kontopassordet."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Skrudde på 2-trinnsinnlogging."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Skrudde av 2-trinnsinnlogging."
|
||||
@@ -2100,10 +2181,10 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Confirm Users"
|
||||
"message": "Bekreft brukere"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed."
|
||||
"message": "Du har brukere som har akseptert sin invitasjon, men må fortsatt bekreftes. Brukere vil ikke ha tilgang til organisasjonen før de er bekreftet."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Startdato"
|
||||
|
||||
2487
src/locales/nl/messages.json
Normal file
2487
src/locales/nl/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Hasło"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Hasło"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notatki"
|
||||
},
|
||||
@@ -272,7 +275,7 @@
|
||||
"message": "Rodzaje"
|
||||
},
|
||||
"typeLogin": {
|
||||
"message": "Login"
|
||||
"message": "Dane logowania"
|
||||
},
|
||||
"typeCard": {
|
||||
"message": "Karta"
|
||||
@@ -430,7 +433,7 @@
|
||||
"message": "Dodany element"
|
||||
},
|
||||
"editedItem": {
|
||||
"message": "Edytowany element"
|
||||
"message": "Element zmieniony"
|
||||
},
|
||||
"sharedItem": {
|
||||
"message": "Udostępniony element"
|
||||
@@ -463,7 +466,7 @@
|
||||
"message": "Czy na pewno chcesz zastąpić bieżące hasło?"
|
||||
},
|
||||
"editedFolder": {
|
||||
"message": "Edytowany folder"
|
||||
"message": "Folder zmieniony"
|
||||
},
|
||||
"addedFolder": {
|
||||
"message": "Dodany folder"
|
||||
@@ -499,7 +502,7 @@
|
||||
"message": "Zaloguj się lub utwórz nowe konto, aby uzyskać dostęp do Twojego bezpiecznego sejfu."
|
||||
},
|
||||
"createAccount": {
|
||||
"message": "Utwórz Konto"
|
||||
"message": "Utwórz konto"
|
||||
},
|
||||
"logIn": {
|
||||
"message": "Zaloguj się"
|
||||
@@ -526,7 +529,7 @@
|
||||
"message": "Wskazówka dotycząca hasła głównego może pomóc Ci przypomnieć sobie hasło, jeśli je zapomnisz."
|
||||
},
|
||||
"reTypeMasterPass": {
|
||||
"message": "Powtórz Hasło Główne"
|
||||
"message": "Powtórz hasło główne"
|
||||
},
|
||||
"masterPassHint": {
|
||||
"message": "Podpowiedź do hasła głównego (opcjonalnie)"
|
||||
@@ -541,7 +544,7 @@
|
||||
"message": "Podpowiedź do hasła"
|
||||
},
|
||||
"enterEmailToGetHint": {
|
||||
"message": "Podaj email powiązany z kontem, aby otrzymywać podpowiedź do hasła głównego."
|
||||
"message": "Podaj e-mail powiązany z kontem, aby otrzymywać podpowiedź do hasła głównego."
|
||||
},
|
||||
"getMasterPasswordHint": {
|
||||
"message": "Uzyskaj podpowiedź hasła głównego"
|
||||
@@ -571,7 +574,7 @@
|
||||
"message": "Wystąpił nieoczekiwany błąd."
|
||||
},
|
||||
"emailAddress": {
|
||||
"message": "Adres email"
|
||||
"message": "Adres e-mail"
|
||||
},
|
||||
"yourVaultIsLocked": {
|
||||
"message": "Twój sejf jest zablokowany. Wprowadź swoje hasło główne, aby kontynuować."
|
||||
@@ -589,7 +592,7 @@
|
||||
"message": "Brak elementów do wyświetlenia."
|
||||
},
|
||||
"noCollectionsInList": {
|
||||
"message": "Brak folderów do wyświetlenia."
|
||||
"message": "Brak kolekcji do wyświetlenia."
|
||||
},
|
||||
"noGroupsInList": {
|
||||
"message": "Brak grup do wyświetlenia."
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Długość"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Liczba słów"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Separator wyrazów"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Historia haseł"
|
||||
},
|
||||
@@ -847,10 +856,43 @@
|
||||
"message": "Aktualne hasło główne"
|
||||
},
|
||||
"newMasterPass": {
|
||||
"message": "Nowe hasło głowne:"
|
||||
"message": "Nowe hasło główne"
|
||||
},
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Potwierdź nowe hasło"
|
||||
"message": "Potwierdź nowe hasło główne"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Ustawienia klucza szyfrowania"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Algorytm KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Powtórzenia KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Wyższa liczba powtórzeń KDF może pomóc chronić Twoje hasło główne przed atakami typu brute force. Zalecamy ustawienie wartości $VALUE$ lub wyższej.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Ustawienie zbyt wysokiej liczby powtórzeń KDF może skutkować obniżeniem wydajności podczas logowania do Bitwarden (oraz odblokowywania sejfu) na urządzeniach z wolniejszym procesorem. Zalecamy stopniowe zwiększanie tej wartości o $INCREMENT$ i przetestowanie jej na wszystkich Twoich urządzeniach.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Zmień KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Zmieniono ustawienia klucza szyfrowania"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Strefa niebezpieczeństwa"
|
||||
@@ -862,7 +904,7 @@
|
||||
"message": "Zakończ sesje"
|
||||
},
|
||||
"deauthorizeSessionsDesc": {
|
||||
"message": "Concerned your account is logged in on another device? Proceed below to deauthorize all computers or devices that you have previously used. This security step is recommended if you previously used a public PC or accidentally saved your password on a device that isn't yours. This step will also clear all previously remembered two-step login sessions."
|
||||
"message": "Martwisz się tym, że jesteś zalogowany na innym urządzeniu? Kontynuuj poniżej, aby wylogować się ze wszystkich komputerów, których wcześniej używałeś. Tek krok bezpieczeństwa jest zalecany, jeśli korzystałeś z publicznego komputera lub przypadkowo zapisałeś swoje hasło na cudzym urządzeniu. Ten krok zdezaktywuje również wszystkie sesje z zapamiętanym logowaniem dwustopniowym."
|
||||
},
|
||||
"deauthorizeSessionsWarning": {
|
||||
"message": "Kontynuowanie spowoduje także wylogowanie cię z bieżącej sesji i będziesz musiał zalogować się ponownie. Zostaniesz również poproszony o dwustopniową autoryzację, jeśli ta opcja jest włączona. Aktywne sesje na innych urządzeniach mogą w dalszym ciągu pozostać aktywne przez maksymalnie godzinę."
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Wyczyść sejf"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Wyczyszczono sejf organizacji."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Kontynuuj poniżej, aby usunąć wszystkie elementy i foldery z Twojego sejfu. Elementy udostępnione organizacji nie zostaną usunięte."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Przejdź poniżej, aby usunąć wszystkie elementy z sejfu organizacji."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Wykasowanie sejfu jest nieodwracalne. Akcja ta nie może być cofnięta."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Członkostwo premium jest wymagane do korzystania z tej funkcji."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Masz dostęp do funkcji premium"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Posiadasz już dostęp do funkcji wersji premium dzięki organizacji, której jesteś członkiem."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Zarządzaj"
|
||||
},
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Dodaj nowy klucz YubiKey do swojego konta"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Włóż klucz YubiKey (NEO lub seria 4) do portu USB swojego komputera."
|
||||
"message": "Włóż YubiKey do portu USB swojego komputera."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Wybierz poniżej pierwsze wolne pole YubiKey."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Klucz U2F $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Obsługa NFC"
|
||||
},
|
||||
@@ -1163,19 +1226,34 @@
|
||||
"message": "Wprowadź 6-cyfrowy kod weryfikacyjny z e-maila"
|
||||
},
|
||||
"sendEmail": {
|
||||
"message": "Wyślij email"
|
||||
"message": "Wyślij e-mail"
|
||||
},
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Dodaj klucz bezpieczeństwa FIDO U2F do swojego konta"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Włóż klucz bezpieczeństwa do portu USB swojego komputera."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Czy jesteś pewien, że chcesz usunąć ten klucz bezpieczeństwa?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Odczytaj klucz"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Klucz został złamany."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Nadaj kluczowi bezpieczeństwa przyjazną nazwę, aby go łatwiej zidentyfikować."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Podłącz klucz bezpieczeństwa do portu USB komputera i kliknij przycisk \"Odczytaj klucz\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Jeśli klucz bezpieczeństwa posiada przycisk, dotknij go."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Zapisz formularz."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Z powodu ograniczeń platformy, FIDO U2F nie może być używany we wszystkich aplikacjach Bitwarden. Powinieneś włączyć inną metodę dwustopniowego logowania, tak abyś miał dostęp do swojego konta w sytuacji, gdy FIDO U2F nie będzie mógł zostać użyty. Sugerowane platformy:"
|
||||
"message": "Z powodu ograniczeń platformy, FIDO U2F nie może być używany we wszystkich aplikacjach Bitwarden. Powinieneś włączyć inną metodę dwustopniowego logowania, tak abyś miał dostęp do swojego konta w sytuacji, gdy FIDO U2F nie będzie mógł zostać użyty. Wspierane platformy:"
|
||||
},
|
||||
"twoFactorU2fSupportWeb": {
|
||||
"message": "Sejf internetowy i rozszerzenia przeglądarki na komputerze\/laptopie z przeglądarką obsługującą U2F (Chrome, Opera, Vivaldi lub Firefox z włączoną obsługą FIDO U2F)."
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Oczekiwanie na dotknięcie klucza bezpieczeństwa"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Kliknij przycisk \"Włącz\" poniżej, aby aktywować dwustopniowe logowanie za pomocą tego klucza bezpieczeństwa."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Kliknij przycisk \"Zapisz\" poniżej, aby włączyć ten klucz bezpieczeństwa dla dwustopniowego logowania."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Wystąpił problem z odczytem klucza bezpieczeństwa."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Wystąpił problem z odczytem klucza bezpieczeństwa. Spróbuj ponownie."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Twój kod odzyskiwania Bitwarden"
|
||||
@@ -1196,7 +1274,7 @@
|
||||
"message": "Nie aktywowano żadnego dostawcy dwustopniowego logowania. Po aktywowaniu dostawcy wróć tutaj, aby odczytać swój kod odzyskiwania."
|
||||
},
|
||||
"printCode": {
|
||||
"message": "Wydrukuj kody",
|
||||
"message": "Wydrukuj kod",
|
||||
"description": "Print 2FA recovery code"
|
||||
},
|
||||
"reports": {
|
||||
@@ -1206,7 +1284,7 @@
|
||||
"message": "Raport naruszenia danych"
|
||||
},
|
||||
"breachDesc": {
|
||||
"message": "\"Naruszenie\" jest zdarzeniem, w którym hakerzy uzyskali nielegalny dostęp do danych serwisu, a następnie je publicznie udostępnili. Przejrzyj rodzaj danych, które zostały naruszone (adresy e-mail, hasła, karty kredytowe itp.) i podejmij odpowiednie działania, takie jak zmiana hasła."
|
||||
"message": "\"Naruszenie\" jest zdarzeniem, w którym hakerzy uzyskali nielegalny dostęp do danych serwisu, a następnie je upublicznili. Przejrzyj rodzaj danych, które zostały naruszone (adresy e-mail, hasła, karty kredytowe itp.) i podejmij odpowiednie działania, takie jak zmiana hasła."
|
||||
},
|
||||
"breachCheckUsernameEmail": {
|
||||
"message": "Sprawdź nazwy użytkownika lub adresy e-mail, których używasz."
|
||||
@@ -1250,7 +1328,7 @@
|
||||
"message": "Strona"
|
||||
},
|
||||
"affectedUsers": {
|
||||
"message": "Poszkodowani Użytkownicy"
|
||||
"message": "Poszkodowani użytkownicy"
|
||||
},
|
||||
"breachOccurred": {
|
||||
"message": "Wystąpiło naruszenie"
|
||||
@@ -1269,13 +1347,13 @@
|
||||
"description": "Another way of saying \"Get a premium membership\""
|
||||
},
|
||||
"premiumUpdated": {
|
||||
"message": "Włączono Pakiet Premium."
|
||||
"message": "Włączono pakiet Premium."
|
||||
},
|
||||
"premiumUpgradeUnlockFeatures": {
|
||||
"message": "Zaktualizuj swoje konto do członkostwa premium i odblokuj fajne dodatkowe funkcje."
|
||||
"message": "Zaktualizuj swoje konto do członkostwa premium i odblokuj fajne, dodatkowe funkcje."
|
||||
},
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 GB miejsca na zaszyfrowane pliki."
|
||||
"message": "1 GB przestrzeni na zaszyfrowane pliki."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "Dodatkowe opcje dwustopniowego logowania, takie jak YubiKey, FIDO U2F i Duo."
|
||||
@@ -1337,10 +1415,10 @@
|
||||
"description": "Short abbreviation for 'month'"
|
||||
},
|
||||
"paymentChargedAnnually": {
|
||||
"message": "Your payment method will be charged immediately and on a recurring basis each year. You may cancel at any time."
|
||||
"message": "Twoja płatność zostanie zrealizowana natychmiast i będzie powtarzana corocznie. Możesz zrezygnować w dowolnej chwili."
|
||||
},
|
||||
"paymentChargedWithTrial": {
|
||||
"message": "Your plan comes with a free 7 day trial. Your card will not be charged until the trial has ended and on a recurring basis each $INTERVAL$. You may cancel at any time.",
|
||||
"message": "Twój plan zawiera 7-dniowy okres próbny. W tym czasie nie poniesiesz żadnych kosztów. Płatność będzie realizowana co $INTERVAL$. Możesz zrezygnować w dowolnym czasie.",
|
||||
"placeholders": {
|
||||
"interval": {
|
||||
"content": "$1",
|
||||
@@ -1566,7 +1644,7 @@
|
||||
"description": "Free as in 'free beer'."
|
||||
},
|
||||
"planDescFree": {
|
||||
"message": "Dla celów testowych lub użytkowników indywidualnych możesz udostępniać elementy $COUNT$ innym użytkownikom.",
|
||||
"message": "Dla celów testowych lub użytku osobistego możesz udostępniać elementy $COUNT$ innym użytkownikom.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Hosting na własnym serwerze (opcjonalny)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Użytkownicy uzyskują dostęp do funkcji członkostwa premium"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Kontroluj dostęp z użyciem grup użytkowników"
|
||||
},
|
||||
@@ -1716,13 +1797,13 @@
|
||||
"message": "Uzyskaj pomoc"
|
||||
},
|
||||
"getApps": {
|
||||
"message": "Pobierz aplikację"
|
||||
"message": "Pobierz aplikacje"
|
||||
},
|
||||
"loggedInAs": {
|
||||
"message": "Zalogowany jako"
|
||||
},
|
||||
"eventLogs": {
|
||||
"message": "Dziennik Zdarzeń"
|
||||
"message": "Dziennik zdarzeń"
|
||||
},
|
||||
"people": {
|
||||
"message": "Ludzie"
|
||||
@@ -1868,14 +1949,14 @@
|
||||
"changedPassword": {
|
||||
"message": "Zmieniono hasło do konta."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Włączono dwustopniowe logowanie."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Włączono\/zaktualizowano dwustopniowe logowanie."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Wyłączono dwustopniowe logowanie."
|
||||
},
|
||||
"recovered2fa": {
|
||||
"message": "Recovered account from two-step login."
|
||||
"message": "Dwustopniowe logowanie zostało zdezaktywowane."
|
||||
},
|
||||
"failedLogin": {
|
||||
"message": "Logowanie nie powiodło się z powodu błędnego hasła."
|
||||
@@ -2070,7 +2151,7 @@
|
||||
"message": "Dostęp grupowy"
|
||||
},
|
||||
"groupAccessUserDesc": {
|
||||
"message": "Zmieniono grupy, do których należy użytkownik."
|
||||
"message": "Zmień grupy, do których należy użytkownik."
|
||||
},
|
||||
"invitedUsers": {
|
||||
"message": "Zaproszeni użytkownicy."
|
||||
@@ -2103,7 +2184,7 @@
|
||||
"message": "Zatwierdź użytkowników"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "Istnieją użytkownicy, którzy przyjęli zaproszenie, ale muszą jeszcze zostać zatwierdzeni. Użytkownicy nie mają dostępu do organizacji, dopóki nie zostaną potwierdzeni."
|
||||
"message": "Istnieją użytkownicy, którzy przyjęli zaproszenie, ale muszą jeszcze zostać zatwierdzeni. Użytkownicy nie będą posiadali dostępu do organizacji, dopóki nie zostaną potwierdzeni."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Data rozpoczęcia"
|
||||
@@ -2112,7 +2193,7 @@
|
||||
"message": "Data zakończenia"
|
||||
},
|
||||
"verifyEmail": {
|
||||
"message": "Zweryfikuj adres email"
|
||||
"message": "Zweryfikuj adres e-mail"
|
||||
},
|
||||
"verifyEmailDesc": {
|
||||
"message": "Zweryfikuj swój adres e-mail, aby odblokować dostęp do wszystkich funkcji."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Senha"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Frase Secreta"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notas"
|
||||
},
|
||||
@@ -680,7 +683,7 @@
|
||||
"message": "Chave de Segurança YubiKey OTP"
|
||||
},
|
||||
"yubiKeyDesc": {
|
||||
"message": "Utilize um YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO."
|
||||
"message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO."
|
||||
},
|
||||
"duoDesc": {
|
||||
"message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.",
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Comprimento"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Número de Palavras"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Separador de Palavra"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Histórico de Senha"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirme a Nova Senha Mestra"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Configurações da Chave de Criptografia"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Algoritmo KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Iterações KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "As iterações KDF mais altas podem ajudar a proteger a sua senha mestra de ser descoberta pela força bruta de um invasor. Recomendamos um valor de $VALUE$ ou mais.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Configurar as suas iterações KDF muito alta pode resultar em baixo desempenho ao iniciar sessão (e desbloquear) no Bitwarden em dispositivos com CPUs mais lentas. Recomendamos que você aumente o valor em incrementos de $INCREMENT$ e, em seguida, teste em todos os seus dispositivos.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Alterar KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "As Configurações da Chave de Criptografia foram Alteradas"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Zona de Perigo"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Limpar o Cofre"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Cofre da organização limpado."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Continue abaixo para excluir todos os itens e pastas do seu cofre. Itens que pertencem a uma organização com a qual você compartilha não serão excluídos."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Continue abaixo para excluir todos os itens no cofre da organização."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Limpando o seu cofre permanentemente. Não pode ser desfeito."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Uma conta premium é necessária para usar esse recurso."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Você tem acesso premium"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Você já tem acesso às funcionalidades premium por causa de uma organização da qual é um membro."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Gerenciar"
|
||||
},
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Adicionar um novo Yubikey à sua conta"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Conecte o YubiKey (NEO ou 4 series) a porta USB do seu computador."
|
||||
"message": "Conecte o YubiKey na porta USB do seu computador."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Selecione o YubiKey no primeiro campo vazio abaixo."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Chave U2F $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Suporte a NFC"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Adicione uma chave de segurança FIDO U2F à sua conta"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Conecte a chave de segurança na porta USB do seu computador."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Tem certeza que deseja remover esta chave de segurança?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Chave de Leitura"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "A chave está comprometida."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Dê à chave de segurança um nome amigável para identificá-la."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Conecte a chave de segurança na porta USB do seu computador e clique no botão \"Ler Chave\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Se a chave de segurança tiver um botão, toque nele."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Salvar o formulário."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Devido as limitações da plataforma, o FIDO U2F não pode ser usado em todas os aplicativos do Bitwarden. Você deve habilitar outro provedor de login em duas etapas para poder acessar sua conta quando o FIDO U2F não puder ser usado. Plataformas Suportadas:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Esperando que você toque no botão da sua chave de segurança"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Clique no botão \"Habilitar\" abaixo para ativar essa chave de segurança para o login em duas etapas."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Clique no botão \"Salvar\" abaixo para ativar essa chave de segurança para o login em duas etapas."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Houve um problema ao ler a chave de segurança."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Houve um problema ao ler a chave de segurança. Tente novamente."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Seu código de recuperação de login em duas etapas do Bitwarden"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Hospedagem Local (opcional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Os usuários obtêm acesso às funcionalidades premium dos associados"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Controle o acesso do usuário com grupos"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Senha da conta alterada."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Habilitar login em duas etapas."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Habilitado\/atualizado o login em duas etapas."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Desabilitar login em duas etapas."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Palavra-passe"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Frase-passe"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Notas"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Comprimento"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Número de palavras"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Separador de palavras"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Histórico de Palavras-passe"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Confirmar a Nova Palavra-passe Mestra"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Definições da chave de encriptação"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Algoritmo KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Iterações KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Iterações KDF mais altas podem ajudar a proteger a sua palavra-passe mestra de ser forçada por um atacante. Nós recomendamos um valor de $VALUE$ ou mais.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Definir as suas iterações KDF muito altas pode resultar em desempenho fraco ao iniciar sessão (e desbloquear) o Bitwarden em dispositivos com CPUs mais lentos. Nós recomendamos que aumente o valor em incrementos de $INCREMENT$ e depois testar todos os seus dispositivos.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Alterar KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Definições da chave de encriptação alteradas"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Zona Perigosa"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Esvaziar Cofre"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Cofre da organização purgado."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Continue para eliminar todos os itens e pastas do seu cofre. Itens que pertençam a uma organização que partilhe não serão eliminados."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceda abaixo para apagar todos os itens no cofre da organização."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Esvaziar o seu cofre é permanente. Não pode ser desfeito."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Para utilizar esta opção é necessária uma subscrição Premium."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Você tem acesso premium"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Você já tem acesso às funcionalidades premium por causa de uma organização da qual é um membro."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Gerir"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Chave $INDEX$ U2F",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Suporte NFC"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Adicione à sua conta uma chave de segurança FIDO U2F"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Ligue a chave de segurança numa porta USB do seu computador."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Tem a certeza de que pretende remover esta chave de segurança?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Ler chave"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "A chave foi comprometida."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Dê à chave de segurança um nome amigável para a identificar."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Coloque a chave de segurança na porta USB do seu computador e clique no botão \"Ler chave\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Se a chave de segurança tiver um botão, toque-lhe."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Guarde o formulário."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Devido a limitações da plataforma, FIDO U2F não pode ser utilizado em todas as aplicações Bitwarden. Deverá escolher outro método de início de sessão em dois passos quando FIDO U2F não puder ser utilizado. Plataformas suportadas:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "A aguardar que toque no botão da sua chave de segurança"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Clique no botão \"Ativar\" abaixo para ativar esta chave de segurança para o início de sessão em dois passos."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Clique no botão \"Guardar\" abaixo para ativar esta chave de segurança para o início de sessão em dois passos."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Ocorreu um problema ao ler a chave de segurança."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Ocorreu um problema ao ler a chave de segurança. Tente novamente."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "O seu código Bitwarden de recuperação de início de sessão em dois passos"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Alojamento próprio (opcional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Os utilizadores obtêm acesso a funcionalidades de adesão premium"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Controle o acesso de utilizadores com grupos"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Palavra-passe da conta alterada."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Início de sessão em dois passos ativado."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Início de sessão em dois passos ativado\/atualizado."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Início de sessão em dois passos desativado."
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
}
|
||||
},
|
||||
"whatTypeOfItem": {
|
||||
"message": "Какой это тип элемента?"
|
||||
"message": "Выберите тип элемента"
|
||||
},
|
||||
"name": {
|
||||
"message": "Имя"
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Пароль"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Парольная фраза"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Заметки"
|
||||
},
|
||||
@@ -680,7 +683,7 @@
|
||||
"message": "Ключ безопасности YubiKey OTP"
|
||||
},
|
||||
"yubiKeyDesc": {
|
||||
"message": "Используйте YubiKey для доступа к вашей учетной записи. Работает с устройствами YubiKey 4, 4 Nano, 4C и NEO."
|
||||
"message": "Используйте YubiKey для доступа к вашей учетной записи. Работает с устройствами YubiKey 4 серии, 5 серии и NEO."
|
||||
},
|
||||
"duoDesc": {
|
||||
"message": "Подтвердите при помощи Duo Security, используя приложение Duo Mobile, SMS, телефонный звонок или ключ безопасности U2F.",
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Длина"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Количество слов"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Разделитель слов"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "История паролей"
|
||||
},
|
||||
@@ -826,7 +835,7 @@
|
||||
}
|
||||
},
|
||||
"loggedOutWarning": {
|
||||
"message": "При продолжении ваша сессия будет завершена и вам будет предложено авторизоваться повторно. Сеансы на других устройствах могут продолжать оставаться активными в течение одного часа."
|
||||
"message": "В случае продолжения, ваша сессия будет завершена и вам будет предложено авторизоваться повторно. Сеансы на других устройствах могут продолжать оставаться активными в течение одного часа."
|
||||
},
|
||||
"emailChanged": {
|
||||
"message": "Email изменен"
|
||||
@@ -852,20 +861,53 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Подтвердите новый мастер-пароль"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Настройки ключа шифрования"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "Алгоритм KDF"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "Итерации KDF"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Более высокие итерации KDF могут помочь защитить ваш мастер-пароль от атаки грубой силой (полным перебором). Мы рекомендуем значение $VALUE$ или больше.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Установка слишком высоких итераций KDF может привести к снижению производительности при входе (и разблокировке) на устройствах с медленными процессорами. Мы рекомендуем увеличивать значение с шагом $INCREMENT$, а затем проверить все ваши устройства.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Изменить KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Настройки ключа шифрования изменены"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Опасная зона"
|
||||
},
|
||||
"dangerZoneDesc": {
|
||||
"message": "Осторожно, эти действия не обратимы!"
|
||||
"message": "Будьте внимательны - эти действия не обратимы!"
|
||||
},
|
||||
"deauthorizeSessions": {
|
||||
"message": "Деавторизовать сессии"
|
||||
},
|
||||
"deauthorizeSessionsDesc": {
|
||||
"message": "Беспокоитесь о том, что ваша учетная запись авторизована на другом устройстве? Чтобы деавторизовать все ранее использовавшиеся компьютеры или устройства, выполните действие ниже. Этот шаг безопасности рекомендуется, если вы ранее использовали общедоступный компьютер или случайно сохранили свой пароль на устройстве, которое вам не принадлежит. Это действие также очистит все ранее сохраненные сессии двухфакторного входа."
|
||||
"message": "Беспокоитесь о том, что ваша учетная запись авторизована на другом устройстве? Чтобы деавторизовать все ранее использовавшиеся компьютеры или устройства, выполните действие ниже. Этот шаг безопасности рекомендуется, если вы ранее использовали общедоступный компьютер или случайно сохранили свой пароль на устройстве, которое вам не принадлежит. Это действие также очистит все ранее сохраненные сессии двухфакторной аутентификации."
|
||||
},
|
||||
"deauthorizeSessionsWarning": {
|
||||
"message": "При продолжении ваша сессия также будет завершена и вам будет предложено авторизоваться повторно. Также вам будет предложено повторно авторизоваться при помощи двухфакторной аутентификации, если она включена. Сеансы на других устройствах могут продолжать оставаться активными в течение одного часа."
|
||||
"message": "В случае продолжения, ваша сессия будет завершена и вам будет предложено авторизоваться повторно. При активированной двухфакторной аутентификации вам потребуется ввести код. Сеансы на других устройствах могут продолжать оставаться активными в течение одного часа."
|
||||
},
|
||||
"sessionsDeauthorized": {
|
||||
"message": "Все сессии деавторизованы"
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Очистить хранилище"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Хранилище организации очищено."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Чтобы удалить все элементы и папки из вашего хранилища, выполните действие ниже. Элементы, принадлежащие организации, с которой вы делитесь, удалены не будут."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Для удаления всех элементов в хранилище организации выполните следующие действия."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Очистка вашего хранилища необратима. Ее нельзя отменить."
|
||||
},
|
||||
@@ -960,7 +1008,7 @@
|
||||
"description": "'Gravatar' is the name of a service. See www.gravatar.com"
|
||||
},
|
||||
"enableGravatarsDesc": {
|
||||
"message": "Использовать аватары, загруженные с gravatar.com."
|
||||
"message": "Использовать аватары с сайта gravatar.com."
|
||||
},
|
||||
"default": {
|
||||
"message": "По умолчанию"
|
||||
@@ -1037,10 +1085,16 @@
|
||||
"message": "Премиум-статус"
|
||||
},
|
||||
"premiumRequired": {
|
||||
"message": "Необходим премиум-статус"
|
||||
"message": "Необходим Премиум-статус"
|
||||
},
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Для использования этой функции требуется премиум-статус."
|
||||
"message": "Для использования этой функции требуется Премиум-статус."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "У вас есть Премиум-статус"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "У вас уже есть доступ к Премиум, так как вы являетесь членом организации."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Управление"
|
||||
@@ -1073,7 +1127,7 @@
|
||||
"message": "Устройства Windows"
|
||||
},
|
||||
"twoStepAuthenticatorAppsRecommended": {
|
||||
"message": "Эти приложения рекомендуется, однако, другие приложения-аутентификаторы также будут работать."
|
||||
"message": "Эти приложения рекомендуются, однако, другие приложения-аутентификаторы также будут работать."
|
||||
},
|
||||
"twoStepAuthenticatorScanCode": {
|
||||
"message": "Сосканируйте этот QR-код вашим приложением-аутентификатором"
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Добавить новый YubiKey в свою учетную запись"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Подключите YubiKey (NEO или 4 серии) к USB-порту вашего компьютера."
|
||||
"message": "Подключите YubiKey к USB-порту вашего компьютера."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Выберите первое пустое поле ввода YubiKey ниже."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "Ключ U2F $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Поддержка NFC"
|
||||
},
|
||||
@@ -1136,7 +1199,7 @@
|
||||
"message": "Если один из ваших YubiKey поддерживает NFC (например, YubiKey NEO), то при обнаружении доступности NFC на мобильном устройстве вам будет выдан запрос."
|
||||
},
|
||||
"yubikeysUpdated": {
|
||||
"message": "YubiKeys обновлены"
|
||||
"message": "YubiKey обновлены"
|
||||
},
|
||||
"disableAllKeys": {
|
||||
"message": "Отключить все ключи"
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Добавьте в свою учетную запись ключ безопасности FIDO U2F"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Подключите ключ безопасности к USB-порту вашего компьютера."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Вы действительно хотите удалить этот ключ безопасности?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Чтение ключа"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Ключ скомпрометирован."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Присвойте ключу безопасности понятное имя для его идентификации."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Подключите ключ безопасности к USB-порту компьютера и нажмите кнопку 'Чтение ключа'."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Если у ключа безопасности есть кнопка, нажмите ее."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Сохранить форму."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Из-за ограничений платформы FIDO U2F нельзя использовать во всех приложениях Bitwarden. Вы должны включить другого провайдера двухфакторной аутентификации, чтобы иметь возможность получить доступ к своей учетной записи, когда FIDO U2F не может быть использован. Поддерживаемые платформы:"
|
||||
},
|
||||
@@ -1183,14 +1261,14 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "В ожидании нажатия кнопки на ключе безопасности"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Нажмите кнопку \"Включить\" ниже, чтобы активировать этот ключ безопасности для двухфакторной аутентификации."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Нажмите кнопку 'Сохранить' ниже, чтобы включить этот ключ безопасности для двухфакторной аутентификации."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Не удалось прочитать ключ безопасности."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Не удалось прочитать ключ безопасности. Попробуйте снова."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Ваш код восстановления двухфакторной ауентификации Bitwarden"
|
||||
"message": "Ваш код восстановления двухфакторной аутентификации Bitwarden"
|
||||
},
|
||||
"twoFactorRecoveryNoCode": {
|
||||
"message": "Вы еще не включили ни одного провайдера двухфакторной аутентификации. После включения, вы можете вернуться сюда и проверить ваш код восстановления."
|
||||
@@ -1287,7 +1365,7 @@
|
||||
"message": "Приоритетную поддержку."
|
||||
},
|
||||
"premiumSignUpFuture": {
|
||||
"message": "Все будущие функции премиум-статуса. Их будет больше!"
|
||||
"message": "Все будущие функции Премиум-статуса. Их будет больше!"
|
||||
},
|
||||
"premiumPrice": {
|
||||
"message": "Всего лишь $PRICE$ \/в год!",
|
||||
@@ -1489,7 +1567,7 @@
|
||||
"message": "Обновленный способ оплаты."
|
||||
},
|
||||
"purchasePremium": {
|
||||
"message": "Купить премиум"
|
||||
"message": "Купить Премиум"
|
||||
},
|
||||
"licenseFile": {
|
||||
"message": "Файл лицензии"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Локальный хостинг (опционально)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Пользователи получают доступ к возможностям Премиум-статуса"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Управление доступом пользователей с помощью групп"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Изменен пароль учетной записи."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Двухфакторная аутентификация включена."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Двухфакторная аутентификация включена\/обновлена."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Двухфакторная аутентификация выключена."
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Heslo"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Heslo"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Poznámky"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Dĺžka"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Počet slov"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Oddeľovač slov"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "História hesla"
|
||||
},
|
||||
@@ -817,7 +826,7 @@
|
||||
"message": "Kód"
|
||||
},
|
||||
"changeEmailDesc": {
|
||||
"message": "Zaslali overovací kód na $EMAIL$. Prosím skontrolujte vašu schránku a zadajte zaslaný kód nižšie pre potvrdenie zmeny vašej e-mailovej adresy.",
|
||||
"message": "Zaslali sme overovací kód na $EMAIL$. Prosím skontrolujte vašu schránku a zadajte zaslaný kód nižšie pre potvrdenie zmeny vašej e-mailovej adresy.",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"content": "$1",
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Potvrďte nové hlavné heslo"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Nastavenia šifrovacieho kľúča"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF algoritmus"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF iterácií"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Vyšší počet iterácií KDF môže pomôcť chrániť vaše hlavné heslo pri brute force útoku. Odporúčame hodnotu $VALUE$ alebo viac.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Nastavenie KDF iterácií príliš vysoko môže viesť k spomalení pri prihlasovaní sa do Bitwarden (a pri odomykaní) v zariadeniach s pomalším procesorom. Odporúčame zvýšiť hodnotu v prírastkoch po $INCREMENT$ a potom testovať na všetkých vašich zariadeniach.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Zmeniť KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Nastavenia šifrovacieho kľúča zmenené"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Riziková zóna"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Vyprázdniť trezor"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Trezor organizácie bol vyprázdnený."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Pokračujte ďalej ak chcete odstrániť všetky položky a priečinky vo vašom trezore. Položky, ktoré ste zdieľali a patria k organizácii sa neodstránia."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Pokračujte ďalej ak chcete odstrániť všetky položky v trezore organizácie."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Vyprázdnenie trezoru je trvalé. Operáciu nie je možné vrátiť späť."
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Pre použitie tejto funkcie je potrebné prémiové členstvo."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Máte premium prístup"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "Už máte prístup k prémiovým funkciám vďaka organizácii ktorej ste členom."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Spravovať"
|
||||
},
|
||||
@@ -1097,7 +1151,7 @@
|
||||
"message": "Do svojho účtu pridať nový YubiKey"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Zapojte YubiKey (NEO alebo 4 séria) do USB portu počítača."
|
||||
"message": "Zapojte YubiKey do USB portu počítača."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Nižšie zvoľte prvé voľné pole na vašom YubiKey."
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F kľúč $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "Podpora NFC"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Pridajte FIDO U2F kľúč k vášmu účtu"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Pripojte bezpečnostný kľúč k vášmu počítaču prostredníctvom USB portu."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Naozaj chcete odstrániť tento bezpečnostný kľúč?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Načítať kľúč"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Kľúč bol kompromitovaný."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Zadajte názov pre bezpečnostný kľúč pre jeho ľahšiu identifikáciu."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Zasuňte bezpečnostný kľúč do USB portu na vašom počítači a kliknite na tlačidlo \"Načítať kľúč\"."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "Ak má kľúč na sebe tlačidlo, stlačte ho."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Ulož formulár."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Vzhľadom na obmedzenia platform, FIDO U2F nemôže byť použitý vo všetkých Bitwarden aplikáciách. Mali by ste povoliť inú formu dvojitého overenia, aby ste sa mohli prihlásiť k svojmu účtu ak nie je možné použiť FIDO U2F. Podporované platformy:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Čaká sa na stlačenie tlačidla na vašom kľúči"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Kliknite na tlačidlo \"Povoliť\" pre povolenie bezpečnostného kľúča pre dvojstupňové prihlásenie."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Kliknite na tlačidlo \"Uložiť\" pre povolenie bezpečnostného kľúča pre dvojstupňové prihlásenie."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "Problém pri čítaní bezpečnostného kľúča."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "Problém pri čítaní bezpečnostného kľúča. Skúste to znova."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Váš Bitwarden záchranný kód pre dvojstupňové overovanie"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "Prevádzka na vlastnom systéme (voliteľné)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Používatelia získajú prístup k prémiovým funkciám"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Kontrola prístupu používateľov prostredníctvom skupín"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Zmenené heslo k účtu."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Dvojstupňové prihlasovanie zapnuté."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Dvojstupňové prihlasovanie zapnuté\/aktualizované."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Dvojstupňové prihlasovanie vypnuté."
|
||||
@@ -2100,10 +2181,10 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Confirm Users"
|
||||
"message": "Potvrdiť používateľov"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed."
|
||||
"message": "Máte používateľov, ktorí prijali pozvanie, ale ešte ich musíte potvrdiť. Používatelia nebudú mať prístup k organizácii, kým nebudú potvrdení."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Počiatočný Dátum"
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "Lösenord"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "Anteckningar"
|
||||
},
|
||||
@@ -718,7 +721,7 @@
|
||||
"message": "Välj en organisation som du vill dela dessa objekt med. Delning överför ägandet av objekten till organisationen. Du kommer inte längre att vara direkt ägare till dessa objekt när de har delats."
|
||||
},
|
||||
"collectionsDesc": {
|
||||
"message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item."
|
||||
"message": "Redigera de samlingar som detta objekt delas med. Endast användare i organisationer som har tillgång till dessa samlingar kommer kunna se objektet."
|
||||
},
|
||||
"deleteSelectedItemsDesc": {
|
||||
"message": "Du har valt $COUNT$ objekt att ta bort. Är du säker på att du vill ta bort alla dessa objekt?",
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "Längd"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "Lösenordshistorik"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "Bekräfta nytt huvudlösenord"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "Inställningar för krypteringsnyckel"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF algoritm"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF iterationer"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker. We recommend a value of $VALUE$ or more.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "Setting your KDF iterations too high could result in poor performance when logging into (and unlocking) Bitwarden on devices with slower CPUs. We recommend that you increase the value in increments of $INCREMENT$ and then test all of your devices.",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "Ändra KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "Inställningar för krypteringsnyckel ändrade"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "Högrisksområde"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "Rensa valv"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "Rensning av ditt valv är permanent. Det går inte att ångra."
|
||||
},
|
||||
@@ -907,10 +955,10 @@
|
||||
"message": "Importera data"
|
||||
},
|
||||
"importSuccess": {
|
||||
"message": "Data has been successfully imported into your vault."
|
||||
"message": "Data har importerats till ditt Valv."
|
||||
},
|
||||
"importFormatError": {
|
||||
"message": "Data is not formatted correctly. Please check your import file and try again."
|
||||
"message": "Datan är inte korrekt formaterad. Vänligen kontrollera din importerade fil och försök igen."
|
||||
},
|
||||
"importNothingError": {
|
||||
"message": "Ingenting importerades."
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "Ett premium-medlemskap krävs för att använda den här funktionen."
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "Du har premiumtillgång"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "You already have access to premium features because of an organization you are a member of."
|
||||
},
|
||||
"manage": {
|
||||
"message": "Hantera"
|
||||
},
|
||||
@@ -1055,7 +1109,7 @@
|
||||
"message": "Ange ditt huvudlösenord för att ändra på inställningar för tvåstegsverifiering."
|
||||
},
|
||||
"twoStepAuthenticatorDesc": {
|
||||
"message": "Follow these steps to set up two-step login with an authenticator app:"
|
||||
"message": "Följ dessa steg för att konfigurera tvåfaktorsautentisering med en autentiseringsapp:"
|
||||
},
|
||||
"twoStepAuthenticatorDownloadApp": {
|
||||
"message": "Hämta en tvåstegsverifieringsapp"
|
||||
@@ -1091,19 +1145,19 @@
|
||||
"message": "Are you sure you want to disable this two-step login provider?"
|
||||
},
|
||||
"twoStepDisabled": {
|
||||
"message": "Two-step login provider disabled."
|
||||
"message": "Tvåfaktorsautentisering leverantör inaktiverad."
|
||||
},
|
||||
"twoFactorYubikeyAdd": {
|
||||
"message": "Add a new YubiKey to your account"
|
||||
"message": "Lägg till en ny YubiKey till ditt konto"
|
||||
},
|
||||
"twoFactorYubikeyPlugIn": {
|
||||
"message": "Plug the YubiKey (NEO or 4 series) into your computer's USB port."
|
||||
"message": "Sätt in YubiKey (NEO eller 4-serien) i din dators USB-port."
|
||||
},
|
||||
"twoFactorYubikeySelectKey": {
|
||||
"message": "Select in the first empty YubiKey input field below."
|
||||
},
|
||||
"twoFactorYubikeyTouchButton": {
|
||||
"message": "Touch the YubiKey's button."
|
||||
"message": "Tryck på YubiKey-knappen."
|
||||
},
|
||||
"twoFactorYubikeySaveForm": {
|
||||
"message": "Spara formuläret."
|
||||
@@ -1126,26 +1180,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC-stöd"
|
||||
},
|
||||
"twoFactorYubikeySupportsNfc": {
|
||||
"message": "One of my keys supports NFC."
|
||||
"message": "En av mina nycklar stöder NFC."
|
||||
},
|
||||
"twoFactorYubikeySupportsNfcDesc": {
|
||||
"message": "If one of your YubiKeys supports NFC (such as a YubiKey NEO), you will be prompted on mobile devices whenever NFC availability is detected."
|
||||
"message": "Om en av dina YubiKeys stöder NFC (till exempel en YubiKey NEO), kommer du få en fråga på på mobila enheter när NFC tillgänglighet upptäcks."
|
||||
},
|
||||
"yubikeysUpdated": {
|
||||
"message": "YubiKeys updated"
|
||||
"message": "YubiKeys uppdaterade"
|
||||
},
|
||||
"disableAllKeys": {
|
||||
"message": "Disable All Keys"
|
||||
"message": "Inaktivera alla nycklar"
|
||||
},
|
||||
"twoFactorDuoDesc": {
|
||||
"message": "Enter the Bitwarden application information from your Duo Admin panel."
|
||||
},
|
||||
"twoFactorDuoIntegrationKey": {
|
||||
"message": "Integration Key"
|
||||
"message": "Integrationsnyckel"
|
||||
},
|
||||
"twoFactorDuoSecretKey": {
|
||||
"message": "Hemlig nyckel"
|
||||
@@ -1154,25 +1217,40 @@
|
||||
"message": "API Hostname"
|
||||
},
|
||||
"twoFactorEmailDesc": {
|
||||
"message": "Follow these steps to set up two-step login with email:"
|
||||
"message": "Följ dessa steg för att konfigurera tvåfaktorsautentisering med e-post:"
|
||||
},
|
||||
"twoFactorEmailEnterEmail": {
|
||||
"message": "Enter the email that you wish to receive verification codes"
|
||||
"message": "Ange den e-postadress som du vill ta emot verifieringskoder"
|
||||
},
|
||||
"twoFactorEmailEnterCode": {
|
||||
"message": "Enter the resulting 6 digit verification code from the email"
|
||||
"message": "Ange den 6-siffriga verifieringskoden från mailet"
|
||||
},
|
||||
"sendEmail": {
|
||||
"message": "Skicka e-post"
|
||||
},
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "Add a FIDO U2F security key to your account"
|
||||
"message": "Lägg till en FIDO U2F säkerhetsnyckel till ditt konto"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "Plug the security key into your computer's USB port."
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "If the security key has a button, touch it."
|
||||
"message": "Om säkerhetsnyckeln har en knapp, tryck på den."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:"
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Waiting for you to touch the button on your security key"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Click the \"Enable\" button below to enable this security key for two-step login."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "There was a problem reading the security key."
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "Your Bitwarden two-step login recovery code"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "On-premise hosting (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Users get access to premium membership features"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Kontrollera användaråtkomst med grupper"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Ändrade kontolösenord."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Aktiverade tvåstegsverifiering."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Inaktiverade tvåstegsverifiering."
|
||||
@@ -2100,10 +2181,10 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Confirm Users"
|
||||
"message": "Bekräfta användare"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed."
|
||||
"message": "Du har användare som har accepterat deras inbjudan, men behöver fortfarande bli bekräftade. Användare har inte åtkomst till organisationen förrän de blivit bekräftade."
|
||||
},
|
||||
"startDate": {
|
||||
"message": "Startdatum"
|
||||
|
||||
2487
src/locales/tr/messages.json
Normal file
2487
src/locales/tr/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "密码"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "密码"
|
||||
},
|
||||
"notes": {
|
||||
"message": "笔记"
|
||||
},
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "长度"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "字数"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "单词分隔符"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "密码历史记录"
|
||||
},
|
||||
@@ -852,6 +861,39 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "确认新主密码"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "加密密钥设置"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF 算法"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF 迭代"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "更高的 KDF 迭代可以帮助保护您的主密码免遭攻击者的暴力强制。建议 $VALUE$ 或更高。",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "如果将 KDF 迭代设置得太高, 可能会在 CPU 速度较慢的设备上登录(以及解锁)Bitwarden 时性能较差。建议您增加 $INCREMENT$ 的增量值, 然后测试所有设备。",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "更改 KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "加密密钥设置已更改"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "危险操作区"
|
||||
},
|
||||
@@ -873,9 +915,15 @@
|
||||
"purgeVault": {
|
||||
"message": "清空密码库"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "已清除的组织密码库。"
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "接下来的操作会删除密码库中的所有项目和文件夹。属于组织的共享项目将不会被删除。"
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "继续执行以下操作以删除组织的密码库中的所有项目。"
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "清空密码库是永久性的。不能被撤消。"
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "此功能需要高级会员资格。"
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "您有高级版访问权限"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "由于您所属的组织, 您已经拥有高级版功能权限。"
|
||||
},
|
||||
"manage": {
|
||||
"message": "管理"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "YubiKey $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC 支持"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "在您的帐户中添加 FIDO U2F 安全密钥"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "将安全密钥插入电脑的 USB 端口。"
|
||||
"removeU2fConfirmation": {
|
||||
"message": "您确认要删除这个安全密钥?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "读取密钥"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "密钥被破坏。"
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "给安全密钥一个友好的名称来标识它。"
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "将安全密钥插入计算机的 USB 端口, 然后单击 \"读取密钥\" 按钮。"
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "如果安全密钥有按钮,请按下它。"
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "保存表单。"
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "由于平台限制,FIDO U2F 无法用于所有的 Bitwarden 应用。 您应启用另一个两步登录验证应用,以便在 FIDO U2F 不可用时,也能访问您的帐户。 支持的平台:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "请您按下安全密钥上的按钮"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "单击下面的 \"启用\" 按钮,启用此安全密钥进行两步登录。"
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "单击下面的 \"保存\" 按钮,启用此安全密钥进行两步登录。"
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "读取安全密钥时出现问题。"
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "读取安全密钥时出现问题,请再试一次。"
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "您的 Bitwarden 两步登录恢复代码"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "内部托管(可选)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "用户拥有高级会员功能权限"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "使用群组控制用户访问权限"
|
||||
},
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "已更改帐户密码。"
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "已启用两步登录。"
|
||||
"enabledUpdated2fa": {
|
||||
"message": "已启用\/更新两步登录。"
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "已禁用两步登录。"
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"password": {
|
||||
"message": "密碼"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Passphrase"
|
||||
},
|
||||
"notes": {
|
||||
"message": "筆記"
|
||||
},
|
||||
@@ -718,10 +721,10 @@
|
||||
"message": "選擇您希望分享這些項目的組織。這些項目的擁有權將會轉移到組織。一經分享,您將不再是這些項目的直接擁有者。"
|
||||
},
|
||||
"collectionsDesc": {
|
||||
"message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item."
|
||||
"message": "編輯與此項目共享的集合。只有具有這些集合存取權限的組織使用者才能夠看到此項目。"
|
||||
},
|
||||
"deleteSelectedItemsDesc": {
|
||||
"message": "You have selected $COUNT$ item(s) to delete. Are you sure you want to delete all of these items?",
|
||||
"message": "您已經選取了 $COUNT$ 個項目要刪除。確定要刪除這些項目嗎 ?",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -730,7 +733,7 @@
|
||||
}
|
||||
},
|
||||
"moveSelectedItemsDesc": {
|
||||
"message": "Choose a folder that you would like to move the $COUNT$ selected item(s) to.",
|
||||
"message": "選擇要將這 $COUNT$ 個項目移動到的資料夾。",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -739,7 +742,7 @@
|
||||
}
|
||||
},
|
||||
"shareSelectedItemsDesc": {
|
||||
"message": "You have selected $COUNT$ item(s). $SHAREABLE_COUNT$ items are sharable, $NONSHAREABLE_COUNT$ are not. Items with attachments must be shared individually.",
|
||||
"message": "您已經選取了 $COUNT$ 個項目。 $SHAREABLE_COUNT$ 個項目是可以分享的,$NONSHAREABLE_COUNT$ 則否。有附件的的項目必須單獨分享。",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -795,6 +798,12 @@
|
||||
"length": {
|
||||
"message": "長度"
|
||||
},
|
||||
"numWords": {
|
||||
"message": "Number of Words"
|
||||
},
|
||||
"wordSeparator": {
|
||||
"message": "Word Separator"
|
||||
},
|
||||
"passwordHistory": {
|
||||
"message": "密碼歷史記錄"
|
||||
},
|
||||
@@ -826,7 +835,7 @@
|
||||
}
|
||||
},
|
||||
"loggedOutWarning": {
|
||||
"message": "Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
|
||||
"message": "接下來會登出目前的登入階段,並要求您重新登入。其他裝置上的登入階段最多會保持一個小時。"
|
||||
},
|
||||
"emailChanged": {
|
||||
"message": "電子郵件已更改"
|
||||
@@ -835,7 +844,7 @@
|
||||
"message": "請重新登入。"
|
||||
},
|
||||
"logBackInOthersToo": {
|
||||
"message": "Please log back in. If you are using other Bitwarden applications log out and back in to those as well."
|
||||
"message": "請重新登入。如果您還在使用其他 Bitwarden 應用,也請登出並重新登入。"
|
||||
},
|
||||
"changeMasterPassword": {
|
||||
"message": "變更主密碼"
|
||||
@@ -852,30 +861,69 @@
|
||||
"confirmNewMasterPass": {
|
||||
"message": "確認新密碼"
|
||||
},
|
||||
"encKeySettings": {
|
||||
"message": "加密金鑰設定"
|
||||
},
|
||||
"kdfAlgorithm": {
|
||||
"message": "KDF 演算法"
|
||||
},
|
||||
"kdfIterations": {
|
||||
"message": "KDF 疊代"
|
||||
},
|
||||
"kdfIterationsDesc": {
|
||||
"message": "較高的 KDF 遞代次數可以避免您的主密碼遭到暴力破解。我們建議 $VALUE$ 或更高。",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
"content": "$1",
|
||||
"example": "100,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"kdfIterationsWarning": {
|
||||
"message": "把 KDF 遞代次數設太高會導致在 CPU 較慢的裝置上登入 ( 與解鎖 ) Bitwarden 時降低效能。我們建議您增加 $INCREMENT$ 的值並且在所有的裝置上測試。",
|
||||
"placeholders": {
|
||||
"increment": {
|
||||
"content": "$1",
|
||||
"example": "50,000"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeKdf": {
|
||||
"message": "變更 KDF"
|
||||
},
|
||||
"encKeySettingsChanged": {
|
||||
"message": "加密金鑰設定已變更"
|
||||
},
|
||||
"dangerZone": {
|
||||
"message": "危險區域"
|
||||
},
|
||||
"dangerZoneDesc": {
|
||||
"message": "小心, 這些動作是無法復原的!"
|
||||
"message": "小心, 這些動作是無法挽回的!"
|
||||
},
|
||||
"deauthorizeSessions": {
|
||||
"message": "Deauthorize Sessions"
|
||||
"message": "取消登入階段"
|
||||
},
|
||||
"deauthorizeSessionsDesc": {
|
||||
"message": "Concerned your account is logged in on another device? Proceed below to deauthorize all computers or devices that you have previously used. This security step is recommended if you previously used a public PC or accidentally saved your password on a device that isn't yours. This step will also clear all previously remembered two-step login sessions."
|
||||
},
|
||||
"deauthorizeSessionsWarning": {
|
||||
"message": "Proceeding will also log you out of your current session, requiring you to log back in. You will also be prompted for two-step login again, if enabled. Active sessions on other devices may continue to remain active for up to one hour."
|
||||
"message": "接下來會登出目前的登入階段,並要求您重新登入。若您有設定兩步驟登入,也需重新驗證。其他裝置上的登入階段最多會保持一個小時。"
|
||||
},
|
||||
"sessionsDeauthorized": {
|
||||
"message": "All Sessions Deauthorized"
|
||||
"message": "已取消所有登入階段授權"
|
||||
},
|
||||
"purgeVault": {
|
||||
"message": "清除密碼庫"
|
||||
},
|
||||
"purgedOrganizationVault": {
|
||||
"message": "Purged organization vault."
|
||||
},
|
||||
"purgeVaultDesc": {
|
||||
"message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted."
|
||||
},
|
||||
"purgeOrgVaultDesc": {
|
||||
"message": "Proceed below to delete all items in the organization's vault."
|
||||
},
|
||||
"purgeVaultWarning": {
|
||||
"message": "清除密碼庫是永久性的。將無法被還原。"
|
||||
},
|
||||
@@ -1042,6 +1090,12 @@
|
||||
"premiumRequiredDesc": {
|
||||
"message": "進階會員才可使用此功能。"
|
||||
},
|
||||
"youHavePremiumAccess": {
|
||||
"message": "You have premium access"
|
||||
},
|
||||
"alreadyPremiumFromOrg": {
|
||||
"message": "You already have access to premium features because of an organization you are a member of."
|
||||
},
|
||||
"manage": {
|
||||
"message": "管理"
|
||||
},
|
||||
@@ -1126,6 +1180,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"u2fkeyX": {
|
||||
"message": "U2F Key $INDEX$",
|
||||
"placeholders": {
|
||||
"index": {
|
||||
"content": "$1",
|
||||
"example": "2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nfcSupport": {
|
||||
"message": "NFC 支援"
|
||||
},
|
||||
@@ -1168,12 +1231,27 @@
|
||||
"twoFactorU2fAdd": {
|
||||
"message": "在您的帳戶中新增 FIDO U2F 安全金鑰"
|
||||
},
|
||||
"twoFactorU2fPlugIn": {
|
||||
"message": "將安全金鑰插入電腦的 USB 連接埠。"
|
||||
"removeU2fConfirmation": {
|
||||
"message": "Are you sure you want to remove this security key?"
|
||||
},
|
||||
"readKey": {
|
||||
"message": "Read Key"
|
||||
},
|
||||
"keyCompromised": {
|
||||
"message": "Key is compromised."
|
||||
},
|
||||
"twoFactorU2fGiveName": {
|
||||
"message": "Give the security key a friendly name to identify it."
|
||||
},
|
||||
"twoFactorU2fPlugInReadKey": {
|
||||
"message": "Plug the security key into your computer's USB port and click the \"Read Key\" button."
|
||||
},
|
||||
"twoFactorU2fTouchButton": {
|
||||
"message": "If the security key has a button, touch it."
|
||||
},
|
||||
"twoFactorU2fSaveForm": {
|
||||
"message": "Save the form."
|
||||
},
|
||||
"twoFactorU2fWarning": {
|
||||
"message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:"
|
||||
},
|
||||
@@ -1183,11 +1261,11 @@
|
||||
"twoFactorU2fWaiting": {
|
||||
"message": "Waiting for you to touch the button on your security key"
|
||||
},
|
||||
"twoFactorU2fClickEnable": {
|
||||
"message": "Click the \"Enable\" button below to enable this security key for two-step login."
|
||||
"twoFactorU2fClickSave": {
|
||||
"message": "Click the \"Save\" button below to enable this security key for two-step login."
|
||||
},
|
||||
"twoFactorU2fProblemReading": {
|
||||
"message": "讀取安全金鑰時發生問題。"
|
||||
"twoFactorU2fProblemReadingTryAgain": {
|
||||
"message": "There was a problem reading the security key. Try again."
|
||||
},
|
||||
"twoFactorRecoveryYourCode": {
|
||||
"message": "您的 Bitwarden 兩步登入復原碼"
|
||||
@@ -1244,7 +1322,7 @@
|
||||
"message": "Breached Accounts Found"
|
||||
},
|
||||
"compromisedData": {
|
||||
"message": "Compromised data"
|
||||
"message": "遭洩漏的資料"
|
||||
},
|
||||
"website": {
|
||||
"message": "網站"
|
||||
@@ -1661,6 +1739,9 @@
|
||||
"onPremHostingOptional": {
|
||||
"message": "On-premise hosting (optional)"
|
||||
},
|
||||
"usersGetPremium": {
|
||||
"message": "Users get access to premium membership features"
|
||||
},
|
||||
"controlAccessWithGroups": {
|
||||
"message": "Control user access with groups"
|
||||
},
|
||||
@@ -1719,7 +1800,7 @@
|
||||
"message": "取得應用程式"
|
||||
},
|
||||
"loggedInAs": {
|
||||
"message": "登入為"
|
||||
"message": "已登入為"
|
||||
},
|
||||
"eventLogs": {
|
||||
"message": "事件記錄"
|
||||
@@ -1752,7 +1833,7 @@
|
||||
"message": "The external id is used to link this group to an external system such as a user directory."
|
||||
},
|
||||
"accessControl": {
|
||||
"message": "Access Control"
|
||||
"message": "存取控制"
|
||||
},
|
||||
"groupAccessAllItems": {
|
||||
"message": "This group can access and modify all items."
|
||||
@@ -1868,8 +1949,8 @@
|
||||
"changedPassword": {
|
||||
"message": "Changed account password."
|
||||
},
|
||||
"enabled2fa": {
|
||||
"message": "Enabled two-step login."
|
||||
"enabledUpdated2fa": {
|
||||
"message": "Enabled\/updated two-step login."
|
||||
},
|
||||
"disabled2fa": {
|
||||
"message": "Disabled two-step login."
|
||||
@@ -2100,7 +2181,7 @@
|
||||
}
|
||||
},
|
||||
"confirmUsers": {
|
||||
"message": "Confirm Users"
|
||||
"message": "確認使用者"
|
||||
},
|
||||
"usersNeedConfirmed": {
|
||||
"message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed."
|
||||
|
||||
@@ -192,6 +192,10 @@ input, select, textarea {
|
||||
.card ul.fa-ul.card-ul {
|
||||
margin-left: 1.9em;
|
||||
|
||||
li {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.fa-li {
|
||||
top: 4px;
|
||||
}
|
||||
@@ -276,7 +280,7 @@ label:not(.form-check-label):not(.btn) {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
&:disabled:not(.manual), &.loading {
|
||||
.fa-spinner {
|
||||
display: flex;
|
||||
}
|
||||
@@ -319,6 +323,10 @@ label:not(.form-check-label):not(.btn) {
|
||||
}
|
||||
}
|
||||
|
||||
td.wrap {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
td.table-list-options {
|
||||
width: 76px;
|
||||
max-width: 76px;
|
||||
|
||||
@@ -11,7 +11,8 @@ export class I18nService extends BaseI18nService {
|
||||
});
|
||||
|
||||
this.supportedTranslationLocales = [
|
||||
'en', 'cs', 'da', 'de', 'es', 'fr', 'nb', 'pl', 'pt-PT', 'pt-BR', 'ru', 'sk', 'sv', 'zh-CN',
|
||||
'en', 'cs', 'da', 'de', 'es', 'et', 'fr', 'it', 'nb', 'nl', 'pl', 'pt-PT', 'pt-BR',
|
||||
'ru', 'sk', 'sv', 'zh-CN',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { SweetAlert } from 'sweetalert/typings/core';
|
||||
import { DeviceType } from 'jslib/enums/deviceType';
|
||||
|
||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||
|
||||
import { Utils } from 'jslib/misc/utils';
|
||||
@@ -16,7 +17,7 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
|
||||
private browserCache: DeviceType = null;
|
||||
|
||||
constructor(private i18nService: I18nService) { }
|
||||
constructor(private i18nService: I18nService, private messagingService: MessagingService) { }
|
||||
|
||||
getDevice(): DeviceType {
|
||||
if (this.browserCache != null) {
|
||||
@@ -85,10 +86,6 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
return 'UA-81915606-3';
|
||||
}
|
||||
|
||||
getDomain(uriString: string): string {
|
||||
return Utils.getHostname(uriString);
|
||||
}
|
||||
|
||||
isViewOpen(): boolean {
|
||||
return false;
|
||||
}
|
||||
@@ -143,8 +140,14 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
return true;
|
||||
}
|
||||
|
||||
showToast(type: 'error' | 'success' | 'warning' | 'info', title: string, text: string, global?: any): void {
|
||||
throw new Error('showToast not implemented');
|
||||
showToast(type: 'error' | 'success' | 'warning' | 'info', title: string, text: string | string[],
|
||||
options?: any): void {
|
||||
this.messagingService.send('showToast', {
|
||||
text: text,
|
||||
title: title,
|
||||
type: type,
|
||||
options: options,
|
||||
});
|
||||
}
|
||||
|
||||
async showDialog(text: string, title?: string, confirmText?: string, cancelText?: string, type?: string) {
|
||||
@@ -199,6 +202,14 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
return confirmed;
|
||||
}
|
||||
|
||||
eventTrack(action: string, label?: string, options?: any) {
|
||||
this.messagingService.send('analyticsEventTrack', {
|
||||
action: action,
|
||||
label: label,
|
||||
options: options,
|
||||
});
|
||||
}
|
||||
|
||||
isDev(): boolean {
|
||||
return process.env.ENV === 'development';
|
||||
}
|
||||
@@ -208,10 +219,17 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
|
||||
}
|
||||
|
||||
copyToClipboard(text: string, options?: any): void {
|
||||
const doc: Document = options ? options.doc : window.document;
|
||||
if ((window as any).clipboardData && (window as any).clipboardData.setData) {
|
||||
let win = window;
|
||||
let doc = window.document;
|
||||
if (options && (options.window || options.win)) {
|
||||
win = options.window || options.win;
|
||||
doc = win.document;
|
||||
} else if (options && options.doc) {
|
||||
doc = options.doc;
|
||||
}
|
||||
if ((win as any).clipboardData && (win as any).clipboardData.setData) {
|
||||
// IE specific code path to prevent textarea being shown while dialog is visible.
|
||||
(window as any).clipboardData.setData('Text', text);
|
||||
(win as any).clipboardData.setData('Text', text);
|
||||
} else if (doc.queryCommandSupported && doc.queryCommandSupported('copy')) {
|
||||
const textarea = doc.createElement('textarea');
|
||||
textarea.textContent = text;
|
||||
|
||||
@@ -6,22 +6,38 @@
|
||||
"experimentalDecorators": true,
|
||||
"module": "commonjs",
|
||||
"target": "es5",
|
||||
"lib": ["es5", "es6", "dom"],
|
||||
"lib": [
|
||||
"es5",
|
||||
"es6",
|
||||
"dom"
|
||||
],
|
||||
"allowJs": true,
|
||||
"sourceMap": true,
|
||||
"types": [],
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"jslib/*": [ "jslib/src/*" ],
|
||||
"@angular/*": [ "node_modules/@angular/*" ],
|
||||
"angular2-toaster": [ "node_modules/angular2-toaster" ],
|
||||
"angulartics2": [ "node_modules/angulartics2" ]
|
||||
"tldjs": [
|
||||
"jslib/src/misc/tldjs.noop"
|
||||
],
|
||||
"jslib/*": [
|
||||
"jslib/src/*"
|
||||
],
|
||||
"@angular/*": [
|
||||
"node_modules/@angular/*"
|
||||
],
|
||||
"node": [
|
||||
"node_modules/@types/node"
|
||||
]
|
||||
}
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"preserveWhitespaces": true
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build",
|
||||
"jslib/node_modules",
|
||||
"jslib/dist",
|
||||
"jslib/spec",
|
||||
"jslib/src/electron",
|
||||
|
||||
@@ -13,12 +13,8 @@ if (process.env.NODE_ENV == null) {
|
||||
}
|
||||
const ENV = process.env.ENV = process.env.NODE_ENV;
|
||||
|
||||
if (process.env.NODE_ENV == null) {
|
||||
process.env.NODE_ENV = 'development';
|
||||
}
|
||||
|
||||
const extractCss = new ExtractTextPlugin({
|
||||
filename: '[name].[chunkhash].css',
|
||||
filename: '[name].[hash].css',
|
||||
disable: false,
|
||||
allChunks: true,
|
||||
});
|
||||
@@ -77,7 +73,7 @@ const plugins = [
|
||||
path.resolve(__dirname, 'build/*'),
|
||||
]),
|
||||
// ref: https://github.com/angular/angular/issues/20357
|
||||
new webpack.ContextReplacementPlugin(/\@angular(\\|\/)core(\\|\/)esm5/,
|
||||
new webpack.ContextReplacementPlugin(/\@angular(\\|\/)core(\\|\/)fesm5/,
|
||||
path.resolve(__dirname, './src')),
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/index.html',
|
||||
@@ -95,6 +91,7 @@ const plugins = [
|
||||
chunks: ['connectors/u2f'],
|
||||
}),
|
||||
new CopyWebpackPlugin([
|
||||
{ from: './src/.nojekyll' },
|
||||
{ from: './src/manifest.json' },
|
||||
{ from: './src/favicon.ico' },
|
||||
{ from: './src/browserconfig.xml' },
|
||||
@@ -103,6 +100,7 @@ const plugins = [
|
||||
{ from: './src/locales', to: 'locales' },
|
||||
{ from: './src/scripts', to: 'scripts' },
|
||||
{ from: './node_modules/qrious/dist/qrious.min.js', to: 'scripts' },
|
||||
{ from: './node_modules/braintree-web-drop-in/dist/browser/dropin.js', to: 'scripts' },
|
||||
]),
|
||||
extractCss,
|
||||
new webpack.DefinePlugin({
|
||||
@@ -133,8 +131,9 @@ if (ENV === 'production') {
|
||||
});
|
||||
}
|
||||
|
||||
// ref: https://webpack.js.org/configuration/dev-server/#devserver
|
||||
let certSuffix = fs.existsSync('dev-server.local.pem') ? '.local' : '.shared';
|
||||
const serve = {
|
||||
const devServer = {
|
||||
https: {
|
||||
key: fs.readFileSync('dev-server' + certSuffix + '.pem'),
|
||||
cert: fs.readFileSync('dev-server' + certSuffix + '.pem'),
|
||||
@@ -146,7 +145,7 @@ const serve = {
|
||||
const config = {
|
||||
mode: ENV,
|
||||
devtool: 'source-map',
|
||||
serve: serve,
|
||||
devServer: devServer,
|
||||
entry: {
|
||||
'app/polyfills': './src/app/polyfills.ts',
|
||||
'app/main': './src/app/main.ts',
|
||||
@@ -173,12 +172,13 @@ const config = {
|
||||
extensions: ['.ts', '.js'],
|
||||
alias: {
|
||||
jslib: path.join(__dirname, 'jslib/src'),
|
||||
tldjs: path.join(__dirname, 'jslib/src/misc/tldjs.noop'),
|
||||
},
|
||||
symlinks: false,
|
||||
modules: [path.resolve('node_modules')],
|
||||
},
|
||||
output: {
|
||||
filename: '[name].[chunkhash].js',
|
||||
filename: '[name].[hash].js',
|
||||
path: path.resolve(__dirname, 'build'),
|
||||
},
|
||||
module: { rules: moduleRules },
|
||||
|
||||
Reference in New Issue
Block a user