Merge branch 'master' of https://github.com/bitwarden/web into feature/hide-passwords

This commit is contained in:
hinton 2020-06-01 21:38:17 +02:00
commit b2bf192677
19 changed files with 364 additions and 233 deletions

2
jslib

@ -1 +1 @@
Subproject commit 2858724f4431038be190fc0b748efe287dd1bae6 Subproject commit 212a2e3745e6e0e2b3057ed308c47daf6aeefbc8

View File

@ -179,6 +179,7 @@ import localeCa from '@angular/common/locales/ca';
import localeCs from '@angular/common/locales/cs'; import localeCs from '@angular/common/locales/cs';
import localeDa from '@angular/common/locales/da'; import localeDa from '@angular/common/locales/da';
import localeDe from '@angular/common/locales/de'; import localeDe from '@angular/common/locales/de';
import localeEl from '@angular/common/locales/el';
import localeEnGb from '@angular/common/locales/en-GB'; import localeEnGb from '@angular/common/locales/en-GB';
import localeEs from '@angular/common/locales/es'; import localeEs from '@angular/common/locales/es';
import localeEt from '@angular/common/locales/et'; import localeEt from '@angular/common/locales/et';
@ -203,6 +204,7 @@ registerLocaleData(localeCa, 'ca');
registerLocaleData(localeCs, 'cs'); registerLocaleData(localeCs, 'cs');
registerLocaleData(localeDa, 'da'); registerLocaleData(localeDa, 'da');
registerLocaleData(localeDe, 'de'); registerLocaleData(localeDe, 'de');
registerLocaleData(localeEl, 'el');
registerLocaleData(localeEnGb, 'en-GB'); registerLocaleData(localeEnGb, 'en-GB');
registerLocaleData(localeEs, 'es'); registerLocaleData(localeEs, 'es');
registerLocaleData(localeEt, 'et'); registerLocaleData(localeEt, 'et');

View File

@ -16,9 +16,11 @@
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span> <span class="sr-only">{{'loading' | i18n}}</span>
</ng-container> </ng-container>
<ng-container *ngIf="!loading && (collections | search:searchText:'name':'id') as searchedCollections"> <ng-container
*ngIf="!loading && (isPaging() ? pagedCollections : collections | search:searchText:'name':'id') as searchedCollections">
<p *ngIf="!searchedCollections.length">{{'noCollectionsInList' | i18n}}</p> <p *ngIf="!searchedCollections.length">{{'noCollectionsInList' | i18n}}</p>
<table class="table table-hover table-list" *ngIf="searchedCollections.length"> <table class="table table-hover table-list" *ngIf="searchedCollections.length" infiniteScroll
[infiniteScrollDistance]="1" [infiniteScrollDisabled]="!isPaging()" (scrolled)="loadMore()">
<tbody> <tbody>
<tr *ngFor="let c of searchedCollections"> <tr *ngFor="let c of searchedCollections">
<td> <td>

View File

@ -14,6 +14,7 @@ import { ApiService } from 'jslib/abstractions/api.service';
import { CollectionService } from 'jslib/abstractions/collection.service'; import { CollectionService } from 'jslib/abstractions/collection.service';
import { I18nService } from 'jslib/abstractions/i18n.service'; import { I18nService } from 'jslib/abstractions/i18n.service';
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service'; import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
import { SearchService } from 'jslib/abstractions/search.service';
import { UserService } from 'jslib/abstractions/user.service'; import { UserService } from 'jslib/abstractions/user.service';
import { CollectionData } from 'jslib/models/data/collectionData'; import { CollectionData } from 'jslib/models/data/collectionData';
@ -40,15 +41,20 @@ export class CollectionsComponent implements OnInit {
loading = true; loading = true;
organizationId: string; organizationId: string;
collections: CollectionView[]; collections: CollectionView[];
pagedCollections: CollectionView[];
searchText: string; searchText: string;
protected didScroll = false;
protected pageSize = 100;
private pagedCollectionsCount = 0;
private modal: ModalComponent = null; private modal: ModalComponent = null;
constructor(private apiService: ApiService, private route: ActivatedRoute, constructor(private apiService: ApiService, private route: ActivatedRoute,
private collectionService: CollectionService, private componentFactoryResolver: ComponentFactoryResolver, private collectionService: CollectionService, private componentFactoryResolver: ComponentFactoryResolver,
private analytics: Angulartics2, private toasterService: ToasterService, private analytics: Angulartics2, private toasterService: ToasterService,
private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, private platformUtilsService: PlatformUtilsService,
private userService: UserService) { } private userService: UserService, private searchService: SearchService) { }
async ngOnInit() { async ngOnInit() {
this.route.parent.parent.params.subscribe(async (params) => { this.route.parent.parent.params.subscribe(async (params) => {
@ -74,9 +80,27 @@ export class CollectionsComponent implements OnInit {
const collections = response.data.filter((c) => c.organizationId === this.organizationId).map((r) => const collections = response.data.filter((c) => c.organizationId === this.organizationId).map((r) =>
new Collection(new CollectionData(r as CollectionDetailsResponse))); new Collection(new CollectionData(r as CollectionDetailsResponse)));
this.collections = await this.collectionService.decryptMany(collections); this.collections = await this.collectionService.decryptMany(collections);
this.resetPaging();
this.loading = false; this.loading = false;
} }
loadMore() {
if (this.collections.length <= this.pageSize) {
return;
}
const pagedLength = this.pagedCollections.length;
let pagedSize = this.pageSize;
if (pagedLength === 0 && this.pagedCollectionsCount > this.pageSize) {
pagedSize = this.pagedCollectionsCount;
}
if (this.collections.length > pagedLength) {
this.pagedCollections =
this.pagedCollections.concat(this.collections.slice(pagedLength, pagedLength + pagedSize));
}
this.pagedCollectionsCount = this.pagedCollections.length;
this.didScroll = this.pagedCollections.length > this.pageSize;
}
edit(collection: CollectionView) { edit(collection: CollectionView) {
if (this.modal != null) { if (this.modal != null) {
this.modal.close(); this.modal.close();
@ -147,10 +171,28 @@ export class CollectionsComponent implements OnInit {
}); });
} }
async resetPaging() {
this.pagedCollections = [];
this.loadMore();
}
isSearching() {
return this.searchService.isSearchable(this.searchText);
}
isPaging() {
const searching = this.isSearching();
if (searching && this.didScroll) {
this.resetPaging();
}
return !searching && this.collections.length > this.pageSize;
}
private removeCollection(collection: CollectionView) { private removeCollection(collection: CollectionView) {
const index = this.collections.indexOf(collection); const index = this.collections.indexOf(collection);
if (index > -1) { if (index > -1) {
this.collections.splice(index, 1); this.collections.splice(index, 1);
this.resetPaging();
} }
} }
} }

View File

@ -16,9 +16,10 @@
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span> <span class="sr-only">{{'loading' | i18n}}</span>
</ng-container> </ng-container>
<ng-container *ngIf="!loading && (groups | search:searchText:'name':'id') as searchedGroups"> <ng-container *ngIf="!loading && (isPaging() ? pagedGroups : groups | search:searchText:'name':'id') as searchedGroups">
<p *ngIf="!searchedGroups.length">{{'noGroupsInList' | i18n}}</p> <p *ngIf="!searchedGroups.length">{{'noGroupsInList' | i18n}}</p>
<table class="table table-hover table-list" *ngIf="searchedGroups.length"> <table class="table table-hover table-list" *ngIf="searchedGroups.length" infiniteScroll
[infiniteScrollDistance]="1" [infiniteScrollDisabled]="!isPaging()" (scrolled)="loadMore()">
<tbody> <tbody>
<tr *ngFor="let g of searchedGroups"> <tr *ngFor="let g of searchedGroups">
<td> <td>

View File

@ -16,6 +16,7 @@ import { Angulartics2 } from 'angulartics2';
import { ApiService } from 'jslib/abstractions/api.service'; import { ApiService } from 'jslib/abstractions/api.service';
import { I18nService } from 'jslib/abstractions/i18n.service'; import { I18nService } from 'jslib/abstractions/i18n.service';
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service'; import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
import { SearchService } from 'jslib/abstractions/search.service';
import { UserService } from 'jslib/abstractions/user.service'; import { UserService } from 'jslib/abstractions/user.service';
import { GroupResponse } from 'jslib/models/response/groupResponse'; import { GroupResponse } from 'jslib/models/response/groupResponse';
@ -37,15 +38,20 @@ export class GroupsComponent implements OnInit {
loading = true; loading = true;
organizationId: string; organizationId: string;
groups: GroupResponse[]; groups: GroupResponse[];
pagedGroups: GroupResponse[];
searchText: string; searchText: string;
protected didScroll = false;
protected pageSize = 100;
private pagedGroupsCount = 0;
private modal: ModalComponent = null; private modal: ModalComponent = null;
constructor(private apiService: ApiService, private route: ActivatedRoute, constructor(private apiService: ApiService, private route: ActivatedRoute,
private i18nService: I18nService, private componentFactoryResolver: ComponentFactoryResolver, private i18nService: I18nService, private componentFactoryResolver: ComponentFactoryResolver,
private analytics: Angulartics2, private toasterService: ToasterService, private analytics: Angulartics2, private toasterService: ToasterService,
private platformUtilsService: PlatformUtilsService, private userService: UserService, private platformUtilsService: PlatformUtilsService, private userService: UserService,
private router: Router) { } private router: Router, private searchService: SearchService) { }
async ngOnInit() { async ngOnInit() {
this.route.parent.parent.params.subscribe(async (params) => { this.route.parent.parent.params.subscribe(async (params) => {
@ -70,9 +76,26 @@ export class GroupsComponent implements OnInit {
const groups = response.data != null && response.data.length > 0 ? response.data : []; const groups = response.data != null && response.data.length > 0 ? response.data : [];
groups.sort(Utils.getSortFunction(this.i18nService, 'name')); groups.sort(Utils.getSortFunction(this.i18nService, 'name'));
this.groups = groups; this.groups = groups;
this.resetPaging();
this.loading = false; this.loading = false;
} }
loadMore() {
if (this.groups.length <= this.pageSize) {
return;
}
const pagedLength = this.pagedGroups.length;
let pagedSize = this.pageSize;
if (pagedLength === 0 && this.pagedGroupsCount > this.pageSize) {
pagedSize = this.pagedGroupsCount;
}
if (this.groups.length > pagedLength) {
this.pagedGroups = this.pagedGroups.concat(this.groups.slice(pagedLength, pagedLength + pagedSize));
}
this.pagedGroupsCount = this.pagedGroups.length;
this.didScroll = this.pagedGroups.length > this.pageSize;
}
edit(group: GroupResponse) { edit(group: GroupResponse) {
if (this.modal != null) { if (this.modal != null) {
this.modal.close(); this.modal.close();
@ -142,10 +165,28 @@ export class GroupsComponent implements OnInit {
}); });
} }
async resetPaging() {
this.pagedGroups = [];
this.loadMore();
}
isSearching() {
return this.searchService.isSearchable(this.searchText);
}
isPaging() {
const searching = this.isSearching();
if (searching && this.didScroll) {
this.resetPaging();
}
return !searching && this.groups.length > this.pageSize;
}
private removeGroup(group: GroupResponse) { private removeGroup(group: GroupResponse) {
const index = this.groups.indexOf(group); const index = this.groups.indexOf(group);
if (index > -1) { if (index > -1) {
this.groups.splice(index, 1); this.groups.splice(index, 1);
this.resetPaging();
} }
} }
} }

View File

@ -35,13 +35,15 @@
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span> <span class="sr-only">{{'loading' | i18n}}</span>
</ng-container> </ng-container>
<ng-container *ngIf="!loading && (users | search:searchText:'name':'email':'id') as searchedUsers"> <ng-container
*ngIf="!loading && (isPaging() ? pagedUsers : users | search:searchText:'name':'email':'id') as searchedUsers">
<p *ngIf="!searchedUsers.length">{{'noUsersInList' | i18n}}</p> <p *ngIf="!searchedUsers.length">{{'noUsersInList' | i18n}}</p>
<ng-container *ngIf="searchedUsers.length"> <ng-container *ngIf="searchedUsers.length">
<app-callout type="info" title="{{'confirmUsers' | i18n}}" icon="fa-check-circle" *ngIf="showConfirmUsers"> <app-callout type="info" title="{{'confirmUsers' | i18n}}" icon="fa-check-circle" *ngIf="showConfirmUsers">
{{'usersNeedConfirmed' | i18n}} {{'usersNeedConfirmed' | i18n}}
</app-callout> </app-callout>
<table class="table table-hover table-list"> <table class="table table-hover table-list" infiniteScroll [infiniteScrollDistance]="1"
[infiniteScrollDisabled]="!isPaging()" (scrolled)="loadMore()">
<tbody> <tbody>
<tr *ngFor="let u of searchedUsers"> <tr *ngFor="let u of searchedUsers">
<td width="30"> <td width="30">

View File

@ -19,6 +19,7 @@ import { ApiService } from 'jslib/abstractions/api.service';
import { CryptoService } from 'jslib/abstractions/crypto.service'; import { CryptoService } from 'jslib/abstractions/crypto.service';
import { I18nService } from 'jslib/abstractions/i18n.service'; import { I18nService } from 'jslib/abstractions/i18n.service';
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service'; import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
import { SearchService } from 'jslib/abstractions/search.service';
import { StorageService } from 'jslib/abstractions/storage.service'; import { StorageService } from 'jslib/abstractions/storage.service';
import { UserService } from 'jslib/abstractions/user.service'; import { UserService } from 'jslib/abstractions/user.service';
@ -50,6 +51,7 @@ export class PeopleComponent implements OnInit {
loading = true; loading = true;
organizationId: string; organizationId: string;
users: OrganizationUserUserDetailsResponse[]; users: OrganizationUserUserDetailsResponse[];
pagedUsers: OrganizationUserUserDetailsResponse[];
searchText: string; searchText: string;
status: OrganizationUserStatusType = null; status: OrganizationUserStatusType = null;
statusMap = new Map<OrganizationUserStatusType, OrganizationUserUserDetailsResponse[]>(); statusMap = new Map<OrganizationUserStatusType, OrganizationUserUserDetailsResponse[]>();
@ -59,6 +61,10 @@ export class PeopleComponent implements OnInit {
accessEvents = false; accessEvents = false;
accessGroups = false; accessGroups = false;
protected didScroll = false;
protected pageSize = 100;
private pagedUsersCount = 0;
private modal: ModalComponent = null; private modal: ModalComponent = null;
private allUsers: OrganizationUserUserDetailsResponse[]; private allUsers: OrganizationUserUserDetailsResponse[];
@ -67,7 +73,7 @@ export class PeopleComponent implements OnInit {
private platformUtilsService: PlatformUtilsService, private analytics: Angulartics2, private platformUtilsService: PlatformUtilsService, private analytics: Angulartics2,
private toasterService: ToasterService, private cryptoService: CryptoService, private toasterService: ToasterService, private cryptoService: CryptoService,
private userService: UserService, private router: Router, private userService: UserService, private router: Router,
private storageService: StorageService) { } private storageService: StorageService, private searchService: SearchService) { }
async ngOnInit() { async ngOnInit() {
this.route.parent.parent.params.subscribe(async (params) => { this.route.parent.parent.params.subscribe(async (params) => {
@ -119,6 +125,23 @@ export class PeopleComponent implements OnInit {
} else { } else {
this.users = this.allUsers; this.users = this.allUsers;
} }
this.resetPaging();
}
loadMore() {
if (this.users.length <= this.pageSize) {
return;
}
const pagedLength = this.pagedUsers.length;
let pagedSize = this.pageSize;
if (pagedLength === 0 && this.pagedUsersCount > this.pageSize) {
pagedSize = this.pagedUsersCount;
}
if (this.users.length > pagedLength) {
this.pagedUsers = this.pagedUsers.concat(this.users.slice(pagedLength, pagedLength + pagedSize));
}
this.pagedUsersCount = this.pagedUsers.length;
this.didScroll = this.pagedUsers.length > this.pageSize;
} }
get allCount() { get allCount() {
@ -294,6 +317,23 @@ export class PeopleComponent implements OnInit {
}); });
} }
async resetPaging() {
this.pagedUsers = [];
this.loadMore();
}
isSearching() {
return this.searchService.isSearchable(this.searchText);
}
isPaging() {
const searching = this.isSearching();
if (searching && this.didScroll) {
this.resetPaging();
}
return !searching && this.users.length > this.pageSize;
}
private async doConfirmation(user: OrganizationUserUserDetailsResponse) { private async doConfirmation(user: OrganizationUserUserDetailsResponse) {
const orgKey = await this.cryptoService.getOrgKey(this.organizationId); const orgKey = await this.cryptoService.getOrgKey(this.organizationId);
const publicKeyResponse = await this.apiService.getUserPublicKey(user.userId); const publicKeyResponse = await this.apiService.getUserPublicKey(user.userId);
@ -313,6 +353,7 @@ export class PeopleComponent implements OnInit {
let index = this.users.indexOf(user); let index = this.users.indexOf(user);
if (index > -1) { if (index > -1) {
this.users.splice(index, 1); this.users.splice(index, 1);
this.resetPaging();
} }
if (this.statusMap.has(OrganizationUserStatusType.Accepted)) { if (this.statusMap.has(OrganizationUserStatusType.Accepted)) {
index = this.statusMap.get(OrganizationUserStatusType.Accepted).indexOf(user); index = this.statusMap.get(OrganizationUserStatusType.Accepted).indexOf(user);

View File

@ -1833,10 +1833,10 @@
"message": "Organizations allow you to share parts of your vault with others as well as manage related users for a specific entity such as a family, small team, or large company." "message": "Organizations allow you to share parts of your vault with others as well as manage related users for a specific entity such as a family, small team, or large company."
}, },
"generalInformation": { "generalInformation": {
"message": "General Information" "message": "Algemene Inligting"
}, },
"organizationName": { "organizationName": {
"message": "Organization Name" "message": "Organisasienaam"
}, },
"accountOwnedBusiness": { "accountOwnedBusiness": {
"message": "This account is owned by a business." "message": "This account is owned by a business."
@ -1848,10 +1848,10 @@
"message": "Business Name" "message": "Business Name"
}, },
"chooseYourPlan": { "chooseYourPlan": {
"message": "Choose Your Plan" "message": "Kies U Plan"
}, },
"users": { "users": {
"message": "Users" "message": "Gebruikers"
}, },
"userSeats": { "userSeats": {
"message": "User Seats" "message": "User Seats"
@ -1879,7 +1879,7 @@
"message": "How many user seats do you need? You can also add additional seats later if needed." "message": "How many user seats do you need? You can also add additional seats later if needed."
}, },
"planNameFree": { "planNameFree": {
"message": "Free", "message": "Gratis",
"description": "Free as in 'free beer'." "description": "Free as in 'free beer'."
}, },
"planDescFree": { "planDescFree": {
@ -1892,16 +1892,16 @@
} }
}, },
"planNameFamilies": { "planNameFamilies": {
"message": "Families" "message": "Gesinne"
}, },
"planDescFamilies": { "planDescFamilies": {
"message": "For personal use, to share with family & friends." "message": "Vir persoonlike gebruik om met vriende en familie te deel."
}, },
"planNameTeams": { "planNameTeams": {
"message": "Teams" "message": "Spanne"
}, },
"planDescTeams": { "planDescTeams": {
"message": "For businesses and other team organizations." "message": "Vir sake- en ander spanorganisasies."
}, },
"planNameEnterprise": { "planNameEnterprise": {
"message": "Enterprise" "message": "Enterprise"
@ -1910,10 +1910,10 @@
"message": "For businesses and other large organizations." "message": "For businesses and other large organizations."
}, },
"freeForever": { "freeForever": {
"message": "Free Forever" "message": "Altyd Gratis"
}, },
"includesXUsers": { "includesXUsers": {
"message": "includes $COUNT$ users", "message": "sluit $COUNT$ gebruikers in",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -1922,10 +1922,10 @@
} }
}, },
"additionalUsers": { "additionalUsers": {
"message": "Additional Users" "message": "Bykomende Gebruikers"
}, },
"costPerUser": { "costPerUser": {
"message": "$COST$ per user", "message": "$COST$ per gebruiker",
"placeholders": { "placeholders": {
"cost": { "cost": {
"content": "$1", "content": "$1",
@ -2006,76 +2006,76 @@
} }
}, },
"monthly": { "monthly": {
"message": "Monthly" "message": "Maandeliks"
}, },
"annually": { "annually": {
"message": "Annually" "message": "Jaarliks"
}, },
"basePrice": { "basePrice": {
"message": "Base Price" "message": "Basisprys"
}, },
"organizationCreated": { "organizationCreated": {
"message": "Organization Created" "message": "Organisasie Geskep"
}, },
"organizationReadyToGo": { "organizationReadyToGo": {
"message": "Your new organization is ready to go!" "message": "U nuwe organisasie is gereed vir gebruik!"
}, },
"organizationUpgraded": { "organizationUpgraded": {
"message": "Your organization has been upgraded." "message": "U organisasie is opgegradeer."
}, },
"leave": { "leave": {
"message": "Leave" "message": "Verlaat"
}, },
"leaveOrganizationConfirmation": { "leaveOrganizationConfirmation": {
"message": "Are you sure you want to leave this organization?" "message": "Is u seker u wil hierdie organisasie verlaat?"
}, },
"leftOrganization": { "leftOrganization": {
"message": "You have left the organization." "message": "U het die organisasie verlaat."
}, },
"defaultCollection": { "defaultCollection": {
"message": "Default Collection" "message": "Verstekversameling"
}, },
"getHelp": { "getHelp": {
"message": "Get Help" "message": "Kry Hulp"
}, },
"getApps": { "getApps": {
"message": "Get the Apps" "message": "Kry die Toeps"
}, },
"loggedInAs": { "loggedInAs": {
"message": "Logged in as" "message": "Aangeteken as"
}, },
"eventLogs": { "eventLogs": {
"message": "Event Logs" "message": "Event Logs"
}, },
"people": { "people": {
"message": "People" "message": "Mense"
}, },
"policies": { "policies": {
"message": "Policies" "message": "Beleide"
}, },
"editPolicy": { "editPolicy": {
"message": "Edit Policy" "message": "Wysig Beleid"
}, },
"groups": { "groups": {
"message": "Groups" "message": "Groepe"
}, },
"newGroup": { "newGroup": {
"message": "New Group" "message": "Nuwe Groep"
}, },
"addGroup": { "addGroup": {
"message": "Add Group" "message": "Voeg Groep Toe"
}, },
"editGroup": { "editGroup": {
"message": "Edit Group" "message": "Wysig Groep"
}, },
"deleteGroupConfirmation": { "deleteGroupConfirmation": {
"message": "Are you sure you want to delete this group?" "message": "Is u seker u wil hierdie groep skrap?"
}, },
"removeUserConfirmation": { "removeUserConfirmation": {
"message": "Are you sure you want to remove this user?" "message": "Is u seker u wil hierdie gebruiker verwyder?"
}, },
"externalId": { "externalId": {
"message": "External Id" "message": "Eksterne ID"
}, },
"externalIdDesc": { "externalIdDesc": {
"message": "The external id can be used as a reference or to link this resource to an external system such as a user directory." "message": "The external id can be used as a reference or to link this resource to an external system such as a user directory."
@ -2084,31 +2084,31 @@
"message": "Access Control" "message": "Access Control"
}, },
"groupAccessAllItems": { "groupAccessAllItems": {
"message": "This group can access and modify all items." "message": "Hierdie groep het toegang tot alle items en kan dit wysig."
}, },
"groupAccessSelectedCollections": { "groupAccessSelectedCollections": {
"message": "This group can access only the selected collections." "message": "Hierdie groep het slegs toegang tot die gekose versamelings."
}, },
"readOnly": { "readOnly": {
"message": "Read Only" "message": "Leesalleen"
}, },
"newCollection": { "newCollection": {
"message": "New Collection" "message": "Nuwe Versameling"
}, },
"addCollection": { "addCollection": {
"message": "Add Collection" "message": "Voeg Versameling Toe"
}, },
"editCollection": { "editCollection": {
"message": "Edit Collection" "message": "Wysig Versameling"
}, },
"deleteCollectionConfirmation": { "deleteCollectionConfirmation": {
"message": "Are you sure you want to delete this collection?" "message": "Is u seker u wil hierdie versameling skrap?"
}, },
"editUser": { "editUser": {
"message": "Edit User" "message": "Wysig Gebruiker"
}, },
"inviteUser": { "inviteUser": {
"message": "Invite User" "message": "Nooi Gebruiker Uit"
}, },
"inviteUserDesc": { "inviteUserDesc": {
"message": "Invite a new user to your organization by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." "message": "Invite a new user to your organization by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account."
@ -2132,7 +2132,7 @@
"message": "This user can access only the selected collections." "message": "This user can access only the selected collections."
}, },
"search": { "search": {
"message": "Search" "message": "Soek"
}, },
"invited": { "invited": {
"message": "Invited" "message": "Invited"
@ -2156,55 +2156,55 @@
"message": "Admins can access and manage all items, collections and users in your organization." "message": "Admins can access and manage all items, collections and users in your organization."
}, },
"user": { "user": {
"message": "User" "message": "Gebruiker"
}, },
"userDesc": { "userDesc": {
"message": "A regular user with access to assigned collections in your organization." "message": "A regular user with access to assigned collections in your organization."
}, },
"manager": { "manager": {
"message": "Manager" "message": "Bestuurder"
}, },
"managerDesc": { "managerDesc": {
"message": "Managers can access and manage assigned collections in your organization." "message": "Bestuurders bestuur en het toegang tot toegewysde versamelings in u organisasie."
}, },
"all": { "all": {
"message": "All" "message": "Alle"
}, },
"refresh": { "refresh": {
"message": "Refresh" "message": "Verfris"
}, },
"timestamp": { "timestamp": {
"message": "Timestamp" "message": "Tydstempel"
}, },
"event": { "event": {
"message": "Event" "message": "Gebeurtenis"
}, },
"unknown": { "unknown": {
"message": "Unknown" "message": "Onbekend"
}, },
"loadMore": { "loadMore": {
"message": "Load More" "message": "Laai Meer"
}, },
"mobile": { "mobile": {
"message": "Mobile", "message": "Mobiel",
"description": "Mobile app" "description": "Mobile app"
}, },
"extension": { "extension": {
"message": "Extension", "message": "Uitbreiding",
"description": "Browser extension/addon" "description": "Browser extension/addon"
}, },
"desktop": { "desktop": {
"message": "Desktop", "message": "Werkskerm",
"description": "Desktop app" "description": "Desktop app"
}, },
"webVault": { "webVault": {
"message": "Web Vault" "message": "Webkluis"
}, },
"loggedIn": { "loggedIn": {
"message": "Logged in." "message": "Aangeteken."
}, },
"changedPassword": { "changedPassword": {
"message": "Changed account password." "message": "Rekeningwagwoord is verander."
}, },
"enabledUpdated2fa": { "enabledUpdated2fa": {
"message": "Enabled/updated two-step login." "message": "Enabled/updated two-step login."
@ -2474,37 +2474,37 @@
} }
}, },
"device": { "device": {
"message": "Device" "message": "Toestel"
}, },
"view": { "view": {
"message": "View" "message": "Bekyk"
}, },
"invalidDateRange": { "invalidDateRange": {
"message": "Invalid date range." "message": "Ongeldige datumbereik."
}, },
"errorOccurred": { "errorOccurred": {
"message": "An error has occurred." "message": "n Fout het voorgekom."
}, },
"userAccess": { "userAccess": {
"message": "User Access" "message": "Gebruikertoegang"
}, },
"userType": { "userType": {
"message": "User Type" "message": "Gebruikertipe"
}, },
"groupAccess": { "groupAccess": {
"message": "Group Access" "message": "Groeptoegang"
}, },
"groupAccessUserDesc": { "groupAccessUserDesc": {
"message": "Edit the groups that this user belongs to." "message": "Edit the groups that this user belongs to."
}, },
"invitedUsers": { "invitedUsers": {
"message": "Invited user(s)." "message": "Gebruiker(s) genooi."
}, },
"resendInvitation": { "resendInvitation": {
"message": "Resend Invitation" "message": "Resend Invitation"
}, },
"hasBeenReinvited": { "hasBeenReinvited": {
"message": "$USER$ has been reinvited.", "message": "$USER$ is weer uitgenooi.",
"placeholders": { "placeholders": {
"user": { "user": {
"content": "$1", "content": "$1",
@ -2516,10 +2516,10 @@
"message": "Bevestig" "message": "Bevestig"
}, },
"confirmUser": { "confirmUser": {
"message": "Confirm User" "message": "Bevestig Gebruiker"
}, },
"hasBeenConfirmed": { "hasBeenConfirmed": {
"message": "$USER$ has been confirmed.", "message": "$USER$ is bevestig.",
"placeholders": { "placeholders": {
"user": { "user": {
"content": "$1", "content": "$1",
@ -2528,7 +2528,7 @@
} }
}, },
"confirmUsers": { "confirmUsers": {
"message": "Confirm Users" "message": "Bevestig Gebruikers"
}, },
"usersNeedConfirmed": { "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": "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."
@ -2558,7 +2558,7 @@
"message": "Unable to verify your email. Try sending a new verification email." "message": "Unable to verify your email. Try sending a new verification email."
}, },
"updateBrowser": { "updateBrowser": {
"message": "Update Browser" "message": "Werk Blaaier By"
}, },
"updateBrowserDesc": { "updateBrowserDesc": {
"message": "You are using an unsupported web browser. The web vault may not function properly." "message": "You are using an unsupported web browser. The web vault may not function properly."
@ -2570,7 +2570,7 @@
"message": "You've been invited to join the organization listed above. To accept the invitation, you need to log in or create a new Bitwarden account." "message": "You've been invited to join the organization listed above. To accept the invitation, you need to log in or create a new Bitwarden account."
}, },
"inviteAccepted": { "inviteAccepted": {
"message": "Invitation Accepted" "message": "Uitnodiging is Aanvaar"
}, },
"inviteAcceptedDesc": { "inviteAcceptedDesc": {
"message": "You can access this organization once an administrator confirms your membership. We'll send you an email when that happens." "message": "You can access this organization once an administrator confirms your membership. We'll send you an email when that happens."
@ -2612,25 +2612,25 @@
"message": "You have requested to delete your Bitwarden account. Click the button below to confirm." "message": "You have requested to delete your Bitwarden account. Click the button below to confirm."
}, },
"myOrganization": { "myOrganization": {
"message": "My Organization" "message": "My Organisasie"
}, },
"deleteOrganization": { "deleteOrganization": {
"message": "Delete Organization" "message": "Skrap Organisasie"
}, },
"deleteOrganizationDesc": { "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": "Gaan hieronder voort om hierdie organisasie en alle verwante data te skrap. Individuele gebruikersrekeninge bly bestaan maar sal nie meer aan hierdie organisasie gekoppel wees nie. "
}, },
"deleteOrganizationWarning": { "deleteOrganizationWarning": {
"message": "Deleting the organization is permanent. It cannot be undone." "message": "Skrap van die organisasie is permanent. Dit kan nie ontdaan word nie."
}, },
"organizationDeleted": { "organizationDeleted": {
"message": "Organization Deleted" "message": "Organisasie Geskrap"
}, },
"organizationDeletedDesc": { "organizationDeletedDesc": {
"message": "The organization and all associated data has been deleted." "message": "Die organisasie en alle verwante data is geskrap."
}, },
"organizationUpdated": { "organizationUpdated": {
"message": "Organization updated" "message": "Organisasie bygewerk"
}, },
"taxInformation": { "taxInformation": {
"message": "Belastinginligting" "message": "Belastinginligting"
@ -2808,7 +2808,7 @@
"description": "A policy is something like Terms of Service, Privacy Policy, etc." "description": "A policy is something like Terms of Service, Privacy Policy, etc."
}, },
"termsOfService": { "termsOfService": {
"message": "Terms of Service" "message": "Gebruiksvoorwaardes"
}, },
"privacyPolicy": { "privacyPolicy": {
"message": "Privaatheidsbeleid" "message": "Privaatheidsbeleid"
@ -2967,13 +2967,13 @@
"message": "U moet u intekening bestuur vanuit die winkel waarin u toepgebonde aankoop gedoen is." "message": "U moet u intekening bestuur vanuit die winkel waarin u toepgebonde aankoop gedoen is."
}, },
"minLength": { "minLength": {
"message": "Minimum Length" "message": "Minimum lengte"
}, },
"clone": { "clone": {
"message": "Clone" "message": "Kloon"
}, },
"masterPassPolicyDesc": { "masterPassPolicyDesc": {
"message": "Set minimum requirements for master password strength." "message": "Stel minimum vereistes vir hoofwagwoordsterkte."
}, },
"twoStepLoginPolicyDesc": { "twoStepLoginPolicyDesc": {
"message": "Require users to set up two-step login on their personal accounts." "message": "Require users to set up two-step login on their personal accounts."
@ -2985,16 +2985,16 @@
"message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations."
}, },
"passwordGeneratorPolicyDesc": { "passwordGeneratorPolicyDesc": {
"message": "Set minimum requirements for password generator configuration." "message": "Stel minimum vereistes vir opstelling van wagwoordgenereerder."
}, },
"passwordGeneratorPolicyInEffect": { "passwordGeneratorPolicyInEffect": {
"message": "One or more organization policies are affecting your generator settings." "message": "Een of meer organisasiebeleide beïnvloed u genereerderinstellings."
}, },
"masterPasswordPolicyInEffect": { "masterPasswordPolicyInEffect": {
"message": "One or more organization policies require your master password to meet the following requirements:" "message": "Een of meer organisasiebeleide stel die volgende eise aan u hoofwagwoord:"
}, },
"policyInEffectMinComplexity": { "policyInEffectMinComplexity": {
"message": "Minimum complexity score of $SCORE$", "message": "Minimum ingewikkeldheidstelling van $SCORE$",
"placeholders": { "placeholders": {
"score": { "score": {
"content": "$1", "content": "$1",
@ -3003,7 +3003,7 @@
} }
}, },
"policyInEffectMinLength": { "policyInEffectMinLength": {
"message": "Minimum length of $LENGTH$", "message": "Minimum lengte van $LENGTH$",
"placeholders": { "placeholders": {
"length": { "length": {
"content": "$1", "content": "$1",
@ -3012,16 +3012,16 @@
} }
}, },
"policyInEffectUppercase": { "policyInEffectUppercase": {
"message": "Contain one or more uppercase characters" "message": "Bevat een of meer hoofletterkarakters"
}, },
"policyInEffectLowercase": { "policyInEffectLowercase": {
"message": "Contain one or more lowercase characters" "message": "Bevat een of meer kleinletterkarakters"
}, },
"policyInEffectNumbers": { "policyInEffectNumbers": {
"message": "Contain one or more numbers" "message": "Bevat een of meer syfers"
}, },
"policyInEffectSpecial": { "policyInEffectSpecial": {
"message": "Contain one or more of the following special characters $CHARS$", "message": "Bevat een of meer van die volgende spesiale karakters $CHARS$",
"placeholders": { "placeholders": {
"chars": { "chars": {
"content": "$1", "content": "$1",
@ -3030,16 +3030,16 @@
} }
}, },
"masterPasswordPolicyRequirementsNotMet": { "masterPasswordPolicyRequirementsNotMet": {
"message": "Your new master password does not meet the policy requirements." "message": "U nuwe hoofwagwoord voldoen nie aan die beleidsvereistes nie."
}, },
"minimumNumberOfWords": { "minimumNumberOfWords": {
"message": "Minimum Number of Words" "message": "Minimum Aantal Woorde"
}, },
"defaultType": { "defaultType": {
"message": "Default Type" "message": "Verstektipe"
}, },
"userPreference": { "userPreference": {
"message": "User Preference" "message": "Gebruikersvoorkeure"
}, },
"vaultTimeoutAction": { "vaultTimeoutAction": {
"message": "Vault Timeout Action" "message": "Vault Timeout Action"
@ -3051,33 +3051,33 @@
"message": "A logged out vault requires that you re-authenticate to access it again." "message": "A logged out vault requires that you re-authenticate to access it again."
}, },
"lock": { "lock": {
"message": "Lock", "message": "Vergrendel",
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
"message": "Trash", "message": "Asblik",
"description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted"
}, },
"searchTrash": { "searchTrash": {
"message": "Search Trash" "message": "Deursoek Asblik"
}, },
"permanentlyDelete": { "permanentlyDelete": {
"message": "Permanently Delete" "message": "Skrap Permanent"
}, },
"permanentlyDeleteSelected": { "permanentlyDeleteSelected": {
"message": "Permanently Delete Selected" "message": "Skrap Gekose Permanent"
}, },
"permanentlyDeleteItem": { "permanentlyDeleteItem": {
"message": "Permanently Delete Item" "message": "Skrap Item Permanent"
}, },
"permanentlyDeleteItemConfirmation": { "permanentlyDeleteItemConfirmation": {
"message": "Are you sure you want to permanently delete this item?" "message": "Is u seker u wil hierdie item permanent skrap?"
}, },
"permanentlyDeletedItem": { "permanentlyDeletedItem": {
"message": "Permanently Deleted item" "message": "Permanent Geskrapte Item"
}, },
"permanentlyDeletedItems": { "permanentlyDeletedItems": {
"message": "Permanently Deleted items" "message": "Permanent Geskrapte Items"
}, },
"permanentlyDeleteSelectedItemsDesc": { "permanentlyDeleteSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?", "message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?",
@ -3089,7 +3089,7 @@
} }
}, },
"permanentlyDeletedItemId": { "permanentlyDeletedItemId": {
"message": "Permanently Deleted item $ID$.", "message": "Permanent Geskrapte Items $ID$.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",

View File

@ -2817,10 +2817,10 @@
"message": "Filtry" "message": "Filtry"
}, },
"vaultTimeout": { "vaultTimeout": {
"message": "Vault Timeout" "message": "Časový limit trezoru"
}, },
"vaultTimeoutDesc": { "vaultTimeoutDesc": {
"message": "Choose when your vault will timeout and perform the selected action." "message": "Vyberte, kdy vyprší bezpečnostní limit trezoru. Poté bude provedena vybraná akce."
}, },
"oneMinute": { "oneMinute": {
"message": "Po 1 minutě" "message": "Po 1 minutě"
@ -3042,16 +3042,16 @@
"message": "Uživatelská volba" "message": "Uživatelská volba"
}, },
"vaultTimeoutAction": { "vaultTimeoutAction": {
"message": "Vault Timeout Action" "message": "Akce při vypršení časového limitu"
}, },
"vaultTimeoutActionLockDesc": { "vaultTimeoutActionLockDesc": {
"message": "A locked vault requires that you re-enter your master password to access it again." "message": "Trezor bude uzamčen. Pro opětovný přístup k trezoru bude vyžadováno hlavní heslo."
}, },
"vaultTimeoutActionLogOutDesc": { "vaultTimeoutActionLogOutDesc": {
"message": "A logged out vault requires that you re-authenticate to access it again." "message": "Budete odhlášeni. Pro opětovný přístup k trezoru bude vyžadováno ověření."
}, },
"lock": { "lock": {
"message": "Lock", "message": "Zamknout",
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
@ -3062,25 +3062,25 @@
"message": "Hledat v koši" "message": "Hledat v koši"
}, },
"permanentlyDelete": { "permanentlyDelete": {
"message": "Permanently Delete" "message": "Trvale smazat"
}, },
"permanentlyDeleteSelected": { "permanentlyDeleteSelected": {
"message": "Permanently Delete Selected" "message": "Trvale smazat vybrané"
}, },
"permanentlyDeleteItem": { "permanentlyDeleteItem": {
"message": "Permanently Delete Item" "message": "Trvale smazat položku"
}, },
"permanentlyDeleteItemConfirmation": { "permanentlyDeleteItemConfirmation": {
"message": "Are you sure you want to permanently delete this item?" "message": "Opravdu chcete tuto položku trvale smazat?"
}, },
"permanentlyDeletedItem": { "permanentlyDeletedItem": {
"message": "Permanently Deleted item" "message": "Trvale smazaná položka"
}, },
"permanentlyDeletedItems": { "permanentlyDeletedItems": {
"message": "Permanently Deleted items" "message": "Trvale smazané položky"
}, },
"permanentlyDeleteSelectedItemsDesc": { "permanentlyDeleteSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?", "message": "Vybrané položky ($COUNT$) budou trvale smazány. Opravdu chcete všechny vybrané položky trvale smazat?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3089,7 +3089,7 @@
} }
}, },
"permanentlyDeletedItemId": { "permanentlyDeletedItemId": {
"message": "Permanently Deleted item $ID$.", "message": "Položka $ID$ trvale smazána.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3098,25 +3098,25 @@
} }
}, },
"restore": { "restore": {
"message": "Restore" "message": "Obnovit"
}, },
"restoreSelected": { "restoreSelected": {
"message": "Restore Selected" "message": "Obnovit vybrané"
}, },
"restoreItem": { "restoreItem": {
"message": "Restore Item" "message": "Obnovit položku"
}, },
"restoredItem": { "restoredItem": {
"message": "Restored Item" "message": "Obnovená položka"
}, },
"restoredItems": { "restoredItems": {
"message": "Restored Items" "message": "Obnovené položky"
}, },
"restoreItemConfirmation": { "restoreItemConfirmation": {
"message": "Are you sure you want to restore this item?" "message": "Opravdu chcete tuto položku obnovit?"
}, },
"restoreItems": { "restoreItems": {
"message": "Restore items" "message": "Obnovit položky"
}, },
"restoreSelectedItemsDesc": { "restoreSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to restore. Are you sure you want to restore all of these items?", "message": "You have selected $COUNT$ item(s) to restore. Are you sure you want to restore all of these items?",
@ -3128,7 +3128,7 @@
} }
}, },
"restoredItemId": { "restoredItemId": {
"message": "Restored item $ID$.", "message": "Položka $ID$ obnovena.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3137,9 +3137,9 @@
} }
}, },
"vaultTimeoutLogOutConfirmation": { "vaultTimeoutLogOutConfirmation": {
"message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" "message": "Po vypršení časového limitu dojde k odhlášení. Přístup k trezoru bude odebrán a pro opětovné přihlášení bude vyžadováno online ověření. Opravdu chcete použít toto nastavení?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "Timeout Action Confirmation" "message": "Potvrzení akce při vypršení časového limitu"
} }
} }

View File

@ -461,10 +461,10 @@
"message": "Er du sikker på, at du vil slette dette element?" "message": "Er du sikker på, at du vil slette dette element?"
}, },
"deletedItem": { "deletedItem": {
"message": "Slettede element" "message": "Element sendt til papirkurven"
}, },
"deletedItems": { "deletedItems": {
"message": "Slettede elementer" "message": "Elementer sendt til papirkurven"
}, },
"movedItems": { "movedItems": {
"message": "Flyttede elementer" "message": "Flyttede elementer"
@ -2249,7 +2249,7 @@
} }
}, },
"deletedItemId": { "deletedItemId": {
"message": "Slettede element $ID$.", "message": "Element $ID$ sendt til papirkurven.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2817,10 +2817,10 @@
"message": "Filtre" "message": "Filtre"
}, },
"vaultTimeout": { "vaultTimeout": {
"message": "Vault Timeout" "message": "Boks timeout"
}, },
"vaultTimeoutDesc": { "vaultTimeoutDesc": {
"message": "Choose when your vault will timeout and perform the selected action." "message": "Vælg timeout for din boks, hvorefter den vil udføre den valgte handling."
}, },
"oneMinute": { "oneMinute": {
"message": "1 minut" "message": "1 minut"
@ -3042,45 +3042,45 @@
"message": "Brugerindstilling" "message": "Brugerindstilling"
}, },
"vaultTimeoutAction": { "vaultTimeoutAction": {
"message": "Vault Timeout Action" "message": "Boks timeout-handling"
}, },
"vaultTimeoutActionLockDesc": { "vaultTimeoutActionLockDesc": {
"message": "A locked vault requires that you re-enter your master password to access it again." "message": "En låst boks kræver at du gentaster din hovedadgangskode for at tilgå den igen."
}, },
"vaultTimeoutActionLogOutDesc": { "vaultTimeoutActionLogOutDesc": {
"message": "A logged out vault requires that you re-authenticate to access it again." "message": "En boks der er logget ud kræver, at du godkender igen for at få adgang til den."
}, },
"lock": { "lock": {
"message": "Lock", "message": "Lås",
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
"message": "Trash", "message": "Papirkurv",
"description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted"
}, },
"searchTrash": { "searchTrash": {
"message": "Search Trash" "message": "Søg i papirkurven"
}, },
"permanentlyDelete": { "permanentlyDelete": {
"message": "Permanently Delete" "message": "Slette permanent"
}, },
"permanentlyDeleteSelected": { "permanentlyDeleteSelected": {
"message": "Permanently Delete Selected" "message": "Slet valgte elementer permanent"
}, },
"permanentlyDeleteItem": { "permanentlyDeleteItem": {
"message": "Permanently Delete Item" "message": "Slet element permanent"
}, },
"permanentlyDeleteItemConfirmation": { "permanentlyDeleteItemConfirmation": {
"message": "Are you sure you want to permanently delete this item?" "message": "Er du sikker på, at du vil slette dette element permanent?"
}, },
"permanentlyDeletedItem": { "permanentlyDeletedItem": {
"message": "Permanently Deleted item" "message": "Element slettet permanent"
}, },
"permanentlyDeletedItems": { "permanentlyDeletedItems": {
"message": "Permanently Deleted items" "message": "Elementer slettet permanent"
}, },
"permanentlyDeleteSelectedItemsDesc": { "permanentlyDeleteSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?", "message": "Du har valgt $COUNT$ element(er), der skal slettes permanent. Er du sikker på, at du vil slette alle disse elementer permanent?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3089,7 +3089,7 @@
} }
}, },
"permanentlyDeletedItemId": { "permanentlyDeletedItemId": {
"message": "Permanently Deleted item $ID$.", "message": "Element $ID$ slettet permanent.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3098,28 +3098,28 @@
} }
}, },
"restore": { "restore": {
"message": "Restore" "message": "Gendan"
}, },
"restoreSelected": { "restoreSelected": {
"message": "Restore Selected" "message": "Gendan valgte"
}, },
"restoreItem": { "restoreItem": {
"message": "Restore Item" "message": "Gendan element"
}, },
"restoredItem": { "restoredItem": {
"message": "Restored Item" "message": "Element gendannet"
}, },
"restoredItems": { "restoredItems": {
"message": "Restored Items" "message": "Elementer gendannet"
}, },
"restoreItemConfirmation": { "restoreItemConfirmation": {
"message": "Are you sure you want to restore this item?" "message": "Er du sikker på, at du vil gendanne dette element?"
}, },
"restoreItems": { "restoreItems": {
"message": "Restore items" "message": "Gendan elementer"
}, },
"restoreSelectedItemsDesc": { "restoreSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to restore. Are you sure you want to restore all of these items?", "message": "Du har valgt $COUNT$ element(er), der skal gendannes. Er du sikker på, at du vil gendanne alle disse elementer?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3128,7 +3128,7 @@
} }
}, },
"restoredItemId": { "restoredItemId": {
"message": "Restored item $ID$.", "message": "Element $ID$ gendannet.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3137,9 +3137,9 @@
} }
}, },
"vaultTimeoutLogOutConfirmation": { "vaultTimeoutLogOutConfirmation": {
"message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" "message": "Ved at logge ud fjernes al adgang til din boks og kræver online-godkendelse efter timeout-perioden. Er du sikker på, at du vil bruge denne indstilling?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "Timeout Action Confirmation" "message": "Bekræft timeout-handling"
} }
} }

View File

@ -854,7 +854,7 @@
"message": "E-Mail-Adresse ändern" "message": "E-Mail-Adresse ändern"
}, },
"newEmail": { "newEmail": {
"message": "Neue E-Mail Adresse" "message": "Neue E-Mail-Adresse"
}, },
"code": { "code": {
"message": "Code" "message": "Code"
@ -1032,7 +1032,7 @@
"message": "Ändern Sie die Sprache für den Web-Tresor." "message": "Ändern Sie die Sprache für den Web-Tresor."
}, },
"disableIcons": { "disableIcons": {
"message": "Webseiten Icons deaktivieren" "message": "Website-Icons deaktivieren"
}, },
"disableIconsDesc": { "disableIconsDesc": {
"message": "Website-Icons zeigen ein wiedererkennbares Bild neben jedem Eintrag in Ihrem Tresor." "message": "Website-Icons zeigen ein wiedererkennbares Bild neben jedem Eintrag in Ihrem Tresor."
@ -1048,16 +1048,16 @@
"message": "Standard" "message": "Standard"
}, },
"domainRules": { "domainRules": {
"message": "Domänenregeln" "message": "Domain-Regeln"
}, },
"domainRulesDesc": { "domainRulesDesc": {
"message": "Wenn Sie die gleiche Anmeldung über mehrere verschiedene Webseitendomänen hinweg haben, können Sie die Webseite als \"gleichwertig\" markieren. \"Globale\" Domänen wurden bereits von Bitwarden für Sie angelegt." "message": "Wenn Sie die gleiche Anmeldung über mehrere verschiedene Webseitendomänen hinweg haben, können Sie die Webseite als \"gleichwertig\" markieren. \"Globale\" Domänen wurden bereits von Bitwarden für Sie angelegt."
}, },
"globalEqDomains": { "globalEqDomains": {
"message": "Globale gleichwertige Domänen" "message": "Globale gleichwertige Domains"
}, },
"customEqDomains": { "customEqDomains": {
"message": "Benutzerdefinierte gleichwertige Domänen" "message": "Benutzerdefinierte gleichwertige Domains"
}, },
"exclude": { "exclude": {
"message": "Ausschließen" "message": "Ausschließen"
@ -2153,7 +2153,7 @@
"message": "Administrator" "message": "Administrator"
}, },
"adminDesc": { "adminDesc": {
"message": "Administratoren können auf alle Elemente, Sammlungen und Benutzer in der Organisation zugreifen und diese verwalten." "message": "Administratoren können auf alle Einträge, Sammlungen und Benutzer in der Organisation zugreifen und diese verwalten."
}, },
"user": { "user": {
"message": "Benutzer" "message": "Benutzer"
@ -2276,7 +2276,7 @@
} }
}, },
"viewedPasswordItemId": { "viewedPasswordItemId": {
"message": "Passwort für Element $ID$ kopiert.", "message": "Passwort für Eintrag $ID$ angesehen.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2285,7 +2285,7 @@
} }
}, },
"viewedHiddenFieldItemId": { "viewedHiddenFieldItemId": {
"message": "Verstecktes Feld für Element $ID$ angesehen.", "message": "Verstecktes Feld für Eintrag $ID$ angesehen.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2294,7 +2294,7 @@
} }
}, },
"viewedSecurityCodeItemId": { "viewedSecurityCodeItemId": {
"message": "Sicherheitscode für Element $ID$ angesehen.", "message": "Sicherheitscode für Eintrag $ID$ angesehen.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2303,7 +2303,7 @@
} }
}, },
"copiedPasswordItemId": { "copiedPasswordItemId": {
"message": "Passwort für Element $ID$ kopiert.", "message": "Passwort für Eintrag $ID$ kopiert.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2312,7 +2312,7 @@
} }
}, },
"copiedHiddenFieldItemId": { "copiedHiddenFieldItemId": {
"message": "Verstecktes Feld für Element $ID$ kopiert.", "message": "Verstecktes Feld für Eintrag $ID$ kopiert.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2321,7 +2321,7 @@
} }
}, },
"copiedSecurityCodeItemId": { "copiedSecurityCodeItemId": {
"message": "Sicherheitscode für Element $ID$ kopiert.", "message": "Sicherheitscode für Eintrag $ID$ kopiert.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -2330,7 +2330,7 @@
} }
}, },
"autofilledItemId": { "autofilledItemId": {
"message": "Element $ID$ automatisch ausgefüllt.", "message": "Eintrag $ID$ automatisch ausgefüllt.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3012,10 +3012,10 @@
} }
}, },
"policyInEffectUppercase": { "policyInEffectUppercase": {
"message": "Enthält ein oder mehrere Großbuchstaben" "message": "Enthält einen oder mehrere Großbuchstaben"
}, },
"policyInEffectLowercase": { "policyInEffectLowercase": {
"message": "Enthält ein oder mehrere Kleinbuchstaben" "message": "Enthält einen oder mehrere Kleinbuchstaben"
}, },
"policyInEffectNumbers": { "policyInEffectNumbers": {
"message": "Enthält eine oder mehrere Zahlen" "message": "Enthält eine oder mehrere Zahlen"
@ -3080,7 +3080,7 @@
"message": "Dauerhaft gelöschte Einträge" "message": "Dauerhaft gelöschte Einträge"
}, },
"permanentlyDeleteSelectedItemsDesc": { "permanentlyDeleteSelectedItemsDesc": {
"message": "Sie haben $COUNT$ Eintrag/Einträge zum unwiderruflichen Löschen ausgewählt. Sind Sie sicher, dass Sie alle diese(n) Eintrag/Einträge dauerhaft löschen möchten?", "message": "Sie haben $COUNT$ Eintrag/Einträge zum unwiderruflichen Löschen ausgewählt. Sind Sie sicher, dass Sie diese(n) Eintrag/Einträge dauerhaft löschen möchten?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3119,7 +3119,7 @@
"message": "Einträge wiederherstellen" "message": "Einträge wiederherstellen"
}, },
"restoreSelectedItemsDesc": { "restoreSelectedItemsDesc": {
"message": "Sie haben $COUNT$ Eintrag/Einträge zum Wiederherstellen ausgewählt. Sind Sie sicher, dass Sie alle diese Einträge wiederherstellen möchten?", "message": "Sie haben $COUNT$ Eintrag/Einträge zum Wiederherstellen ausgewählt. Sind Sie sicher, dass Sie diese(n) Eintrag/Einträge dauerhaft löschen möchten?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",

View File

@ -461,10 +461,10 @@
"message": "Are you sure you want to delete this item?" "message": "Are you sure you want to delete this item?"
}, },
"deletedItem": { "deletedItem": {
"message": "Deleted item" "message": "Item sent to bin"
}, },
"deletedItems": { "deletedItems": {
"message": "Deleted items" "message": "Items sent to bin"
}, },
"movedItems": { "movedItems": {
"message": "Moved items" "message": "Moved items"
@ -2249,7 +2249,7 @@
} }
}, },
"deletedItemId": { "deletedItemId": {
"message": "Deleted item $ID$.", "message": "Sent item $ID$ to bin.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3055,11 +3055,11 @@
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
"message": "Rubbish", "message": "Bin",
"description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted"
}, },
"searchTrash": { "searchTrash": {
"message": "Search rubbish" "message": "Search bin"
}, },
"permanentlyDelete": { "permanentlyDelete": {
"message": "Permanently delete" "message": "Permanently delete"

View File

@ -1485,7 +1485,7 @@
"message": "Breached Accounts Found" "message": "Breached Accounts Found"
}, },
"compromisedData": { "compromisedData": {
"message": "Compromised data" "message": "Vaarantunutta tietoa"
}, },
"website": { "website": {
"message": "Sivusto" "message": "Sivusto"

View File

@ -2817,10 +2817,10 @@
"message": "Filtri" "message": "Filtri"
}, },
"vaultTimeout": { "vaultTimeout": {
"message": "Vault Timeout" "message": "Timeout Cassaforte"
}, },
"vaultTimeoutDesc": { "vaultTimeoutDesc": {
"message": "Choose when your vault will timeout and perform the selected action." "message": "Scegli quando la tua cassaforte andrà in timeout ed esegui l'azione selezionata."
}, },
"oneMinute": { "oneMinute": {
"message": "1 minuto" "message": "1 minuto"
@ -3042,45 +3042,45 @@
"message": "Preferenze utente" "message": "Preferenze utente"
}, },
"vaultTimeoutAction": { "vaultTimeoutAction": {
"message": "Vault Timeout Action" "message": "Azione Timeout Cassaforte"
}, },
"vaultTimeoutActionLockDesc": { "vaultTimeoutActionLockDesc": {
"message": "Scegli quando bloccare la tua cassaforte. Una cassaforte bloccata richiede l'inserimento della password principale per potervi accedere." "message": "Una cassaforte bloccata richiede l'inserimento della password principale per accedere nuovamente."
}, },
"vaultTimeoutActionLogOutDesc": { "vaultTimeoutActionLogOutDesc": {
"message": "A logged out vault requires that you re-authenticate to access it again." "message": "La disconnessione dalla cassaforte richiede l'inserimento della password principale per accedere nuovamente."
}, },
"lock": { "lock": {
"message": "Lock", "message": "Blocca",
"description": "Verb form: to make secure or inaccesible by" "description": "Verb form: to make secure or inaccesible by"
}, },
"trash": { "trash": {
"message": "Trash", "message": "Cestino",
"description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted"
}, },
"searchTrash": { "searchTrash": {
"message": "Search Trash" "message": "Cerca nel cestino"
}, },
"permanentlyDelete": { "permanentlyDelete": {
"message": "Permanently Delete" "message": "Elimina definitivamente"
}, },
"permanentlyDeleteSelected": { "permanentlyDeleteSelected": {
"message": "Permanently Delete Selected" "message": "Elimina definitivamente l'elemento selezionato"
}, },
"permanentlyDeleteItem": { "permanentlyDeleteItem": {
"message": "Permanently Delete Item" "message": "Elimina definitivamente l'elemento"
}, },
"permanentlyDeleteItemConfirmation": { "permanentlyDeleteItemConfirmation": {
"message": "Are you sure you want to permanently delete this item?" "message": "Sei sicuro di voler eliminare definitivamente questo elemento?"
}, },
"permanentlyDeletedItem": { "permanentlyDeletedItem": {
"message": "Permanently Deleted item" "message": "Elimina definitivamente l'elemento"
}, },
"permanentlyDeletedItems": { "permanentlyDeletedItems": {
"message": "Permanently Deleted items" "message": "Elimina definitivamente gli elementi"
}, },
"permanentlyDeleteSelectedItemsDesc": { "permanentlyDeleteSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?", "message": "Hai selezionato $COUNT$ elemento/i da eliminare definitivamente. Sei sicuro di voler eliminare definitivamente tutti gli elementi selezionati?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3089,7 +3089,7 @@
} }
}, },
"permanentlyDeletedItemId": { "permanentlyDeletedItemId": {
"message": "Permanently Deleted item $ID$.", "message": "Elemento definitivamente eliminato $ID$.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3098,28 +3098,28 @@
} }
}, },
"restore": { "restore": {
"message": "Restore" "message": "Ripristina"
}, },
"restoreSelected": { "restoreSelected": {
"message": "Restore Selected" "message": "Ripristina selezionato"
}, },
"restoreItem": { "restoreItem": {
"message": "Restore Item" "message": "Ripristina elemento"
}, },
"restoredItem": { "restoredItem": {
"message": "Restored Item" "message": "Ripristina Elemento"
}, },
"restoredItems": { "restoredItems": {
"message": "Restored Items" "message": "Elementi Ripristinati"
}, },
"restoreItemConfirmation": { "restoreItemConfirmation": {
"message": "Are you sure you want to restore this item?" "message": "Sei sicuro di voler ripristinare questo elemento?"
}, },
"restoreItems": { "restoreItems": {
"message": "Restore items" "message": "Ripristina elementi"
}, },
"restoreSelectedItemsDesc": { "restoreSelectedItemsDesc": {
"message": "You have selected $COUNT$ item(s) to restore. Are you sure you want to restore all of these items?", "message": "Hai selezionato $COUNT$ elemento/i da ripristinare. Sei sicuro di voler ripristinare tutti gli elementi selezionati?",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",
@ -3128,7 +3128,7 @@
} }
}, },
"restoredItemId": { "restoredItemId": {
"message": "Restored item $ID$.", "message": "Elemento ripristinato $ID$.",
"placeholders": { "placeholders": {
"id": { "id": {
"content": "$1", "content": "$1",
@ -3137,9 +3137,9 @@
} }
}, },
"vaultTimeoutLogOutConfirmation": { "vaultTimeoutLogOutConfirmation": {
"message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" "message": "La disconnessione rimuove tutti gli accessi alla tua cassaforte e richiede l'autenticazione online dopo il periodo di timeout. Sei sicuro di voler utilizzare questa impostazione?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "Timeout Action Confirmation" "message": "Conferma Azione di Timeout"
} }
} }

View File

@ -1423,7 +1423,7 @@
"message": "Znaleźliśmy identyczne hasła" "message": "Znaleźliśmy identyczne hasła"
}, },
"reusedPasswordsFoundDesc": { "reusedPasswordsFoundDesc": {
"message": "Znaleźliśmy hasła ($COUNT$), które powtarzają się w sejfie. Zmień je, aby były unikalne.", "message": "Znaleźliśmy hasła, które powtarzają się w sejfie. Zmień je, aby były unikalne.",
"placeholders": { "placeholders": {
"count": { "count": {
"content": "$1", "content": "$1",

View File

@ -2817,10 +2817,10 @@
"message": "Filtros" "message": "Filtros"
}, },
"vaultTimeout": { "vaultTimeout": {
"message": "Vault Timeout" "message": "Tempo de expiração do Cofre"
}, },
"vaultTimeoutDesc": { "vaultTimeoutDesc": {
"message": "Choose when your vault will timeout and perform the selected action." "message": "Escolha quando o seu cofre irá de expirar e a ação que irá executar."
}, },
"oneMinute": { "oneMinute": {
"message": "1 minuto" "message": "1 minuto"
@ -3042,13 +3042,13 @@
"message": "Preferência do utilizador" "message": "Preferência do utilizador"
}, },
"vaultTimeoutAction": { "vaultTimeoutAction": {
"message": "Vault Timeout Action" "message": "Ação de expiração do Cofre"
}, },
"vaultTimeoutActionLockDesc": { "vaultTimeoutActionLockDesc": {
"message": "A locked vault requires that you re-enter your master password to access it again." "message": "Um cofre bloqueado requer que você reinsira a sua palavra-passe mestra para o aceder novamente."
}, },
"vaultTimeoutActionLogOutDesc": { "vaultTimeoutActionLogOutDesc": {
"message": "A logged out vault requires that you re-authenticate to access it again." "message": "Um cofre com a sessão desligada requer que você se autentique novamente para o poder aceder."
}, },
"lock": { "lock": {
"message": "Bloquear", "message": "Bloquear",
@ -3140,6 +3140,6 @@
"message": "Terminar sessão irá remover todos os acessos ao seu cofre e requer autenticação online após o período de espera. Tem a certeza de que pretende utilizar esta definição?" "message": "Terminar sessão irá remover todos os acessos ao seu cofre e requer autenticação online após o período de espera. Tem a certeza de que pretende utilizar esta definição?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "Timeout Action Confirmation" "message": "Confirmação de expiração do Cofre"
} }
} }

View File

@ -3137,9 +3137,9 @@
} }
}, },
"vaultTimeoutLogOutConfirmation": { "vaultTimeoutLogOutConfirmation": {
"message": "登出将会在超时后删除您访问密码库的所有权限,并且需要进行在线认证。 您确定要使用此设置吗?" "message": "注销时将会移除密码库的所有访问权限,并且需要在超时后进行在线认证。 您确定要使用此设置吗?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "超时作确认" "message": "超时作确认"
} }
} }

View File

@ -11,7 +11,7 @@ export class I18nService extends BaseI18nService {
}); });
this.supportedTranslationLocales = [ this.supportedTranslationLocales = [
'en', 'ca', 'cs', 'da', 'de', 'en-GB', 'es', 'et', 'fr', 'he', 'it', 'ja', 'ko', 'nb', 'nl', 'pl', 'en', 'ca', 'cs', 'da', 'de', 'el', 'en-GB', 'es', 'et', 'fr', 'he', 'it', 'ja', 'ko', 'nb', 'nl', 'pl',
'pt-PT', 'pt-BR', 'ru', 'sk', 'sv', 'uk', 'zh-CN', 'zh-TW', 'pt-PT', 'pt-BR', 'ru', 'sk', 'sv', 'uk', 'zh-CN', 'zh-TW',
]; ];
} }