Merge pull request #4496 from emanuelschuetze/translation-20190311

Updated translations
This commit is contained in:
Emanuel Schütze 2019-03-11 12:58:22 +01:00 committed by GitHub
commit 0ac9125d66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 596 additions and 222 deletions

View File

@ -104,7 +104,7 @@ export class WebsocketService {
public constructor( public constructor(
private matSnackBar: MatSnackBar, private matSnackBar: MatSnackBar,
private zone: NgZone, private zone: NgZone,
public translate: TranslateService, private translate: TranslateService,
private router: Router private router: Router
) {} ) {}

View File

@ -1,9 +1,4 @@
import { _ } from '@biesbjerg/ngx-translate-extract'; import { _ } from 'app/core/translate/translation-marker';
// see issue: 4078
// function _(key: string | string[]): string | string[] {
// return key;
// }
/** /**
* Add strings here that require translations but have never been declared * Add strings here that require translations but have never been declared
@ -161,13 +156,8 @@ _('Preamble text for PDF and DOCX documents (all motions)');
_('Sort categories by'); _('Sort categories by');
_('Include the sequential number in PDF and DOCX'); _('Include the sequential number in PDF and DOCX');
// misc motion strings // misc motion strings
_('needed');
_('Amendment'); _('Amendment');
_('Amendment to');
_('Statute amendment for'); _('Statute amendment for');
_('Creation date');
_('Last modified');
_('Which version?');
// motion workflow 1 // motion workflow 1
_('Simple Workflow'); _('Simple Workflow');
@ -214,7 +204,6 @@ _('Called');
_('Called with'); _('Called with');
_('Recommendation'); _('Recommendation');
_('Motion block'); _('Motion block');
_('Are you sure you want to delete this motion?');
_('The text field may not be blank.'); _('The text field may not be blank.');
_('The reason field may not be blank.'); _('The reason field may not be blank.');
@ -356,6 +345,7 @@ _(
// users misc // users misc
_('Username or password is not correct.'); _('Username or password is not correct.');
_('Guest');
// default groups // default groups
_('Default'); _('Default');

View File

@ -0,0 +1,12 @@
/**
* Mark strings as translateable for ng-translate-extract.
* Marked strings are added into template-en.pot by 'npm run extract'.
*
* @example
* ```ts
* _('translateable string');
* ```
*/
export function _(str: string): string {
return str;
}

View File

@ -53,7 +53,7 @@ export abstract class BaseSortListService<V extends BaseViewModel> {
/** /**
* Constructor. Does nothing. TranslateService is used for localeCompeare. * Constructor. Does nothing. TranslateService is used for localeCompeare.
*/ */
public constructor(public translate: TranslateService, private store: StorageService) {} public constructor(protected translate: TranslateService, private store: StorageService) {}
/** /**
* Put an array of data that you want sorted. * Put an array of data that you want sorted.

View File

@ -1,5 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { _ } from 'app/core/translate/translation-marker';
/** /**
* The possible keys of a poll object that represent numbers. * The possible keys of a poll object that represent numbers.
* TODO Should be 'key of MotionPoll if type of key is number' * TODO Should be 'key of MotionPoll if type of key is number'
@ -88,11 +90,11 @@ export class PollService {
case 'abstain': case 'abstain':
return 'Abstain'; return 'Abstain';
case 'votescast': case 'votescast':
return 'Total votes cast'; return _('Total votes cast');
case 'votesvalid': case 'votesvalid':
return 'Valid votes'; return _('Valid votes');
case 'votesinvalid': case 'votesinvalid':
return 'Invalid votes'; return _('Invalid votes');
default: default:
return ''; return '';
} }

View File

@ -1,5 +1,3 @@
import { TranslateService } from '@ngx-translate/core';
import { Selectable } from './selectable'; import { Selectable } from './selectable';
/** /**
@ -13,14 +11,13 @@ export class EmptySelectable implements Selectable {
/** /**
* Empty Constructor * Empty Constructor
* @param translate translate Service
*/ */
public constructor(private translate?: TranslateService) {} public constructor() {}
/** /**
* gets the title * gets the title
*/ */
public getTitle = () => (this.translate ? this.translate.instant('None') : 'None'); public getTitle = () => '';
/** /**
* gets the list title * gets the list title

View File

@ -93,7 +93,7 @@ export class OsSortFilterBarComponent<V extends BaseViewModel> {
* @param bottomSheet * @param bottomSheet
*/ */
public constructor( public constructor(
public translate: TranslateService, protected translate: TranslateService,
public vp: ViewportService, public vp: ViewportService,
private bottomSheet: MatBottomSheet private bottomSheet: MatBottomSheet
) { ) {

View File

@ -3,7 +3,7 @@
<ngx-mat-select-search [formControl]="filterControl"></ngx-mat-select-search> <ngx-mat-select-search [formControl]="filterControl"></ngx-mat-select-search>
<div *ngIf="!multiple && includeNone"> <div *ngIf="!multiple && includeNone">
<mat-option [value]="null"> <mat-option [value]="null">
<span translate>None</span> <span></span>
</mat-option> </mat-option>
<mat-divider></mat-divider> <mat-divider></mat-divider>
</div> </div>

View File

@ -133,7 +133,7 @@ export class SearchValueSelectorComponent implements OnInit, OnDestroy {
/** /**
* Empty constructor * Empty constructor
*/ */
public constructor(public translate: TranslateService) {} public constructor(protected translate: TranslateService) {}
/** /**
* onInit with filter ans subscription on filter * onInit with filter ans subscription on filter

View File

@ -111,7 +111,7 @@ export class SortingListComponent implements OnInit, OnDestroy {
* Creates an empty array. * Creates an empty array.
* @param translate the translation service * @param translate the translation service
*/ */
public constructor(public translate: TranslateService) { public constructor(protected translate: TranslateService) {
this.array = []; this.array = [];
} }

View File

@ -1,9 +1,11 @@
import { BaseModel } from '../base/base-model'; import { BaseModel } from '../base/base-model';
import { _ } from 'app/core/translate/translation-marker';
/** /**
* Iterable pre selection of genders (sexes) * Iterable pre selection of genders (sexes)
*/ */
export const genders = ['Female', 'Male', 'Diverse']; export const genders = [_('female'), _('male'), _('diverse')];
/** /**
* Representation of a user in contrast to the operator. * Representation of a user in contrast to the operator.

View File

@ -19,6 +19,7 @@ import { PdfDocumentService } from 'app/core/ui-services/pdf-document.service';
import { ViewportService } from 'app/core/ui-services/viewport.service'; import { ViewportService } from 'app/core/ui-services/viewport.service';
import { ViewItem } from '../../models/view-item'; import { ViewItem } from '../../models/view-item';
import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable'; import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable';
import { _ } from 'app/core/translate/translation-marker';
/** /**
* List view for the agenda. * List view for the agenda.
@ -58,7 +59,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
slideOptions: [ slideOptions: [
{ {
key: 'only_main_items', key: 'only_main_items',
displayName: this.translate.instant('Only main agenda items'), displayName: _('Only main agenda items'),
default: false default: false
} }
], ],
@ -87,7 +88,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private operator: OperatorService, private operator: OperatorService,
private route: ActivatedRoute, private route: ActivatedRoute,
@ -174,8 +175,8 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
* Click handler for the numbering button to enable auto numbering * Click handler for the numbering button to enable auto numbering
*/ */
public async onAutoNumbering(): Promise<void> { public async onAutoNumbering(): Promise<void> {
const content = this.translate.instant('Are you sure you want to number all agenda items?'); const title = this.translate.instant('Are you sure you want to number all agenda items?');
if (await this.promptService.open('', content)) { if (await this.promptService.open(title, null)) {
await this.repo.autoNumbering().then(null, this.raiseError); await this.repo.autoNumbering().then(null, this.raiseError);
} }
} }
@ -211,8 +212,9 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
* @param item The item to delete * @param item The item to delete
*/ */
public async onDelete(item: ViewItem): Promise<void> { public async onDelete(item: ViewItem): Promise<void> {
const content = this.translate.instant('Delete') + ` ${item.getTitle()}?`; const title = this.translate.instant('Are you sure you want to delete this entry?');
if (await this.promptService.open('Are you sure?', content)) { const content = item.contentObject.getTitle();
if (await this.promptService.open(title, content)) {
await this.repo.delete(item).then(null, this.raiseError); await this.repo.delete(item).then(null, this.raiseError);
} }
} }
@ -222,8 +224,8 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
* is only filled with any data in multiSelect mode * is only filled with any data in multiSelect mode
*/ */
public async deleteSelected(): Promise<void> { public async deleteSelected(): Promise<void> {
const content = this.translate.instant('This will delete all selected agenda items.'); const title = this.translate.instant('Are you sure you want to delete all selected items?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
for (const agenda of this.selectedRows) { for (const agenda of this.selectedRows) {
await this.repo.delete(agenda); await this.repo.delete(agenda);
} }

View File

@ -158,6 +158,6 @@
<button mat-menu-item (click)="clearSpeakerList()" *ngIf="!emptyList" class="red-warning-text"> <button mat-menu-item (click)="clearSpeakerList()" *ngIf="!emptyList" class="red-warning-text">
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
<span trabslate>Remove all speakers</span> <span translate>Remove all speakers</span>
</button> </button>
</mat-menu> </mat-menu>

View File

@ -121,7 +121,7 @@ export class ListOfSpeakersComponent extends BaseViewComponent implements OnInit
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
snackBar: MatSnackBar, snackBar: MatSnackBar,
projectorRepo: ProjectorRepositoryService, projectorRepo: ProjectorRepositoryService,
private route: ActivatedRoute, private route: ActivatedRoute,
@ -360,8 +360,10 @@ export class ListOfSpeakersComponent extends BaseViewComponent implements OnInit
* after a confirmation dialog * after a confirmation dialog
*/ */
public async clearSpeakerList(): Promise<void> { public async clearSpeakerList(): Promise<void> {
const content = this.translate.instant('This will clear all speakers from the list.'); const title = this.translate.instant(
if (await this.promptService.open('Are you sure?', content)) { 'Are you sure you want to delete all speakers from this list of speakers?'
);
if (await this.promptService.open(title, null)) {
this.repo.deleteAllSpeakers(this.viewItem); this.repo.deleteAllSpeakers(this.viewItem);
} }
} }

View File

@ -98,7 +98,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 agenda item' | translate }}"
[InputListValues]="itemObserver" [InputListValues]="itemObserver"
></os-search-value-selector> ></os-search-value-selector>
</div> </div>

View File

@ -218,8 +218,9 @@ export class TopicDetailComponent extends BaseViewComponent {
* Handler for the delete button. Uses the PromptService * Handler for the delete button. Uses the PromptService
*/ */
public async onDeleteButton(): Promise<void> { public async onDeleteButton(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.topic.title}?`; const title = this.translate.instant('Are you sure you want to delete this entry?');
if (await this.promptService.open('Are you sure?', content)) { const content = this.topic.title;
if (await this.promptService.open(title, content)) {
await this.repo.delete(this.topic).then(null, this.raiseError); await this.repo.delete(this.topic).then(null, this.raiseError);
this.router.navigate(['/agenda']); this.router.navigate(['/agenda']);
} }

View File

@ -5,6 +5,7 @@ import { Item, itemVisibilityChoices } from 'app/shared/models/agenda/item';
import { ViewItem } from '../models/view-item'; import { ViewItem } from '../models/view-item';
import { StorageService } from 'app/core/core-services/storage.service'; import { StorageService } from 'app/core/core-services/storage.service';
import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service'; import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service';
import { TranslateService } from '@ngx-translate/core';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -18,8 +19,9 @@ export class AgendaFilterListService extends BaseFilterListService<Item, ViewIte
* Constructor. Also creates the dynamic filter options * Constructor. Also creates the dynamic filter options
* @param store * @param store
* @param repo * @param repo
* @param translate Translation service
*/ */
public constructor(store: StorageService, repo: ItemRepositoryService) { public constructor(store: StorageService, repo: ItemRepositoryService, private translate: TranslateService) {
super(store, repo); super(store, repo);
this.filterOptions = [ this.filterOptions = [
{ {
@ -30,7 +32,10 @@ export class AgendaFilterListService extends BaseFilterListService<Item, ViewIte
{ {
label: 'Status', label: 'Status',
property: 'closed', property: 'closed',
options: [{ label: 'Open', condition: false }, { label: 'Closed', condition: true }] options: [
{ label: this.translate.instant('Open items'), condition: false },
{ label: this.translate.instant('Closed items'), condition: true }
]
} }
]; ];
this.updateFilterDefinitions(this.filterOptions); this.updateFilterDefinitions(this.filterOptions);

View File

@ -33,7 +33,7 @@ export class AssignmentListComponent extends ListViewBaseComponent<ViewAssignmen
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
public repo: AssignmentRepositoryService, public repo: AssignmentRepositoryService,
private promptService: PromptService, private promptService: PromptService,
@ -83,8 +83,8 @@ export class AssignmentListComponent extends ListViewBaseComponent<ViewAssignmen
* is only filled with any data in multiSelect mode * is only filled with any data in multiSelect mode
*/ */
public async deleteSelected(): Promise<void> { public async deleteSelected(): Promise<void> {
const content = this.translate.instant('This will delete all selected assignments.'); const title = this.translate.instant('Are you sure you want to delete all selected elections?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
for (const assignment of this.selectedRows) { for (const assignment of this.selectedRows) {
await this.repo.delete(assignment); await this.repo.delete(assignment);
} }

View File

@ -178,8 +178,9 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
* @param file the file to delete * @param file the file to delete
*/ */
public async onDelete(file: ViewMediafile): Promise<void> { public async onDelete(file: ViewMediafile): Promise<void> {
const content = this.translate.instant('Do you want to delete this file?') + `<p><strong>${file}</strong>`; const title = this.translate.instant('Are you sure you want to delete this file?');
if (await this.promptService.open('Are you sure?', content)) { const content = file.getTitle();
if (await this.promptService.open(title, content)) {
this.repo.delete(file); this.repo.delete(file);
} }
} }
@ -189,8 +190,8 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
* will be made available in multiSelect mode * will be made available in multiSelect mode
*/ */
public async deleteSelected(): Promise<void> { public async deleteSelected(): Promise<void> {
const content = this.translate.instant('All selected files will be deleted!'); const title = this.translate.instant('Are you sure you want to delete all selected files?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
for (const mediafile of this.selectedRows) { for (const mediafile of this.selectedRows) {
await this.repo.delete(mediafile); await this.repo.delete(mediafile);
} }

View File

@ -16,6 +16,7 @@ import { ViewMotionBlock } from './view-motion-block';
import { BaseViewModel } from 'app/site/base/base-view-model'; import { BaseViewModel } from 'app/site/base/base-view-model';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { ViewMotionChangeRecommendation } from './view-change-recommendation'; import { ViewMotionChangeRecommendation } from './view-change-recommendation';
import { _ } from 'app/core/translate/translation-marker';
/** /**
* The line numbering mode for the motion detail view. * The line numbering mode for the motion detail view.
@ -610,7 +611,7 @@ export class ViewMotion extends BaseAgendaViewModel implements Searchable {
if (this.changeRecommendations && this.changeRecommendations.length) { if (this.changeRecommendations && this.changeRecommendations.length) {
slideOptions.push({ slideOptions.push({
key: 'mode', key: 'mode',
displayName: 'Which version?', displayName: _('Which version?'),
default: configService.instant('motions_recommendation_text_mode'), default: configService.instant('motions_recommendation_text_mode'),
choices: [ choices: [
{ value: 'original', displayName: 'Original version' }, { value: 'original', displayName: 'Original version' },

View File

@ -58,7 +58,7 @@ export class CategoryListComponent extends BaseViewComponent implements OnInit {
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: CategoryRepositoryService, private repo: CategoryRepositoryService,
private motionRepo: MotionRepositoryService, private motionRepo: MotionRepositoryService,
@ -173,8 +173,9 @@ export class CategoryListComponent extends BaseViewComponent implements OnInit {
* @param viewCategory The category to delete * @param viewCategory The category to delete
*/ */
public async onDeleteButton(viewCategory: ViewCategory): Promise<void> { public async onDeleteButton(viewCategory: ViewCategory): Promise<void> {
const content = this.translate.instant('Delete') + ` ${viewCategory.name}?`; const title = this.translate.instant('Are you sure you want to delete this category?');
if (await this.promptService.open('Are you sure?', content)) { const content = viewCategory.getTitle();
if (await this.promptService.open(title, content)) {
this.repo.delete(viewCategory).then(() => this.onCancelButton(), this.raiseError); this.repo.delete(viewCategory).then(() => this.onCancelButton(), this.raiseError);
} }
} }

View File

@ -75,7 +75,7 @@ export class CategorySortComponent extends BaseViewComponent implements OnInit {
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private promptService: PromptService, private promptService: PromptService,
private repo: CategoryRepositoryService, private repo: CategoryRepositoryService,
@ -107,8 +107,9 @@ export class CategorySortComponent extends BaseViewComponent implements OnInit {
*/ */
public async onNumberMotions(): Promise<void> { public async onNumberMotions(): Promise<void> {
if (this.sortSelector) { if (this.sortSelector) {
const content = this.translate.instant('This will change the identifier for the motions of this category.'); const title = this.translate.instant('Are you sure you want to renumber all motions of this category?');
if (await this.promptService.open('Are you sure?', content)) { const content = this.category.getTitle();
if (await this.promptService.open(title, content)) {
const sortedMotionIds = this.sortSelector.array.map(selectable => selectable.id); const sortedMotionIds = this.sortSelector.array.map(selectable => selectable.id);
await this.repo await this.repo
.numberMotionsInCategory(this.category.category, sortedMotionIds) .numberMotionsInCategory(this.category.category, sortedMotionIds)

View File

@ -131,10 +131,11 @@ export class MotionBlockDetailComponent extends ListViewBaseComponent<ViewMotion
* Click handler for recommendation button * Click handler for recommendation button
*/ */
public async onFollowRecButton(): Promise<void> { public async onFollowRecButton(): Promise<void> {
const content = this.translate.instant( const title = this.translate.instant(
`Are you sure you want to override the state of all motions of this motion block?` 'Are you sure you want to override the state of all motions of this motion block?'
); );
if (await this.promptService.open(this.block.title, content)) { const content = this.block.title;
if (await this.promptService.open(title, content)) {
this.repo.followRecommendation(this.block); this.repo.followRecommendation(this.block);
} }
} }
@ -153,8 +154,9 @@ export class MotionBlockDetailComponent extends ListViewBaseComponent<ViewMotion
* Click handler to delete motion blocks * Click handler to delete motion blocks
*/ */
public async onDeleteBlockButton(): Promise<void> { public async onDeleteBlockButton(): Promise<void> {
const content = this.translate.instant('Are you sure you want to delete this motion block?'); const title = this.translate.instant('Are you sure you want to delete this motion block?');
if (await this.promptService.open(this.block.title, content)) { const content = this.block.title;
if (await this.promptService.open(title, content)) {
await this.repo.delete(this.block); await this.repo.delete(this.block);
this.router.navigate(['../'], { relativeTo: this.route }); this.router.navigate(['../'], { relativeTo: this.route });
} }
@ -166,8 +168,9 @@ export class MotionBlockDetailComponent extends ListViewBaseComponent<ViewMotion
* @param motion the corresponding motion * @param motion the corresponding motion
*/ */
public async onRemoveMotionButton(motion: ViewMotion): Promise<void> { public async onRemoveMotionButton(motion: ViewMotion): Promise<void> {
const content = this.translate.instant('Are you sure you want to remove this motion from motion block?'); const title = this.translate.instant('Are you sure you want to remove this motion from motion block?');
if (await this.promptService.open(motion.title, content)) { const content = motion.getTitle();
if (await this.promptService.open(title, content)) {
this.repo.removeMotionFromBlock(motion); this.repo.removeMotionFromBlock(motion);
} }
} }

View File

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

View File

@ -157,8 +157,9 @@ export class MotionBlockListComponent extends ListViewBaseComponent<ViewMotionBl
* @param motionBlock the block to delete * @param motionBlock the block to delete
*/ */
public async onDelete(motionBlock: ViewMotionBlock): Promise<void> { public async onDelete(motionBlock: ViewMotionBlock): Promise<void> {
const content = this.translate.instant('Are you sure you want to delete this motion block?'); const title = this.translate.instant('Are you sure you want to delete this motion block?');
if (await this.promptService.open(motionBlock.title, content)) { const content = motionBlock.title;
if (await this.promptService.open(title, content)) {
await this.repo.delete(motionBlock); await this.repo.delete(motionBlock);
} }
} }

View File

@ -55,7 +55,7 @@ export class MotionCommentSectionListComponent extends BaseViewComponent impleme
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: MotionCommentSectionRepositoryService, private repo: MotionCommentSectionRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -164,8 +164,9 @@ export class MotionCommentSectionListComponent extends BaseViewComponent impleme
* @param viewSection The section to delete * @param viewSection The section to delete
*/ */
public async onDeleteButton(viewSection: ViewMotionCommentSection): Promise<void> { public async onDeleteButton(viewSection: ViewMotionCommentSection): Promise<void> {
const content = this.translate.instant('Delete') + ` ${viewSection.name}?`; const title = this.translate.instant('Are you sure you want to delete this comment field?');
if (await this.promptService.open('Are you sure?', content)) { const content = viewSection.name;
if (await this.promptService.open(title, content)) {
this.repo.delete(viewSection).then(() => (this.openId = this.editId = null), this.raiseError); this.repo.delete(viewSection).then(() => (this.openId = this.editId = null), this.raiseError);
} }
} }

View File

@ -83,7 +83,7 @@ export class AmendmentCreateWizardComponent extends BaseViewComponent {
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
private configService: ConfigService, private configService: ConfigService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private repo: MotionRepositoryService, private repo: MotionRepositoryService,

View File

@ -79,7 +79,7 @@ export class MotionDetailDiffComponent extends BaseViewComponent implements Afte
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
private motionRepo: MotionRepositoryService, private motionRepo: MotionRepositoryService,
@ -277,8 +277,8 @@ export class MotionDetailDiffComponent extends BaseViewComponent implements Afte
public async deleteChangeRecommendation(reco: ViewMotionChangeRecommendation, $event: MouseEvent): Promise<void> { public async deleteChangeRecommendation(reco: ViewMotionChangeRecommendation, $event: MouseEvent): Promise<void> {
$event.stopPropagation(); $event.stopPropagation();
$event.preventDefault(); $event.preventDefault();
const content = this.translate.instant('Delete this change recommendation'); const title = this.translate.instant('Are you sure you want to delete this change recommendation?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
this.recoRepo.delete(reco).then(null, this.raiseError); this.recoRepo.delete(reco).then(null, this.raiseError);
} }
} }

View File

@ -708,19 +708,6 @@
</div> </div>
</div> </div>
<!-- Parent item -->
<div class="content-field" *ngIf="newMotion && agendaItemObserver.value.length > 0">
<os-search-value-selector
ngDefaultControl
[form]="contentForm"
[formControl]="contentForm.get('agenda_parent_id')"
[multiple]="false"
[includeNone]="true"
listname="{{ 'Parent item' | translate }}"
[InputListValues]="agendaItemObserver"
></os-search-value-selector>
</div>
<!-- Visibility --> <!-- Visibility -->
<div class="content-field" *ngIf="newMotion"> <div class="content-field" *ngIf="newMotion">
<mat-form-field> <mat-form-field>
@ -732,6 +719,19 @@
</mat-form-field> </mat-form-field>
</div> </div>
<!-- Parent item -->
<div class="content-field" *ngIf="newMotion && agendaItemObserver.value.length > 0">
<os-search-value-selector
ngDefaultControl
[form]="contentForm"
[formControl]="contentForm.get('agenda_parent_id')"
[multiple]="false"
[includeNone]="true"
listname="{{ 'Parent agenda item' | translate }}"
[InputListValues]="agendaItemObserver"
></os-search-value-selector>
</div>
<!-- Supporter form --> <!-- Supporter form -->
<div class="content-field" *ngIf="editMotion && minSupporters"> <div class="content-field" *ngIf="editMotion && minSupporters">
<div *ngIf="perms.isAllowed('change_metadata', motion)"> <div *ngIf="perms.isAllowed('change_metadata', motion)">

View File

@ -377,7 +377,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
public vp: ViewportService, public vp: ViewportService,
public operator: OperatorService, public operator: OperatorService,
@ -855,7 +855,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public async deleteMotionButton(): Promise<void> { public async deleteMotionButton(): Promise<void> {
const title = this.translate.instant('Are you sure you want to delete this motion?'); const title = this.translate.instant('Are you sure you want to delete this motion?');
if (await this.promptService.open(title, this.motion.getTitle())) { const content = this.motion.getTitle();
if (await this.promptService.open(title, content)) {
await this.repo.delete(this.motion); await this.repo.delete(this.motion);
this.router.navigate(['./motions/']); this.router.navigate(['./motions/']);
} }
@ -1001,8 +1002,10 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
try { try {
// Just confirm this, if there is one modified final version the user would override. // Just confirm this, if there is one modified final version the user would override.
if (this.motion.modified_final_version) { if (this.motion.modified_final_version) {
const content = this.translate.instant('Are you sure to copy the final version to the print template?'); const title = this.translate.instant(
if (await this.promptService.open(this.motion.title, content)) { 'Are you sure you want to copy the final version to the print template?'
);
if (await this.promptService.open(title, null)) {
await this.updateMotion({ modified_final_version: finalVersion }, this.motion); await this.updateMotion({ modified_final_version: finalVersion }, this.motion);
} }
} else { } else {
@ -1018,8 +1021,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* Deletes the modified final version * Deletes the modified final version
*/ */
public async deleteModifiedFinalVersion(): Promise<void> { public async deleteModifiedFinalVersion(): Promise<void> {
const content = this.translate.instant('Are you sure to delete the print template?'); const title = this.translate.instant('Are you sure you want to delete the print template?');
if (await this.promptService.open(this.motion.title, content)) { if (await this.promptService.open(title, null)) {
this.updateMotion({ modified_final_version: '' }, this.motion).then( this.updateMotion({ modified_final_version: '' }, this.motion).then(
() => this.setChangeRecoMode(ChangeRecoMode.Final), () => this.setChangeRecoMode(ChangeRecoMode.Final),
this.raiseError this.raiseError

View File

@ -1,4 +1,4 @@
<h2><span translate>Voting result</span></h2> <h2 translate>Voting result</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;
@ -14,7 +14,7 @@
</mat-form-field> </mat-form-field>
</div> </div>
<div class="submit-buttons"> <div class="submit-buttons">
<button mat-button (click)="cancel()" translate>Cancel</button> <button mat-button (click)="submit()">{{ 'Save' | translate }}</button>
<button mat-button (click)="submit()" translate>Save</button> <button mat-button (click)="cancel()">{{ 'Cancel' | translate }}</button>
</div> </div>

View File

@ -118,8 +118,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('Are you sure you want to delete this vote?'); const title = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open('Delete vote?', content)) { if (await this.promptService.open(title, null)) {
this.motionRepo.deletePoll(this.poll); this.motionRepo.deletePoll(this.poll);
} }
} }

View File

@ -86,7 +86,7 @@ export class MotionListComponent extends ListViewBaseComponent<ViewMotion, Motio
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
sortService: MotionSortListService, sortService: MotionSortListService,
filterService: MotionFilterListService, filterService: MotionFilterListService,

View File

@ -145,7 +145,7 @@ export class WorkflowDetailComponent extends BaseViewComponent implements OnInit
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private promtService: PromptService, private promtService: PromptService,
private dialog: MatDialog, private dialog: MatDialog,

View File

@ -97,8 +97,9 @@ export class WorkflowListComponent extends ListViewBaseComponent<ViewWorkflow, W
* @param selected the selected workflow * @param selected the selected workflow
*/ */
public async onDeleteWorkflow(selected: ViewWorkflow): Promise<void> { public async onDeleteWorkflow(selected: ViewWorkflow): Promise<void> {
const content = this.translate.instant('Delete') + ` ${selected}?`; const title = this.translate.instant('Are you sure you want to delete this workflow?');
if (await this.promptService.open('Are you sure?', content)) { const content = selected.getTitle();
if (await this.promptService.open(title, content)) {
this.workflowRepo.delete(selected).then(() => {}, this.raiseError); this.workflowRepo.delete(selected).then(() => {}, this.raiseError);
} }
} }

View File

@ -51,7 +51,7 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: StatuteParagraphRepositoryService, private repo: StatuteParagraphRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -136,8 +136,9 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
* @param viewStatuteParagraph The statute paragraph to delete * @param viewStatuteParagraph The statute paragraph to delete
*/ */
public async onDeleteButton(viewStatuteParagraph: ViewStatuteParagraph): Promise<void> { public async onDeleteButton(viewStatuteParagraph: ViewStatuteParagraph): Promise<void> {
const content = this.translate.instant('Delete') + ` ${viewStatuteParagraph.title}?`; const title = this.translate.instant('Are you sure you want to delete this statute paragraph?');
if (await this.promptService.open('Are you sure?', content)) { const content = viewStatuteParagraph.title;
if (await this.promptService.open(title, content)) {
this.repo.delete(viewStatuteParagraph).then(() => (this.openId = this.editId = null), this.raiseError); this.repo.delete(viewStatuteParagraph).then(() => (this.openId = this.editId = null), this.raiseError);
} }
} }

View File

@ -61,8 +61,8 @@ export class MotionMultiselectService {
* @param motions The motions to delete * @param motions The motions to delete
*/ */
public async delete(motions: ViewMotion[]): Promise<void> { public async delete(motions: ViewMotion[]): Promise<void> {
const content = this.translate.instant('This will delete all selected motions.'); const title = this.translate.instant('Are you sure you want to delete all selected motions?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
for (const motion of motions) { for (const motion of motions) {
await this.repo.delete(motion); await this.repo.delete(motion);
} }
@ -239,7 +239,7 @@ export class MotionMultiselectService {
*/ */
public async setMotionBlock(motions: ViewMotion[]): Promise<void> { public async setMotionBlock(motions: ViewMotion[]): Promise<void> {
const title = this.translate.instant('This will set the following 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 = this.translate.instant('Clear motion block');
const selectedChoice = await this.choiceService.open( const selectedChoice = await this.choiceService.open(
title, title,
this.motionBlockRepo.getViewModelList(), this.motionBlockRepo.getViewModelList(),

View File

@ -5,6 +5,7 @@ import { ViewMotion } from '../models/view-motion';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { StorageService } from 'app/core/core-services/storage.service'; import { StorageService } from 'app/core/core-services/storage.service';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { _ } from 'app/core/translate/translation-marker';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -21,8 +22,8 @@ export class MotionSortListService extends BaseSortListService<ViewMotion> {
{ property: 'category' }, { property: 'category' },
{ property: 'motion_block_id', label: 'Motion block' }, { property: 'motion_block_id', label: 'Motion block' },
{ property: 'state' }, { property: 'state' },
{ property: 'creationDate', label: this.translate.instant('Creation date') }, { property: 'creationDate', label: _('Creation date') },
{ property: 'lastChangeDate', label: this.translate.instant('Last modified') } { property: 'lastChangeDate', label: _('Last modified') }
] ]
}; };
protected name = 'Motion'; protected name = 'Motion';

View File

@ -40,7 +40,7 @@ export class CountdownListComponent extends BaseViewComponent implements OnInit
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: CountdownRepositoryService, private repo: CountdownRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -152,8 +152,9 @@ export class CountdownListComponent extends BaseViewComponent implements OnInit
* @param countdown The countdown to delete * @param countdown The countdown to delete
*/ */
public async onDeleteButton(countdown: ViewCountdown): Promise<void> { public async onDeleteButton(countdown: ViewCountdown): Promise<void> {
const content = this.translate.instant('Delete countdown') + ` ${this.translate.instant(countdown.title)}?`; const title = this.translate.instant('Are you sure you want to delete this countdown?');
if (await this.promptService.open('Are you sure?', content)) { const content = countdown.title;
if (await this.promptService.open(title, content)) {
this.repo.delete(countdown).then(() => (this.openId = this.editId = null), this.raiseError); this.repo.delete(countdown).then(() => (this.openId = this.editId = null), this.raiseError);
} }
} }

View File

@ -172,7 +172,7 @@
<!-- Previous Slides --> <!-- Previous Slides -->
<mat-expansion-panel *ngIf="projector.elements_history.length" class="previous-slides"> <mat-expansion-panel *ngIf="projector.elements_history.length" class="previous-slides">
<mat-expansion-panel-header> <mat-expansion-panel-header>
<span translate>History</span> <span translate>Previous slides</span>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p *ngFor="let elements of projector.elements_history; let i = index"> <p *ngFor="let elements of projector.elements_history; let i = index">
{{ i + 1 }}. &nbsp; {{ getSlideTitle(elements[0]) }} {{ i + 1 }}. &nbsp; {{ getSlideTitle(elements[0]) }}
@ -228,16 +228,6 @@
<span translate>Current list of speakers</span> <span translate>Current list of speakers</span>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<!-- Overlay -->
<mat-list>
<mat-list-item [ngClass]="{ projected: isClosProjected(true) }">
<button type="button" mat-icon-button (click)="toggleClos(true)">
<mat-icon>videocam</mat-icon>
</button>
<span translate>Overlay</span>
</mat-list-item>
</mat-list>
<!-- Slide--> <!-- Slide-->
<mat-list *ngIf="projectorCount > 1"> <mat-list *ngIf="projectorCount > 1">
<mat-list-item [ngClass]="{ projected: isClosProjected(false) }"> <mat-list-item [ngClass]="{ projected: isClosProjected(false) }">
@ -248,6 +238,16 @@
</mat-list-item> </mat-list-item>
</mat-list> </mat-list>
<!-- Overlay -->
<mat-list>
<mat-list-item [ngClass]="{ projected: isClosProjected(true) }">
<button type="button" mat-icon-button (click)="toggleClos(true)">
<mat-icon>videocam</mat-icon>
</button>
<span translate>Overlay</span>
</mat-list-item>
</mat-list>
<!-- Chyron --> <!-- Chyron -->
<mat-list> <mat-list>
<mat-list-item [ngClass]="{ projected: isChyronProjected() }"> <mat-list-item [ngClass]="{ projected: isChyronProjected() }">

View File

@ -14,10 +14,10 @@
</div> </div>
</os-head-bar> </os-head-bar>
<mat-card *ngIf="!projectorToCreate && projectors"> <mat-card *ngIf="!projectorToCreate && projectors && projectors.length > 1">
<span translate> <span translate>
Reference projector for current list of speakers: Reference projector for current list of speakers:
</span> </span>&nbsp;
<mat-form-field> <mat-form-field>
<mat-select [disabled]="!!editId" [value]="projectors[0].reference_projector_id" (selectionChange)="onSelectReferenceProjector($event)"> <mat-select [disabled]="!!editId" [value]="projectors[0].reference_projector_id" (selectionChange)="onSelectReferenceProjector($event)">
<mat-option *ngFor="let projector of projectors" [value]="projector.id"> <mat-option *ngFor="let projector of projectors" [value]="projector.id">

View File

@ -85,7 +85,7 @@ export class ProjectorListComponent extends BaseViewComponent implements OnInit
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: ProjectorRepositoryService, private repo: ProjectorRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -254,8 +254,9 @@ export class ProjectorListComponent extends BaseViewComponent implements OnInit
* @param projector The projector to delete * @param projector The projector to delete
*/ */
public async onDeleteButton(projector: ViewProjector): Promise<void> { public async onDeleteButton(projector: ViewProjector): Promise<void> {
const content = this.translate.instant('Delete') + ` ${projector.name}?`; const title = this.translate.instant('Are you sure you want to delete this projector?');
if (await this.promptService.open('Are you sure?', content)) { const content = projector.name;
if (await this.promptService.open(title, content)) {
this.repo.delete(projector).then(null, this.raiseError); this.repo.delete(projector).then(null, this.raiseError);
} }
} }

View File

@ -41,7 +41,7 @@ export class ProjectorMessageListComponent extends BaseViewComponent implements
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: ProjectorMessageRepositoryService, private repo: ProjectorMessageRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -127,8 +127,8 @@ export class ProjectorMessageListComponent extends BaseViewComponent implements
* @param message The message to delete * @param message The message to delete
*/ */
public async onDeleteButton(message: ViewProjectorMessage): Promise<void> { public async onDeleteButton(message: ViewProjectorMessage): Promise<void> {
const content = this.translate.instant('Delete this message?'); const title = this.translate.instant('Are you sure you want to delete the selected message?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
this.repo.delete(message).then(() => (this.openId = this.editId = null), this.raiseError); this.repo.delete(message).then(() => (this.openId = this.editId = null), this.raiseError);
} }
} }

View File

@ -39,7 +39,7 @@ export class TagListComponent extends ListViewBaseComponent<ViewTag, Tag> implem
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: TagRepositoryService, private repo: TagRepositoryService,
private promptService: PromptService private promptService: PromptService
@ -102,8 +102,9 @@ export class TagListComponent extends ListViewBaseComponent<ViewTag, Tag> implem
* Deletes the selected Tag after a successful confirmation. * Deletes the selected Tag after a successful confirmation.
*/ */
public async deleteSelectedTag(): Promise<void> { public async deleteSelectedTag(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.selectedTag.name}?`; const title = this.translate.instant('Are you sure you want to delete this tag?');
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) { const content = this.selectedTag.name;
if (await this.promptService.open(title, content)) {
this.repo.delete(this.selectedTag).then(() => this.cancelEditing(), this.raiseError); this.repo.delete(this.selectedTag).then(() => this.cancelEditing(), this.raiseError);
} }
} }

View File

@ -58,7 +58,7 @@ export class GroupListComponent extends BaseViewComponent implements OnInit {
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
public repo: GroupRepositoryService, public repo: GroupRepositoryService,
private promptService: PromptService private promptService: PromptService
@ -131,8 +131,9 @@ export class GroupListComponent extends BaseViewComponent implements OnInit {
* Deletes the selected Group * Deletes the selected Group
*/ */
public async deleteSelectedGroup(): Promise<void> { public async deleteSelectedGroup(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.selectedGroup.name}?`; const title = this.translate.instant('Are you sure you want to delete this group?');
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) { const content = this.translate.instant(this.selectedGroup.name);
if (await this.promptService.open(title, content)) {
this.repo.delete(this.selectedGroup).then(() => this.cancelEditing(), this.raiseError); this.repo.delete(this.selectedGroup).then(() => this.cancelEditing(), this.raiseError);
} }
} }

View File

@ -66,7 +66,7 @@ export class PasswordComponent extends BaseViewComponent implements OnInit {
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router, private router: Router,
@ -150,7 +150,7 @@ export class PasswordComponent extends BaseViewComponent implements OnInit {
const newPassword2 = this.userPasswordForm.value.newPassword2; const newPassword2 = this.userPasswordForm.value.newPassword2;
if (newPassword1 !== newPassword2) { if (newPassword1 !== newPassword2) {
this.raiseError(this.translate.instant('New passwords do not match')); this.raiseError(this.translate.instant('Error: The new passwords do not match.'));
} else { } else {
await this.repo.setNewPassword(oldPassword, newPassword1); await this.repo.setNewPassword(oldPassword, newPassword1);
this.router.navigate(['./']); this.router.navigate(['./']);

View File

@ -14,10 +14,10 @@
(keyup)="onKeyUp($event)" (keyup)="onKeyUp($event)"
/> />
</mat-form-field> </mat-form-field>
<button mat-button (click)="changePresence()" translate>Change presence</button> <button mat-button (click)="changePresence()">{{ 'Change presence' | translate }}</button>
<mat-card *ngIf="lastChangedUser" [ngClass]="lastChangedUser.is_present ? 'success' : 'warning'"> <mat-card *ngIf="lastChangedUser" [ngClass]="lastChangedUser.is_present ? 'success' : 'warning'">
<span>{{ lastChangedUser.full_name }}&nbsp;</span> <span translate>is now</span> <span>{{ lastChangedUser.full_name }}&nbsp;</span> <span translate>is now</span>:
<span>&nbsp;{{ lastChangedUser.is_present ? 'present' : ('not present' | translate) }}</span> <span>&nbsp;{{ lastChangedUser.is_present ? ('present' | translate) : ('absent' | translate) }}</span>
</mat-card> </mat-card>
<mat-card *ngIf="errorMsg" class="error"> {{ errorMsg | translate }} </mat-card> <mat-card *ngIf="errorMsg" class="error">{{ errorMsg | translate }}</mat-card>
</mat-card> </mat-card>

View File

@ -87,7 +87,7 @@ export class UserDetailComponent extends BaseViewComponent implements OnInit {
*/ */
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private route: ActivatedRoute, private route: ActivatedRoute,
@ -377,10 +377,9 @@ export class UserDetailComponent extends BaseViewComponent implements OnInit {
* click on the delete user button * click on the delete user button
*/ */
public async deleteUserButton(): Promise<void> { public async deleteUserButton(): Promise<void> {
const content = const title = this.translate.instant('Are you sure you want to delete this participant?');
this.translate.instant('Do you want to delete this participant?') + const content = this.user.full_name;
`<p><strong>${this.user.full_name}</strong>`; if (await this.promptService.open(title, content)) {
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) {
this.repo.delete(this.user).then(() => this.router.navigate(['./users/']), this.raiseError); this.repo.delete(this.user).then(() => this.router.navigate(['./users/']), this.raiseError);
} }
} }

View File

@ -19,6 +19,7 @@ import { OperatorService } from 'app/core/core-services/operator.service';
import { ViewUser } from '../../models/view-user'; import { ViewUser } from '../../models/view-user';
import { ViewGroup } from '../../models/view-group'; import { ViewGroup } from '../../models/view-group';
import { genders, User } from 'app/shared/models/users/user'; import { genders, User } from 'app/shared/models/users/user';
import { _ } from 'app/core/translate/translation-marker';
/** /**
* Interface for the short editing dialog. * Interface for the short editing dialog.
@ -130,7 +131,7 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
translate: TranslateService, protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
private repo: UserRepositoryService, private repo: UserRepositoryService,
private groupRepo: GroupRepositoryService, private groupRepo: GroupRepositoryService,
@ -268,8 +269,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Bulk deletes users. Needs multiSelect mode to fill selectedRows * Bulk deletes users. Needs multiSelect mode to fill selectedRows
*/ */
public async deleteSelected(): Promise<void> { public async deleteSelected(): Promise<void> {
const content = this.translate.instant('This will delete all selected users.'); const title = this.translate.instant('Are you sure you want to delete all selected participants?');
if (await this.promptService.open('Are you sure?', content)) { if (await this.promptService.open(title, null)) {
for (const user of this.selectedRows) { for (const user of this.selectedRows) {
await this.repo.delete(user); await this.repo.delete(user);
} }
@ -281,8 +282,10 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* SelectedRows is only filled with data in multiSelect mode * SelectedRows is only filled with data in multiSelect mode
*/ */
public async setGroupSelected(): Promise<void> { public async setGroupSelected(): Promise<void> {
const content = this.translate.instant('This will add or remove the following groups for all selected users:'); const content = this.translate.instant(
const choices = ['Add group(s)', 'Remove group(s)']; 'This will add or remove the following groups for all selected participants:'
);
const choices = [_('add group(s)'), _('remove group(s)')];
const selectedChoice = await this.choiceService.open(content, this.groupRepo.getViewModelList(), true, choices); const selectedChoice = await this.choiceService.open(content, this.groupRepo.getViewModelList(), true, choices);
if (selectedChoice) { if (selectedChoice) {
for (const user of this.selectedRows) { for (const user of this.selectedRows) {
@ -305,8 +308,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode. * Uses selectedRows defined via multiSelect mode.
*/ */
public async setActiveSelected(): Promise<void> { public async setActiveSelected(): Promise<void> {
const content = this.translate.instant('Set the active status for the selected users'); const content = this.translate.instant('Set active status for selected participants:');
const options = ['Active', 'Not active']; const options = [_('active'), _('inactive')];
const selectedChoice = await this.choiceService.open(content, null, false, options); const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) { if (selectedChoice) {
const active = selectedChoice.action === options[0]; const active = selectedChoice.action === options[0];
@ -321,8 +324,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode. * Uses selectedRows defined via multiSelect mode.
*/ */
public async setPresentSelected(): Promise<void> { public async setPresentSelected(): Promise<void> {
const content = this.translate.instant('Set the presence status for the selected users'); const content = this.translate.instant('Set presence status for selected participants:');
const options = ['Present', 'Not present']; const options = [_('present'), _('absent')];
const selectedChoice = await this.choiceService.open(content, null, false, options); const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) { if (selectedChoice) {
const present = selectedChoice.action === options[0]; const present = selectedChoice.action === options[0];
@ -337,8 +340,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode. * Uses selectedRows defined via multiSelect mode.
*/ */
public async setCommitteeSelected(): Promise<void> { public async setCommitteeSelected(): Promise<void> {
const content = this.translate.instant('Sets/unsets the committee status for the selected users'); const content = this.translate.instant('Set committee status for selected participants:');
const options = ['Is committee', 'Is not committee']; const options = [_('committee'), _('no committee')];
const selectedChoice = await this.choiceService.open(content, null, false, options); const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) { if (selectedChoice) {
const committee = selectedChoice.action === options[0]; const committee = selectedChoice.action === options[0];
@ -353,10 +356,9 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* multiSelect mode. * multiSelect mode.
*/ */
public async sendInvitationEmailSelected(): Promise<void> { public async sendInvitationEmailSelected(): Promise<void> {
const content = const title = this.translate.instant('Are you sure you want to send emails to all selected participants?');
this.translate.instant('Send invitation e-Mails to the selected users?') + const content = this.selectedRows.length + ' ' + this.translate.instant('emails');
` (${this.selectedRows.length} E-Mails)`; if (await this.promptService.open(title, content)) {
if (await this.promptService.open('Are you sure?', content)) {
this.repo.sendInvitationEmail(this.selectedRows).then(this.raiseError, this.raiseError); this.repo.sendInvitationEmail(this.selectedRows).then(this.raiseError, this.raiseError);
} }
} }

View File

@ -26,7 +26,10 @@ export class UserFilterListService extends BaseFilterListService<User, ViewUser>
property: 'is_present', property: 'is_present',
label: 'Presence', label: 'Presence',
isActive: false, isActive: false,
options: [{ condition: true, label: 'Is present' }, { condition: false, label: 'Is not present' }] options: [
{ condition: true, label: this.translate.instant('Is present') },
{ condition: false, label: this.translate.instant('Is not present') }
]
}, },
{ {
property: 'is_active', property: 'is_active',
@ -48,7 +51,7 @@ export class UserFilterListService extends BaseFilterListService<User, ViewUser>
}, },
{ {
property: 'is_last_email_send', property: 'is_last_email_send',
label: 'Last email send', label: this.translate.instant('Last email send'),
isActive: false, isActive: false,
options: [ options: [
{ condition: true, label: this.translate.instant('Got an email') }, { condition: true, label: this.translate.instant('Got an email') },

File diff suppressed because one or more lines are too long

View File

@ -125,9 +125,6 @@ msgstr "Sichtbarkeit in der Tagesordnung"
msgid "All casted ballots" msgid "All casted ballots"
msgstr "Alle abgegebenen Stimmzettel" msgstr "Alle abgegebenen Stimmzettel"
msgid "All selected files will be deleted!"
msgstr "Alle ausgewählten Dateien werden gelöscht!"
msgid "All valid ballots" msgid "All valid ballots"
msgstr "Alle gültigen Stimmzettel" msgstr "Alle gültigen Stimmzettel"
@ -180,12 +177,89 @@ msgstr "Ein unbekannter Fehler ist aufgetreten."
msgid "Arabic" msgid "Arabic"
msgstr "Arabisch" msgstr "Arabisch"
msgid "Are you sure you want to copy the final version to the print template?"
msgstr ""
"Soll die Beschlussfassung weiter bearbeitet und eine Beschluss-Druckvorlage "
"erstellt werden?"
msgid "Are you sure you want to delete all selected elections?"
msgstr "Sollen alle ausgewählten Wahlen wirklich gelöscht werden?"
msgid "Are you sure you want to delete all selected files?"
msgstr "Sollen alle ausgewählten Dateien wirklich gelöscht werden?"
msgid "Are you sure you want to delete all selected items?"
msgstr "Sollen alle ausgewählten Dateien wirklich gelöscht werden?"
msgid "Are you sure you want to delete all selected motions?"
msgstr "Sollen alle ausgewählten Anträge wirklich gelöscht werden?"
msgid "Are you sure you want to delete all selected participants?"
msgstr "Sollen alle ausgewählten Teilnehmende wirklich gelöscht werden?"
msgid ""
"Are you sure you want to delete all speakers from this list of speakers?"
msgstr "Sollen wirklich alle Redner/innen von dieser Liste entfernt werden?"
msgid "Are you sure you want to delete the print template?"
msgstr "Soll die Beschluss-Druckvorlage wirklich gelöscht werden?"
msgid "Are you sure you want to delete the selected message?"
msgstr "Soll die ausgewählte Mitteilung wirklich gelöscht werden?"
msgid "Are you sure you want to delete this category?"
msgstr "Soll dieses Sachgebiet wirklich gelöscht werden?"
msgid "Are you sure you want to delete this change recommendation?"
msgstr "Soll diese Änderungsempfehlung wirklich gelöscht werden?"
msgid "Are you sure you want to delete this comment field?"
msgstr "Soll dieses Kommentarfeld wirklich gelöscht werden?"
msgid "Are you sure you want to delete this countdown?"
msgstr "Soll dieser Countdown wirklich gelöscht werden?"
msgid "Are you sure you want to delete this entry?"
msgstr "Soll dieser Eintrag wirklich gelöscht werden?"
msgid "Are you sure you want to delete this file?"
msgstr "Soll diese Datei wirklich gelöscht werden?"
msgid "Are you sure you want to delete this group?"
msgstr "Soll diese Gruppe wirklich gelöscht werden?"
msgid "Are you sure you want to delete this motion?" msgid "Are you sure you want to delete this motion?"
msgstr "Soll dieser Antrag wirklich gelöscht werden?" msgstr "Soll dieser Antrag wirklich gelöscht werden?"
msgid "Are you sure you want to delete this participant?"
msgstr "Soll diese/r Teilnehmende wirklich gelöscht werden?"
msgid "Are you sure you want to delete this projector?"
msgstr "Soll dieser Projektor wirklich gelöscht werden?"
msgid "Are you sure you want to delete this statute paragraph?"
msgstr "Soll dieser Satzungsabschnitt wirklich gelöscht werden?"
msgid "Are you sure you want to delete this tag?"
msgstr "Soll dieses Schlagwort wirklich gelöscht werden?"
msgid "Are you sure you want to delete this vote?" msgid "Are you sure you want to delete this vote?"
msgstr "Soll diese Abstimmung wirklich gelöscht werden?" msgstr "Soll diese Abstimmung wirklich gelöscht werden?"
msgid "Are you sure you want to delete this workflow?"
msgstr "Soll dieser Arbeitsablauf wirklich gelöscht werden?"
msgid "Are you sure you want to number all agenda items?"
msgstr "Sollen alle Tagesordnungspunkte wirklich neu nummeriert werden?"
msgid "Are you sure you want to renumber all motions of this category?"
msgstr ""
"Sollen alle Anträge dieses Sachgebiets wirklich neu nummeriert werden?"
msgid "Are you sure you want to send emails to all selected participants?"
msgstr ""
"Sollen E-Mails wirklich an alle ausgewählten Teilnehmende gesendet werden?"
msgid "" msgid ""
"At least given name or surname have to be filled in. All other fields are " "At least given name or surname have to be filled in. All other fields are "
"optional and may be empty." "optional and may be empty."
@ -391,6 +465,9 @@ msgstr "Alle löschen"
msgid "Clear list" msgid "Clear list"
msgstr "Liste leeren" msgstr "Liste leeren"
msgid "Clear motion block"
msgstr "Antragsblock löschen"
msgid "Clear tags" msgid "Clear tags"
msgstr "Schlagwörter löschen" msgstr "Schlagwörter löschen"
@ -400,6 +477,9 @@ msgstr "Schließen"
msgid "Close list of speakers" msgid "Close list of speakers"
msgstr "Redeliste schließen" msgstr "Redeliste schließen"
msgid "Closed items"
msgstr "Erledigte Einträge"
msgid "Collapse all" msgid "Collapse all"
msgstr "Alle zusammenklappen" msgstr "Alle zusammenklappen"
@ -455,6 +535,9 @@ msgstr "Beschluss-Druckvorlage erstellen"
msgid "Create new category" msgid "Create new category"
msgstr "Neues Sachgebiet erstellen" msgstr "Neues Sachgebiet erstellen"
msgid "Create new state"
msgstr "Neuen Status erstellen"
msgid "Create new workflow" msgid "Create new workflow"
msgstr "Neuen Arbeitsablauf erstellen" msgstr "Neuen Arbeitsablauf erstellen"
@ -467,9 +550,6 @@ msgstr "Aktuelle Browsersprache"
msgid "Current list of speakers" msgid "Current list of speakers"
msgstr "Aktuelle Redeliste" msgstr "Aktuelle Redeliste"
msgid "Current list of speakers reference"
msgstr "Referenz zur aktuellen Redeliste"
msgid "Custom number of ballot papers" msgid "Custom number of ballot papers"
msgstr "Benutzerdefinierte Anzahl von Stimmzetteln" msgstr "Benutzerdefinierte Anzahl von Stimmzetteln"
@ -584,9 +664,6 @@ msgstr "Nicht befassen"
msgid "Do not decide" msgid "Do not decide"
msgstr "Nicht entscheiden" msgstr "Nicht entscheiden"
msgid "Do you want to delete this file?"
msgstr "Soll diese Datei wirklich gelöscht werden?"
msgid "Does not have notes" msgid "Does not have notes"
msgstr "Hat keine Notizen" msgstr "Hat keine Notizen"
@ -701,6 +778,12 @@ msgstr ""
msgid "Error" msgid "Error"
msgstr "Fehler" msgstr "Fehler"
msgid "Error: The new passwords do not match."
msgstr "Fehler: Die neuen Passwörter stimmen nicht überein."
msgid "Estimated end"
msgstr "Voraussichtliches Ende"
msgid "Event" msgid "Event"
msgstr "Veranstaltung" msgstr "Veranstaltung"
@ -785,6 +868,9 @@ msgstr "Empfehlung folgen"
msgid "Follow recommendations for all motions" msgid "Follow recommendations for all motions"
msgstr "Empfehlungen für alle Anträge folgen" msgstr "Empfehlungen für alle Anträge folgen"
msgid "Following users are currently editing this motion:"
msgstr "Folgende Nutzer bearbeiten aktuell diesen Antrag:"
msgid "Forgot Password?" msgid "Forgot Password?"
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
@ -827,6 +913,9 @@ msgstr "Gruppen mit Leseberechtigungen"
msgid "Groups with write permissions" msgid "Groups with write permissions"
msgstr "Gruppen mit Schreibberechtigungen" msgstr "Gruppen mit Schreibberechtigungen"
msgid "Guest"
msgstr "Gast"
msgid "Has notes" msgid "Has notes"
msgstr "Hat Notizen" msgstr "Hat Notizen"
@ -933,6 +1022,9 @@ msgstr "Ungültige Eingabe."
msgid "Invalid line number" msgid "Invalid line number"
msgstr "Ungültige Zeilennummer" msgstr "Ungültige Zeilennummer"
msgid "Invalid votes"
msgstr "Ungültige Stimmen"
msgid "Is PDF file" msgid "Is PDF file"
msgstr "Ist eine PDF-Datei" msgstr "Ist eine PDF-Datei"
@ -963,6 +1055,9 @@ msgstr "Ist nicht aktiv"
msgid "Is not favorite" msgid "Is not favorite"
msgstr "Ist kein Favorit" msgstr "Ist kein Favorit"
msgid "Is not present"
msgstr "Ist nicht anwesend"
msgid "Is present" msgid "Is present"
msgstr "Ist anwesend" msgstr "Ist anwesend"
@ -978,6 +1073,9 @@ msgstr "Verwenden Sie eine Zeile pro Person."
msgid "Label color" msgid "Label color"
msgstr "Beschriftungsfarbe" msgstr "Beschriftungsfarbe"
msgid "Last email send"
msgstr "Letzte gesendet E-Mail"
msgid "Last modified" msgid "Last modified"
msgstr "Zuletzt geändert" msgstr "Zuletzt geändert"
@ -1023,9 +1121,6 @@ msgstr "Als Gast anmelden"
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
msgid "Manage the list of speakers for..."
msgstr "Redeliste verwalten für..."
msgid "Mark speaker" msgid "Mark speaker"
msgstr "Redner/in markieren" msgstr "Redner/in markieren"
@ -1280,6 +1375,9 @@ msgstr "Nur Haupt-Tagesordnungspunkte"
msgid "Open" msgid "Open"
msgstr "Öffnen" msgstr "Öffnen"
msgid "Open items"
msgstr "Offene Einträge"
msgid "Open list of speakers" msgid "Open list of speakers"
msgstr "Redeliste öffnen" msgstr "Redeliste öffnen"
@ -1328,8 +1426,8 @@ msgstr "Absatzbasiert mit Änderungsdarstellung"
msgid "Parallel upload" msgid "Parallel upload"
msgstr "Parallel hochladen" msgstr "Parallel hochladen"
msgid "Parent item" msgid "Parent agenda item"
msgstr "Elternelement" msgstr "Elternelement in der Tagesordnung"
msgid "Participant cannot be found" msgid "Participant cannot be found"
msgstr "Teilnehmende wurde nicht gefunden" msgstr "Teilnehmende wurde nicht gefunden"
@ -1422,6 +1520,9 @@ msgstr "Vorschau"
msgid "Previous" msgid "Previous"
msgstr "Zurück" msgstr "Zurück"
msgid "Previous slides"
msgstr "Letzte Folien"
msgid "Print ballot papers" msgid "Print ballot papers"
msgstr "Stimmzettel drucken" msgstr "Stimmzettel drucken"
@ -1485,8 +1586,8 @@ msgstr "Empfehlung gesetzt auf {arg1}"
msgid "Refer to committee" msgid "Refer to committee"
msgstr "In Ausschuss verweisen" msgstr "In Ausschuss verweisen"
msgid "Reference projector" msgid "Reference projector for current list of speakers:"
msgstr "Referenzprojektor" msgstr "Referezprojektor für die aktuelle Redeliste:"
msgid "Referral to committee" msgid "Referral to committee"
msgstr "Verweisung in Ausschuss" msgstr "Verweisung in Ausschuss"
@ -1509,6 +1610,9 @@ msgstr "Verwerfung (nicht berechtigt)"
msgid "Remove" msgid "Remove"
msgstr "Entfernen" msgstr "Entfernen"
msgid "Remove all speakers"
msgstr "Alle Redner/innen entfernen"
msgid "" msgid ""
"Remove all supporters of a motion if a submitter edits his motion in early " "Remove all supporters of a motion if a submitter edits his motion in early "
"state" "state"
@ -1568,6 +1672,18 @@ msgstr "QR-Code scannen um sich mit dem WLAN zu verbinden."
msgid "Scan this QR code to open URL." msgid "Scan this QR code to open URL."
msgstr "QR-Code scannen um die URL zu öffnen." msgstr "QR-Code scannen um die URL zu öffnen."
msgid "Scroll down"
msgstr "Nach unten scrollen"
msgid "Scroll down (big step)"
msgstr "Nach unten scrollen (in großen Schritten)"
msgid "Scroll up"
msgstr "Nach oben scrollen"
msgid "Scroll up (big step)"
msgstr "Nach oben scrollen (in großen Schritten)"
msgid "Search" msgid "Search"
msgstr "Suche" msgstr "Suche"
@ -1610,6 +1726,9 @@ msgstr "Laufende Nummer"
msgid "Serially numbered" msgid "Serially numbered"
msgstr "fortlaufend nummerieren" msgstr "fortlaufend nummerieren"
msgid "Set active status for selected participants:"
msgstr "Aktiv-Status für ausgewählte Teilnehmende setzen:"
msgid "Set as parent" msgid "Set as parent"
msgstr "Als Eltern setzen" msgstr "Als Eltern setzen"
@ -1619,6 +1738,9 @@ msgstr "Sachgebiet setzen"
msgid "Set committee ..." msgid "Set committee ..."
msgstr "Gremium setzen ..." msgstr "Gremium setzen ..."
msgid "Set committee status for selected participants:"
msgstr "Gremium-Status für ausgewählte Teilnehmende setzen:"
msgid "Set hidden" msgid "Set hidden"
msgstr "Versteckt setzen" msgstr "Versteckt setzen"
@ -1637,6 +1759,9 @@ msgstr "Antragsblock setzen"
msgid "Set presence ..." msgid "Set presence ..."
msgstr "Anwesenheit setzen ..." msgstr "Anwesenheit setzen ..."
msgid "Set presence status for selected participants:"
msgstr "Anwesenheits-Status für ausgewählte Teilnehmende setzen:"
msgid "Set public" msgid "Set public"
msgstr "Öffentlich setzen" msgstr "Öffentlich setzen"
@ -1727,6 +1852,9 @@ msgstr "Anträge sortieren"
msgid "Sort name of participants by" msgid "Sort name of participants by"
msgstr "Namen der Teilnehmenden sortieren nach" msgstr "Namen der Teilnehmenden sortieren nach"
msgid "Speakers"
msgstr "Redner/innen"
msgid "Special values" msgid "Special values"
msgstr "Spezielle Werte" msgstr "Spezielle Werte"
@ -1901,6 +2029,12 @@ msgstr ""
"Dieses Präfix wird gesetzt, wenn die automatische Nummerierung der " "Dieses Präfix wird gesetzt, wenn die automatische Nummerierung der "
"Tagesordnung durchgeführt wird." "Tagesordnung durchgeführt wird."
msgid ""
"This will add or remove the following groups for all selected participants:"
msgstr ""
"Folgende Gruppen werden für die ausgewählten Teilnehmenden hinzugefügt oder "
"entfernt:"
msgid "" msgid ""
"This will add or remove the following submitters for all selected motions:" "This will add or remove the following submitters for all selected motions:"
msgstr "" msgstr ""
@ -1912,9 +2046,6 @@ msgstr ""
"Folgende Schlagwörter werden für die ausgewählten Anträge hinzugefügt oder " "Folgende Schlagwörter werden für die ausgewählten Anträge hinzugefügt oder "
"entfernt:" "entfernt:"
msgid "This will delete all selected motions."
msgstr "Alle ausgewählten Anträge werden gelöscht."
msgid "This will move all selected motions as childs to:" msgid "This will move all selected motions as childs to:"
msgstr "" msgstr ""
"Alle ausgewählten Anträge werden unterhalb des folgenden " "Alle ausgewählten Anträge werden unterhalb des folgenden "
@ -1980,6 +2111,9 @@ msgstr "Themen wurden importiert."
msgid "Topics(s) will be imported." msgid "Topics(s) will be imported."
msgstr "Themen werden importiert." msgstr "Themen werden importiert."
msgid "Total votes cast"
msgstr "Abgegebene Stimmen"
msgid "Two-thirds majority" msgid "Two-thirds majority"
msgstr "Zweidrittelmehrheit" msgstr "Zweidrittelmehrheit"
@ -2028,6 +2162,9 @@ msgstr "Benutzername"
msgid "Username or password is not correct." msgid "Username or password is not correct."
msgstr "Benutzername oder Passwort war nicht korrekt." msgstr "Benutzername oder Passwort war nicht korrekt."
msgid "Valid votes"
msgstr "Gültige Stimmen"
msgid "Visibility" msgid "Visibility"
msgstr "Sichtbarkeit" msgstr "Sichtbarkeit"
@ -2079,6 +2216,9 @@ msgstr "Web-Interface-Kopfzeilen-Logo"
msgid "Welcome to OpenSlides" msgid "Welcome to OpenSlides"
msgstr "Willkommen bei OpenSlides" msgstr "Willkommen bei OpenSlides"
msgid "Which version?"
msgstr "Welche Fassung?"
msgid "" msgid ""
"Will be displayed as label before selected recommendation for statute " "Will be displayed as label before selected recommendation for statute "
"amendments. Use an empty value to disable the recommendation system." "amendments. Use an empty value to disable the recommendation system."
@ -2153,12 +2293,21 @@ msgstr "[Platz für Ihren Begrüßungs- und Hilfetext.]"
msgid "[Space for your welcome text.]" msgid "[Space for your welcome text.]"
msgstr "[Platz für Ihren Begrüßungstext.]" msgstr "[Platz für Ihren Begrüßungstext.]"
msgid "absent"
msgstr "abwesend"
msgid "accepted" msgid "accepted"
msgstr "angenommen" msgstr "angenommen"
msgid "active"
msgstr "aktiv"
msgid "active users" msgid "active users"
msgstr "aktive Nutzer" msgstr "aktive Nutzer"
msgid "add group(s)"
msgstr "Gruppe(n) hinzufügen"
msgid "adjourned" msgid "adjourned"
msgstr "vertagt" msgstr "vertagt"
@ -2171,6 +2320,9 @@ msgstr "stimmzettel"
msgid "by" msgid "by"
msgstr "von" msgstr "von"
msgid "committee"
msgstr "Gremium"
msgid "connections" msgid "connections"
msgstr "Verbindungen" msgstr "Verbindungen"
@ -2180,6 +2332,12 @@ msgstr "Wortmeldung"
msgid "disabled" msgid "disabled"
msgstr "deaktiviert" msgstr "deaktiviert"
msgid "diverse"
msgstr "divers"
msgid "emails"
msgstr "E-Mails"
msgid "entries will be ommitted." msgid "entries will be ommitted."
msgstr "Einträge werden ausgelassen. " msgstr "Einträge werden ausgelassen. "
@ -2189,6 +2347,15 @@ msgstr "Fehler"
msgid "example" msgid "example"
msgstr "Beispiel" msgstr "Beispiel"
msgid "female"
msgstr "weiblich"
msgid "has saved his work on this motion."
msgstr "hat die Arbeit an diesem Antrag gespeichert."
msgid "inactive"
msgstr "inaktiv"
msgid "inline" msgid "inline"
msgstr "innerhalb" msgstr "innerhalb"
@ -2207,18 +2374,24 @@ msgstr "Einträge pro Seite"
msgid "majority" msgid "majority"
msgstr "Mehrheit" msgstr "Mehrheit"
msgid "male"
msgstr "männlich"
msgid "minutes"
msgstr "Minuten"
msgid "motions" msgid "motions"
msgstr "Anträge" msgstr "Anträge"
msgid "motions-example" msgid "motions-example"
msgstr "Anträge-Beispiel" msgstr "Anträge-Beispiel"
msgid "needed"
msgstr "erforderlich"
msgid "needs review" msgid "needs review"
msgstr "benötigt Überprüfung" msgstr "benötigt Überprüfung"
msgid "no committee"
msgstr "kein Gremium"
msgid "none" msgid "none"
msgstr "aus" msgstr "aus"
@ -2228,9 +2401,6 @@ msgstr "nicht befasst"
msgid "not decided" msgid "not decided"
msgstr "nicht entschieden" msgstr "nicht entschieden"
msgid "not present"
msgstr "abwesend"
msgid "not reached." msgid "not reached."
msgstr "nicht erreicht." msgstr "nicht erreicht."
@ -2246,6 +2416,9 @@ msgstr "Teilnehmende-Beispiel"
msgid "permitted" msgid "permitted"
msgstr "zugelassen" msgstr "zugelassen"
msgid "present"
msgstr "anwesend"
msgid "published" msgid "published"
msgstr "veröffentlicht" msgstr "veröffentlicht"
@ -2261,6 +2434,9 @@ msgstr "abgelehnt"
msgid "rejected (not authorized)" msgid "rejected (not authorized)"
msgstr "verworfen (nicht zulässig)" msgstr "verworfen (nicht zulässig)"
msgid "remove group(s)"
msgstr "Gruppe(n) entfernen"
msgid "result" msgid "result"
msgstr "Ergebnis" msgstr "Ergebnis"
@ -2270,9 +2446,6 @@ msgstr "Ergebnisse"
msgid "selected" msgid "selected"
msgstr "ausgewählt" msgstr "ausgewählt"
msgid "self"
msgstr "sich selbst"
msgid "statute paragraphs have been imported." msgid "statute paragraphs have been imported."
msgstr "Satzungsabschnitte wurden importiert." msgstr "Satzungsabschnitte wurden importiert."

View File

@ -114,9 +114,6 @@ msgstr ""
msgid "All casted ballots" msgid "All casted ballots"
msgstr "" msgstr ""
msgid "All selected files will be deleted!"
msgstr ""
msgid "All valid ballots" msgid "All valid ballots"
msgstr "" msgstr ""
@ -168,12 +165,84 @@ msgstr ""
msgid "Arabic" msgid "Arabic"
msgstr "" msgstr ""
msgid "Are you sure you want to copy the final version to the print template?"
msgstr ""
msgid "Are you sure you want to delete all selected elections?"
msgstr ""
msgid "Are you sure you want to delete all selected files?"
msgstr ""
msgid "Are you sure you want to delete all selected items?"
msgstr ""
msgid "Are you sure you want to delete all selected motions?"
msgstr ""
msgid "Are you sure you want to delete all selected participants?"
msgstr ""
msgid "Are you sure you want to delete all speakers from this list of speakers?"
msgstr ""
msgid "Are you sure you want to delete the print template?"
msgstr ""
msgid "Are you sure you want to delete the selected message?"
msgstr ""
msgid "Are you sure you want to delete this category?"
msgstr ""
msgid "Are you sure you want to delete this change recommendation?"
msgstr ""
msgid "Are you sure you want to delete this comment field?"
msgstr ""
msgid "Are you sure you want to delete this countdown?"
msgstr ""
msgid "Are you sure you want to delete this entry?"
msgstr ""
msgid "Are you sure you want to delete this file?"
msgstr ""
msgid "Are you sure you want to delete this group?"
msgstr ""
msgid "Are you sure you want to delete this motion?" msgid "Are you sure you want to delete this motion?"
msgstr "" msgstr ""
msgid "Are you sure you want to delete this participant?"
msgstr ""
msgid "Are you sure you want to delete this projector?"
msgstr ""
msgid "Are you sure you want to delete this statute paragraph?"
msgstr ""
msgid "Are you sure you want to delete this tag?"
msgstr ""
msgid "Are you sure you want to delete this vote?" msgid "Are you sure you want to delete this vote?"
msgstr "" msgstr ""
msgid "Are you sure you want to delete this workflow?"
msgstr ""
msgid "Are you sure you want to number all agenda items?"
msgstr ""
msgid "Are you sure you want to renumber all motions of this category?"
msgstr ""
msgid "Are you sure you want to send emails to all selected participants?"
msgstr ""
msgid "" msgid ""
"At least given name or surname have to be filled in. All other fields are " "At least given name or surname have to be filled in. All other fields are "
"optional and may be empty." "optional and may be empty."
@ -374,6 +443,9 @@ msgstr ""
msgid "Clear list" msgid "Clear list"
msgstr "" msgstr ""
msgid "Clear motion block"
msgstr ""
msgid "Clear tags" msgid "Clear tags"
msgstr "" msgstr ""
@ -383,6 +455,9 @@ msgstr ""
msgid "Close list of speakers" msgid "Close list of speakers"
msgstr "" msgstr ""
msgid "Closed items"
msgstr ""
msgid "Collapse all" msgid "Collapse all"
msgstr "" msgstr ""
@ -437,6 +512,9 @@ msgstr ""
msgid "Create new category" msgid "Create new category"
msgstr "" msgstr ""
msgid "Create new state"
msgstr ""
msgid "Create new workflow" msgid "Create new workflow"
msgstr "" msgstr ""
@ -449,9 +527,6 @@ msgstr ""
msgid "Current list of speakers" msgid "Current list of speakers"
msgstr "" msgstr ""
msgid "Current list of speakers reference"
msgstr ""
msgid "Custom number of ballot papers" msgid "Custom number of ballot papers"
msgstr "" msgstr ""
@ -549,9 +624,6 @@ msgstr ""
msgid "Do not decide" msgid "Do not decide"
msgstr "" msgstr ""
msgid "Do you want to delete this file?"
msgstr ""
msgid "Does not have notes" msgid "Does not have notes"
msgstr "" msgstr ""
@ -658,6 +730,12 @@ msgstr ""
msgid "Error" msgid "Error"
msgstr "" msgstr ""
msgid "Error: The new passwords do not match."
msgstr ""
msgid "Estimated end"
msgstr ""
msgid "Event" msgid "Event"
msgstr "" msgstr ""
@ -742,6 +820,9 @@ msgstr ""
msgid "Follow recommendations for all motions" msgid "Follow recommendations for all motions"
msgstr "" msgstr ""
msgid "Following users are currently editing this motion:"
msgstr ""
msgid "Forgot Password?" msgid "Forgot Password?"
msgstr "" msgstr ""
@ -784,6 +865,9 @@ msgstr ""
msgid "Groups with write permissions" msgid "Groups with write permissions"
msgstr "" msgstr ""
msgid "Guest"
msgstr ""
msgid "Has notes" msgid "Has notes"
msgstr "" msgstr ""
@ -888,6 +972,9 @@ msgstr ""
msgid "Invalid line number" msgid "Invalid line number"
msgstr "" msgstr ""
msgid "Invalid votes"
msgstr ""
msgid "Is PDF file" msgid "Is PDF file"
msgstr "" msgstr ""
@ -918,6 +1005,9 @@ msgstr ""
msgid "Is not favorite" msgid "Is not favorite"
msgstr "" msgstr ""
msgid "Is not present"
msgstr ""
msgid "Is present" msgid "Is present"
msgstr "" msgstr ""
@ -933,6 +1023,9 @@ msgstr ""
msgid "Label color" msgid "Label color"
msgstr "" msgstr ""
msgid "Last email send"
msgstr ""
msgid "Last modified" msgid "Last modified"
msgstr "" msgstr ""
@ -978,9 +1071,6 @@ msgstr ""
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
msgid "Manage the list of speakers for..."
msgstr ""
msgid "Mark speaker" msgid "Mark speaker"
msgstr "" msgstr ""
@ -1233,6 +1323,9 @@ msgstr ""
msgid "Open" msgid "Open"
msgstr "" msgstr ""
msgid "Open items"
msgstr ""
msgid "Open list of speakers" msgid "Open list of speakers"
msgstr "" msgstr ""
@ -1281,7 +1374,7 @@ msgstr ""
msgid "Parallel upload" msgid "Parallel upload"
msgstr "" msgstr ""
msgid "Parent item" msgid "Parent agenda item"
msgstr "" msgstr ""
msgid "Participant cannot be found" msgid "Participant cannot be found"
@ -1374,6 +1467,9 @@ msgstr ""
msgid "Previous" msgid "Previous"
msgstr "" msgstr ""
msgid "Previous slides"
msgstr ""
msgid "Print ballot papers" msgid "Print ballot papers"
msgstr "" msgstr ""
@ -1437,7 +1533,7 @@ msgstr ""
msgid "Refer to committee" msgid "Refer to committee"
msgstr "" msgstr ""
msgid "Reference projector" msgid "Reference projector for current list of speakers:"
msgstr "" msgstr ""
msgid "Referral to committee" msgid "Referral to committee"
@ -1461,6 +1557,9 @@ msgstr ""
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
msgid "Remove all speakers"
msgstr ""
msgid "" msgid ""
"Remove all supporters of a motion if a submitter edits his motion in early " "Remove all supporters of a motion if a submitter edits his motion in early "
"state" "state"
@ -1516,6 +1615,18 @@ msgstr ""
msgid "Scan this QR code to open URL." msgid "Scan this QR code to open URL."
msgstr "" msgstr ""
msgid "Scroll down"
msgstr ""
msgid "Scroll down (big step)"
msgstr ""
msgid "Scroll up"
msgstr ""
msgid "Scroll up (big step)"
msgstr ""
msgid "Search" msgid "Search"
msgstr "" msgstr ""
@ -1558,6 +1669,9 @@ msgstr ""
msgid "Serially numbered" msgid "Serially numbered"
msgstr "" msgstr ""
msgid "Set active status for selected participants:"
msgstr ""
msgid "Set as parent" msgid "Set as parent"
msgstr "" msgstr ""
@ -1567,6 +1681,9 @@ msgstr ""
msgid "Set committee ..." msgid "Set committee ..."
msgstr "" msgstr ""
msgid "Set committee status for selected participants:"
msgstr ""
msgid "Set hidden" msgid "Set hidden"
msgstr "" msgstr ""
@ -1585,6 +1702,9 @@ msgstr ""
msgid "Set presence ..." msgid "Set presence ..."
msgstr "" msgstr ""
msgid "Set presence status for selected participants:"
msgstr ""
msgid "Set public" msgid "Set public"
msgstr "" msgstr ""
@ -1675,6 +1795,9 @@ msgstr ""
msgid "Sort name of participants by" msgid "Sort name of participants by"
msgstr "" msgstr ""
msgid "Speakers"
msgstr ""
msgid "Special values" msgid "Special values"
msgstr "" msgstr ""
@ -1833,15 +1956,15 @@ 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 or remove the following groups for all selected participants:"
msgstr ""
msgid "This will add or remove the following submitters for all selected motions:" msgid "This will add or remove the following submitters for all selected motions:"
msgstr "" msgstr ""
msgid "This will add or remove the following tags for 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."
msgstr ""
msgid "This will move all selected motions as childs to:" msgid "This will move all selected motions as childs to:"
msgstr "" msgstr ""
@ -1901,6 +2024,9 @@ msgstr ""
msgid "Topics(s) will be imported." msgid "Topics(s) will be imported."
msgstr "" msgstr ""
msgid "Total votes cast"
msgstr ""
msgid "Two-thirds majority" msgid "Two-thirds majority"
msgstr "" msgstr ""
@ -1944,6 +2070,9 @@ msgstr ""
msgid "Username or password is not correct." msgid "Username or password is not correct."
msgstr "" msgstr ""
msgid "Valid votes"
msgstr ""
msgid "Visibility" msgid "Visibility"
msgstr "" msgstr ""
@ -1995,6 +2124,9 @@ msgstr ""
msgid "Welcome to OpenSlides" msgid "Welcome to OpenSlides"
msgstr "" msgstr ""
msgid "Which version?"
msgstr ""
msgid "" msgid ""
"Will be displayed as label before selected recommendation for statute " "Will be displayed as label before selected recommendation for statute "
"amendments. Use an empty value to disable the recommendation system." "amendments. Use an empty value to disable the recommendation system."
@ -2062,12 +2194,21 @@ msgstr ""
msgid "[Space for your welcome text.]" msgid "[Space for your welcome text.]"
msgstr "" msgstr ""
msgid "absent"
msgstr ""
msgid "accepted" msgid "accepted"
msgstr "" msgstr ""
msgid "active"
msgstr ""
msgid "active users" msgid "active users"
msgstr "" msgstr ""
msgid "add group(s)"
msgstr ""
msgid "adjourned" msgid "adjourned"
msgstr "" msgstr ""
@ -2080,6 +2221,9 @@ msgstr ""
msgid "by" msgid "by"
msgstr "" msgstr ""
msgid "committee"
msgstr ""
msgid "connections" msgid "connections"
msgstr "" msgstr ""
@ -2089,6 +2233,12 @@ msgstr ""
msgid "disabled" msgid "disabled"
msgstr "" msgstr ""
msgid "diverse"
msgstr ""
msgid "emails"
msgstr ""
msgid "entries will be ommitted." msgid "entries will be ommitted."
msgstr "" msgstr ""
@ -2098,6 +2248,15 @@ msgstr ""
msgid "example" msgid "example"
msgstr "" msgstr ""
msgid "female"
msgstr ""
msgid "has saved his work on this motion."
msgstr ""
msgid "inactive"
msgstr ""
msgid "inline" msgid "inline"
msgstr "" msgstr ""
@ -2116,16 +2275,22 @@ msgstr ""
msgid "majority" msgid "majority"
msgstr "" msgstr ""
msgid "male"
msgstr ""
msgid "minutes"
msgstr ""
msgid "motions" msgid "motions"
msgstr "" msgstr ""
msgid "motions-example" msgid "motions-example"
msgstr "" msgstr ""
msgid "needed" msgid "needs review"
msgstr "" msgstr ""
msgid "needs review" msgid "no committee"
msgstr "" msgstr ""
msgid "none" msgid "none"
@ -2137,9 +2302,6 @@ msgstr ""
msgid "not decided" msgid "not decided"
msgstr "" msgstr ""
msgid "not present"
msgstr ""
msgid "not reached." msgid "not reached."
msgstr "" msgstr ""
@ -2155,6 +2317,9 @@ msgstr ""
msgid "permitted" msgid "permitted"
msgstr "" msgstr ""
msgid "present"
msgstr ""
msgid "published" msgid "published"
msgstr "" msgstr ""
@ -2170,6 +2335,9 @@ msgstr ""
msgid "rejected (not authorized)" msgid "rejected (not authorized)"
msgstr "" msgstr ""
msgid "remove group(s)"
msgstr ""
msgid "result" msgid "result"
msgstr "" msgstr ""
@ -2179,9 +2347,6 @@ msgstr ""
msgid "selected" msgid "selected"
msgstr "" msgstr ""
msgid "self"
msgstr ""
msgid "statute paragraphs have been imported." msgid "statute paragraphs have been imported."
msgstr "" msgstr ""

View File

@ -52,7 +52,7 @@
* { * {
font-family: OSFont, Fira Sans, Roboto, Arial, Helvetica, sans-serif; font-family: OSFont, Fira Sans, Roboto, Arial, Helvetica, sans-serif;
} }
.mat-toolbar h2 { .mat-toolbar h2, .mat-dialog-title {
font-family: OSFont, Fira Sans, Roboto, Arial, Helvetica, sans-serif !important; font-family: OSFont, Fira Sans, Roboto, Arial, Helvetica, sans-serif !important;
} }