Updated tranlstions

This commit is contained in:
Emanuel Schütze 2019-03-11 09:48:20 +01:00
parent d251bd15e6
commit 5139fe8365
54 changed files with 596 additions and 222 deletions

View File

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

View File

@ -1,9 +1,4 @@
import { _ } from '@biesbjerg/ngx-translate-extract';
// see issue: 4078
// function _(key: string | string[]): string | string[] {
// return key;
// }
import { _ } from 'app/core/translate/translation-marker';
/**
* 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');
_('Include the sequential number in PDF and DOCX');
// misc motion strings
_('needed');
_('Amendment');
_('Amendment to');
_('Statute amendment for');
_('Creation date');
_('Last modified');
_('Which version?');
// motion workflow 1
_('Simple Workflow');
@ -214,7 +204,6 @@ _('Called');
_('Called with');
_('Recommendation');
_('Motion block');
_('Are you sure you want to delete this motion?');
_('The text field may not be blank.');
_('The reason field may not be blank.');
@ -356,6 +345,7 @@ _(
// users misc
_('Username or password is not correct.');
_('Guest');
// default groups
_('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.
*/
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.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,9 +1,11 @@
import { BaseModel } from '../base/base-model';
import { _ } from 'app/core/translate/translation-marker';
/**
* 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.

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 { ViewItem } from '../../models/view-item';
import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable';
import { _ } from 'app/core/translate/translation-marker';
/**
* List view for the agenda.
@ -58,7 +59,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
slideOptions: [
{
key: 'only_main_items',
displayName: this.translate.instant('Only main agenda items'),
displayName: _('Only main agenda items'),
default: false
}
],
@ -87,7 +88,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
*/
public constructor(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private operator: OperatorService,
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
*/
public async onAutoNumbering(): Promise<void> {
const content = this.translate.instant('Are you sure you want to number all agenda items?');
if (await this.promptService.open('', content)) {
const title = this.translate.instant('Are you sure you want to number all agenda items?');
if (await this.promptService.open(title, null)) {
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
*/
public async onDelete(item: ViewItem): Promise<void> {
const content = this.translate.instant('Delete') + ` ${item.getTitle()}?`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete this entry?');
const content = item.contentObject.getTitle();
if (await this.promptService.open(title, content)) {
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
*/
public async deleteSelected(): Promise<void> {
const content = this.translate.instant('This will delete all selected agenda items.');
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete all selected items?');
if (await this.promptService.open(title, null)) {
for (const agenda of this.selectedRows) {
await this.repo.delete(agenda);
}

View File

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

View File

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

View File

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

View File

@ -218,8 +218,9 @@ export class TopicDetailComponent extends BaseViewComponent {
* Handler for the delete button. Uses the PromptService
*/
public async onDeleteButton(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.topic.title}?`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete this entry?');
const content = this.topic.title;
if (await this.promptService.open(title, content)) {
await this.repo.delete(this.topic).then(null, this.raiseError);
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 { StorageService } from 'app/core/core-services/storage.service';
import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service';
import { TranslateService } from '@ngx-translate/core';
@Injectable({
providedIn: 'root'
@ -18,8 +19,9 @@ export class AgendaFilterListService extends BaseFilterListService<Item, ViewIte
* Constructor. Also creates the dynamic filter options
* @param store
* @param repo
* @param translate Translation service
*/
public constructor(store: StorageService, repo: ItemRepositoryService) {
public constructor(store: StorageService, repo: ItemRepositoryService, private translate: TranslateService) {
super(store, repo);
this.filterOptions = [
{
@ -30,7 +32,10 @@ export class AgendaFilterListService extends BaseFilterListService<Item, ViewIte
{
label: 'Status',
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);

View File

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

View File

@ -178,8 +178,9 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
* @param file the file to delete
*/
public async onDelete(file: ViewMediafile): Promise<void> {
const content = this.translate.instant('Do you want to delete this file?') + `<p><strong>${file}</strong>`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete this file?');
const content = file.getTitle();
if (await this.promptService.open(title, content)) {
this.repo.delete(file);
}
}
@ -189,8 +190,8 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
* will be made available in multiSelect mode
*/
public async deleteSelected(): Promise<void> {
const content = this.translate.instant('All selected files will be deleted!');
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete all selected files?');
if (await this.promptService.open(title, null)) {
for (const mediafile of this.selectedRows) {
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 { ConfigService } from 'app/core/ui-services/config.service';
import { ViewMotionChangeRecommendation } from './view-change-recommendation';
import { _ } from 'app/core/translate/translation-marker';
/**
* 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) {
slideOptions.push({
key: 'mode',
displayName: 'Which version?',
displayName: _('Which version?'),
default: configService.instant('motions_recommendation_text_mode'),
choices: [
{ value: 'original', displayName: 'Original version' },

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -708,19 +708,6 @@
</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 -->
<div class="content-field" *ngIf="newMotion">
<mat-form-field>
@ -732,6 +719,19 @@
</mat-form-field>
</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 -->
<div class="content-field" *ngIf="editMotion && minSupporters">
<div *ngIf="perms.isAllowed('change_metadata', motion)">

View File

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

View File

@ -1,4 +1,4 @@
<h2><span translate>Voting result</span></h2>
<h2 translate>Voting result</h2>
<div class="meta-text">
<span translate>Special values</span>:<br />
<mat-chip>-1</mat-chip>&nbsp;=&nbsp;
@ -14,7 +14,7 @@
</mat-form-field>
</div>
<div class="submit-buttons">
<button mat-button (click)="cancel()" translate>Cancel</button>
<button mat-button (click)="submit()" translate>Save</button>
<button mat-button (click)="submit()">{{ 'Save' | translate }}</button>
<button mat-button (click)="cancel()">{{ 'Cancel' | translate }}</button>
</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.
*/
public async deletePoll(): Promise<void> {
const content = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open('Delete vote?', content)) {
const title = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open(title, null)) {
this.motionRepo.deletePoll(this.poll);
}
}

View File

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

View File

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

View File

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

View File

@ -51,7 +51,7 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
*/
public constructor(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private repo: StatuteParagraphRepositoryService,
private formBuilder: FormBuilder,
@ -136,8 +136,9 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
* @param viewStatuteParagraph The statute paragraph to delete
*/
public async onDeleteButton(viewStatuteParagraph: ViewStatuteParagraph): Promise<void> {
const content = this.translate.instant('Delete') + ` ${viewStatuteParagraph.title}?`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete this statute paragraph?');
const content = viewStatuteParagraph.title;
if (await this.promptService.open(title, content)) {
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
*/
public async delete(motions: ViewMotion[]): Promise<void> {
const content = this.translate.instant('This will delete all selected motions.');
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete all selected motions?');
if (await this.promptService.open(title, null)) {
for (const motion of motions) {
await this.repo.delete(motion);
}
@ -239,7 +239,7 @@ export class MotionMultiselectService {
*/
public async setMotionBlock(motions: ViewMotion[]): Promise<void> {
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(
title,
this.motionBlockRepo.getViewModelList(),

View File

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

View File

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

View File

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

View File

@ -14,10 +14,10 @@
</div>
</os-head-bar>
<mat-card *ngIf="!projectorToCreate && projectors">
<mat-card *ngIf="!projectorToCreate && projectors && projectors.length > 1">
<span translate>
Reference projector for current list of speakers:
</span>
</span>&nbsp;
<mat-form-field>
<mat-select [disabled]="!!editId" [value]="projectors[0].reference_projector_id" (selectionChange)="onSelectReferenceProjector($event)">
<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(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private repo: ProjectorRepositoryService,
private formBuilder: FormBuilder,
@ -254,8 +254,9 @@ export class ProjectorListComponent extends BaseViewComponent implements OnInit
* @param projector The projector to delete
*/
public async onDeleteButton(projector: ViewProjector): Promise<void> {
const content = this.translate.instant('Delete') + ` ${projector.name}?`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete this projector?');
const content = projector.name;
if (await this.promptService.open(title, content)) {
this.repo.delete(projector).then(null, this.raiseError);
}
}

View File

@ -41,7 +41,7 @@ export class ProjectorMessageListComponent extends BaseViewComponent implements
*/
public constructor(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private repo: ProjectorMessageRepositoryService,
private formBuilder: FormBuilder,
@ -127,8 +127,8 @@ export class ProjectorMessageListComponent extends BaseViewComponent implements
* @param message The message to delete
*/
public async onDeleteButton(message: ViewProjectorMessage): Promise<void> {
const content = this.translate.instant('Delete this message?');
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete the selected message?');
if (await this.promptService.open(title, null)) {
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(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private repo: TagRepositoryService,
private promptService: PromptService
@ -102,8 +102,9 @@ export class TagListComponent extends ListViewBaseComponent<ViewTag, Tag> implem
* Deletes the selected Tag after a successful confirmation.
*/
public async deleteSelectedTag(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.selectedTag.name}?`;
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) {
const title = this.translate.instant('Are you sure you want to delete this tag?');
const content = this.selectedTag.name;
if (await this.promptService.open(title, content)) {
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(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
public repo: GroupRepositoryService,
private promptService: PromptService
@ -131,8 +131,9 @@ export class GroupListComponent extends BaseViewComponent implements OnInit {
* Deletes the selected Group
*/
public async deleteSelectedGroup(): Promise<void> {
const content = this.translate.instant('Delete') + ` ${this.selectedGroup.name}?`;
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) {
const title = this.translate.instant('Are you sure you want to delete this group?');
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);
}
}

View File

@ -66,7 +66,7 @@ export class PasswordComponent extends BaseViewComponent implements OnInit {
*/
public constructor(
title: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private route: ActivatedRoute,
private router: Router,
@ -150,7 +150,7 @@ export class PasswordComponent extends BaseViewComponent implements OnInit {
const newPassword2 = this.userPasswordForm.value.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 {
await this.repo.setNewPassword(oldPassword, newPassword1);
this.router.navigate(['./']);

View File

@ -14,10 +14,10 @@
(keyup)="onKeyUp($event)"
/>
</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'">
<span>{{ lastChangedUser.full_name }}&nbsp;</span> <span translate>is now</span>
<span>&nbsp;{{ lastChangedUser.is_present ? 'present' : ('not present' | translate) }}</span>
<span>{{ lastChangedUser.full_name }}&nbsp;</span> <span translate>is now</span>:
<span>&nbsp;{{ lastChangedUser.is_present ? ('present' | translate) : ('absent' | translate) }}</span>
</mat-card>
<mat-card *ngIf="errorMsg" class="error">{{ errorMsg | translate }}</mat-card>
</mat-card>

View File

@ -87,7 +87,7 @@ export class UserDetailComponent extends BaseViewComponent implements OnInit {
*/
public constructor(
title: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private formBuilder: FormBuilder,
private route: ActivatedRoute,
@ -377,10 +377,9 @@ export class UserDetailComponent extends BaseViewComponent implements OnInit {
* click on the delete user button
*/
public async deleteUserButton(): Promise<void> {
const content =
this.translate.instant('Do you want to delete this participant?') +
`<p><strong>${this.user.full_name}</strong>`;
if (await this.promptService.open(this.translate.instant('Are you sure?'), content)) {
const title = this.translate.instant('Are you sure you want to delete this participant?');
const content = this.user.full_name;
if (await this.promptService.open(title, content)) {
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 { ViewGroup } from '../../models/view-group';
import { genders, User } from 'app/shared/models/users/user';
import { _ } from 'app/core/translate/translation-marker';
/**
* Interface for the short editing dialog.
@ -130,7 +131,7 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
*/
public constructor(
titleService: Title,
translate: TranslateService,
protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar,
private repo: UserRepositoryService,
private groupRepo: GroupRepositoryService,
@ -268,8 +269,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Bulk deletes users. Needs multiSelect mode to fill selectedRows
*/
public async deleteSelected(): Promise<void> {
const content = this.translate.instant('This will delete all selected users.');
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to delete all selected participants?');
if (await this.promptService.open(title, null)) {
for (const user of this.selectedRows) {
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
*/
public async setGroupSelected(): Promise<void> {
const content = this.translate.instant('This will add or remove the following groups for all selected users:');
const choices = ['Add group(s)', 'Remove group(s)'];
const content = this.translate.instant(
'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);
if (selectedChoice) {
for (const user of this.selectedRows) {
@ -305,8 +308,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode.
*/
public async setActiveSelected(): Promise<void> {
const content = this.translate.instant('Set the active status for the selected users');
const options = ['Active', 'Not active'];
const content = this.translate.instant('Set active status for selected participants:');
const options = [_('active'), _('inactive')];
const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) {
const active = selectedChoice.action === options[0];
@ -321,8 +324,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode.
*/
public async setPresentSelected(): Promise<void> {
const content = this.translate.instant('Set the presence status for the selected users');
const options = ['Present', 'Not present'];
const content = this.translate.instant('Set presence status for selected participants:');
const options = [_('present'), _('absent')];
const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) {
const present = selectedChoice.action === options[0];
@ -337,8 +340,8 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* Uses selectedRows defined via multiSelect mode.
*/
public async setCommitteeSelected(): Promise<void> {
const content = this.translate.instant('Sets/unsets the committee status for the selected users');
const options = ['Is committee', 'Is not committee'];
const content = this.translate.instant('Set committee status for selected participants:');
const options = [_('committee'), _('no committee')];
const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) {
const committee = selectedChoice.action === options[0];
@ -353,10 +356,9 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
* multiSelect mode.
*/
public async sendInvitationEmailSelected(): Promise<void> {
const content =
this.translate.instant('Send invitation e-Mails to the selected users?') +
` (${this.selectedRows.length} E-Mails)`;
if (await this.promptService.open('Are you sure?', content)) {
const title = this.translate.instant('Are you sure you want to send emails to all selected participants?');
const content = this.selectedRows.length + ' ' + this.translate.instant('emails');
if (await this.promptService.open(title, content)) {
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',
label: 'Presence',
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',
@ -48,7 +51,7 @@ export class UserFilterListService extends BaseFilterListService<User, ViewUser>
},
{
property: 'is_last_email_send',
label: 'Last email send',
label: this.translate.instant('Last email send'),
isActive: false,
options: [
{ 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"
msgstr "Alle abgegebenen Stimmzettel"
msgid "All selected files will be deleted!"
msgstr "Alle ausgewählten Dateien werden gelöscht!"
msgid "All valid ballots"
msgstr "Alle gültigen Stimmzettel"
@ -180,12 +177,89 @@ msgstr "Ein unbekannter Fehler ist aufgetreten."
msgid "Arabic"
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?"
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?"
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 ""
"At least given name or surname have to be filled in. All other fields are "
"optional and may be empty."
@ -391,6 +465,9 @@ msgstr "Alle löschen"
msgid "Clear list"
msgstr "Liste leeren"
msgid "Clear motion block"
msgstr "Antragsblock löschen"
msgid "Clear tags"
msgstr "Schlagwörter löschen"
@ -400,6 +477,9 @@ msgstr "Schließen"
msgid "Close list of speakers"
msgstr "Redeliste schließen"
msgid "Closed items"
msgstr "Erledigte Einträge"
msgid "Collapse all"
msgstr "Alle zusammenklappen"
@ -455,6 +535,9 @@ msgstr "Beschluss-Druckvorlage erstellen"
msgid "Create new category"
msgstr "Neues Sachgebiet erstellen"
msgid "Create new state"
msgstr "Neuen Status erstellen"
msgid "Create new workflow"
msgstr "Neuen Arbeitsablauf erstellen"
@ -467,9 +550,6 @@ msgstr "Aktuelle Browsersprache"
msgid "Current list of speakers"
msgstr "Aktuelle Redeliste"
msgid "Current list of speakers reference"
msgstr "Referenz zur aktuellen Redeliste"
msgid "Custom number of ballot papers"
msgstr "Benutzerdefinierte Anzahl von Stimmzetteln"
@ -584,9 +664,6 @@ msgstr "Nicht befassen"
msgid "Do not decide"
msgstr "Nicht entscheiden"
msgid "Do you want to delete this file?"
msgstr "Soll diese Datei wirklich gelöscht werden?"
msgid "Does not have notes"
msgstr "Hat keine Notizen"
@ -701,6 +778,12 @@ msgstr ""
msgid "Error"
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"
msgstr "Veranstaltung"
@ -785,6 +868,9 @@ msgstr "Empfehlung folgen"
msgid "Follow recommendations for all motions"
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?"
msgstr "Passwort vergessen?"
@ -827,6 +913,9 @@ msgstr "Gruppen mit Leseberechtigungen"
msgid "Groups with write permissions"
msgstr "Gruppen mit Schreibberechtigungen"
msgid "Guest"
msgstr "Gast"
msgid "Has notes"
msgstr "Hat Notizen"
@ -933,6 +1022,9 @@ msgstr "Ungültige Eingabe."
msgid "Invalid line number"
msgstr "Ungültige Zeilennummer"
msgid "Invalid votes"
msgstr "Ungültige Stimmen"
msgid "Is PDF file"
msgstr "Ist eine PDF-Datei"
@ -963,6 +1055,9 @@ msgstr "Ist nicht aktiv"
msgid "Is not favorite"
msgstr "Ist kein Favorit"
msgid "Is not present"
msgstr "Ist nicht anwesend"
msgid "Is present"
msgstr "Ist anwesend"
@ -978,6 +1073,9 @@ msgstr "Verwenden Sie eine Zeile pro Person."
msgid "Label color"
msgstr "Beschriftungsfarbe"
msgid "Last email send"
msgstr "Letzte gesendet E-Mail"
msgid "Last modified"
msgstr "Zuletzt geändert"
@ -1023,9 +1121,6 @@ msgstr "Als Gast anmelden"
msgid "Logout"
msgstr "Abmelden"
msgid "Manage the list of speakers for..."
msgstr "Redeliste verwalten für..."
msgid "Mark speaker"
msgstr "Redner/in markieren"
@ -1280,6 +1375,9 @@ msgstr "Nur Haupt-Tagesordnungspunkte"
msgid "Open"
msgstr "Öffnen"
msgid "Open items"
msgstr "Offene Einträge"
msgid "Open list of speakers"
msgstr "Redeliste öffnen"
@ -1328,8 +1426,8 @@ msgstr "Absatzbasiert mit Änderungsdarstellung"
msgid "Parallel upload"
msgstr "Parallel hochladen"
msgid "Parent item"
msgstr "Elternelement"
msgid "Parent agenda item"
msgstr "Elternelement in der Tagesordnung"
msgid "Participant cannot be found"
msgstr "Teilnehmende wurde nicht gefunden"
@ -1422,6 +1520,9 @@ msgstr "Vorschau"
msgid "Previous"
msgstr "Zurück"
msgid "Previous slides"
msgstr "Letzte Folien"
msgid "Print ballot papers"
msgstr "Stimmzettel drucken"
@ -1485,8 +1586,8 @@ msgstr "Empfehlung gesetzt auf {arg1}"
msgid "Refer to committee"
msgstr "In Ausschuss verweisen"
msgid "Reference projector"
msgstr "Referenzprojektor"
msgid "Reference projector for current list of speakers:"
msgstr "Referezprojektor für die aktuelle Redeliste:"
msgid "Referral to committee"
msgstr "Verweisung in Ausschuss"
@ -1509,6 +1610,9 @@ msgstr "Verwerfung (nicht berechtigt)"
msgid "Remove"
msgstr "Entfernen"
msgid "Remove all speakers"
msgstr "Alle Redner/innen entfernen"
msgid ""
"Remove all supporters of a motion if a submitter edits his motion in early "
"state"
@ -1568,6 +1672,18 @@ msgstr "QR-Code scannen um sich mit dem WLAN zu verbinden."
msgid "Scan this QR code to open URL."
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"
msgstr "Suche"
@ -1610,6 +1726,9 @@ msgstr "Laufende Nummer"
msgid "Serially numbered"
msgstr "fortlaufend nummerieren"
msgid "Set active status for selected participants:"
msgstr "Aktiv-Status für ausgewählte Teilnehmende setzen:"
msgid "Set as parent"
msgstr "Als Eltern setzen"
@ -1619,6 +1738,9 @@ msgstr "Sachgebiet setzen"
msgid "Set committee ..."
msgstr "Gremium setzen ..."
msgid "Set committee status for selected participants:"
msgstr "Gremium-Status für ausgewählte Teilnehmende setzen:"
msgid "Set hidden"
msgstr "Versteckt setzen"
@ -1637,6 +1759,9 @@ msgstr "Antragsblock setzen"
msgid "Set presence ..."
msgstr "Anwesenheit setzen ..."
msgid "Set presence status for selected participants:"
msgstr "Anwesenheits-Status für ausgewählte Teilnehmende setzen:"
msgid "Set public"
msgstr "Öffentlich setzen"
@ -1727,6 +1852,9 @@ msgstr "Anträge sortieren"
msgid "Sort name of participants by"
msgstr "Namen der Teilnehmenden sortieren nach"
msgid "Speakers"
msgstr "Redner/innen"
msgid "Special values"
msgstr "Spezielle Werte"
@ -1901,6 +2029,12 @@ msgstr ""
"Dieses Präfix wird gesetzt, wenn die automatische Nummerierung der "
"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 ""
"This will add or remove the following submitters for all selected motions:"
msgstr ""
@ -1912,9 +2046,6 @@ msgstr ""
"Folgende Schlagwörter werden für die ausgewählten Anträge hinzugefügt oder "
"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:"
msgstr ""
"Alle ausgewählten Anträge werden unterhalb des folgenden "
@ -1980,6 +2111,9 @@ msgstr "Themen wurden importiert."
msgid "Topics(s) will be imported."
msgstr "Themen werden importiert."
msgid "Total votes cast"
msgstr "Abgegebene Stimmen"
msgid "Two-thirds majority"
msgstr "Zweidrittelmehrheit"
@ -2028,6 +2162,9 @@ msgstr "Benutzername"
msgid "Username or password is not correct."
msgstr "Benutzername oder Passwort war nicht korrekt."
msgid "Valid votes"
msgstr "Gültige Stimmen"
msgid "Visibility"
msgstr "Sichtbarkeit"
@ -2079,6 +2216,9 @@ msgstr "Web-Interface-Kopfzeilen-Logo"
msgid "Welcome to OpenSlides"
msgstr "Willkommen bei OpenSlides"
msgid "Which version?"
msgstr "Welche Fassung?"
msgid ""
"Will be displayed as label before selected recommendation for statute "
"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.]"
msgstr "[Platz für Ihren Begrüßungstext.]"
msgid "absent"
msgstr "abwesend"
msgid "accepted"
msgstr "angenommen"
msgid "active"
msgstr "aktiv"
msgid "active users"
msgstr "aktive Nutzer"
msgid "add group(s)"
msgstr "Gruppe(n) hinzufügen"
msgid "adjourned"
msgstr "vertagt"
@ -2171,6 +2320,9 @@ msgstr "stimmzettel"
msgid "by"
msgstr "von"
msgid "committee"
msgstr "Gremium"
msgid "connections"
msgstr "Verbindungen"
@ -2180,6 +2332,12 @@ msgstr "Wortmeldung"
msgid "disabled"
msgstr "deaktiviert"
msgid "diverse"
msgstr "divers"
msgid "emails"
msgstr "E-Mails"
msgid "entries will be ommitted."
msgstr "Einträge werden ausgelassen. "
@ -2189,6 +2347,15 @@ msgstr "Fehler"
msgid "example"
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"
msgstr "innerhalb"
@ -2207,18 +2374,24 @@ msgstr "Einträge pro Seite"
msgid "majority"
msgstr "Mehrheit"
msgid "male"
msgstr "männlich"
msgid "minutes"
msgstr "Minuten"
msgid "motions"
msgstr "Anträge"
msgid "motions-example"
msgstr "Anträge-Beispiel"
msgid "needed"
msgstr "erforderlich"
msgid "needs review"
msgstr "benötigt Überprüfung"
msgid "no committee"
msgstr "kein Gremium"
msgid "none"
msgstr "aus"
@ -2228,9 +2401,6 @@ msgstr "nicht befasst"
msgid "not decided"
msgstr "nicht entschieden"
msgid "not present"
msgstr "abwesend"
msgid "not reached."
msgstr "nicht erreicht."
@ -2246,6 +2416,9 @@ msgstr "Teilnehmende-Beispiel"
msgid "permitted"
msgstr "zugelassen"
msgid "present"
msgstr "anwesend"
msgid "published"
msgstr "veröffentlicht"
@ -2261,6 +2434,9 @@ msgstr "abgelehnt"
msgid "rejected (not authorized)"
msgstr "verworfen (nicht zulässig)"
msgid "remove group(s)"
msgstr "Gruppe(n) entfernen"
msgid "result"
msgstr "Ergebnis"
@ -2270,9 +2446,6 @@ msgstr "Ergebnisse"
msgid "selected"
msgstr "ausgewählt"
msgid "self"
msgstr "sich selbst"
msgid "statute paragraphs have been imported."
msgstr "Satzungsabschnitte wurden importiert."

View File

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

View File

@ -52,7 +52,7 @@
* {
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;
}