Merge pull request #4163 from emanuelschuetze/translations

Updated translation strings and German translation.
This commit is contained in:
Emanuel Schütze 2019-01-22 09:19:26 +01:00 committed by GitHub
commit c67aef68d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 978 additions and 236 deletions

View File

@ -31,12 +31,12 @@
<mat-dialog-actions>
<div *ngIf="data.actionButtons">
<button *ngFor="let button of data.actionButtons" mat-button (click)="closeDialog(true, button)">
<span translate>{{ button }}</span>
<span>{{ button | translate }}</span>
</button>
</div>
<div *ngIf="!data.actionButtons">
<button *ngIf="!data.multiSelect || data.choices.length" mat-button (click)="closeDialog(true)">
<span translate>Ok</span>
<span>OK</span>
</button>
</div>
<button mat-button (click)="closeDialog(false)"><span translate>Cancel</span></button>

View File

@ -5,7 +5,7 @@
<mat-icon>
{{ filter.count ? 'checked' : ''}}
</mat-icon>
<span translate>{{ service.getFilterName(filter) }}</span>
<span>{{ service.getFilterName(filter) | translate }}</span>
</mat-panel-title>
</mat-expansion-panel-header>
<div class="indent" *ngIf="filter.options && filter.options.length">
@ -18,7 +18,7 @@
</div>
<div class="filter-subtitle" *ngIf="!isFilter(option)">
<mat-divider *ngIf="option === '-'"></mat-divider>
<span *ngIf="option !== '-'" translate> {{option}}</span>
<span *ngIf="option !== '-'"> {{ option | translate }}</span>
</div>
</div>
</mat-action-list>

View File

@ -2,7 +2,7 @@
<mat-list-item *ngFor="let option of this.data.sortOptions.options" (click)="clickedOption(option.property)">
<button mat-menu-item>
<mat-icon>{{ data.getSortIcon(option) }}</mat-icon>
<span translate>{{ data.getSortLabel(option) }}</span>
<span>{{ data.getSortLabel(option) | translate}}</span>
</button>
</mat-list-item>
</mat-nav-list>

View File

@ -16,7 +16,7 @@
<div *ngFor="let filter of filterService.filterDefinitions">
<button mat-button *ngIf="filter.count" (click)="filterService.clearFilter(filter)">
<mat-icon inline>close</mat-icon>
<span translate>{{ filterService.getFilterName(filter) }}</span>
<span>{{ filterService.getFilterName(filter) | translate }}</span>
</button>
</div>
</div>
@ -55,7 +55,7 @@
<mat-drawer #filterMenu mode="push" position="end">
<div class="custom-table-header filter-menu" (click)="this.filterMenu.toggle()">
<span><mat-icon>keyboard_arrow_right</mat-icon></span>
<span class="right-with-margin" translate>Filter options:</span>
<span class="right-with-margin" translate>Filter options</span>
</div>
<os-filter-menu *ngIf="filterService" (dismissed)="this.filterMenu.close()" [service]="filterService">
</os-filter-menu>
@ -70,7 +70,7 @@
>
<button mat-menu-item>
<mat-icon>{{ sortService.getSortIcon(option) }}</mat-icon>
<span translate> {{ sortService.getSortLabel(option) }}</span>
<span>{{ sortService.getSortLabel(option) | translate }}</span>
</button>
</mat-list-item>
</div>

View File

@ -43,7 +43,7 @@
</mat-select>
</mat-form-field>
<mat-form-field>
<mat-label translate> Column Separator</mat-label>
<mat-label translate>Column separator</mat-label>
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
{{ option.label | translate }}
@ -70,7 +70,7 @@
(change)="onSelectFile($event)"
/>
<button mat-button onclick="document.getElementById('agenda-import-file-input').click()">
<span translate> Select file</span>
<span translate>Select file</span>
</button>
</div>
</div>
@ -127,14 +127,13 @@
</div>
</div>
<div *ngIf="newCount">
<span translate>Click on 'import' (right top corner) to import the new topics.
</span>
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
</div>
<div>
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
<mat-option value="all" translate> Show all </mat-option>
<mat-option value="error" translate> Show errors only </mat-option>
<mat-option value="noerror" translate> Show correct entries </mat-option>
<mat-option value="all" translate>Show all</mat-option>
<mat-option value="error" translate>Show errors only</mat-option>
<mat-option value="noerror" translate>Show correct entries only</mat-option>
</mat-select>
</div>
<div class="table-container">
@ -189,7 +188,7 @@
</ng-container>
<ng-container matColumnDef="text">
<mat-header-cell *matHeaderCellDef translate>Item text</mat-header-cell>
<mat-header-cell *matHeaderCellDef translate>Text</mat-header-cell>
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
{{ getShortPreview(entry.newEntry.text) }}
</mat-cell>

View File

@ -1,4 +1,4 @@
<h1 mat-dialog-title>{{ 'Change values for' | translate }} {{ item.getTitle() }}</h1>
<h1 mat-dialog-title>{{ 'Edit details for' | translate }} {{ item.getTitle() }}</h1>
<div mat-dialog-content>
<form class="itemDialogForm" [formGroup]="agendaInfoForm" (keydown)="onKeyDown($event)" (ngSubmit)="saveItemInfo()">
<!-- Visibility -->

View File

@ -66,7 +66,7 @@
<ng-template let-item>
<span *osPerms="'agenda.can_manage_list_of_speakers'">
<span *ngIf="hasSpokenCount(item)" class="red-warning-text speaker-warning">
<span translate>Call</span><span>&nbsp;{{ hasSpokenCount(item) + 1 }}</span>
{{ hasSpokenCount(item) + 1 }}. <span translate>contribution</span>
</span>
</span>
<mat-button-toggle-group *osPerms="'agenda.can_manage_list_of_speakers'">

View File

@ -101,7 +101,7 @@
[formControl]="topicForm.get('agenda_parent_id')"
[multiple]="false"
[includeNone]="true"
listname="{{ 'Parent Item' | translate }}"
listname="{{ 'Parent item' | translate }}"
[InputListValues]="agendaItemObserver"
></os-search-value-selector>
</div>

View File

@ -20,7 +20,7 @@
<mat-menu #menu="matMenu">
<button mat-menu-item *ngFor="let registeredModel of registeredModels" (click)="toggleModel(registeredModel)">
<mat-checkbox [checked]="registeredModel.enabled" (click)="$event.preventDefault()">
<span translate>{{ registeredModel.verboseNamePlural }}</span>
<span>{{ registeredModel.verboseNamePlural | translate }}</span>
</mat-checkbox>
</button>
</mat-menu>
@ -31,7 +31,7 @@
<ng-container *ngIf="searchResultCount > 0">
<h3>
<span translate>Found</span> {{ searchResultCount }}
{{ searchResultCount }}
<span *ngIf="searchResultCount === 1" translate>result</span>
<span *ngIf="searchResultCount > 1" translate>results</span>
</h3>

View File

@ -122,7 +122,7 @@ export class HistoryListComponent extends ListViewBaseComponent<ViewHistory> imp
if (information.length > 1) {
argument_string = this.translate.instant(information[1]);
}
return base_string.replace(/{arg1}/g, argument_string);
return base_string.replace(/\\{arg1\\}/g, argument_string);
}
}
}

View File

@ -28,7 +28,7 @@
<p>
<os-search-value-selector
ngDefaultControl
listname="{{ 'Parent Item' | translate }}"
listname="{{ 'Parent item' | translate }}"
[form]="createBlockForm"
[formControl]="createBlockForm.get('agenda_parent_id')"
[multiple]="false"

View File

@ -337,7 +337,7 @@
<div class="create-poll-button" *ngIf="perms.isAllowed('createpoll', motion)">
<button mat-button (click)="createPoll()">
<mat-icon class="main-nav-color">poll</mat-icon>
<span translate>Create poll</span>
<span translate>New vote</span>
</button>
</div>
</div>
@ -533,7 +533,7 @@
[formControl]="contentForm.get('agenda_parent_id')"
[multiple]="false"
[includeNone]="true"
listname="{{ 'Parent Item' | translate }}"
listname="{{ 'Parent item' | translate }}"
[InputListValues]="agendaItemObserver"
></os-search-value-selector>
</div>

View File

@ -10,7 +10,7 @@
</os-head-bar>
<mat-card class="os-form-card import-table">
<span translate>Requires comma or semicolon separated values with these column header names in the first row</span>:
<span translate>Required comma or semicolon separated values with these column header names in the first row:</span>
<br />
<div class="code red-warning-text">
<span translate>Identifier</span>, <span translate>Title</span>, <span translate>Text</span>,
@ -39,7 +39,7 @@
</mat-select>
</mat-form-field>
<mat-form-field>
<mat-label translate> Column Separator</mat-label>
<mat-label translate>Column separator</mat-label>
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
{{ option.label | translate }}
@ -96,8 +96,7 @@
</div>
</div>
<div *ngIf="newCount">
<span translate>Click on 'import' (right top corner) to import the new motions.
</span>
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
</div>
<div>
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">

View File

@ -1,4 +1,4 @@
<h2><span translate>Vote form</span></h2>
<h2><span translate>Voting result</span></h2>
<div class="meta-text">
<span translate>Special values</span>:<br />
<mat-chip>-1</mat-chip>&nbsp;=&nbsp;
@ -8,7 +8,7 @@
</div>
<div *ngFor="let key of pollKeys">
<mat-form-field>
<mat-label translate>{{ getLabel(key) | translate }}</mat-label>
<mat-label>{{ getLabel(key) | translate }}</mat-label>
<input type="number" matInput [(ngModel)]="data[key]" />
<!-- TODO mark required fields -->
</mat-form-field>

View File

@ -1,6 +1,6 @@
<os-meta-text-block showActionRow="true">
<ng-container class="meta-text-block-title">
<span translate>Poll</span> <span *ngIf="pollIndex">&nbsp;{{ pollIndex + 1 }}</span>
<span translate>Voting result</span> <span *ngIf="pollIndex">&nbsp;({{ pollIndex + 1 }})</span>
</ng-container>
<ng-container class="meta-text-block-content">
<div *ngIf="poll.has_votes" class="on-transition-fade poll-result">
@ -11,7 +11,7 @@
</mat-icon>
<div class="progress-container">
<div>
<span translate>{{ getLabel(key) }}</span
<span>{{ getLabel(key) | translate }}</span
>:&nbsp;{{ getNumber(key) }}
<span *ngIf="!isAbstractValue(key)">({{ getPercent(key) }}%)</span>
</div>
@ -29,7 +29,6 @@
</div>
<!-- quorum -->
<div *osPerms="'motions.can_manage'">
<div *ngIf="abstractPoll"><span translate>Quorum not calculable.</span></div>
<div class="poll-quorum-line" *ngIf="!abstractPoll">
<span>
<span *ngIf="yesQuorum">
@ -37,7 +36,7 @@
<mat-icon color="primary" *ngIf="quorumYesReached"> thumb_up </mat-icon>
</span>
<button mat-button [matMenuTriggerFor]="majorityMenu">
&nbsp;<span translate>{{ getQuorumLabel() }}</span> &nbsp;<span
&nbsp;<span>{{ getQuorumLabel() | translate }}</span> &nbsp;<span
*ngIf="majorityChoice !== 'disabled'"
>({{ yesQuorum }})</span
>
@ -46,22 +45,19 @@
<span *ngIf="quorumYesReached" translate> reached.</span>
<span *ngIf="!quorumYesReached" translate> not reached.</span>
</span>
<span *ngIf="majorityChoice === 'disabled'"
>&nbsp;&mdash;&nbsp; <span translate>No quorum calculated</span>
</span>
</span>
</div>
</div>
</div>
</ng-container>
<ng-container class="meta-text-block-action-row" *osPerms="'motions.can_manage_metadata'">
<button mat-icon-button class="main-nav-color" matTooltip="{{ 'Edit poll' | translate }}" (click)="editPoll()">
<button mat-icon-button class="main-nav-color" matTooltip="{{ 'Edit' | translate }}" (click)="editPoll()">
<mat-icon inline>edit</mat-icon>
</button>
<button
mat-icon-button
class="main-nav-color"
matTooltip="{{ 'Print ballots' | translate }}"
matTooltip="{{ 'Print ballot papers' | translate }}"
(click)="printBallots()"
>
<mat-icon inline>local_printshop</mat-icon>
@ -69,7 +65,7 @@
<button
mat-icon-button
class="main-nav-color"
matTooltip="{{ 'Delete poll' | translate }}"
matTooltip="{{ 'Delete' | translate }}"
(click)="deletePoll()"
>
<mat-icon inline>delete</mat-icon>
@ -79,6 +75,6 @@
<mat-menu #majorityMenu="matMenu">
<button mat-menu-item *ngFor="let option of majorityChoices" (click)="majorityChoice = option.value">
<span translate>{{ option.display_name }}</span>
<span>{{ option.display_name | translate }}</span>
</button>
</mat-menu>

View File

@ -113,8 +113,8 @@ export class MotionPollComponent implements OnInit {
* Sends a delete request for this poll after a confirmation dialog has been accepted.
*/
public async deletePoll(): Promise<void> {
const content = this.translate.instant('The current poll will be deleted!');
if (await this.promptService.open('Are you sure?', content)) {
const content = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open('Delete vote?', content)) {
this.motionRepo.deletePoll(this.poll);
}
}

View File

@ -80,6 +80,6 @@ export class MotionCsvExportService {
'B1,Title 2,Text 2,Reason 2,Submitter B, Category B,, Block A',
',Title 3, Text 3,,,,,'
];
this.fileExport.saveFile(rows.join('\n'), this.translate.instant('Motion example') + '.csv');
this.fileExport.saveFile(rows.join('\n'), this.translate.instant('motions-example') + '.csv');
}
}

View File

@ -88,7 +88,7 @@ export class MotionMultiselectService {
* @param motions The motions to change
*/
public async setStateOfMultiple(motions: ViewMotion[]): Promise<void> {
const title = this.translate.instant('This will set the state of all selected motions to:');
const title = this.translate.instant('This will set the following state for all selected motions:');
const choices = this.workflowRepo.getWorkflowStatesForMotions(motions).map(workflowState => ({
id: workflowState.id,
label: workflowState.name
@ -105,7 +105,7 @@ export class MotionMultiselectService {
* @param motions The motions to change
*/
public async setRecommendation(motions: ViewMotion[]): Promise<void> {
const title = this.translate.instant('This will set the recommendation for all selected motions to:');
const title = this.translate.instant('This will set the following recommendation for all selected motions:');
const choices = this.workflowRepo
.getWorkflowStatesForMotions(motions)
.filter(workflowState => !!workflowState.recommendation_label)
@ -132,7 +132,7 @@ export class MotionMultiselectService {
* @param motions The motions to change
*/
public async setCategory(motions: ViewMotion[]): Promise<void> {
const title = this.translate.instant('This will set the category of all selected motions to:');
const title = this.translate.instant('This will set the following category for all selected motions:');
const clearChoice = 'No category';
const selectedChoice = await this.choiceService.open(
title,
@ -231,7 +231,7 @@ export class MotionMultiselectService {
* @param motions The motions for which to change the motionBlock
*/
public async setMotionBlock(motions: ViewMotion[]): Promise<void> {
const title = this.translate.instant('This will change the motion Block for all selected motions:');
const title = this.translate.instant('This will set the following motion block for all selected motions:');
const clearChoice = 'Clear motion block';
const selectedChoice = await this.choiceService.open(
title,

View File

@ -240,7 +240,7 @@ export class MotionPdfService {
metaTableBody.push([
{
text: this.translate.instant('Summary of change recommendations'),
text: this.translate.instant('Summary of changes'),
style: 'boldText'
},
{

View File

@ -1,7 +1,7 @@
<os-head-bar [nav]="false" [goBack]="true">
<!-- Title -->
<div class="title-slot">
<h2 translate>{{ projector?.name | translate }}</h2>
<h2>{{ projector?.name | translate }}</h2>
</div>
</os-head-bar>

View File

@ -1,16 +1,17 @@
<os-head-bar (mainEvent)="goBack()" [mainButton]="true" [nav]="false" [editMode]="true" (saveEvent)="save()">a
<!-- Title -->
<div class="title-slot"><h2 translate>Change Password</h2></div>
<div class="title-slot"><h2 translate>Change password</h2></div>
</os-head-bar>
<mat-card class="os-card">
<div *ngIf="!this.canManage && !this.ownPage">
<!-- no Admin, cannot Manage (a.k.a Attack Prevention) -->
<span translate>You are not supposed to be here please leave...</span>
<span translate>You are not supposed to be here...</span>
</div>
<div *ngIf="this.canManage && !this.ownPage">
<!-- can Manage, but not own Page (a.k.a. Admin) -->
<div *ngIf="user">
<mat-icon>warning</mat-icon> <span translate>You are changing the password for the user:</span> {{user.full_name}}
<h1><span translate>Change password for</span> {{ user.full_name }}</h1>
<mat-icon>warning</mat-icon> <span translate>You override the personally set password!</span>
</div>
<br>
<form [formGroup]="adminPasswordForm" (keydown)="onKeyDown($event)">
@ -19,7 +20,7 @@
[type]="hide_admin_newPassword ? 'password' : 'text'"
matInput
formControlName="admin_newPassword"
placeholder="{{ 'New Password' | translate }}"
placeholder="{{ 'New password' | translate }}"
/>
<mat-icon
matSuffix
@ -31,19 +32,20 @@
</form>
<br>
<div *ngIf="user">
<span translate>Initial Password:</span> {{user.default_password}}
<span translate>Initial password</span>: {{ user.default_password }}<br>
<span translate>Username</span>: {{ user.username }}
</div>
<br>
<button
mat-raised-button
color="primary"
(click)="hide_admin_newPassword = !hide_admin_newPassword">
<span translate>Show Password</span>&nbsp;
<mat-icon
matSuffix
mat-icon-button>
{{hide_admin_newPassword ? 'visibility_off' : 'visibility'}}
</mat-icon>
&nbsp;<span translate>Show password</span>
</button>
</div>
<div *ngIf="this.ownPage">
@ -54,7 +56,7 @@
[type]="hide_user_password ? 'password' : 'text'"
matInput
formControlName="user_oldPassword"
placeholder="{{ 'Old Password' | translate }}"
placeholder="{{ 'Old password' | translate }}"
/>
</mat-form-field><br>
<mat-form-field>
@ -62,7 +64,7 @@
[type]="hide_user_password ? 'password' : 'text'"
matInput
formControlName="user_newPassword1"
placeholder="{{ 'New Password' | translate }}"
placeholder="{{ 'New password' | translate }}"
/>
<mat-icon
mat-button matSuffix mat-icon-button
@ -75,7 +77,7 @@
[type]="hide_user_password ? 'password' : 'text'"
matInput
formControlName="user_newPassword2"
placeholder="{{ 'Confirm New Password' | translate }}"
placeholder="{{ 'Confirm new password' | translate }}"
/>
</mat-form-field>
</form>
@ -83,12 +85,12 @@
mat-raised-button
color="primary"
(click)="hide_user_password = !hide_user_password">
<span translate>Show Password</span>&nbsp;
<mat-icon
matSuffix
mat-icon-button>
{{ hide_user_password ? 'visibility_off' : 'visibility' }}
</mat-icon>
&nbsp;<span translate>Show password</span>
</button>
</div>
</mat-card>

View File

@ -1,6 +1,6 @@
<os-head-bar [nav]="false">
<!-- Title -->
<div class="title-slot"><h2 translate>Import users</h2></div>
<div class="title-slot"><h2 translate>Import participants</h2></div>
<div class="menu-slot">
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
@ -12,7 +12,7 @@
<mat-tab-group (selectedTabChange)="onTabChange()">
<mat-tab label="{{ 'CSV import' | translate }}">
<span translate
>Requires comma or semicolon separated values with these column header names in the first row</span
>Required comma or semicolon separated values with these column header names in the first row:</span
>: <br />
<div class="code red-warning-text">
<span translate>Title</span>, <span translate>Given name</span>, <span translate>Surname</span> ,
@ -47,7 +47,7 @@
</mat-select>
</mat-form-field>
<mat-form-field>
<mat-label translate> Column Separator</mat-label>
<mat-label translate>Column separator</mat-label>
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
{{ option.label | translate }}
@ -73,49 +73,50 @@
#fileInput
(change)="onSelectFile($event)"
/>
<button mat-button color="accent" onclick="document.getElementById('user-import-file-input').click()">
<button
mat-button
color="accent"
onclick="document.getElementById('user-import-file-input').click()"
>
<span translate> Select file</span>
</button>
</div>
</div>
</mat-tab>
<mat-tab label="{{ 'Text import' | translate }}">
<div [formGroup]="textAreaForm">
<div>
<span translate>
Copy and paste your participant names in this textbox.</span>
<span translate>
Keep each person in a single line.
</span><br />
<span translate> Comma separated names will be read as 'Surname(s), given name(s)'. </span>
</div>
<mat-form-field>
<textarea
matInput
formControlName="inputtext"
placeholder="{{ 'Insert users here' | translate }}"
cdkTextareaAutosize
cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"
></textarea>
</mat-form-field>
</div>
<div [formGroup]="textAreaForm">
<div>
<button mat-button color="accent" (click)="parseTextArea()"><span translate>Preview</span></button>
<span translate> Copy and paste your participant names in this textbox.</span>
<span translate> Keep each person in a single line. </span><br />
<span translate> Comma separated names will be read as 'Surname, given name(s)'. </span>
</div>
</mat-tab>
<mat-form-field>
<textarea
matInput
formControlName="inputtext"
placeholder="{{ 'Insert participants here' | translate }}"
cdkTextareaAutosize
cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"
></textarea>
</mat-form-field>
</div>
<div>
<button mat-button color="accent" (click)="parseTextArea()"><span translate>Preview</span></button>
</div>
</mat-tab>
</mat-tab-group>
</mat-card>
<!-- preview table -->
<mat-card *ngIf="hasFile" class="os-form-card import-table">
<h3 translate> Preview</h3>
<h3 translate>Preview</h3>
<div class="summary">
<!-- new entries -->
<div *ngIf="newCount">
&nbsp;
<mat-icon inline>playlist_add</mat-icon>
<span>&nbsp;{{ newCount }}&nbsp;</span> <span translate>User(s) will be imported.</span>
<span>&nbsp;{{ newCount }}&nbsp;</span> <span translate>Participant(s) will be imported.</span>
</div>
<!-- errors/duplicates -->
<div *ngIf="nonImportableCount" class="red-warning-text">
@ -127,25 +128,23 @@
<div *ngIf="doneCount" class="green-text">
&nbsp;
<mat-icon inline>done</mat-icon>
<span>&nbsp;{{ doneCount }}&nbsp;</span> <span translate>Users have been imported.</span>
<span>&nbsp;{{ doneCount }}&nbsp;</span> <span translate>Participants have been imported.</span>
</div>
</div>
<div *ngIf="newCount">
<span translate>Click on 'import' (right top corner) to import the new users.
</span>
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
</div>
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
<mat-option value="all" translate> Show all </mat-option>
<mat-option value="error" translate> Show errors only </mat-option>
<mat-option value="noerror" translate> Show correct entries </mat-option>
<mat-option value="all" translate>Show all</mat-option>
<mat-option value="error" translate>Show errors only</mat-option>
<mat-option value="noerror" translate>Show correct entries only</mat-option>
</mat-select>
<div class="table-container">
<table mat-table class="on-transition-fade" [dataSource]="dataSource" matSort>
<!-- Status column -->
<ng-container matColumnDef="status" sticky>
<mat-header-cell *matHeaderCellDef class="first-column"></mat-header-cell>
<mat-cell *matCellDef="let entry" class="first-column">
<mat-cell *matCellDef="let entry" class="first-column">
<div *ngIf="entry.status === 'error'">
<mat-icon
class="red-warning-text"
@ -154,20 +153,20 @@
{{ getActionIcon(entry) }}
</mat-icon>
<mat-icon
color="warn"
*ngIf="hasError(entry, 'ParsingErrors')"
matTooltip="{{ getVerboseError('ParsingErrors') | translate }}"
>
warning
</mat-icon>
color="warn"
*ngIf="hasError(entry, 'ParsingErrors')"
matTooltip="{{ getVerboseError('ParsingErrors') | translate }}"
>
warning
</mat-icon>
</div>
<div *ngIf="entry.status === 'new'">
<mat-icon matTooltip="{{ 'User will be imported' | translate }}">
<mat-icon matTooltip="{{ 'Participant will be imported' | translate }}">
{{ getActionIcon(entry) }}
</mat-icon>
</div>
<div *ngIf="entry.status === 'done'">
<mat-icon matTooltip="{{ 'User has been imported' | translate }}">
<mat-icon matTooltip="{{ 'Participant has been imported' | translate }}">
{{ getActionIcon(entry) }}
</mat-icon>
</div>
@ -180,10 +179,10 @@
<mat-cell *matCellDef="let entry">
<span *ngIf="nameErrors(entry)">
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
warning
</mat-icon>
&nbsp;
</span>
warning
</mat-icon>
&nbsp;
</span>
{{ entry.newEntry.title }}
</mat-cell>
</ng-container>
@ -231,10 +230,10 @@
<mat-cell *matCellDef="let entry">
<div *ngIf="entry.newEntry.csvGroups.length">
<span *ngIf="hasError(entry, 'Groups')">
<mat-icon color="warn"matTooltip="{{ getVerboseError('Groups') | translate }}">
<mat-icon color="warn" matTooltip="{{ getVerboseError('Groups') | translate }}">
warning
</mat-icon>
</span>
</span>
<span *ngFor="let group of entry.newEntry.csvGroups">
{{ group.name }}
<mat-icon class="newBadge" color="accent" inline *ngIf="!group.id">add</mat-icon>
@ -250,19 +249,19 @@
</ng-container>
<ng-container matColumnDef="is_active">
<mat-header-cell *matHeaderCellDef translate>Is Active</mat-header-cell>
<mat-header-cell *matHeaderCellDef translate>Is active</mat-header-cell>
<mat-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_active"> </mat-checkbox>
</mat-cell>
</ng-container>
<ng-container matColumnDef="is_present">
<mat-header-cell *matHeaderCellDef translate>Is Present</mat-header-cell>
<mat-header-cell *matHeaderCellDef translate>Is present</mat-header-cell>
<mat-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_present"> </mat-checkbox>
</mat-cell>
</ng-container>
<ng-container matColumnDef="is_committee">
<mat-header-cell *matHeaderCellDef translate>Is Committee</mat-header-cell>
<mat-header-cell *matHeaderCellDef translate>Is committee</mat-header-cell>
<mat-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_committee"> </mat-checkbox>
</mat-cell>

View File

@ -69,7 +69,7 @@ export class UserImportListComponent extends BaseImportListComponent<ViewUser> {
',Fred,Bloggs,London,,,,,,,,',
',,Executive Board,,,,,,,1,,'
];
this.exporter.saveFile(rows.join('\n'), this.translate.instant('User example') + '.csv');
this.exporter.saveFile(rows.join('\n'), this.translate.instant('participants-example') + '.csv');
}
/**

View File

@ -118,21 +118,21 @@
<mat-divider></mat-divider>
<button mat-menu-item (click)="setGroupSelected()">
<mat-icon>people</mat-icon>
<span translate>Add/remove groups</span>
<span translate>Add/remove groups ...</span>
</button>
<button mat-menu-item (click)="setActiveSelected()">
<mat-icon>add_circle</mat-icon>
<span translate>Set/unset active</span>
<mat-icon>block</mat-icon>
<span translate>Enable/disable account ...</span>
</button>
<button mat-menu-item (click)="setPresentSelected()">
<mat-icon>check_box</mat-icon>
<span translate>Set/unset presence</span>
<span translate>Set presence ...</span>
</button>
<button mat-menu-item (click)="setCommitteeSelected()">
<mat-icon>account_balance</mat-icon>
<span translate>Set/unset committee</span>
<span translate>Set committee ...</span>
</button>
<mat-divider></mat-divider>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -34,16 +34,24 @@ msgstr ""
msgid "Activate statute amendments"
msgstr ""
msgid "Add groups"
msgid "Active filters"
msgstr ""
msgid "Add me"
msgstr ""
msgid "Add submitters"
msgid "Add/remove groups ..."
msgstr ""
msgid "Add tags"
msgid "Add/remove submitters"
msgstr ""
msgid "Add/remove tags"
msgstr ""
msgid ""
"Additional columns after the required ones may be present and won't affect "
"the import."
msgstr ""
msgid "Adjourn"
@ -55,6 +63,9 @@ msgstr ""
msgid "Admin"
msgstr ""
msgid "After verifiy the preview click on 'import' please (see top right)."
msgstr ""
msgid "Agenda"
msgstr ""
@ -109,6 +120,14 @@ msgstr ""
msgid "Arabic"
msgstr ""
msgid "Are you sure you want to delete this vote?"
msgstr ""
msgid ""
"At least given name or surname have to be filled in. All other fields are "
"optional and may be empty."
msgstr ""
msgid "Attachments"
msgstr ""
@ -133,6 +152,9 @@ msgstr ""
msgid "Begin speech"
msgstr ""
msgid "CSV import"
msgstr ""
msgid "Call list"
msgstr ""
@ -250,30 +272,48 @@ msgstr ""
msgid "Change password"
msgstr ""
msgid "Change password for"
msgstr ""
msgid "Change recommendation"
msgstr ""
msgid "Change recommendations"
msgstr ""
msgid "Changed by"
msgstr ""
msgid "Changed version"
msgstr ""
msgid "Choose 0 to disable the supporting system."
msgstr ""
msgid "Clear all"
msgstr ""
msgid "Clear list"
msgstr ""
msgid "Close"
msgstr ""
msgid "Close list of speakers"
msgstr ""
msgid "Collapse all"
msgstr ""
msgid "Color for blanked projector"
msgstr ""
msgid "Column separator"
msgstr ""
msgid "Comma separated names will be read as 'Surname, given name(s)'."
msgstr ""
msgid "Comment"
msgstr ""
@ -286,7 +326,13 @@ msgstr ""
msgid "Complex Workflow"
msgstr ""
msgid "Content"
msgid "Confirm new password"
msgstr ""
msgid "Copy and paste your participant names in this textbox."
msgstr ""
msgid "Countdowns"
msgstr ""
msgid "Couple countdown with the list of speakers"
@ -354,6 +400,12 @@ msgstr ""
msgid "Delete whole history"
msgstr ""
msgid "Deletion"
msgstr ""
msgid "Deselect all"
msgstr ""
msgid "Designates whether this user is in the room."
msgstr ""
@ -386,18 +438,33 @@ msgstr ""
msgid "Do you want to delete this file?"
msgstr ""
msgid "Done"
msgstr ""
msgid "Download CSV example file"
msgstr ""
msgid "Drop files into this area OR select files"
msgstr ""
msgid "Duration"
msgstr ""
msgid "Edit"
msgstr ""
msgid "Edit category:"
msgid "Edit category"
msgstr ""
msgid "Edit comment field:"
msgstr ""
msgid "Edit details"
msgstr ""
msgid "Edit details for"
msgstr ""
msgid "Edit profile"
msgstr ""
@ -407,12 +474,21 @@ msgstr ""
msgid "Edit the whole motion text"
msgstr ""
msgid "Edit title"
msgstr ""
msgid "Edit topic"
msgstr ""
msgid "Election method"
msgstr ""
msgid "Elections"
msgstr ""
msgid "Element"
msgstr ""
msgid "Email"
msgstr ""
@ -434,6 +510,12 @@ msgstr ""
msgid "Enable participant presence view"
msgstr ""
msgid "Enable/disable account ..."
msgstr ""
msgid "Encoding of the file"
msgstr ""
msgid "End speech"
msgstr ""
@ -467,9 +549,6 @@ msgstr ""
msgid "Exit"
msgstr ""
msgid "Exit multiselect"
msgstr ""
msgid "Expand all"
msgstr ""
@ -482,9 +561,6 @@ msgstr ""
msgid "Export as CSV"
msgstr ""
msgid "FILTER"
msgstr ""
msgid "File information"
msgstr ""
@ -494,12 +570,27 @@ msgstr ""
msgid "Files"
msgstr ""
msgid "Filter"
msgstr ""
msgid "Filter options"
msgstr ""
msgid "Filters"
msgstr ""
msgid "Final version"
msgstr ""
msgid "Finished"
msgstr ""
msgid "Follow recommendation"
msgstr ""
msgid "Follow recommendations for all motions"
msgstr ""
msgid "Font color of projector header and footer"
msgstr ""
@ -566,7 +657,21 @@ msgstr ""
msgid "Identifier"
msgstr ""
msgid "Import ..."
msgid ""
"Identifier, reason, submitter, category, origin and motion block are "
"optional and may be empty."
msgstr ""
msgid "Import"
msgstr ""
msgid "Import motions"
msgstr ""
msgid "Import participants"
msgstr ""
msgid "Import topics"
msgstr ""
msgid "Include the sequential number in PDF and DOCX"
@ -578,6 +683,15 @@ msgstr ""
msgid "Input format: DD.MM.YYYY HH:MM"
msgstr ""
msgid "Insert participants here"
msgstr ""
msgid "Insert topics here"
msgstr ""
msgid "Insertion"
msgstr ""
msgid "Installed plugins"
msgstr ""
@ -596,18 +710,18 @@ msgstr ""
msgid "Is committee"
msgstr ""
msgid "Is inactive"
msgstr ""
msgid "Is no committee"
msgstr ""
msgid "Is not present"
msgstr ""
msgid "Is present"
msgstr ""
msgid "Item number"
msgstr ""
msgid "Keep each item in a single line."
msgstr ""
msgid "Keep each person in a single line."
msgstr ""
msgid "Last speakers"
msgstr ""
@ -647,21 +761,45 @@ msgstr ""
msgid "Mark speaker"
msgstr ""
msgid "Meta information"
msgstr ""
msgid "Motion"
msgstr ""
msgid "Motion block"
msgstr ""
msgid "Motion blocks"
msgstr ""
msgid "Motion deleted"
msgstr ""
msgid "Motion has been imported"
msgstr ""
msgid "Motion log"
msgstr ""
msgid "Motion preamble"
msgstr ""
msgid "Motion text"
msgstr ""
msgid "Motion updated"
msgstr ""
msgid "Motion will be imported"
msgstr ""
msgid "Motion(s) will be imported."
msgstr ""
msgid "Motions"
msgstr ""
msgid "Motions have been imported."
msgstr ""
msgid "Move to agenda item"
msgstr ""
@ -680,7 +818,7 @@ msgstr ""
msgid "Needs review"
msgstr ""
msgid "New"
msgid "New Projector"
msgstr ""
msgid "New amendment"
@ -698,6 +836,12 @@ msgstr ""
msgid "New motion"
msgstr ""
msgid "New motion block"
msgstr ""
msgid "New participant"
msgstr ""
msgid "New password"
msgstr ""
@ -707,6 +851,12 @@ msgstr ""
msgid "New tag name"
msgstr ""
msgid "New topic"
msgstr ""
msgid "New vote"
msgstr ""
msgid "Next"
msgstr ""
@ -716,9 +866,6 @@ msgstr ""
msgid "No changes at the text."
msgstr ""
msgid "No choices available"
msgstr ""
msgid "No comment"
msgstr ""
@ -743,6 +890,9 @@ msgstr ""
msgid "No personal note"
msgstr ""
msgid "No search result found for"
msgstr ""
msgid "No statute paragraphs"
msgstr ""
@ -769,9 +919,15 @@ msgstr ""
msgid "Number of last speakers to be shown on the projector"
msgstr ""
msgid "Number set"
msgstr ""
msgid "Numbered per category"
msgstr ""
msgid "Numbering"
msgstr ""
msgid "Numbering prefix for agenda items"
msgstr ""
@ -784,7 +940,7 @@ msgstr ""
msgid "Offline mode: You can use OpenSlides but changes are not saved."
msgstr ""
msgid "Ok"
msgid "Old password"
msgstr ""
msgid "One email was send sucessfully."
@ -796,6 +952,9 @@ msgstr ""
msgid "Open"
msgstr ""
msgid "Open list of speakers"
msgstr ""
msgid "Origin"
msgstr ""
@ -829,12 +988,30 @@ msgstr ""
msgid "Parallel upload"
msgstr ""
msgid "Parent item"
msgstr ""
msgid "Participant has been imported"
msgstr ""
msgid "Participant number"
msgstr ""
msgid "Participant will be imported"
msgstr ""
msgid "Participant(s) will be imported."
msgstr ""
msgid "Participants"
msgstr ""
msgid "Participants have been imported."
msgstr ""
msgid "Paste/write your topics in this textbox."
msgstr ""
msgid "Permission"
msgstr ""
@ -853,6 +1030,9 @@ msgstr ""
msgid "Please enter your new password"
msgstr ""
msgid "Please fill in all required values"
msgstr ""
msgid "Preamble text for PDF and DOCX documents (all motions)"
msgstr ""
@ -874,6 +1054,12 @@ msgstr ""
msgid "Presentation and assembly system"
msgstr ""
msgid "Preview"
msgstr ""
msgid "Print ballot papers"
msgstr ""
msgid "Privacy Policy"
msgstr ""
@ -895,6 +1081,12 @@ msgstr ""
msgid "Projector logo"
msgstr ""
msgid "Projector messages"
msgstr ""
msgid "Projectors"
msgstr ""
msgid "Public"
msgstr ""
@ -910,6 +1102,9 @@ msgstr ""
msgid "Recommendation"
msgstr ""
msgid "Recommendation set to {arg1}"
msgstr ""
msgid "Refer to committee"
msgstr ""
@ -939,21 +1134,29 @@ msgid ""
"state"
msgstr ""
msgid "Remove groups"
msgid "Remove from motion block"
msgstr ""
msgid "Remove me"
msgstr ""
msgid "Remove tags"
msgid "Replacement"
msgstr ""
msgid "Required"
msgstr ""
msgid ""
"Required comma or semicolon separated values with these column header names "
"in the first row:"
msgstr ""
msgid "Required majority"
msgstr ""
msgid "Reset"
msgstr ""
msgid "Reset password"
msgstr ""
@ -969,18 +1172,33 @@ msgstr ""
msgid "Roman"
msgstr ""
msgid "SORT"
msgid "Save"
msgstr ""
msgid "Save"
msgid "Search"
msgstr ""
msgid "Search player"
msgstr ""
msgid "Search results"
msgstr ""
msgid "Searching for candidates"
msgstr ""
msgid "Select all"
msgstr ""
msgid "Select file"
msgstr ""
msgid "Select or search new speaker ..."
msgstr ""
msgid "Select or search new submitter ..."
msgstr ""
msgid "Select paragraph"
msgstr ""
@ -993,45 +1211,78 @@ msgstr ""
msgid "Separator used for all csv exports and examples"
msgstr ""
msgid "Sequential number"
msgstr ""
msgid "Serially numbered"
msgstr ""
msgid "Set category"
msgstr ""
msgid "Set invisible"
msgid "Set committee ..."
msgstr ""
msgid "Set hidden"
msgstr ""
msgid "Set internal"
msgstr ""
msgid "Set it manually"
msgstr ""
msgid "Set motion block"
msgstr ""
msgid "Set presence ..."
msgstr ""
msgid "Set public"
msgstr ""
msgid "Set recommendation"
msgstr ""
msgid "Set status"
msgstr ""
msgid "Set visible"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Short description of event"
msgstr ""
msgid "Show all"
msgstr ""
msgid "Show amendments together with motions"
msgstr ""
msgid "Show correct entries"
msgstr ""
msgid "Show correct entries only"
msgstr ""
msgid "Show entire motion text"
msgstr ""
msgid "Show errors only"
msgstr ""
msgid "Show logo on projector"
msgstr ""
msgid "Show motion log"
msgstr ""
msgid "Show orange countdown in the last x seconds of speaking time"
msgstr ""
msgid "Show password"
msgstr ""
msgid "Show the clock on projector"
msgstr ""
@ -1047,6 +1298,12 @@ msgstr ""
msgid "Simple majority"
msgstr ""
msgid "Slide options"
msgstr ""
msgid "Sort"
msgstr ""
msgid "Sort ..."
msgstr ""
@ -1056,6 +1313,9 @@ msgstr ""
msgid "Sort name of participants by"
msgstr ""
msgid "Special values"
msgstr ""
msgid "Staff"
msgstr ""
@ -1071,6 +1331,9 @@ msgstr ""
msgid "State"
msgstr ""
msgid "State set to {arg1}"
msgstr ""
msgid "Statute"
msgstr ""
@ -1092,9 +1355,15 @@ msgstr ""
msgid "Structure level"
msgstr ""
msgid "Submitter"
msgstr ""
msgid "Submitters"
msgstr ""
msgid "Submitters changed"
msgstr ""
msgid "Summary of changes"
msgstr ""
@ -1104,6 +1373,9 @@ msgstr ""
msgid "Supporters"
msgstr ""
msgid "Supporters changed"
msgstr ""
msgid "Surname"
msgstr ""
@ -1116,6 +1388,15 @@ msgstr ""
msgid "Tags"
msgstr ""
msgid "Text"
msgstr ""
msgid "Text import"
msgstr ""
msgid "Text separator"
msgstr ""
msgid "The 100 % base of a voting result consists of"
msgstr ""
@ -1128,6 +1409,15 @@ msgstr ""
msgid "The event manager hasn't set up a privacy policy yet."
msgstr ""
msgid "The file has too few columns to be parsed properly."
msgstr ""
msgid "The file seems to have additional columns. They will be ignored."
msgstr ""
msgid "The file seems to have some ommitted columns. They will be considered empty."
msgstr ""
msgid "The link is broken. Please contact your system administrator."
msgstr ""
@ -1160,10 +1450,10 @@ msgstr ""
msgid "This prefix will be set if you run the automatic agenda numbering."
msgstr ""
msgid "This will add the following submitters of all selected motions:"
msgid "This will add or remove the following submitters for all selected motions:"
msgstr ""
msgid "This will add the following tags to all selected motions:"
msgid "This will add or remove the following tags for all selected motions:"
msgstr ""
msgid "This will delete all selected motions."
@ -1172,24 +1462,24 @@ msgstr ""
msgid "This will move all selected motions as childs to:"
msgstr ""
msgid "This will remove the following submitters from all selected motions:"
msgid "This will set the following category for all selected motions:"
msgstr ""
msgid "This will remove the following tags from all selected motions:"
msgid "This will set the following motion block for all selected motions:"
msgstr ""
msgid "This will set the category of all selected motions to:"
msgid "This will set the following recommendation for all selected motions:"
msgstr ""
msgid "This will set the recommendation for all selected motions to:"
msgstr ""
msgid "This will set the state of all selected motions to:"
msgid "This will set the following state for all selected motions:"
msgstr ""
msgid "Three-quarters majority"
msgstr ""
msgid "Timestamp"
msgstr ""
msgid "Title"
msgstr ""
@ -1202,12 +1492,30 @@ msgstr ""
msgid "Title for access data and welcome PDF"
msgstr ""
msgid "Title is required. All other fields are optional and may be empty."
msgstr ""
msgid "Topic"
msgstr ""
msgid "Topic has been imported"
msgstr ""
msgid "Topic will be imported"
msgstr ""
msgid "Topics have been imported."
msgstr ""
msgid "Topics(s) will be imported."
msgstr ""
msgid "Two-thirds majority"
msgstr ""
msgid "Type"
msgstr ""
msgid "Unsupport"
msgstr ""
@ -1240,12 +1548,24 @@ msgstr ""
msgid "Visible"
msgstr ""
msgid "Vote created"
msgstr ""
msgid "Vote deleted"
msgstr ""
msgid "Vote updated"
msgstr ""
msgid "Voting"
msgstr ""
msgid "Voting and ballot papers"
msgstr ""
msgid "Voting result"
msgstr ""
msgid "WEP"
msgstr ""
@ -1289,6 +1609,9 @@ msgstr ""
msgid "Workflow of new statute amendments"
msgstr ""
msgid "Wrong file type detected. Import failed."
msgstr ""
msgid "Yes"
msgstr ""
@ -1304,6 +1627,9 @@ msgstr ""
msgid "Yes/No/Abstain per candidate"
msgstr ""
msgid "You are not supposed to be here..."
msgstr ""
msgid "You are using the history mode of OpenSlides. Changes will not be saved."
msgstr ""
@ -1315,6 +1641,9 @@ msgstr ""
msgid "You can use {event_name} as a placeholder."
msgstr ""
msgid "You override the personally set password!"
msgstr ""
msgid "Your login for {event_name}"
msgstr ""
@ -1342,12 +1671,27 @@ msgstr ""
msgid "by"
msgstr ""
msgid "contribution"
msgstr ""
msgid "disabled"
msgstr ""
msgid "entries will be ommitted."
msgstr ""
msgid "errors"
msgstr ""
msgid "inline"
msgstr ""
msgid "majority"
msgstr ""
msgid "motions-example"
msgstr ""
msgid "needed"
msgstr ""
@ -1363,18 +1707,30 @@ msgstr ""
msgid "not decided"
msgstr ""
msgid "not reached."
msgstr ""
msgid "not set"
msgstr ""
msgid "of"
msgstr ""
msgid "outside"
msgstr ""
msgid "participants-example"
msgstr ""
msgid "permitted"
msgstr ""
msgid "published"
msgstr ""
msgid "reached."
msgstr ""
msgid "refered to committee"
msgstr ""
@ -1384,7 +1740,10 @@ msgstr ""
msgid "rejected (not authorized)"
msgstr ""
msgid "remove submitters"
msgid "result"
msgstr ""
msgid "results"
msgstr ""
msgid "selected"
@ -1396,5 +1755,8 @@ msgstr ""
msgid "supporters"
msgstr ""
msgid "undocumented"
msgstr ""
msgid "withdrawed"
msgstr ""

View File

@ -988,7 +988,7 @@ class MotionPollViewSet(UpdateModelMixin, DestroyModelMixin, GenericViewSet):
# Fire autoupdate again to save information to OpenSlides history.
inform_changed_data(
poll.motion, information=["Poll updated"], user_id=self.request.user.pk
poll.motion, information=["Vote updated"], user_id=self.request.user.pk
)
return response
@ -1003,7 +1003,7 @@ class MotionPollViewSet(UpdateModelMixin, DestroyModelMixin, GenericViewSet):
# Fire autoupdate again to save information to OpenSlides history.
inform_changed_data(
poll.motion, information=["Poll deleted"], user_id=self.request.user.pk
poll.motion, information=["Vote deleted"], user_id=self.request.user.pk
)
return result