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

View File

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

View File

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

View File

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

View File

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

View File

@ -66,7 +66,7 @@
<ng-template let-item> <ng-template let-item>
<span *osPerms="'agenda.can_manage_list_of_speakers'"> <span *osPerms="'agenda.can_manage_list_of_speakers'">
<span *ngIf="hasSpokenCount(item)" class="red-warning-text speaker-warning"> <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>
</span> </span>
<mat-button-toggle-group *osPerms="'agenda.can_manage_list_of_speakers'"> <mat-button-toggle-group *osPerms="'agenda.can_manage_list_of_speakers'">

View File

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

View File

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

View File

@ -122,7 +122,7 @@ export class HistoryListComponent extends ListViewBaseComponent<ViewHistory> imp
if (information.length > 1) { if (information.length > 1) {
argument_string = this.translate.instant(information[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> <p>
<os-search-value-selector <os-search-value-selector
ngDefaultControl ngDefaultControl
listname="{{ 'Parent Item' | translate }}" listname="{{ 'Parent item' | translate }}"
[form]="createBlockForm" [form]="createBlockForm"
[formControl]="createBlockForm.get('agenda_parent_id')" [formControl]="createBlockForm.get('agenda_parent_id')"
[multiple]="false" [multiple]="false"

View File

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

View File

@ -10,7 +10,7 @@
</os-head-bar> </os-head-bar>
<mat-card class="os-form-card import-table"> <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 /> <br />
<div class="code red-warning-text"> <div class="code red-warning-text">
<span translate>Identifier</span>, <span translate>Title</span>, <span translate>Text</span>, <span translate>Identifier</span>, <span translate>Title</span>, <span translate>Text</span>,
@ -39,7 +39,7 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<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-select class="selection" (selectionChange)="selectColSep($event)" value="">
<mat-option *ngFor="let option of columnSeparators" [value]="option.value"> <mat-option *ngFor="let option of columnSeparators" [value]="option.value">
{{ option.label | translate }} {{ option.label | translate }}
@ -96,8 +96,7 @@
</div> </div>
</div> </div>
<div *ngIf="newCount"> <div *ngIf="newCount">
<span translate>Click on 'import' (right top corner) to import the new motions. <span translate>After verifiy the preview click on 'import' please (see top right).</span>
</span>
</div> </div>
<div> <div>
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()"> <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"> <div class="meta-text">
<span translate>Special values</span>:<br /> <span translate>Special values</span>:<br />
<mat-chip>-1</mat-chip>&nbsp;=&nbsp; <mat-chip>-1</mat-chip>&nbsp;=&nbsp;
@ -8,7 +8,7 @@
</div> </div>
<div *ngFor="let key of pollKeys"> <div *ngFor="let key of pollKeys">
<mat-form-field> <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]" /> <input type="number" matInput [(ngModel)]="data[key]" />
<!-- TODO mark required fields --> <!-- TODO mark required fields -->
</mat-form-field> </mat-form-field>

View File

@ -1,6 +1,6 @@
<os-meta-text-block showActionRow="true"> <os-meta-text-block showActionRow="true">
<ng-container class="meta-text-block-title"> <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>
<ng-container class="meta-text-block-content"> <ng-container class="meta-text-block-content">
<div *ngIf="poll.has_votes" class="on-transition-fade poll-result"> <div *ngIf="poll.has_votes" class="on-transition-fade poll-result">
@ -11,7 +11,7 @@
</mat-icon> </mat-icon>
<div class="progress-container"> <div class="progress-container">
<div> <div>
<span translate>{{ getLabel(key) }}</span <span>{{ getLabel(key) | translate }}</span
>:&nbsp;{{ getNumber(key) }} >:&nbsp;{{ getNumber(key) }}
<span *ngIf="!isAbstractValue(key)">({{ getPercent(key) }}%)</span> <span *ngIf="!isAbstractValue(key)">({{ getPercent(key) }}%)</span>
</div> </div>
@ -29,7 +29,6 @@
</div> </div>
<!-- quorum --> <!-- quorum -->
<div *osPerms="'motions.can_manage'"> <div *osPerms="'motions.can_manage'">
<div *ngIf="abstractPoll"><span translate>Quorum not calculable.</span></div>
<div class="poll-quorum-line" *ngIf="!abstractPoll"> <div class="poll-quorum-line" *ngIf="!abstractPoll">
<span> <span>
<span *ngIf="yesQuorum"> <span *ngIf="yesQuorum">
@ -37,7 +36,7 @@
<mat-icon color="primary" *ngIf="quorumYesReached"> thumb_up </mat-icon> <mat-icon color="primary" *ngIf="quorumYesReached"> thumb_up </mat-icon>
</span> </span>
<button mat-button [matMenuTriggerFor]="majorityMenu"> <button mat-button [matMenuTriggerFor]="majorityMenu">
&nbsp;<span translate>{{ getQuorumLabel() }}</span> &nbsp;<span &nbsp;<span>{{ getQuorumLabel() | translate }}</span> &nbsp;<span
*ngIf="majorityChoice !== 'disabled'" *ngIf="majorityChoice !== 'disabled'"
>({{ yesQuorum }})</span >({{ yesQuorum }})</span
> >
@ -46,22 +45,19 @@
<span *ngIf="quorumYesReached" translate> reached.</span> <span *ngIf="quorumYesReached" translate> reached.</span>
<span *ngIf="!quorumYesReached" translate> not reached.</span> <span *ngIf="!quorumYesReached" translate> not reached.</span>
</span> </span>
<span *ngIf="majorityChoice === 'disabled'"
>&nbsp;&mdash;&nbsp; <span translate>No quorum calculated</span>
</span>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
</ng-container> </ng-container>
<ng-container class="meta-text-block-action-row" *osPerms="'motions.can_manage_metadata'"> <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> <mat-icon inline>edit</mat-icon>
</button> </button>
<button <button
mat-icon-button mat-icon-button
class="main-nav-color" class="main-nav-color"
matTooltip="{{ 'Print ballots' | translate }}" matTooltip="{{ 'Print ballot papers' | translate }}"
(click)="printBallots()" (click)="printBallots()"
> >
<mat-icon inline>local_printshop</mat-icon> <mat-icon inline>local_printshop</mat-icon>
@ -69,7 +65,7 @@
<button <button
mat-icon-button mat-icon-button
class="main-nav-color" class="main-nav-color"
matTooltip="{{ 'Delete poll' | translate }}" matTooltip="{{ 'Delete' | translate }}"
(click)="deletePoll()" (click)="deletePoll()"
> >
<mat-icon inline>delete</mat-icon> <mat-icon inline>delete</mat-icon>
@ -79,6 +75,6 @@
<mat-menu #majorityMenu="matMenu"> <mat-menu #majorityMenu="matMenu">
<button mat-menu-item *ngFor="let option of majorityChoices" (click)="majorityChoice = option.value"> <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> </button>
</mat-menu> </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. * Sends a delete request for this poll after a confirmation dialog has been accepted.
*/ */
public async deletePoll(): Promise<void> { public async deletePoll(): Promise<void> {
const content = this.translate.instant('The current poll will be deleted!'); const content = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open('Delete vote?', content)) {
this.motionRepo.deletePoll(this.poll); 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', 'B1,Title 2,Text 2,Reason 2,Submitter B, Category B,, Block A',
',Title 3, Text 3,,,,,' ',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 * @param motions The motions to change
*/ */
public async setStateOfMultiple(motions: ViewMotion[]): Promise<void> { 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 => ({ const choices = this.workflowRepo.getWorkflowStatesForMotions(motions).map(workflowState => ({
id: workflowState.id, id: workflowState.id,
label: workflowState.name label: workflowState.name
@ -105,7 +105,7 @@ export class MotionMultiselectService {
* @param motions The motions to change * @param motions The motions to change
*/ */
public async setRecommendation(motions: ViewMotion[]): Promise<void> { 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 const choices = this.workflowRepo
.getWorkflowStatesForMotions(motions) .getWorkflowStatesForMotions(motions)
.filter(workflowState => !!workflowState.recommendation_label) .filter(workflowState => !!workflowState.recommendation_label)
@ -132,7 +132,7 @@ export class MotionMultiselectService {
* @param motions The motions to change * @param motions The motions to change
*/ */
public async setCategory(motions: ViewMotion[]): Promise<void> { 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 clearChoice = 'No category';
const selectedChoice = await this.choiceService.open( const selectedChoice = await this.choiceService.open(
title, title,
@ -231,7 +231,7 @@ export class MotionMultiselectService {
* @param motions The motions for which to change the motionBlock * @param motions The motions for which to change the motionBlock
*/ */
public async setMotionBlock(motions: ViewMotion[]): Promise<void> { 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 clearChoice = 'Clear motion block';
const selectedChoice = await this.choiceService.open( const selectedChoice = await this.choiceService.open(
title, title,

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<os-head-bar [nav]="false"> <os-head-bar [nav]="false">
<!-- Title --> <!-- 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"> <div class="menu-slot">
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()"> <button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
@ -12,7 +12,7 @@
<mat-tab-group (selectedTabChange)="onTabChange()"> <mat-tab-group (selectedTabChange)="onTabChange()">
<mat-tab label="{{ 'CSV import' | translate }}"> <mat-tab label="{{ 'CSV import' | translate }}">
<span 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 /> >: <br />
<div class="code red-warning-text"> <div class="code red-warning-text">
<span translate>Title</span>, <span translate>Given name</span>, <span translate>Surname</span> , <span translate>Title</span>, <span translate>Given name</span>, <span translate>Surname</span> ,
@ -47,7 +47,7 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<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-select class="selection" (selectionChange)="selectColSep($event)" value="">
<mat-option *ngFor="let option of columnSeparators" [value]="option.value"> <mat-option *ngFor="let option of columnSeparators" [value]="option.value">
{{ option.label | translate }} {{ option.label | translate }}
@ -73,49 +73,50 @@
#fileInput #fileInput
(change)="onSelectFile($event)" (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> <span translate> Select file</span>
</button> </button>
</div> </div>
</div> </div>
</mat-tab> </mat-tab>
<mat-tab label="{{ 'Text import' | translate }}"> <mat-tab label="{{ 'Text import' | translate }}">
<div [formGroup]="textAreaForm"> <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> <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> </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-tab-group>
</mat-card> </mat-card>
<!-- preview table --> <!-- preview table -->
<mat-card *ngIf="hasFile" class="os-form-card import-table"> <mat-card *ngIf="hasFile" class="os-form-card import-table">
<h3 translate> Preview</h3> <h3 translate>Preview</h3>
<div class="summary"> <div class="summary">
<!-- new entries --> <!-- new entries -->
<div *ngIf="newCount"> <div *ngIf="newCount">
&nbsp; &nbsp;
<mat-icon inline>playlist_add</mat-icon> <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> </div>
<!-- errors/duplicates --> <!-- errors/duplicates -->
<div *ngIf="nonImportableCount" class="red-warning-text"> <div *ngIf="nonImportableCount" class="red-warning-text">
@ -127,25 +128,23 @@
<div *ngIf="doneCount" class="green-text"> <div *ngIf="doneCount" class="green-text">
&nbsp; &nbsp;
<mat-icon inline>done</mat-icon> <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> </div>
<div *ngIf="newCount"> <div *ngIf="newCount">
<span translate>Click on 'import' (right top corner) to import the new users. <span translate>After verifiy the preview click on 'import' please (see top right).</span>
</span>
</div> </div>
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()"> <mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
<mat-option value="all" translate> Show all </mat-option> <mat-option value="all" translate>Show all</mat-option>
<mat-option value="error" translate> Show errors only </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="noerror" translate>Show correct entries only</mat-option>
</mat-select> </mat-select>
<div class="table-container"> <div class="table-container">
<table mat-table class="on-transition-fade" [dataSource]="dataSource" matSort> <table mat-table class="on-transition-fade" [dataSource]="dataSource" matSort>
<!-- Status column --> <!-- Status column -->
<ng-container matColumnDef="status" sticky> <ng-container matColumnDef="status" sticky>
<mat-header-cell *matHeaderCellDef class="first-column"></mat-header-cell> <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'"> <div *ngIf="entry.status === 'error'">
<mat-icon <mat-icon
class="red-warning-text" class="red-warning-text"
@ -154,20 +153,20 @@
{{ getActionIcon(entry) }} {{ getActionIcon(entry) }}
</mat-icon> </mat-icon>
<mat-icon <mat-icon
color="warn" color="warn"
*ngIf="hasError(entry, 'ParsingErrors')" *ngIf="hasError(entry, 'ParsingErrors')"
matTooltip="{{ getVerboseError('ParsingErrors') | translate }}" matTooltip="{{ getVerboseError('ParsingErrors') | translate }}"
> >
warning warning
</mat-icon> </mat-icon>
</div> </div>
<div *ngIf="entry.status === 'new'"> <div *ngIf="entry.status === 'new'">
<mat-icon matTooltip="{{ 'User will be imported' | translate }}"> <mat-icon matTooltip="{{ 'Participant will be imported' | translate }}">
{{ getActionIcon(entry) }} {{ getActionIcon(entry) }}
</mat-icon> </mat-icon>
</div> </div>
<div *ngIf="entry.status === 'done'"> <div *ngIf="entry.status === 'done'">
<mat-icon matTooltip="{{ 'User has been imported' | translate }}"> <mat-icon matTooltip="{{ 'Participant has been imported' | translate }}">
{{ getActionIcon(entry) }} {{ getActionIcon(entry) }}
</mat-icon> </mat-icon>
</div> </div>
@ -180,10 +179,10 @@
<mat-cell *matCellDef="let entry"> <mat-cell *matCellDef="let entry">
<span *ngIf="nameErrors(entry)"> <span *ngIf="nameErrors(entry)">
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}"> <mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
warning warning
</mat-icon> </mat-icon>
&nbsp; &nbsp;
</span> </span>
{{ entry.newEntry.title }} {{ entry.newEntry.title }}
</mat-cell> </mat-cell>
</ng-container> </ng-container>
@ -231,10 +230,10 @@
<mat-cell *matCellDef="let entry"> <mat-cell *matCellDef="let entry">
<div *ngIf="entry.newEntry.csvGroups.length"> <div *ngIf="entry.newEntry.csvGroups.length">
<span *ngIf="hasError(entry, 'Groups')"> <span *ngIf="hasError(entry, 'Groups')">
<mat-icon color="warn"matTooltip="{{ getVerboseError('Groups') | translate }}"> <mat-icon color="warn" matTooltip="{{ getVerboseError('Groups') | translate }}">
warning warning
</mat-icon> </mat-icon>
</span> </span>
<span *ngFor="let group of entry.newEntry.csvGroups"> <span *ngFor="let group of entry.newEntry.csvGroups">
{{ group.name }} {{ group.name }}
<mat-icon class="newBadge" color="accent" inline *ngIf="!group.id">add</mat-icon> <mat-icon class="newBadge" color="accent" inline *ngIf="!group.id">add</mat-icon>
@ -250,19 +249,19 @@
</ng-container> </ng-container>
<ng-container matColumnDef="is_active"> <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-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_active"> </mat-checkbox> <mat-checkbox disabled [checked]="entry.newEntry.is_active"> </mat-checkbox>
</mat-cell> </mat-cell>
</ng-container> </ng-container>
<ng-container matColumnDef="is_present"> <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-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_present"> </mat-checkbox> <mat-checkbox disabled [checked]="entry.newEntry.is_present"> </mat-checkbox>
</mat-cell> </mat-cell>
</ng-container> </ng-container>
<ng-container matColumnDef="is_committee"> <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-cell *matCellDef="let entry">
<mat-checkbox disabled [checked]="entry.newEntry.is_committee"> </mat-checkbox> <mat-checkbox disabled [checked]="entry.newEntry.is_committee"> </mat-checkbox>
</mat-cell> </mat-cell>

View File

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

View File

@ -988,7 +988,7 @@ class MotionPollViewSet(UpdateModelMixin, DestroyModelMixin, GenericViewSet):
# Fire autoupdate again to save information to OpenSlides history. # Fire autoupdate again to save information to OpenSlides history.
inform_changed_data( 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 return response
@ -1003,7 +1003,7 @@ class MotionPollViewSet(UpdateModelMixin, DestroyModelMixin, GenericViewSet):
# Fire autoupdate again to save information to OpenSlides history. # Fire autoupdate again to save information to OpenSlides history.
inform_changed_data( 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 return result