Merge pull request #3989 from emanuelschuetze/i18n

Updated German translations and translatable strings
This commit is contained in:
Sean 2018-11-08 20:47:59 +01:00 committed by GitHub
commit acce79a1c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 2967 additions and 284 deletions

View File

@ -9,7 +9,8 @@
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e", "e2e": "ng e2e",
"compodoc": "./node_modules/.bin/compodoc --hideGenerator -p src/tsconfig.app.json -n 'OpenSlides Documentation' -d ../Compodoc -s -w -t -o --port", "compodoc": "./node_modules/.bin/compodoc --hideGenerator -p src/tsconfig.app.json -n 'OpenSlides Documentation' -d ../Compodoc -s -w -t -o --port",
"extract": "ngx-translate-extract -i ./src -o ./src/assets/i18n/{en,de,fr}.json --clean --sort --format-indentation ' ' --format namespaced-json", "extract": "ngx-translate-extract -i ./src -o ./src/assets/i18n/template-en.pot -clean --sort --format pot -m _",
"po2json": "./node_modules/.bin/po2json -f mf src/assets/i18n/de.po src/assets/i18n/de.json && ./node_modules/.bin/po2json -f mf src/assets/i18n/cs.po src/assets/i18n/cs.json",
"prettify": "pretty-quick" "prettify": "pretty-quick"
}, },
"private": true, "private": true,
@ -32,6 +33,7 @@
"file-saver": "^2.0.0-rc.3", "file-saver": "^2.0.0-rc.3",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"ngx-mat-select-search": "^1.4.0", "ngx-mat-select-search": "^1.4.0",
"po2json": "^1.0.0-alpha",
"roboto-fontface": "^0.10.0", "roboto-fontface": "^0.10.0",
"rxjs": "^6.3.3", "rxjs": "^6.3.3",
"uuid": "^3.3.2", "uuid": "^3.3.2",
@ -47,6 +49,7 @@
"@types/jasmine": "^2.8.9", "@types/jasmine": "^2.8.9",
"@types/jasminewd2": "^2.0.5", "@types/jasminewd2": "^2.0.5",
"@types/node": "~8.9.4", "@types/node": "~8.9.4",
"@types/yargs": "^12.0.1",
"codelyzer": "~4.2.1", "codelyzer": "~4.2.1",
"husky": "^0.14.3", "husky": "^0.14.3",
"jasmine-core": "~2.99.1", "jasmine-core": "~2.99.1",

View File

@ -33,7 +33,7 @@ export class AppComponent {
constantsService: ConstantsService // Needs to be started, so it can register itself to the WebsocketService constantsService: ConstantsService // Needs to be started, so it can register itself to the WebsocketService
) { ) {
// manually add the supported languages // manually add the supported languages
translate.addLangs(['en', 'de', 'fr']); translate.addLangs(['en', 'de', 'cs']);
// this language will be used as a fallback when a translation isn't found in the current language // this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en'); translate.setDefaultLang('en');
// get the browsers default language // get the browsers default language

View File

@ -0,0 +1,305 @@
import { _ } from '@biesbjerg/ngx-translate-extract';
/**
* Add strings here that require translations but have never been declared
* in code nor views.
*
* I.e: words transmitted by the server
*
* @example
* ```ts
* _('my new sentence to translate that has not been anywhere');
* ```
*/
// Core config strings
_('Presentation and assembly system');
_('Event name');
_('<a href="http://www.openslides.org">OpenSlides</a> is a free ' +
'web based presentation and assembly system for visualizing ' +
'and controlling agenda, motions and elections of an ' +
'assembly.');
_('General');
_('Event');
_('Short description of event');
_('Event date');
_('Event location');
_('Event organizer');
_('Front page title');
_('Welcome to OpenSlides');
_('Front page text');
_('[Space for your welcome text.]');
_('System');
_('Allow access for anonymous guest users');
_('Show this text on the login page');
_('Export');
_('Separator used for all csv exports and examples');
_('Page number alignment in PDF');
_('Left');
_('Center');
_('Right');
_('Standard font size in PDF');
// Projector config strings
_('Projector');
_('Projector language');
_('Current browser language');
_('Show logo on projector');
_('You can replace the logo by uploading an image and set it as the "Projector logo" in "files".');
_('Show the clock on projector');
_('Show title and description of event on projector');
_('Display header and footer');
_('Background color of projector header and footer');
_('Font color of projector header and footer');
_('Font color of projector headline');
_('Predefined seconds of new countdowns');
_('Color for blanked projector');
_('Default projector');
_('Custom translations');
_('List of speakers overlay');
_('Projector logo');
_('Projector header image');
_('PDF header logo (left)');
_('PDF header logo (right)');
_('PDF footer logo (left)');
_('PDF footer logo (right)');
_('Web interface header logo');
_('PDF ballot paper logo');
// Agenda config strings
_('Enable numbering for agenda items');
_('Numbering prefix for agenda items');
_('This prefix will be set if you run the automatic agenda numbering.');
_('Agenda');
_('Invalid input.');
_('Numeral system for agenda items');
_('Arabic');
_('Roman');
_('Begin of event');
_('Input format: DD.MM.YYYY HH:MM');
_('Hide internal items when projecting subitems');
_('Number of last speakers to be shown on the projector');
_('List of speakers');
_('Show orange countdown in the last x seconds of speaking time');
_('Enter duration in seconds. Choose 0 to disable warning color.');
_('Couple countdown with the list of speakers');
_('[Begin speech] starts the countdown, [End speech] stops the countdown.');
_('Agenda visibility');
_('Default visibility for new agenda items (except topics)');
_('Public item');
_('Internal item');
_('Hidden item');
// Motions config strings
// subgroup general
_('General');
_('Workflow of new motions');
_('Numbered per category');
_('Serially numbered');
_('Set it manually');
_('Motion preamble');
_('The assembly may decide:');
_('Default line numbering');
_('disabled');
_('Line length');
_('The maximum number of characters per line. Relevant when line numbering is enabled. Min: 40');
_('Hide reason on projector');
_('Hide meta information box on projector');
_('Hide recommendation on projector');
_('Stop submitting new motions by non-staff users');
_('Allow to disable versioning');
_('Name of recommender');
_('Will be displayed as label before selected recommendation. Use an empty value to disable the recommendation system.');
_('Default text version for change recommendations');
// subgroup Amendments
_('Amendments');
_('Activate amendments');
_('Show amendments together with motions');
_('Prefix for the identifier for amendments');
_('The title of the motion is always applied.');
_('How to create new amendments');
_('Empty text field');
_('Edit the whole motion text');
_('Paragraph-based, Diff-enabled');
// subgroup Supporters
_('Supporters');
_('Number of (minimum) required supporters for a motion');
_('Choose 0 to disable the supporting system.');
_('Remove all supporters of a motion if a submitter edits his motion in early state');
// subgroup Voting and ballot papers
_('Voting and ballot papers');
_('The 100 % base of a voting result consists of');
_('Yes/No/Abstain');
_('Yes/No');
_('All valid ballots');
_('All casted ballots');
_('Disabled (no percents)');
_('Required majority');
_('Default method to check whether a motion has reached the required majority.');
_('Simple majority');
_('Two-thirds majority');
_('Three-quarters majority');
_('Disabled');
_('Number of ballot papers (selection)');
_('Number of all delegates');
_('Number of all participants');
_('Use the following custom number');
_('Custom number of ballot papers');
// subgroup export
_('Title for PDF and DOCX documents (all motions)');
_('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');
// motion workflow 1
_('Simple Workflow');
_('submitted');
_('accepted');
_('Accept');
_('Acceptance');
_('rejected');
_('Reject');
_('Rejection');
_('not decided');
_('Do not decide');
_('No decision');
// motion workflow 2
_('Complex Workflow');
_('published');
_('permitted');
_('Permit');
_('Permission');
_('accepted');
_('Accept');
_('Acceptance');
_('rejected');
_('Reject');
_('Rejection');
_('withdrawed');
_('Withdraw');
_('adjourned');
_('Adjourn');
_('Adjournment');
_('not concerned');
_('Do not concern');
_('No concernment');
_('refered to committee');
_('Refer to committee');
_('Referral to committee');
_('needs review');
_('Needs review');
_('rejected (not authorized)');
_('Reject (not authorized)');
_('Rejection (not authorized)');
// Assignment config strings
_('Election method');
_('Automatic assign of method');
_('Always one option per candidate');
_('Always Yes-No-Abstain per candidate');
_('Always Yes/No per candidate');
_('Elections');
_('Ballot and ballot papers');
_('The 100-%-base of an election result consists of');
_('For Yes/No/Abstain per candidate and Yes/No per candidate the 100-%-base ' +
'depends on the election method: If there is only one option per candidate, ' +
'the sum of all votes of all candidates is 100 %. Otherwise for each ' +
'candidate the sum of all votes is 100 %.');
_('Yes/No/Abstain per candidate');
_('Yes/No per candidate');
_('All valid ballots');
_('All casted ballots');
_('Disabled (no percents)');
_('Number of ballot papers (selection)');
_('Number of all delegates');
_('Number of all participants');
_('Use the following custom number');
_('Custom number of ballot papers');
_('Required majority');
_('Default method to check whether a candidate has reached the required majority.');
_('Simple majority');
_('Two-thirds majority');
_('Three-quarters majority');
_('Disabled');
_('Put all candidates on the list of speakers');
_('Title for PDF document (all elections)');
_('Preamble text for PDF document (all elections)');
//other translations
_('Searching for candidates');
_('Voting');
_('Finished');
// Users
// permission strings (see models.py of each Django app)
// agenda
_('Can see agenda');
_('Can manage agenda');
_('Can manage list of speakers');
_('Can see internal items and time scheduling of agenda');
_('Can put oneself on the list of speakers');
// assignments
_('Can see elections');
_('Can nominate another participant');
_('Can nominate oneself');
_('Can manage elections');
// core
_('Can see the projector');
_('Can manage the projector');
_('Can see the front page');
_('Can manage tags');
_('Can manage configuration');
_('Can use the chat');
_('Can manage the chat');
_('Can manage logos and fonts');
// mediafiles
_('Can see the list of files');
_('Can upload files');
_('Can manage files');
_('Can see hidden files');
// motions
_('Can see motions');
_('Can create motions');
_('Can support motions');
_('Can manage motions');
_('Can see comments');
_('Can manage comments');
// users
_('Can see names of users');
_('Can see extra data of users (e.g. present and comment)');
_('Can manage users');
// users config strings
_('General');
_('Sort name of participants by');
_('Enable participant presence view');
_('Participants');
_('Given name');
_('Surname');
_('PDF');
_('Welcome to OpenSlides');
_('Title for access data and welcome PDF');
_('[Place for your welcome and help text.]');
_('Help text for access data and welcome PDF');
_('System URL');
_('Used for QRCode in PDF of access data.');
_('WLAN name (SSID)');
_('Used for WLAN QRCode in PDF of access data.');
_('WLAN password');
_('Used for WLAN QRCode in PDF of access data.');
_('WLAN encryption');
_('Used for WLAN QRCode in PDF of access data.');
_('WEP');
_('WPA/WPA2');
_('No encryption');
_('Email');
_('Email sender');
_('Email subject');
_('Your login for {event_name}');
_('You can use {event_name} as a placeholder.');
_('Email body');
_('Dear {name},\n\nthis is your OpenSlides login for the event {event_name}:\n\n {url}\n username: {username}\n password: {password}\n\nThis email was generated automatically.');
_('Use these placeholders: {name}, {event_name}, {url}, {username}, {password}. The url referrs to the system url.');

View File

@ -1,12 +1,12 @@
<mat-toolbar color='primary' class="footer"> <mat-toolbar color='primary' class="footer">
<mat-toolbar-row> <mat-toolbar-row>
<button mat-button class="footer-link" [routerLink]=legalNoticeUrl> <button mat-button class="footer-link" [routerLink]=legalNoticeUrl>
<span translate>Legal Notice</span> <span translate>Legal notice</span>
</button> </button>
<button mat-button class="footer-link" [routerLink]=privacyPolicyUrl> <button mat-button class="footer-link" [routerLink]=privacyPolicyUrl>
<span translate>Privacy Policy</span> <span translate>Privacy policy</span>
</button> </button>
<span class="footer-right">© <span translate>Copyright by</span>&#160;<a href='https://openslides.org/'>OpenSlides</a> <span class="footer-right">© <span>Copyright by</span>&#160;<a href='https://openslides.org/'>OpenSlides</a>
</span> </span>
</mat-toolbar-row> </mat-toolbar-row>
</mat-toolbar> </mat-toolbar>

View File

@ -55,7 +55,7 @@ interface VersionResponse {
} }
/** /**
* Shared component to hold the content of the Legal Notice. * Shared component to hold the content of the Legal notice.
* Used in login and site container. * Used in login and site container.
*/ */
@Component({ @Component({

View File

@ -12,7 +12,7 @@
</mat-form-field> </mat-form-field>
<div *ngIf="dispSelected"> <div *ngIf="dispSelected">
<p> <p>
<span translate>Selected Values</span>: <span translate>Selected values</span>:
</p> </p>
<mat-chip-list #chipList> <mat-chip-list #chipList>
<mat-chip *ngFor="let selectedItem of thisSelector?.value" (removed)="remove(selectedItem)">{{selectedItem.name}} <mat-chip *ngFor="let selectedItem of thisSelector?.value" (removed)="remove(selectedItem)">{{selectedItem.name}}

View File

@ -1,7 +1,7 @@
<os-head-bar plusButton=true (plusButtonClicked)=onPlusButton()> <os-head-bar plusButton=true (plusButtonClicked)=onPlusButton()>
<!-- Title --> <!-- Title -->
<div class="title-slot"> <div class="title-slot">
<h2 translate>Assignments</h2> <h2 translate>Elections</h2>
</div> </div>
<!-- Menu --> <!-- Menu -->

View File

@ -1,6 +1,6 @@
<os-head-bar [nav]=false [goBack]=true> <os-head-bar [nav]=false [goBack]=true>
<div class="title-slot"> <div class="title-slot">
<h2 translate>Legal Notice</h2> <h2 translate>Legal notice</h2>
</div> </div>
</os-head-bar> </os-head-bar>

View File

@ -18,8 +18,8 @@
</ng-container> </ng-container>
<!-- required for all kinds of input --> <!-- required for all kinds of input -->
<mat-label translate>{{ configItem.label }}</mat-label> <mat-label>{{ configItem.label | translate }}</mat-label>
<mat-hint *ngIf="configItem.helpText" translate>{{ configItem.helpText }}</mat-hint> <mat-hint *ngIf="configItem.helpText">{{ configItem.helpText | translate }}</mat-hint>
<span matSuffix> <span matSuffix>
<mat-icon pull="right" class="text-success" *ngIf="updateSuccessIcon">check_circle</mat-icon> <mat-icon pull="right" class="text-success" *ngIf="updateSuccessIcon">check_circle</mat-icon>
</span> </span>

View File

@ -1,7 +1,7 @@
<main> <main>
<mat-card class="os-card"> <mat-card class="os-card">
<h2 translate>Legal Notice</h2> <h2 translate>Legal notice</h2>
</mat-card> </mat-card>
<os-legal-notice-content></os-legal-notice-content> <os-legal-notice-content></os-legal-notice-content>

View File

@ -43,8 +43,8 @@
<mat-paginator class="on-transition-fade" [pageSizeOptions]="[25, 50, 75, 100, 125]"></mat-paginator> <mat-paginator class="on-transition-fade" [pageSizeOptions]="[25, 50, 75, 100, 125]"></mat-paginator>
<mat-menu #mediafilesMenu="matMenu"> <mat-menu #mediafilesMenu="matMenu">
<button mat-menu-item (click)="deleteAllFiles()"> <button mat-menu-item class='red-warning-text' (click)="deleteAllFiles()">
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
<span translate>Delete All</span> <span translate>Delete all files</span>
</button> </button>
</mat-menu> </mat-menu>

View File

@ -33,8 +33,12 @@
<!-- Save and Cancel buttons --> <!-- Save and Cancel buttons -->
<mat-card-actions> <mat-card-actions>
<button mat-button (click)="onCreateButton()" translate>Create</button> <button mat-button (click)="onCreateButton()">
<button mat-button (click)="categoryToCreate = null" translate>Abort</button> <span translate>Save</span>
</button>
<button mat-button (click)="categoryToCreate = null">
<span translate>Cancel</span>
</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
@ -71,7 +75,8 @@
<!-- Edit form shows during the edit event --> <!-- Edit form shows during the edit event -->
<form id="updateForm" [formGroup]='updateForm' *ngIf="editId === category.id" (keydown)="keyDownFunction($event, category)"> <form id="updateForm" [formGroup]='updateForm' *ngIf="editId === category.id" (keydown)="keyDownFunction($event, category)">
<span translate>Edit category details</span>:<br> <span translate>Edit category:</span>:<br>
<mat-form-field> <mat-form-field>
<input formControlName="prefix" matInput placeholder="{{'Prefix' | translate}}" required> <input formControlName="prefix" matInput placeholder="{{'Prefix' | translate}}" required>
<mat-hint *ngIf="!updateForm.controls.prefix.valid"> <mat-hint *ngIf="!updateForm.controls.prefix.valid">

View File

@ -1,9 +1,3 @@
mat-panel-title {
mat-icon {
margin-right: 35px;
}
}
.meta-text-block { .meta-text-block {
padding: 0px; padding: 0px;
margin: 20px; margin: 20px;

View File

@ -15,7 +15,11 @@
</form> </form>
</mat-dialog-content> </mat-dialog-content>
<mat-dialog-actions> <mat-dialog-actions>
<button mat-button mat-dialog-close translate>Abort</button> <button mat-button mat-dialog-close>
<span translate>Cancel</span>
</button>
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. --> <!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
<button mat-button (click)="saveChangeRecommendation()" translate>Save</button> <button mat-button (click)="saveChangeRecommendation()">
<span translate>Save</span>
</button>
</mat-dialog-actions> </mat-dialog-actions>

View File

@ -29,8 +29,12 @@
</form> </form>
</mat-card-content> </mat-card-content>
<mat-card-actions> <mat-card-actions>
<button mat-button (click)="create()" translate>Create</button> <button mat-button (click)="create()">
<button mat-button (click)="commentSectionToCreate = null" translate>Abort</button> <span translate>Save</span>
</button>
<button mat-button (click)="commentSectionToCreate = null">
<span translate>Cancel</span>
</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
<mat-accordion class="os-card"> <mat-accordion class="os-card">
@ -60,7 +64,7 @@
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<form [formGroup]="updateForm" *ngIf="editId === section.id" (keydown)="keyDownFunction($event, section)"> <form [formGroup]="updateForm" *ngIf="editId === section.id" (keydown)="keyDownFunction($event, section)">
<span translate>Edit section details:</span> <span translate>Edit comment field:</span>
<p> <p>
<mat-form-field> <mat-form-field>
<input formControlName="name" matInput placeholder="{{'Name' | translate}}" required> <input formControlName="name" matInput placeholder="{{'Name' | translate}}" required>
@ -95,7 +99,7 @@
<mat-action-row> <mat-action-row>
<button *ngIf="editId !== section.id" mat-button class="on-transition-fade" (click)="onEditButton(section)" <button *ngIf="editId !== section.id" mat-button class="on-transition-fade" (click)="onEditButton(section)"
mat-icon-button> mat-icon-button>
<mat-icon>add</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button *ngIf="editId === section.id" mat-button class="on-transition-fade" (click)="editId = null" <button *ngIf="editId === section.id" mat-button class="on-transition-fade" (click)="editId = null"
mat-icon-button> mat-icon-button>

View File

@ -81,7 +81,7 @@
--> -->
</div> </div>
<div class="status-row" *ngIf="change.isRejected()"> <div class="status-row" *ngIf="change.isRejected()">
<i class="grey" translate>{{ 'Rejected' | translate }}:</i> <i class="grey">{{ 'Rejected' | translate }}:</i>
</div> </div>
<div class="motion-text motion-text-diff line-numbers-outside" <div class="motion-text motion-text-diff line-numbers-outside"

View File

@ -147,7 +147,7 @@
{{ motion.identifier }} {{ motion.identifier }}
</div> </div>
<mat-form-field *ngIf="editMotion"> <mat-form-field *ngIf="editMotion">
<input matInput placeholder='Identifier' formControlName='identifier' [value]='motionCopy.identifier'> <input matInput placeholder='{{ "Identifier" | translate }}' formControlName='identifier' [value]='motionCopy.identifier'>
</mat-form-field> </mat-form-field>
</div> </div>
@ -161,9 +161,9 @@
</div> </div>
<div *ngIf="!editMotion || !newMotion"> <div *ngIf="!editMotion || !newMotion">
<h3 translate>Submitters</h3> <h3 translate>Submitters</h3>
<ul *ngFor="let submitter of motion.submitters"> <mat-chip-list *ngFor="let submitter of motion.submitters">
<li>{{submitter.full_name}}</li> <mat-chip>{{ submitter.full_name }}</mat-chip>
</ul> </mat-chip-list>
</div> </div>
</div> </div>
@ -173,7 +173,7 @@
<div *ngIf="editMotion"> <div *ngIf="editMotion">
<div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']"> <div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']">
<os-search-value-selector ngDefaultControl [form]="metaInfoForm" [formControl]="this.metaInfoForm.get('supporters_id')" <os-search-value-selector ngDefaultControl [form]="metaInfoForm" [formControl]="this.metaInfoForm.get('supporters_id')"
[multiple]="true" listname="Supporter" [InputListValues]="this.supporterObserver"></os-search-value-selector> [multiple]="true" listname="{{ 'Supporters' | translate }}" [InputListValues]="this.supporterObserver"></os-search-value-selector>
</div> </div>
</div> </div>
<div *ngIf="!editMotion && motion.hasSupporters()"> <div *ngIf="!editMotion && motion.hasSupporters()">
@ -194,7 +194,7 @@
</div> </div>
<div *ngIf="!editMotion"> <div *ngIf="!editMotion">
<mat-form-field *osPerms="['motions.can_manage', 'motions.can_manage_metadata']"> <mat-form-field *osPerms="['motions.can_manage', 'motions.can_manage_metadata']">
<mat-select placeholder='State' formControlName='state_id' (selectionChange)="onChangeState($event)"> <mat-select placeholder="{{ 'State' | translate }}" formControlName='state_id' (selectionChange)="onChangeState($event)">
<mat-option [value]="motion.state_id">{{ motion.state }}</mat-option> <mat-option [value]="motion.state_id">{{ motion.state }}</mat-option>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<mat-option *ngFor="let state of motion.nextStates" [value]="state.id">{{ state }}</mat-option> <mat-option *ngFor="let state of motion.nextStates" [value]="state.id">{{ state }}</mat-option>
@ -209,11 +209,16 @@
</div> </div>
<!-- Recommendation --> <!-- Recommendation -->
<!-- The suggestion of the work group weather or not a motion should be accepted -->
<div *ngIf='motion && motion.state && recommender'> <div *ngIf='motion && motion.state && recommender'>
<mat-form-field *ngIf="!editMotion && !newMotion"> <mat-form-field *ngIf="!editMotion && !newMotion">
<mat-select [placeholder]=recommender formControlName='recommendation_id' (selectionChange)="onChangerRecommenderState($event)"> <mat-select [placeholder]=recommender formControlName='recommendation_id' (selectionChange)="onChangerRecommenderState($event)">
<mat-option *ngFor="let recommendation of motion.possibleRecommendations" [value]="recommendation.id">{{ recommendation }}</mat-option> <mat-option *ngFor="let recommendation of motion.possibleRecommendations" [value]="recommendation.id">
{{ recommendation.recommendation_label | translate }}
</mat-option>
<mat-divider></mat-divider>
<mat-option [value]="null">
<mat-icon>replay</mat-icon><span translate>Reset recommendation</span>
</mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
</div> </div>
@ -226,7 +231,7 @@
</div> </div>
<div *ngIf="editMotion || newMotion"> <div *ngIf="editMotion || newMotion">
<os-search-value-selector ngDefaultControl [form]="metaInfoForm" [formControl]="this.metaInfoForm.get('category_id')" <os-search-value-selector ngDefaultControl [form]="metaInfoForm" [formControl]="this.metaInfoForm.get('category_id')"
[multiple]="false" listname="Category" [InputListValues]="this.categoryObserver"></os-search-value-selector> [multiple]="false" listname="{{ 'Category' | translate }}" [InputListValues]="this.categoryObserver"></os-search-value-selector>
</div> </div>
</div> </div>
@ -238,7 +243,7 @@
</div> </div>
<div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']"> <div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']">
<mat-form-field *ngIf="editMotion"> <mat-form-field *ngIf="editMotion">
<input matInput placeholder='Origin' formControlName='origin' [value]='motionCopy.origin'> <input matInput placeholder="{{ 'Origin' | translate}}" formControlName='origin' [value]='motionCopy.origin'>
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>
@ -255,10 +260,10 @@
<!-- Line Number and Diff buttons--> <!-- Line Number and Diff buttons-->
<div class="motion-text-controls"> <div class="motion-text-controls">
<button type="button" mat-icon-button [matMenuTriggerFor]="lineNumberingMenu"> <button type="button" mat-icon-button [matMenuTriggerFor]="lineNumberingMenu" matTooltip="{{ 'Line numbering' | translate }}">
<mat-icon>format_list_numbered</mat-icon> <mat-icon>format_list_numbered</mat-icon>
</button> </button>
<button type="button" mat-icon-button [matMenuTriggerFor]="changeRecoMenu"> <button type="button" mat-icon-button [matMenuTriggerFor]="changeRecoMenu" matTooltip="{{ 'Change recommendations' | translate }}">
<mat-icon>rate_review</mat-icon> <mat-icon>rate_review</mat-icon>
</button> </button>
</div> </div>
@ -269,7 +274,7 @@
<h4>{{motion.title}}</h4> <h4>{{motion.title}}</h4>
</div> </div>
<mat-form-field *ngIf="editMotion" class="wide-form"> <mat-form-field *ngIf="editMotion" class="wide-form">
<input matInput osAutofocus placeholder='Title' formControlName='title' [value]='motionCopy.title' <input matInput osAutofocus placeholder="{{ 'Title' | translate }}" formControlName='title' [value]='motionCopy.title'
required> required>
</mat-form-field> </mat-form-field>
@ -290,18 +295,18 @@
[scrollToChange]="scrollToChange" (createChangeRecommendation)="createChangeRecommendation($event)"></os-motion-detail-diff> [scrollToChange]="scrollToChange" (createChangeRecommendation)="createChangeRecommendation($event)"></os-motion-detail-diff>
</ng-container> </ng-container>
<mat-form-field *ngIf="motion && editMotion" class="wide-form"> <mat-form-field *ngIf="motion && editMotion" class="wide-form">
<textarea matInput placeholder='Motion Text' formControlName='text' [value]='motionCopy.text' required></textarea> <textarea matInput placeholder="{{ 'Motion text' | translate }}" formControlName='text' [value]='motionCopy.text' required></textarea>
</mat-form-field> </mat-form-field>
<!-- Reason --> <!-- Reason -->
<div *ngIf="motion && motion.reason || editMotion"> <div *ngIf="motion && motion.reason || editMotion">
<h5 translate>Reason</h5> <h5 *ngIf="!editMotion" translate>Reason</h5>
<div class="motion-text" *ngIf='!editMotion'> <div class="motion-text" *ngIf='!editMotion'>
<div [innerHtml]='motion.reason'></div> <div [innerHtml]='motion.reason'></div>
</div> </div>
<mat-form-field *ngIf="editMotion" class="wide-form"> <mat-form-field *ngIf="editMotion" class="wide-form">
<textarea matInput placeholder="Reason" formControlName='reason' [value]='motionCopy.reason'></textarea> <textarea matInput placeholder="{{ 'Reason' | translate }}" formControlName='reason' [value]='motionCopy.reason'></textarea>
</mat-form-field> </mat-form-field>
</div> </div>
@ -310,9 +315,9 @@
<!-- Line number Menu --> <!-- Line number Menu -->
<mat-menu #lineNumberingMenu="matMenu" > <mat-menu #lineNumberingMenu="matMenu" >
<button mat-menu-item translate (click)=setLineNumberingMode(0)>None</button> <button mat-menu-item translate (click)=setLineNumberingMode(0)>none</button>
<button mat-menu-item translate (click)=setLineNumberingMode(1)>Inline</button> <button mat-menu-item translate (click)=setLineNumberingMode(1)>inline</button>
<button mat-menu-item translate (click)=setLineNumberingMode(2)>Outside</button> <button mat-menu-item translate (click)=setLineNumberingMode(2)>outside</button>
</mat-menu> </mat-menu>
<!-- Diff View Menu --> <!-- Diff View Menu -->

View File

@ -52,7 +52,7 @@
<mat-header-cell *matHeaderCellDef mat-sort-header>State</mat-header-cell> <mat-header-cell *matHeaderCellDef mat-sort-header>State</mat-header-cell>
<mat-cell *matCellDef="let motion"> <mat-cell *matCellDef="let motion">
<div *ngIf='isDisplayIcon(motion.state) && motion.state' class='innerTable'> <div *ngIf='isDisplayIcon(motion.state) && motion.state' class='innerTable'>
<mat-icon>{{getStateIcon(motion.state)}}></mat-icon> <mat-icon>{{getStateIcon(motion.state)}}</mat-icon>
</div> </div>
</mat-cell> </mat-cell>
</ng-container> </ng-container>
@ -82,7 +82,7 @@
<button mat-menu-item routerLink="statute-paragraphs"> <button mat-menu-item routerLink="statute-paragraphs">
<mat-icon>account_balance</mat-icon> <mat-icon>account_balance</mat-icon>
<span translate>Statute paragrpahs</span> <span translate>Statute paragraphs</span>
</button> </button>
</mat-menu> </mat-menu>

View File

@ -40,8 +40,12 @@
</form> </form>
</mat-card-content> </mat-card-content>
<mat-card-actions> <mat-card-actions>
<button mat-button (click)="create()" translate>Create</button> <button mat-button (click)="create()">
<button mat-button (click)="statuteParagraphToCreate = null" translate>Abort</button> <span translate>Save</span>
</button>
<button mat-button (click)="statuteParagraphToCreate = null">
<span translate>Cancel</span>
</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
<mat-accordion class="os-card"> <mat-accordion class="os-card">
@ -53,7 +57,7 @@
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<form [formGroup]="updateForm" *ngIf="editId === statuteParagraph.id"> <form [formGroup]="updateForm" *ngIf="editId === statuteParagraph.id">
<span translate>Edit statute paragraph details:</span> <span translate>Edit statute paragraph:</span>
<p> <p>
<mat-form-field> <mat-form-field>
<input formControlName="title" matInput placeholder="{{'Title' | translate}}" required> <input formControlName="title" matInput placeholder="{{'Title' | translate}}" required>
@ -101,7 +105,7 @@
</mat-accordion> </mat-accordion>
<mat-card *ngIf="statuteParagraphs.length === 0"> <mat-card *ngIf="statuteParagraphs.length === 0">
<mat-card-content> <mat-card-content>
<div class="no-content" translate>No statute paragraphs yet...</div> <div class="no-content" translate>No statute paragraphs</div>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>

View File

@ -67,7 +67,7 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
/** /**
* Init function. * Init function.
* *
* Sets the title and gets/observes statute paragrpahs from DataStore * Sets the title and gets/observes statute paragraphs from DataStore
*/ */
public ngOnInit(): void { public ngOnInit(): void {
super.setTitle('Statute paragraphs'); super.setTitle('Statute paragraphs');
@ -149,14 +149,10 @@ export class StatuteParagraphListComponent extends BaseViewComponent implements
} }
} }
public sortStatuteParagraphs(): void {
console.log('Not yet implemented. Depends on other Features');
}
/** /**
* TODO: navigate to a sorting view * TODO: navigate to a sorting view
*/ */
public sortStatuteParagrpahs(): void { public sortStatuteParagraphs(): void {
console.log('sort statute paragraphs'); console.log('Not yet implemented. Depends on other Features');
} }
} }

View File

@ -133,7 +133,7 @@ export class ViewMotion extends BaseViewModel {
} }
public get possibleRecommendations(): WorkflowState[] { public get possibleRecommendations(): WorkflowState[] {
return this.recommendation && this.workflow ? this.workflow.states : null; return this.workflow ? this.workflow.states.filter(recommendation => recommendation.recommendation_label !== undefined) : null;
} }
public get origin(): string { public get origin(): string {

View File

@ -19,11 +19,11 @@
</a> </a>
<a *ngIf="isLoggedIn" (click)='editProfile()' mat-list-item> <a *ngIf="isLoggedIn" (click)='editProfile()' mat-list-item>
<mat-icon>person</mat-icon> <mat-icon>person</mat-icon>
<span translate>Edit Profile</span> <span translate>Edit profile</span>
</a> </a>
<a *ngIf="isLoggedIn" (click)='changePassword()' mat-list-item> <a *ngIf="isLoggedIn" (click)='changePassword()' mat-list-item>
<mat-icon>vpn_key</mat-icon> <mat-icon>vpn_key</mat-icon>
<span translate>Change Password</span> <span translate>Change password</span>
</a> </a>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<a *ngIf="isLoggedIn" (click)='logout()' mat-list-item> <a *ngIf="isLoggedIn" (click)='logout()' mat-list-item>
@ -40,7 +40,7 @@
<mat-menu #languageMenu="matMenu"> <mat-menu #languageMenu="matMenu">
<button mat-menu-item (click)='selectLang("en")' translate>English</button> <button mat-menu-item (click)='selectLang("en")' translate>English</button>
<button mat-menu-item (click)='selectLang("de")' translate>German</button> <button mat-menu-item (click)='selectLang("de")' translate>German</button>
<button mat-menu-item (click)='selectLang("fr")' translate>French</button> <button mat-menu-item (click)='selectLang("cs")' translate>Czech</button>
</mat-menu> </mat-menu>
<!-- navigation --> <!-- navigation -->
@ -49,7 +49,7 @@
<a [@navItemAnim] *osPerms="entry.permission" mat-list-item (click)='toggleSideNav()' [routerLink]='entry.route' <a [@navItemAnim] *osPerms="entry.permission" mat-list-item (click)='toggleSideNav()' [routerLink]='entry.route'
routerLinkActive='active' [routerLinkActiveOptions]="{exact: entry.route === '/'}"> routerLinkActive='active' [routerLinkActiveOptions]="{exact: entry.route === '/'}">
<mat-icon>{{ entry.icon }}</mat-icon> <mat-icon>{{ entry.icon }}</mat-icon>
<span translate>{{ entry.displayName | translate}}</span> <span>{{ entry.displayName | translate}}</span>
</a> </a>
</span> </span>

View File

@ -109,7 +109,7 @@ export class SiteComponent extends BaseComponent implements OnInit {
/** /**
* Let the user change the language * Let the user change the language
* @param lang the desired language (en, de, fr, ...) * @param lang the desired language (en, de, cs, ...)
*/ */
public selectLang(selection: string): void { public selectLang(selection: string): void {
this.translate.use(selection).subscribe(); this.translate.use(selection).subscribe();
@ -123,8 +123,8 @@ export class SiteComponent extends BaseComponent implements OnInit {
return this.translate.instant('English'); return this.translate.instant('English');
} else if (abbreviation === 'de') { } else if (abbreviation === 'de') {
return this.translate.instant('German'); return this.translate.instant('German');
} else if (abbreviation === 'fr') { } else if (abbreviation === 'cs') {
return this.translate.instant('French'); return this.translate.instant('Czech');
} }
} }

View File

@ -6,7 +6,7 @@
<form *ngIf="editTag" [formGroup]="tagForm" (ngSubmit)="saveTag()" (keydown)="keyDownFunction($event)"> <form *ngIf="editTag" [formGroup]="tagForm" (ngSubmit)="saveTag()" (keydown)="keyDownFunction($event)">
<mat-form-field> <mat-form-field>
<input type="text" matInput osAutofocus required formControlName="name" placeholder="{{ 'New tag name' | translate}}"> <input type="text" matInput osAutofocus required formControlName="name" placeholder="{{ 'New tag name' | translate}}">
<mat-error *ngIf="tagForm.invalid" translate>A tag name is required</mat-error> <mat-error *ngIf="tagForm.invalid" translate>Required</mat-error>
</mat-form-field> </mat-form-field>
</form> </form>
</div> </div>

View File

@ -7,7 +7,7 @@
<form *ngIf="editGroup" [formGroup]="groupForm" (ngSubmit)="saveGroup()" (keydown)="keyDownFunction($event)"> <form *ngIf="editGroup" [formGroup]="groupForm" (ngSubmit)="saveGroup()" (keydown)="keyDownFunction($event)">
<mat-form-field> <mat-form-field>
<input type="text" matInput osAutofocus required formControlName="name" placeholder="{{ 'New group name' | translate}}"> <input type="text" matInput osAutofocus required formControlName="name" placeholder="{{ 'New group name' | translate}}">
<mat-error *ngIf="groupForm.invalid" translate>A group name is required</mat-error> <mat-error *ngIf="groupForm.invalid" translate>Required</mat-error>
</mat-form-field> </mat-form-field>
</form> </form>
</div> </div>
@ -29,8 +29,8 @@
<mat-accordion *ngFor="let app of repo.appPermissions"> <mat-accordion *ngFor="let app of repo.appPermissions">
<mat-expansion-panel class="mat-elevation-z0" [expanded]=true> <mat-expansion-panel class="mat-elevation-z0" [expanded]=true>
<mat-expansion-panel-header> <mat-expansion-panel-header>
<mat-panel-title translate> <mat-panel-title>
{{ app.name }} {{ app.name | translate }}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
@ -38,16 +38,16 @@
<table mat-table class='on-transition-fade' [dataSource]="getTableDataSource(app.permissions)"> <table mat-table class='on-transition-fade' [dataSource]="getTableDataSource(app.permissions)">
<ng-container matColumnDef="perm" sticky> <ng-container matColumnDef="perm" sticky>
<mat-header-cell *matHeaderCellDef translate>Permissions</mat-header-cell> <mat-header-cell *matHeaderCellDef translate>Permissions</mat-header-cell>
<mat-cell *matCellDef="let perm" translate> <mat-cell *matCellDef="let perm">
{{ perm.display_name }} {{ perm.display_name | translate }}
</mat-cell> </mat-cell>
</ng-container> </ng-container>
<div *ngFor=" let group of groups; trackBy: trackGroupArray"> <div *ngFor=" let group of groups; trackBy: trackGroupArray">
<ng-container [matColumnDef]="group.name"> <ng-container [matColumnDef]="group.name">
<mat-header-cell class="group-head-table-cell" *matHeaderCellDef (click)="selectGroup(group)"> <mat-header-cell class="group-head-table-cell" *matHeaderCellDef (click)="selectGroup(group)">
<div class="inner-table" translate> <div class="inner-table">
{{ group.name }} {{ group.name | translate }}
</div> </div>
</mat-header-cell> </mat-header-cell>
<mat-cell *matCellDef="let perm"> <mat-cell *matCellDef="let perm">

View File

@ -41,13 +41,13 @@
<!-- First name --> <!-- First name -->
<mat-form-field class='form30 distance force-min-with' *ngIf='user.first_name || editUser && isAllowed("manage")'> <mat-form-field class='form30 distance force-min-with' *ngIf='user.first_name || editUser && isAllowed("manage")'>
<input type='text' matInput placeholder='{{"First Name" | translate}}' formControlName='first_name' <input type='text' matInput placeholder='{{"Given name" | translate}}' formControlName='first_name'
[value]='user.first_name'> [value]='user.first_name'>
</mat-form-field> </mat-form-field>
<!-- Last name --> <!-- Last name -->
<mat-form-field class='form30 force-min-with' *ngIf='user.last_name || editUser && isAllowed("manage")'> <mat-form-field class='form30 force-min-with' *ngIf='user.last_name || editUser && isAllowed("manage")'>
<input type='text' matInput placeholder='{{"Last Name" | translate}}' formControlName='last_name' <input type='text' matInput placeholder='{{"Surname" | translate}}' formControlName='last_name'
[value]='user.last_name'> [value]='user.last_name'>
</mat-form-field> </mat-form-field>
</div> </div>
@ -55,7 +55,7 @@
<div *ngIf='isAllowed("seePersonal")'> <div *ngIf='isAllowed("seePersonal")'>
<!-- E-Mail --> <!-- E-Mail -->
<mat-form-field class='form100' *ngIf="user.email || editUser"> <mat-form-field class='form100' *ngIf="user.email || editUser">
<input type='email' matInput placeholder='{{"EMail" | translate}}' name="email" formControlName='email' <input type='email' matInput placeholder='{{"Email" | translate}}' name="email" formControlName='email'
[value]='user.email'> [value]='user.email'>
<mat-error *ngIf="personalInfoForm.get('email').hasError('email')"> <mat-error *ngIf="personalInfoForm.get('email').hasError('email')">
Please enter a valid email address Please enter a valid email address
@ -66,13 +66,13 @@
<div> <div>
<!-- Strucuture Level --> <!-- Strucuture Level -->
<mat-form-field class='form70 distance' *ngIf='user.structure_level || editUser && isAllowed("manage")'> <mat-form-field class='form70 distance' *ngIf='user.structure_level || editUser && isAllowed("manage")'>
<input type='text' matInput placeholder='{{"Structure Level" | translate}}' formControlName='structure_level' <input type='text' matInput placeholder='{{"Structure level" | translate}}' formControlName='structure_level'
[value]='user.structure_level'> [value]='user.structure_level'>
</mat-form-field> </mat-form-field>
<!-- Partizipant Number --> <!-- Partizipant Number -->
<mat-form-field class='form20 force-min-with' *ngIf='user.participant_number || editUser && isAllowed("manage")'> <mat-form-field class='form20 force-min-with' *ngIf='user.participant_number || editUser && isAllowed("manage")'>
<input type='text' matInput placeholder='{{"Participant Number" | translate}}' formControlName='number' <input type='text' matInput placeholder='{{"Participant number" | translate}}' formControlName='number'
[value]='user.participant_number'> [value]='user.participant_number'>
</mat-form-field> </mat-form-field>
</div> </div>
@ -89,7 +89,7 @@
<div *ngIf='isAllowed("manage")'> <div *ngIf='isAllowed("manage")'>
<!-- Initial Password --> <!-- Initial Password -->
<mat-form-field class='form100'> <mat-form-field class='form100'>
<input matInput placeholder='{{"Initial Password" | translate}}' formControlName='default_password' <input matInput placeholder='{{"Initial password" | translate}}' formControlName='default_password'
[value]='user.default_password'> [value]='user.default_password'>
<mat-hint align="end">Generate</mat-hint> <mat-hint align="end">Generate</mat-hint>
<button type="button" mat-button matSuffix mat-icon-button [disabled]='!newUser' (click)='generatePassword()'> <button type="button" mat-button matSuffix mat-icon-button [disabled]='!newUser' (click)='generatePassword()'>
@ -102,7 +102,7 @@
<!-- About me --> <!-- About me -->
<!-- TODO: Needs Rich Text Editor --> <!-- TODO: Needs Rich Text Editor -->
<mat-form-field class='form100' *ngIf="user.about_me || editUser"> <mat-form-field class='form100' *ngIf="user.about_me || editUser">
<textarea formControlName='about_me' matInput placeholder='{{"About Me" | translate}}' [value]='user.about_me'></textarea> <textarea formControlName='about_me' matInput placeholder='{{"About me" | translate}}' [value]='user.about_me'></textarea>
</mat-form-field> </mat-form-field>
</div> </div>
@ -125,12 +125,12 @@
<!-- Present? --> <!-- Present? -->
<mat-checkbox formControlName='is_present' matTooltip='{{"Designates whether this user is in the room." | translate}} ' <mat-checkbox formControlName='is_present' matTooltip='{{"Designates whether this user is in the room." | translate}} '
[value]='user.is_present'> [value]='user.is_present'>
<span translate>Is Present</span> <span translate>Is present</span>
</mat-checkbox> </mat-checkbox>
<!-- Active? --> <!-- Active? -->
<mat-checkbox *osPerms="'users.can_see_extra_data'" formControlName='is_active' matTooltip='{{"Designates whether this user should be treated as active. Unselect this instead of deleting the account." | translate}}' <mat-checkbox *osPerms="'users.can_see_extra_data'" formControlName='is_active' matTooltip='{{"Designates whether this user should be treated as active. Unselect this instead of deleting the account." | translate}}'
[value]='user.is_active'> [value]='user.is_active'>
<span translate>Is Active</span> <span translate>Is active</span>
</mat-checkbox> </mat-checkbox>
<!-- Commitee? --> <!-- Commitee? -->
<mat-checkbox formControlName='is_committee' matTooltip='{{"Designates whether this user should be treated as a committee." | translate}}' <mat-checkbox formControlName='is_committee' matTooltip='{{"Designates whether this user should be treated as a committee." | translate}}'

View File

@ -1,7 +1,7 @@
<os-head-bar mainButton=true (mainEvent)=onPlusButton()> <os-head-bar mainButton=true (mainEvent)=onPlusButton()>
<!-- Title --> <!-- Title -->
<div class="title-slot"> <div class="title-slot">
<h2 translate>Users</h2> <h2 translate>Participants</h2>
</div> </div>
<!-- Menu --> <!-- Menu -->

View File

@ -0,0 +1 @@
{"About me":"O mě","Accept":"Přijmout","Accepted":"Přijato","Agenda":"Pořad jednání","All your changes are saved immediately.":"Všechny vaše změny jsou okamžitě uloženy.","Cancel":"Zrušit","Categories":"Skupiny","Category":"Obor činnosti","Change password":"Změnit heslo","Change recommendation":"Změnit doporučení","Changed version":"Změněná verze","Comment":"Poznámka","Comments":"Poznámky","Content":"Obsah","Create new category":"Vytvořit nový obor činnosti","Create new comment field":"Vytvořit nové poznámkové pole","Create new statute paragraph":"Vytvořit nový odstavec předpisu","Delete":"Smazat","Delete all files":"Smazat všechny soubory","Designates whether this user is in the room.":"Určuje, zda je tento uživatel v místnosti.","Designates whether this user should be treated as a committee.":"Určuje, zda se s tímto uživatelem má zacházet jako s výborem.","Designates whether this user should be treated as active. Unselect this instead of deleting the account.":"Určuje, zda se má s tímto uživatelem zacházet jako s činným. Zrušte vybrání namísto smazání účtu.","Diff version":"Znázornění změn","Edit":"Upravit","Edit category:":"Upravit obor činnosti:","Edit comment field:":"Upravit poznámkové pole:","Edit profile":"Upravit profil","Edit statute paragraph:":"Upravit odstavec předpisu:","Elections":"Elections","Email":"E-mail","English":"Angličtina","Export ...":"Vyvést...","Export as csv":"Vyvést jako CSV","FILTER":"FILTR","Files":"Soubory","Final version":"Konečná verze","French":"Francouzština","German":"Němčina","Given name":"Křestní jméno","Groups":"Skupiny","Groups with read permissions":"Skupiny s oprávněním pro čtení","Groups with write permissions":"Skupiny s oprávněním pro zápis","Home":"Domovská stránka","Identifier":"Identifikátor","Import ...":"Zavést...","Initial password":"Počáteční heslo","Installed plugins":"Nainstalované přídavné moduly","Is a committee":"Je výbor","Is active":"Je činná","Is present":"Je přítomná","Legal notice":"Právní upozornění","License":"Povolení","Line":"Řádek","Login":"Přihlášení","Login as Guest":"Přihlásit se jako host","Logout":"Odhlásit se","Meta information":"Popisné informace","Motion":"Návrh","Motions":"Návrhy","Name":"Název","New group name":"Název nové skupiny","New motion":"Nový návrh","New tag name":"Název nové značky","No change recommendations yet":"Dosud žádná doporučení změn","No comment":"Bez poznámky","No groups selected":"Nevybrány žádné skupiny","No personal note":"Bez osobní poznámky","No statute paragraphs":"Žádné odstavce předpisu","None":"Žádné","Note: You have to reject all change recommendations if the plenum does not follow the recommendation. This does not affect amendments.":"Poznámka: Musíte odmítnout všechna doporučení změn, pokud plenární zasedání nesleduje doporučení. Toto neovlivní dodatky.","OK":"OK","Offline mode: You can use OpenSlides but changes are not saved.":"Režim nepřipojen k internetu: Můžete OpenSlides používat, ale změny nejsou ukládány.","Only for internal notes.":"Jen pro vnitřní poznámky.","Origin":"Původ","Original version":"Původní verze","PDF":"PDF","Participant number":"Číslo účastníka","Participants":"Účastníci","Permissions":"Oprávnění","Personal note":"Osobní poznámka","Prefix":"Předpona","Present":"Přítomen","Privacy Policy":"Politika pro soukromí","Privacy policy":"Politika pro soukromí","Project":"Promítat","Projector":"Promítací přístroj","Public":"Veřejný","Reason":"Zdůvodnění","Reject":"Odmítnout","Rejected":"Odmítnuto","Required":"Požadováno","Reset recommendation":"Vynulovat doporučení","Reset state":"Obnovit stav","SORT":"TŘÍDIT","Save":"Uložit","Selected values":"Vybrané hodnoty","Settings":"Nastavení","Sort ...":"Třídit...","State":"Stav","Statute paragraph":"Odstavec předpisu","Statute paragraphs":"Odstavce předpisu","Structure level":"Úroveň rozčlenění","Submitters":"Navrhovatelé","Summary of changes":"Přehled změn","Supporters":"Podporovatel","Surname":"Příjmení","Tags":"Klíčová slova","The assembly may decide:":"Shromáždění se může usnést:","The event manager hasn't set up a privacy policy yet.":"Správce událostí ještě nenastavil politiku soukromí.","This change collides with another one.":"Tato změna se střetává s jinou.","Title":"Název","Username":"Uživatelské jméno","Welcome to OpenSlides":"Vítejte v OpenSlides","Yes":"Ano","by":"od","inline":"uvnitř","none":"žádné","outside":"vně"}

View File

@ -0,0 +1,376 @@
# Translators:
# fri, 2018
#
msgid ""
msgstr ""
"Last-Translator: fri, 2018\n"
"Language-Team: Czech (https://www.transifex.com/openslides/teams/14270/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
msgid "About me"
msgstr "O mě"
msgid "Accept"
msgstr "Přijmout"
msgid "Accepted"
msgstr "Přijato"
msgid "Agenda"
msgstr "Pořad jednání"
msgid "All your changes are saved immediately."
msgstr "Všechny vaše změny jsou okamžitě uloženy."
msgid "Cancel"
msgstr "Zrušit"
msgid "Categories"
msgstr "Skupiny"
msgid "Category"
msgstr "Obor činnosti"
msgid "Change password"
msgstr "Změnit heslo"
msgid "Change recommendation"
msgstr "Změnit doporučení"
msgid "Changed version"
msgstr "Změněná verze"
msgid "Comment"
msgstr "Poznámka"
msgid "Comments"
msgstr "Poznámky"
msgid "Content"
msgstr "Obsah"
msgid "Create new category"
msgstr "Vytvořit nový obor činnosti"
msgid "Create new comment field"
msgstr "Vytvořit nové poznámkové pole"
msgid "Create new statute paragraph"
msgstr "Vytvořit nový odstavec předpisu"
msgid "Delete"
msgstr "Smazat"
msgid "Delete all files"
msgstr "Smazat všechny soubory"
msgid "Designates whether this user is in the room."
msgstr "Určuje, zda je tento uživatel v místnosti."
msgid "Designates whether this user should be treated as a committee."
msgstr "Určuje, zda se s tímto uživatelem má zacházet jako s výborem."
msgid ""
"Designates whether this user should be treated as active. Unselect this "
"instead of deleting the account."
msgstr ""
"Určuje, zda se má s tímto uživatelem zacházet jako s činným. Zrušte vybrání "
"namísto smazání účtu."
msgid "Diff version"
msgstr "Znázornění změn"
msgid "Edit"
msgstr "Upravit"
msgid "Edit category:"
msgstr "Upravit obor činnosti:"
msgid "Edit comment field:"
msgstr "Upravit poznámkové pole:"
msgid "Edit profile"
msgstr "Upravit profil"
msgid "Edit statute paragraph:"
msgstr "Upravit odstavec předpisu:"
msgid "Elections"
msgstr ""
msgid "Email"
msgstr "E-mail"
msgid "English"
msgstr "Angličtina"
msgid "Export ..."
msgstr "Vyvést..."
msgid "Export as csv"
msgstr "Vyvést jako CSV"
msgid "FILTER"
msgstr "FILTR"
msgid "Files"
msgstr "Soubory"
msgid "Final version"
msgstr "Konečná verze"
msgid "French"
msgstr "Francouzština"
msgid "German"
msgstr "Němčina"
msgid "Given name"
msgstr "Křestní jméno"
msgid "Groups"
msgstr "Skupiny"
msgid "Groups with read permissions"
msgstr "Skupiny s oprávněním pro čtení"
msgid "Groups with write permissions"
msgstr "Skupiny s oprávněním pro zápis"
msgid "Home"
msgstr "Domovská stránka"
msgid "Identifier"
msgstr "Identifikátor"
msgid "Import ..."
msgstr "Zavést..."
msgid "Initial password"
msgstr "Počáteční heslo"
msgid "Installed plugins"
msgstr "Nainstalované přídavné moduly"
msgid "Is a committee"
msgstr "Je výbor"
msgid "Is active"
msgstr "Je činná"
msgid "Is present"
msgstr "Je přítomná"
msgid "Legal notice"
msgstr "Právní upozornění"
msgid "License"
msgstr "Povolení"
msgid "Line"
msgstr "Řádek"
msgid "Login"
msgstr "Přihlášení"
msgid "Login as Guest"
msgstr "Přihlásit se jako host"
msgid "Logout"
msgstr "Odhlásit se"
msgid "Meta information"
msgstr "Popisné informace"
msgid "Motion"
msgstr "Návrh"
msgid "Motions"
msgstr "Návrhy"
msgid "Name"
msgstr "Název"
msgid "New group name"
msgstr "Název nové skupiny"
msgid "New motion"
msgstr "Nový návrh"
msgid "New tag name"
msgstr "Název nové značky"
msgid "No change recommendations yet"
msgstr "Dosud žádná doporučení změn"
msgid "No comment"
msgstr "Bez poznámky"
msgid "No groups selected"
msgstr "Nevybrány žádné skupiny"
msgid "No personal note"
msgstr "Bez osobní poznámky"
msgid "No statute paragraphs"
msgstr "Žádné odstavce předpisu"
msgid "None"
msgstr "Žádné"
msgid ""
"Note: You have to reject all change recommendations if the plenum does not "
"follow the recommendation. This does not affect amendments."
msgstr ""
"Poznámka: Musíte odmítnout všechna doporučení změn, pokud plenární zasedání "
"nesleduje doporučení. Toto neovlivní dodatky."
msgid "OK"
msgstr "OK"
msgid "Offline mode: You can use OpenSlides but changes are not saved."
msgstr ""
"Režim nepřipojen k internetu: Můžete OpenSlides používat, ale změny nejsou "
"ukládány."
msgid "Only for internal notes."
msgstr "Jen pro vnitřní poznámky."
msgid "Origin"
msgstr "Původ"
msgid "Original version"
msgstr "Původní verze"
msgid "PDF"
msgstr "PDF"
msgid "Participant number"
msgstr "Číslo účastníka"
msgid "Participants"
msgstr "Účastníci"
msgid "Permissions"
msgstr "Oprávnění"
msgid "Personal note"
msgstr "Osobní poznámka"
msgid "Prefix"
msgstr "Předpona"
msgid "Present"
msgstr "Přítomen"
msgid "Privacy Policy"
msgstr "Politika pro soukromí"
msgid "Privacy policy"
msgstr "Politika pro soukromí"
msgid "Project"
msgstr "Promítat"
msgid "Projector"
msgstr "Promítací přístroj"
msgid "Public"
msgstr "Veřejný"
msgid "Reason"
msgstr "Zdůvodnění"
msgid "Reject"
msgstr "Odmítnout"
msgid "Rejected"
msgstr "Odmítnuto"
msgid "Required"
msgstr "Požadováno"
msgid "Reset recommendation"
msgstr "Vynulovat doporučení"
msgid "Reset state"
msgstr "Obnovit stav"
msgid "SORT"
msgstr "TŘÍDIT"
msgid "Save"
msgstr "Uložit"
msgid "Selected values"
msgstr "Vybrané hodnoty"
msgid "Settings"
msgstr "Nastavení"
msgid "Sort ..."
msgstr "Třídit..."
msgid "State"
msgstr "Stav"
msgid "Statute paragraph"
msgstr "Odstavec předpisu"
msgid "Statute paragraphs"
msgstr "Odstavce předpisu"
msgid "Structure level"
msgstr "Úroveň rozčlenění"
msgid "Submitters"
msgstr "Navrhovatelé"
msgid "Summary of changes"
msgstr "Přehled změn"
msgid "Supporters"
msgstr "Podporovatel"
msgid "Surname"
msgstr "Příjmení"
msgid "Tags"
msgstr "Klíčová slova"
msgid "The assembly may decide:"
msgstr "Shromáždění se může usnést:"
msgid "The event manager hasn't set up a privacy policy yet."
msgstr "Správce událostí ještě nenastavil politiku soukromí."
msgid "This change collides with another one."
msgstr "Tato změna se střetává s jinou."
msgid "Title"
msgstr "Název"
msgid "Username"
msgstr "Uživatelské jméno"
msgid "Welcome to OpenSlides"
msgstr "Vítejte v OpenSlides"
msgid "Yes"
msgstr "Ano"
msgid "by"
msgstr "od"
msgid "inline"
msgstr "uvnitř"
msgid "none"
msgstr "žádné"
msgid "outside"
msgstr "vně"

File diff suppressed because one or more lines are too long

1113
client/src/assets/i18n/de.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,95 +0,0 @@
{
"Cancel": "",
"About Me": "",
"Category": "",
"Change Password": "",
"Changed version": "",
"Comment": "",
"Content": "",
"Copyright by": "",
"Delete User": "",
"DeleteMotion": "",
"Designates whether this user is in the room": {
"0": ""
},
"Designates whether this user should be treated as a committee": {
"0": ""
},
"Designates whether this user should be treated as active": {
" Unselect this instead of deleting the account": {
"0": ""
}
},
"Diff version": "",
"EMail": "",
"Edit Profile": "",
"Edit category details:": "",
"English": "",
"Export As": {
"0": {
"0": {
"0": ""
}
}
},
"FILTER": "",
"Final version": "",
"First Name": "",
"French": "",
"German": "",
"Groups": "",
"Identifier": "",
"Initial Password": "",
"Inline": "",
"Installed plugins": "",
"Is Active": "",
"Is Present": "",
"Is a committee": "",
"Last Name": "",
"Legal Notice": "",
"License": "",
"Login": "",
"Login as Guest": "",
"Logout": "",
"Meta information": "",
"Motion": "",
"Motions": "",
"Name": "",
"None": "",
"OK": "",
"Offline mode: You can use OpenSlides but changes are not saved": {
"0": ""
},
"Only for internal notes": {
"0": ""
},
"Origin": "",
"Original version": "",
"Outside": "",
"Participant Number": "",
"Personal Note": "",
"Personal note": "",
"Prefix": "",
"Present": "",
"Privacy Policy": "",
"Project": "",
"Projector": "",
"Reason": "",
"Required": "",
"Reset State": "",
"Reset recommendation": "",
"SORT": "",
"Selected Values": "",
"State": "",
"Structure Level": "",
"Submitters": "",
"Supporters": "",
"The assembly may decide:": "",
"The event manager hasn't set up a privacy policy yet": {
"0": ""
},
"Title": "",
"Username": "",
"Welcome to OpenSlides": "",
"by": ""
}

File diff suppressed because it is too large Load Diff

View File

@ -61,8 +61,8 @@ def get_config_variables():
input_type='choice', input_type='choice',
label='Default line numbering', label='Default line numbering',
choices=( choices=(
{'value': 'outside', 'display_name': 'Outside'}, {'value': 'outside', 'display_name': 'outside'},
{'value': 'inline', 'display_name': 'Inline'}, {'value': 'inline', 'display_name': 'inline'},
{'value': 'none', 'display_name': 'Disabled'}), {'value': 'none', 'display_name': 'Disabled'}),
weight=322, weight=322,
group='Motions', group='Motions',