From abad75c12968f574dd21d7a700a5c82582967de6 Mon Sep 17 00:00:00 2001 From: Emanuel Schuetze Date: Mon, 22 Apr 2013 19:59:05 +0200 Subject: [PATCH] A lot of template improvements and translation fixes - Fixed agenda widget for special slide views (e.g. list of speakers, summary). - Fixed back to motion(s) link - Set icon for list of speakers widget. - Fixed overlay widget layout of form elements. - Added submenu with other config_pages to version.html. - Updated completly DE translations, fixed EN strings. - Coding style: Use correct ugettext and ugettext_lazy strings. Use "as _" for ugettext only. Updated translation. - Improved projector template (clock image, fixed facicon, added subtitle for list of speakers) - Changed permission strings ('oneself'). Added check if group(pk=3) exists. - Added event name and description to base template. Some minor template layout fixes. - Use static subtile (no context var). Show last 2 old_speakers for projector. - Cut old_speakers. - Projektor template style changes (e.g. overlay list of speakers). --- openslides/account/views.py | 1 - openslides/agenda/models.py | 35 +- openslides/agenda/signals.py | 4 +- openslides/agenda/slides.py | 4 +- .../agenda/overlay_speaker_projector.html | 19 +- .../templates/agenda/speaker_widget.html | 2 +- openslides/agenda/templates/agenda/view.html | 16 +- .../agenda/templates/agenda/widget.html | 21 +- .../projector/agenda_list_of_speaker.html | 23 +- openslides/agenda/views.py | 14 +- openslides/assignment/forms.py | 6 +- openslides/assignment/models.py | 21 +- openslides/assignment/signals.py | 28 +- openslides/assignment/views.py | 9 +- .../config/templates/config/config_form.html | 3 +- openslides/config/views.py | 4 +- openslides/core/signals.py | 2 +- openslides/core/templates/core/version.html | 15 +- openslides/core/views.py | 8 + openslides/locale/de/LC_MESSAGES/django.mo | Bin 28466 -> 35525 bytes openslides/locale/de/LC_MESSAGES/django.po | 2649 ++++++++--------- openslides/locale/de/LC_MESSAGES/djangojs.mo | Bin 1069 -> 2613 bytes openslides/locale/de/LC_MESSAGES/djangojs.po | 201 +- openslides/mediafile/models.py | 8 +- .../mediafile/static/styles/mediafile.css | 6 +- .../templates/mediafile/mediafile_list.html | 2 +- openslides/motion/forms.py | 20 +- openslides/motion/models.py | 6 +- openslides/motion/pdf.py | 2 +- openslides/motion/signals.py | 36 +- .../templates/motion/category_list.html | 2 +- .../templates/motion/motion_detail.html | 4 +- .../motion/templates/motion/motion_diff.html | 4 +- .../motion/templates/motion/motion_form.html | 6 +- .../motion/templates/motion/motion_list.html | 2 +- openslides/motion/views.py | 8 +- openslides/participant/api.py | 2 +- openslides/participant/forms.py | 4 +- openslides/participant/models.py | 36 +- openslides/participant/signals.py | 14 +- .../templates/participant/group_detail.html | 4 +- .../templates/participant/group_overview.html | 2 +- .../templates/participant/user_detail.html | 73 +- openslides/projector/models.py | 8 +- openslides/projector/signals.py | 1 - ...clock.png => glyphicons_054_clock_big.png} | Bin .../projector/static/styles/dashboard.css | 4 +- .../projector/static/styles/projector.css | 23 +- .../projector/templates/base-projector.html | 2 +- .../projector/overlay_countdown_widget.html | 10 +- .../projector/overlay_message_widget.html | 2 +- openslides/projector/views.py | 2 +- .../static/img/glyphicons_062_paperclip.png | Bin 0 -> 1095 bytes .../img/glyphicons_062_paperclip_white.png | Bin 0 -> 1126 bytes openslides/static/javascript/utils.js | 8 - openslides/static/styles/base.css | 36 +- openslides/templates/base.html | 5 +- openslides/utils/jsonfield/fields.py | 2 +- openslides/utils/person/models.py | 1 + tests/agenda/test_list_of_speakers.py | 4 +- 60 files changed, 1807 insertions(+), 1627 deletions(-) rename openslides/projector/static/img/{glyphicons_054_clock.png => glyphicons_054_clock_big.png} (100%) create mode 100644 openslides/static/img/glyphicons_062_paperclip.png create mode 100644 openslides/static/img/glyphicons_062_paperclip_white.png diff --git a/openslides/account/views.py b/openslides/account/views.py index 5fa151665..0c67c83b3 100644 --- a/openslides/account/views.py +++ b/openslides/account/views.py @@ -45,7 +45,6 @@ def get_personal_info_widget(request): 'submitted_motions': Motion.objects.filter(submitter=request.user), 'config_motion_min_supporters': config['motion_min_supporters'], 'supported_motions': Motion.objects.filter(supporter=request.user)}) - try: from openslides.assignment.models import Assignment except ImportError: diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index 8abed0914..f21886910 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -14,7 +14,7 @@ from datetime import datetime from django.db import models from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _, ugettext_noop, ugettext +from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ from mptt.models import MPTTModel, TreeForeignKey @@ -38,30 +38,30 @@ class Item(MPTTModel, SlideMixin): ORGANIZATIONAL_ITEM = 2 ITEM_TYPE = ( - (AGENDA_ITEM, _('Agenda item')), - (ORGANIZATIONAL_ITEM, _('Organizational item'))) + (AGENDA_ITEM, ugettext_lazy('Agenda item')), + (ORGANIZATIONAL_ITEM, ugettext_lazy('Organizational item'))) - title = models.CharField(null=True, max_length=255, verbose_name=_("Title")) + title = models.CharField(null=True, max_length=255, verbose_name=ugettext_lazy("Title")) """ Title of the agenda item. """ - text = models.TextField(null=True, blank=True, verbose_name=_("Text")) + text = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Text")) """ The optional text of the agenda item. """ - comment = models.TextField(null=True, blank=True, verbose_name=_("Comment")) + comment = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Comment")) """ Optional comment to the agenda item. Will not be shoun to normal users. """ - closed = models.BooleanField(default=False, verbose_name=_("Closed")) + closed = models.BooleanField(default=False, verbose_name=ugettext_lazy("Closed")) """ Flag, if the item is finished. """ - weight = models.IntegerField(default=0, verbose_name=_("Weight")) + weight = models.IntegerField(default=0, verbose_name=ugettext_lazy("Weight")) """ Weight to sort the item in the agenda. """ @@ -73,7 +73,7 @@ class Item(MPTTModel, SlideMixin): """ type = models.IntegerField(max_length=1, choices=ITEM_TYPE, - default=AGENDA_ITEM, verbose_name=_("Type")) + default=AGENDA_ITEM, verbose_name=ugettext_lazy("Type")) """ Type of the agenda item. @@ -81,7 +81,7 @@ class Item(MPTTModel, SlideMixin): """ duration = models.CharField(null=True, blank=True, max_length=5, - verbose_name=_("Duration (hh:mm)")) + verbose_name=ugettext_lazy("Duration (hh:mm)")) """ The intended duration for the topic. """ @@ -94,7 +94,7 @@ class Item(MPTTModel, SlideMixin): """ speaker_list_closed = models.BooleanField( - default=False, verbose_name=_("List of speakers is closed")) + default=False, verbose_name=ugettext_lazy("List of speakers is closed")) """ True, if the list of speakers is closed. """ @@ -125,7 +125,7 @@ class Item(MPTTModel, SlideMixin): For use in Template ??Why does {% trans item.print_related_type|capfirst %} not work?? """ - return ugettext(self.get_related_type().capitalize()) + return _(self.get_related_type().capitalize()) def get_title(self): """ @@ -158,9 +158,12 @@ class Item(MPTTModel, SlideMixin): } elif config['presentation_argument'] == 'show_list_of_speakers': speakers = Speaker.objects.filter(time=None, item=self.pk).order_by('weight') - data = {'title': _('List of speakers for %s') % self.get_title(), + old_speakers = Speaker.objects.filter(item=self.pk).exclude(time=None).order_by('time') + slice_items = max(0, old_speakers.count()-2) + data = {'title': self.get_title(), 'template': 'projector/agenda_list_of_speaker.html', - 'speakers': speakers} + 'speakers': speakers, + 'old_speakers': old_speakers[slice_items:]} elif self.related_sid: data = self.get_related_slide().slide() else: @@ -244,7 +247,7 @@ class Item(MPTTModel, SlideMixin): class SpeakerManager(models.Manager): def add(self, person, item): if self.filter(person=person, item=item, time=None).exists(): - raise OpenSlidesError(_('%s is already on the list of speakers of item %d.') % (person, item.id)) + raise OpenSlidesError(_('%(person)s is already on the list of speakers of item %(id)s.') % {'person': person, 'id': item.id}) weight = (self.filter(item=item).aggregate( models.Max('weight'))['weight__max'] or 0) return self.create(item=item, person=person, weight=weight + 1) @@ -279,7 +282,7 @@ class Speaker(models.Model): class Meta: permissions = ( - ('can_be_speaker', ugettext_noop('Can be speaker')), + ('can_be_speaker', ugettext_noop('Can put oneself on the list of speakers')), ) def __unicode__(self): diff --git a/openslides/agenda/signals.py b/openslides/agenda/signals.py index 1633aebea..4d9d99527 100644 --- a/openslides/agenda/signals.py +++ b/openslides/agenda/signals.py @@ -12,7 +12,7 @@ from django.dispatch import receiver from django import forms -from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ +from django.utils.translation import ugettext_lazy, ugettext_noop from django.template.loader import render_to_string from openslides.config.signals import config_signal @@ -41,7 +41,7 @@ def setup_agenda_config_page(sender, **kwargs): widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M'), required=False, label=ugettext_lazy('Begin of event'), - help_text=_('Input format: DD.MM.YYYY HH:MM'))) + help_text=ugettext_lazy('Input format: DD.MM.YYYY HH:MM'))) extra_stylefiles = ['styles/timepicker.css', 'styles/jquery-ui/jquery-ui.custom.min.css'] extra_javascript = ['javascript/jquery-ui.custom.min.js', diff --git a/openslides/agenda/slides.py b/openslides/agenda/slides.py index 70e5f9d28..d4129fb3c 100644 --- a/openslides/agenda/slides.py +++ b/openslides/agenda/slides.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ugettext as _ from openslides.projector.api import register_slidemodel, register_slidefunc @@ -26,4 +26,4 @@ def agenda_show(): return data register_slidemodel(Item, control_template='agenda/control_item.html') -register_slidefunc('agenda', agenda_show, weight=-1, name=_('Agenda')) +register_slidefunc('agenda', agenda_show, weight=-1, name=ugettext_lazy('Agenda')) diff --git a/openslides/agenda/templates/agenda/overlay_speaker_projector.html b/openslides/agenda/templates/agenda/overlay_speaker_projector.html index 47a52dacd..e1596a4cb 100644 --- a/openslides/agenda/templates/agenda/overlay_speaker_projector.html +++ b/openslides/agenda/templates/agenda/overlay_speaker_projector.html @@ -1,23 +1,8 @@ {% load i18n %} - - -
+
{% if speakers %} -
{% trans "List of speakers:" %}
+

{% trans "List of speakers" %}:

    {% for speaker in speakers %}
  1. {{ speaker }}
  2. diff --git a/openslides/agenda/templates/agenda/speaker_widget.html b/openslides/agenda/templates/agenda/speaker_widget.html index ee4d0c012..6cf6e3744 100644 --- a/openslides/agenda/templates/agenda/speaker_widget.html +++ b/openslides/agenda/templates/agenda/speaker_widget.html @@ -2,5 +2,5 @@ {% load tags %}
    - {% trans 'Put me on the current list of speakers' %} + {% trans 'Put me on the current list of speakers' %}
    diff --git a/openslides/agenda/templates/agenda/view.html b/openslides/agenda/templates/agenda/view.html index 33bb9f18a..aa8bc0c56 100644 --- a/openslides/agenda/templates/agenda/view.html +++ b/openslides/agenda/templates/agenda/view.html @@ -79,12 +79,14 @@ {% if old_speakers %}
    - {% trans "Last speakers:" %} -
    - -
    + {% trans "Last speakers" %}: + {% if old_speakers|length > 1 %} +
    + +
    + {% endif %}
    {% for speaker in old_speakers %} @@ -139,7 +141,7 @@ {{ forloop.counter }}. {{ speaker }} {% if perms.agenda.can_manage_agenda %} - Finished speech + {% trans "Next speaker" %} diff --git a/openslides/agenda/templates/agenda/widget.html b/openslides/agenda/templates/agenda/widget.html index 455caeaf3..39c820953 100644 --- a/openslides/agenda/templates/agenda/widget.html +++ b/openslides/agenda/templates/agenda/widget.html @@ -3,7 +3,9 @@
    • - +   @@ -16,8 +18,10 @@
        {% for item in items %}
      • - - + +   @@ -25,9 +29,16 @@ + + + {% if not item.is_leaf_node %} - - + + {% endif %} {% for p in item.get_ancestors %} diff --git a/openslides/agenda/templates/projector/agenda_list_of_speaker.html b/openslides/agenda/templates/projector/agenda_list_of_speaker.html index 7d667dc6f..edd00ae2f 100644 --- a/openslides/agenda/templates/projector/agenda_list_of_speaker.html +++ b/openslides/agenda/templates/projector/agenda_list_of_speaker.html @@ -4,28 +4,27 @@ {% block title %}{{ block.super }} - {{ item }}{% endblock %} -{% block header %} - -{% endblock %} - {% block content %}

        {{ title }}

        +

        {% trans 'List of speakers' %}

        {% endblock %} {% block scrollcontent %} + {% if old_speakers|length > 0 %} +
          + {% for speaker in old_speakers %} +
        • {{ speaker }}
        • + {% endfor %} +
        + {% endif %} + {% if speakers %} -
          +
            {% for speaker in speakers %}
          1. {{ speaker }}
          2. {% endfor %}
          {% else %} - {% trans 'The list of speakers is empty' %} +

          {% trans 'The list of speakers is empty.' %}

          {% endif %} {% endblock %} diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index c8afc4da3..234be94b0 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -266,7 +266,7 @@ class SpeakerAppendView(SingleObjectMixin, RedirectView): def pre_redirect(self, request, *args, **kwargs): self.object = self.get_object() if self.object.speaker_list_closed: - messages.error(request, _('List of speakers is closed.')) + messages.error(request, _('The list of speakers is closed.')) else: try: Speaker.objects.add(item=self.object, person=request.user) @@ -337,8 +337,10 @@ class SpeakerSpeakView(SingleObjectMixin, RedirectView): item=self.object.pk).exclude( weight=None).get() except Speaker.DoesNotExist: - messages.error(self.request, _('Person %s is not on the list of item %s.' - % (kwargs['person_id'], self.object))) + messages.error( + self.request, + _('%(person)s is not on the list of %(item)s.') + % {'person': kwargs['person_id'], 'item': self.object}) else: speaker.speak() @@ -439,7 +441,7 @@ class CurrentListOfSpeakersView(RedirectView): if item is None: messages.error(request, _( 'There is no list of speakers for the current slide. ' - 'Please choose your agenda item manually from the agenda.')) + 'Please choose the agenda item manually from the agenda.')) return reverse('dashboard') if self.request.user.has_perm('agenda.can_be_speaker'): @@ -483,7 +485,9 @@ def get_widgets(request): template='agenda/widget.html', context={ 'agenda': SLIDE['agenda'], - 'items': Item.objects.all()}, + 'items': Item.objects.all(), + 'summary': config['presentation_argument'] == 'summary', + 'speakers': config['presentation_argument'] == 'show_list_of_speakers'}, permission_required='projector.can_manage_projector'), Widget( diff --git a/openslides/assignment/forms.py b/openslides/assignment/forms.py index a0a0f5818..b66a649a8 100644 --- a/openslides/assignment/forms.py +++ b/openslides/assignment/forms.py @@ -11,7 +11,7 @@ """ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy from openslides.utils.forms import CssClassMixin from openslides.utils.person import PersonFormField @@ -21,7 +21,7 @@ from openslides.assignment.models import Assignment class AssignmentForm(forms.ModelForm, CssClassMixin): posts = forms.IntegerField( - min_value=1, initial=1, label=_("Number of available posts")) + min_value=1, initial=1, label=ugettext_lazy("Number of available posts")) class Meta: model = Assignment @@ -31,5 +31,5 @@ class AssignmentForm(forms.ModelForm, CssClassMixin): class AssignmentRunForm(forms.Form, CssClassMixin): candidate = PersonFormField( widget=forms.Select(attrs={'class': 'medium-input'}), - label=_("Nominate a participant"), + label=ugettext_lazy("Nominate a participant"), ) diff --git a/openslides/assignment/models.py b/openslides/assignment/models.py index 0f89d61a6..a2b528e21 100644 --- a/openslides/assignment/models.py +++ b/openslides/assignment/models.py @@ -12,7 +12,7 @@ from django.core.urlresolvers import reverse from django.db import models -from django.utils.translation import ugettext_lazy as _, ugettext_noop # TODO Change this in the code +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from openslides.utils.person import PersonField from openslides.config.api import config @@ -39,17 +39,17 @@ class AssignmentCandidate(models.Model): class Assignment(models.Model, SlideMixin): prefix = 'assignment' STATUS = ( - ('sea', _('Searching for candidates')), - ('vot', _('Voting')), - ('fin', _('Finished')), + ('sea', ugettext_lazy('Searching for candidates')), + ('vot', ugettext_lazy('Voting')), + ('fin', ugettext_lazy('Finished')), ) - name = models.CharField(max_length=100, verbose_name=_("Name")) - description = models.TextField(null=True, blank=True, verbose_name=_("Description")) - posts = models.PositiveSmallIntegerField(verbose_name=_("Number of available posts")) + name = models.CharField(max_length=100, verbose_name=ugettext_lazy("Name")) + description = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Description")) + posts = models.PositiveSmallIntegerField(verbose_name=ugettext_lazy("Number of available posts")) polldescription = models.CharField( max_length=100, null=True, blank=True, - verbose_name=_("Comment on the ballot paper")) + verbose_name=ugettext_lazy("Comment on the ballot paper")) status = models.CharField(max_length=3, choices=STATUS, default='sea') def set_status(self, status): @@ -240,9 +240,8 @@ class Assignment(models.Model, SlideMixin): class Meta: permissions = ( ('can_see_assignment', ugettext_noop("Can see assignment")), - ('can_nominate_other', - ugettext_noop("Can nominate another person")), - ('can_nominate_self', ugettext_noop("Can nominate themselves")), + ('can_nominate_other', ugettext_noop("Can nominate another person")), + ('can_nominate_self', ugettext_noop("Can nominate oneself")), ('can_manage_assignment', ugettext_noop("Can manage assignment")), ) ordering = ('name',) diff --git a/openslides/assignment/signals.py b/openslides/assignment/signals.py index 9f2490d82..e8a7c716e 100644 --- a/openslides/assignment/signals.py +++ b/openslides/assignment/signals.py @@ -12,7 +12,7 @@ from django.dispatch import receiver from django import forms -from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from openslides.config.signals import config_signal from openslides.config.api import ConfigVariable, ConfigPage @@ -28,19 +28,19 @@ def setup_assignment_config_page(sender, **kwargs): default_value=False, form_field=forms.BooleanField( required=False, - label=_('Only publish voting results for selected winners ' - '(Projector view only)'))) + label=ugettext_lazy('Only publish voting results for selected ' + 'winners (Projector view only)'))) assignment_pdf_ballot_papers_selection = ConfigVariable( name='assignment_pdf_ballot_papers_selection', default_value='CUSTOM_NUMBER', form_field=forms.ChoiceField( widget=forms.Select(), required=False, - label=_('Number of ballot papers (selection)'), + label=ugettext_lazy('Number of ballot papers (selection)'), choices=( - ('NUMBER_OF_DELEGATES', _('Number of all delegates')), - ('NUMBER_OF_ALL_PARTICIPANTS', _('Number of all participants')), - ('CUSTOM_NUMBER', _('Use the following custom number'))))) + ('NUMBER_OF_DELEGATES', ugettext_lazy('Number of all delegates')), + ('NUMBER_OF_ALL_PARTICIPANTS', ugettext_lazy('Number of all participants')), + ('CUSTOM_NUMBER', ugettext_lazy('Use the following custom number'))))) assignment_pdf_ballot_papers_number = ConfigVariable( name='assignment_pdf_ballot_papers_number', default_value=8, @@ -48,32 +48,32 @@ def setup_assignment_config_page(sender, **kwargs): widget=forms.TextInput(attrs={'class': 'small-input'}), required=False, min_value=1, - label=_('Custom number of ballot papers'))) + label=ugettext_lazy('Custom number of ballot papers'))) assignment_pdf_title = ConfigVariable( name='assignment_pdf_title', default_value=_('Elections'), form_field=forms.CharField( widget=forms.TextInput(), required=False, - label=_('Title for PDF document (all elections)'))) + label=ugettext_lazy('Title for PDF document (all elections)'))) assignment_pdf_preamble = ConfigVariable( name='assignment_pdf_preamble', default_value='', form_field=forms.CharField( widget=forms.Textarea(), required=False, - label=_('Preamble text for PDF document (all elections)'))) + label=ugettext_lazy('Preamble text for PDF document (all elections)'))) assignment_poll_vote_values = ConfigVariable( name='assignment_poll_vote_values', default_value='auto', form_field=forms.ChoiceField( widget=forms.Select(), required=False, - label=_('Election method'), + label=ugettext_lazy('Election method'), choices=( - ('auto', _('Automatic assign of method.')), - ('votes', _('Always one option per candidate.')), - ('yesnoabstain', _('Always Yes-No-Abstain per candidate.'))))) + ('auto', ugettext_lazy('Automatic assign of method')), + ('votes', ugettext_lazy('Always one option per candidate')), + ('yesnoabstain', ugettext_lazy('Always Yes-No-Abstain per candidate'))))) return ConfigPage(title=ugettext_noop('Elections'), url='assignment', diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index c8582bca7..a4bee73c5 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -31,7 +31,7 @@ from openslides.utils.utils import ( from openslides.utils.views import FormView, DeleteView, PDFView, RedirectView from openslides.utils.person import get_person from openslides.config.api import config -from openslides.participant.models import User +from openslides.participant.models import User, Group from openslides.projector.projector import Widget from openslides.poll.views import PollFormView from openslides.agenda.models import Item @@ -564,7 +564,12 @@ class AssignmentPollPDF(PDFView): # set number of ballot papers if ballot_papers_selection == "NUMBER_OF_DELEGATES": - number = User.objects.filter(type__iexact="delegate").count() + try: + if Group.objects.get(pk=3): + number = User.objects.filter(groups__pk=3).count() + except Group.DoesNotExist: + number = 0 + elif ballot_papers_selection == "NUMBER_OF_ALL_PARTICIPANTS": number = int(User.objects.count()) else: # ballot_papers_selection == "CUSTOM_NUMBER" diff --git a/openslides/config/templates/config/config_form.html b/openslides/config/templates/config/config_form.html index 75291cf54..0fc66c08d 100644 --- a/openslides/config/templates/config/config_form.html +++ b/openslides/config/templates/config/config_form.html @@ -1,7 +1,6 @@ {% extends 'base.html' %} {% load i18n %} - {% load staticfiles %} {% block content %} @@ -12,7 +11,7 @@
          diff --git a/openslides/config/views.py b/openslides/config/views.py index 3b9782a15..1f140845f 100644 --- a/openslides/config/views.py +++ b/openslides/config/views.py @@ -13,7 +13,7 @@ from django import forms from django.core.urlresolvers import reverse from django.contrib import messages -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy from openslides.utils.views import FormView from openslides.utils.template import Tab @@ -115,7 +115,7 @@ class ConfigView(FormView): """ for key in form.cleaned_data: config[key] = form.cleaned_data[key] - messages.success(self.request, _('%s settings successfully saved.' % self.config_page.title)) + messages.success(self.request, _('%s settings successfully saved.') % _(self.config_page.title)) return super(ConfigView, self).form_valid(form) diff --git a/openslides/core/signals.py b/openslides/core/signals.py index 4f7da8405..75b52a853 100644 --- a/openslides/core/signals.py +++ b/openslides/core/signals.py @@ -12,7 +12,7 @@ from django.dispatch import Signal, receiver from django import forms -from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from openslides.config.signals import config_signal from openslides.config.api import ConfigVariable, ConfigGroup, ConfigGroupedPage diff --git a/openslides/core/templates/core/version.html b/openslides/core/templates/core/version.html index 5cb717756..00a730a16 100644 --- a/openslides/core/templates/core/version.html +++ b/openslides/core/templates/core/version.html @@ -5,7 +5,20 @@ {% block title %}{{ block.super }} – {% trans 'Version' %}{% endblock %} {% block content %} -

          {% trans 'Versions' %}

          +

          + {% trans 'Version' %} + {% trans active_config_page.title %} + +
          +
          + {% for config_page_dict in config_pages_list %} + {% trans config_page_dict.config_page.title %} + {% endfor %} + {% trans 'Version' %} +
          +
          +
          +

          {% for version in versions %}

          {{ version.0 }} {% trans "Version" %}: {{ version.1 }}

          {% endfor %} diff --git a/openslides/core/views.py b/openslides/core/views.py index 8d0384deb..90434f3c3 100644 --- a/openslides/core/views.py +++ b/openslides/core/views.py @@ -15,6 +15,7 @@ from django.utils.importlib import import_module from openslides import get_version, get_git_commit_id, RELEASE from openslides.utils.views import TemplateView +from .signals import config_signal class VersionView(TemplateView): @@ -35,6 +36,13 @@ class VersionView(TemplateView): openslides_version_string += ' Commit: %s' % get_git_commit_id() context['versions'] = [('OpenSlides', openslides_version_string)] + # collect other config pages + config_pages_list = [] + for receiver, config_page in config_signal.send(sender=self): + if config_page.is_shown(): + config_pages_list.append({'config_page': config_page}) + context['config_pages_list'] = sorted(config_pages_list, key=lambda config_page_dict: config_page_dict['config_page'].weight) + # Versions of plugins. for plugin in settings.INSTALLED_PLUGINS: try: diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index 37edec9d41c283ae11b40016624d7d2d7d90dd51..d030ece5642de5cdab69fcab062c8ee3c4791754 100644 GIT binary patch literal 35525 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 YiLjIVWkOU@~Nys)CGFc!jdd{4lGlx0L(0$Gf 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 diff --git a/openslides/locale/de/LC_MESSAGES/django.po b/openslides/locale/de/LC_MESSAGES/django.po index 7519c4249..d9ddec3b5 100644 --- a/openslides/locale/de/LC_MESSAGES/django.po +++ b/openslides/locale/de/LC_MESSAGES/django.po @@ -1,13 +1,13 @@ # German translations for OpenSlides package. # Copyright (C) 2011-2013 by OpenSlides team, see AUTHORS. # This file is distributed under the same license as the OpenSlides package. -# Oskar Hahn , 2012. +# Emanuel Schütze , 2013. # msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-11 22:34+0100\n" +"POT-Creation-Date: 2013-04-23 21:38+0200\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n" "Last-Translator: Emanuel Schuetze \n" "Language-Team: support@openslides.de\n" @@ -17,22 +17,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: global_settings.py:32 -msgid "default" -msgstr "" - -#: global_settings.py:36 +#: global_settings.py:33 msgid "German" msgstr "Deutsch" -#: global_settings.py:37 +#: global_settings.py:34 msgid "English" msgstr "Englisch" -#: global_settings.py:38 +#: global_settings.py:35 msgid "French" msgstr "Französisch" +#: account/views.py:60 +msgid "My motions and elections" +msgstr "Meine Anträge und Wahlen" + +#: account/templates/account/personal_info_widget.html:5 +msgid "I submitted the following motions:" +msgstr "Ich habe folgende Anträge gestellt:" + +#: account/templates/account/personal_info_widget.html:9 +#: account/templates/account/personal_info_widget.html:28 +#: motion/templates/motion/widget.html:19 +msgid "motion" +msgstr "Antrag" + +#: account/templates/account/personal_info_widget.html:13 +#: account/templates/account/personal_info_widget.html:32 +#: motion/templates/motion/motion_detail.html:17 +#: motion/templates/motion/motion_diff.html:22 +#: motion/templates/motion/widget.html:23 +#: motion/templates/projector/Motion.html:65 +msgid "no number" +msgstr "ohne Nummer" + +#: account/templates/account/personal_info_widget.html:17 +#: account/templates/account/personal_info_widget.html:36 +#: account/templates/account/personal_info_widget.html:47 +msgid "None" +msgstr "Keine" + +#: account/templates/account/personal_info_widget.html:24 +msgid "I support the following motions:" +msgstr "Ich unterstütze folgende Anträge:" + +#: account/templates/account/personal_info_widget.html:43 +msgid "I am candidate for the following elections:" +msgstr "Ich bin Kandidat/in bei folgenden Wahlen:" + #: agenda/forms.py:29 msgid "Parent item" msgstr "Elternelement" @@ -41,71 +74,102 @@ msgstr "Elternelement" msgid "Invalid format. Hours from 0 to 99 and minutes from 00 to 59" msgstr "Ungültiges Format. Stunden von 0 bis 99 und Minuten von 00 bis 59" -#: agenda/forms.py:36 agenda/models.py:52 +#: agenda/forms.py:36 agenda/models.py:84 msgid "Duration (hh:mm)" msgstr "Dauer (hh:mm)" -#: agenda/forms.py:70 -msgid "Begin of event" -msgstr "Beginn der Veranstaltung" +#: agenda/forms.py:69 +msgid "Add participant" +msgstr "Neue/n Teilnehmer/in hinzufügen" -#: agenda/models.py:38 +#: agenda/forms.py:82 +#, python-format +msgid "%s is already on the list of speakers." +msgstr "%s ist bereits auf der Rednerliste" + +#: agenda/models.py:41 msgid "Agenda item" msgstr "Tagesordnungseintrag" -#: agenda/models.py:39 +#: agenda/models.py:42 msgid "Organizational item" msgstr "Organisatorischer Eintrag" -#: agenda/models.py:42 config/forms.py:59 motion/forms.py:31 -#: motion/models.py:466 projector/models.py:29 +#: agenda/models.py:44 core/signals.py:76 mediafile/models.py:32 +#: mediafile/templates/mediafile/mediafile_list.html:18 motion/forms.py:33 +#: motion/models.py:565 participant/models.py:39 participant/views.py:182 +#: participant/templates/participant/overview.html:62 projector/models.py:27 msgid "Title" msgstr "Titel" -#: agenda/models.py:43 motion/forms.py:34 motion/models.py:469 -#: projector/models.py:30 +#: agenda/models.py:49 motion/forms.py:38 motion/models.py:568 +#: projector/models.py:28 msgid "Text" msgstr "Text" -#: agenda/models.py:44 agenda/templates/agenda/overview.html:90 -#: agenda/templates/agenda/view.html:37 participant/models.py:60 -#: participant/templates/participant/overview.html:106 -#: participant/templates/participant/user_detail.html:49 +#: agenda/models.py:54 agenda/templates/agenda/overview.html:90 +#: agenda/templates/agenda/view.html:56 participant/models.py:51 +#: participant/templates/participant/overview.html:69 +#: participant/templates/participant/user_detail.html:47 msgid "Comment" msgstr "Kommentar" -#: agenda/models.py:45 +#: agenda/models.py:59 msgid "Closed" msgstr "Abgeschlossen" -#: agenda/models.py:46 agenda/templates/agenda/overview.html:99 -#: projector/models.py:31 +#: agenda/models.py:64 agenda/templates/agenda/overview.html:99 +#: projector/models.py:29 msgid "Weight" msgstr "Gewichtung" -#: agenda/models.py:50 participant/views.py:245 -#: participant/templates/participant/overview.html:69 -#: participant/templates/participant/overview.html:103 -#: participant/templates/participant/user_detail.html:33 +#: agenda/models.py:76 mediafile/templates/mediafile/mediafile_list.html:19 msgid "Type" msgstr "Typ" -#: agenda/models.py:185 +#: agenda/models.py:97 +msgid "List of speakers is closed" +msgstr "Rednerliste ist geschlossen" + +#: agenda/models.py:162 +#: agenda/templates/agenda/overlay_speaker_projector.html:20 +#: agenda/templates/agenda/overlay_speaker_widget.html:5 +#: agenda/templates/agenda/view.html:62 +msgid "List of speakers" +msgstr "Rednerliste" + +#: agenda/models.py:236 msgid "Can see agenda" msgstr "Darf die Tagesordnung sehen" -#: agenda/models.py:186 +#: agenda/models.py:237 msgid "Can manage agenda" msgstr "Darf die Tagesordung verwalten" -#: agenda/models.py:187 +#: agenda/models.py:238 msgid "Can see orga items and time scheduling of agenda" msgstr "Darf Organisationspunkte und Tagesordnung-Zeitplan sehen" -#: agenda/models.py:195 agenda/slides.py:20 agenda/views.py:210 -#: agenda/views.py:211 agenda/views.py:248 agenda/views.py:262 -#: agenda/templates/agenda/config.html:68 -#: agenda/templates/agenda/overview.html:8 +#: agenda/models.py:248 +#, python-format +msgid "%(person)s is already on the list of speakers of item %(id)s." +msgstr "%(person)s ist bereits auf der Rednerliste von Eintrag %(id)s." + +#: agenda/models.py:283 +msgid "Can put oneself on the list of speakers" +msgstr "Darf sich selbst auf die Rednerliste setzen" + +#: agenda/signals.py:43 +msgid "Begin of event" +msgstr "Beginn der Veranstaltung" + +#: agenda/signals.py:44 +msgid "Input format: DD.MM.YYYY HH:MM" +msgstr "Eingabeformat: TT.MM.JJJJ HH:MM" + +#: agenda/signals.py:52 agenda/slides.py:23 agenda/slides.py:29 +#: agenda/views.py:243 agenda/views.py:244 agenda/views.py:469 +#: agenda/views.py:484 agenda/templates/agenda/overview.html:8 #: agenda/templates/agenda/overview.html:55 #: agenda/templates/agenda/overview.html:105 #: agenda/templates/projector/AgendaSummary.html:6 @@ -113,257 +177,90 @@ msgstr "Darf Organisationspunkte und Tagesordnung-Zeitplan sehen" msgid "Agenda" msgstr "Tagesordnung" -#: agenda/views.py:90 +#: agenda/views.py:93 msgid "You are not authorized to manage the agenda." msgstr "Sie sind nicht berechtigt die Tagesordnung zu ändern." -#: agenda/views.py:106 +#: agenda/views.py:109 msgid "Errors when reordering of the agenda" msgstr "Fehler beim Neusortieren der Tagesordnung" -#: agenda/views.py:188 +#: agenda/views.py:219 msgid "Yes, with all child items." msgstr "Ja, mit allen Kindelementen." -#: agenda/views.py:196 +#: agenda/views.py:228 #, python-format msgid "Item %s and his children were successfully deleted." msgstr "Eintrag %s und seine Kindelemente wurde erfolgreich gelöscht." -#: agenda/views.py:201 +#: agenda/views.py:234 #, python-format msgid "Item %s was successfully deleted." msgstr "Eintrag %s wurde erfolgreich gelöscht." -#: agenda/views.py:239 -msgid "Agenda settings successfully saved." -msgstr "Tagesordnung Einstellungen erfolgreich gespeichert." +#: agenda/views.py:269 +msgid "The list of speakers is closed." +msgstr "Die Rednerliste ist geschlossen." -#: agenda/templates/agenda/config.html:20 -msgid "January" -msgstr "Januar" +#: agenda/views.py:298 +msgid "You are not on the list of speakers." +msgstr "Sie stehen nicht auf der Rednerliste." -#: agenda/templates/agenda/config.html:20 -msgid "February" -msgstr "Februar" +#: agenda/views.py:321 +msgid "Do you really want to remove yourself from the list of speakers?" +msgstr "Wollen Sie sich wirklich von der Rednerliste entfernen?" -#: agenda/templates/agenda/config.html:20 -msgid "March" -msgstr "März" +#: agenda/views.py:342 +#, python-format +msgid "%(person)s is not on the list of %(item)s." +msgstr "%(person)s ist nicht auf der Rednerliste von %(item)s." -#: agenda/templates/agenda/config.html:21 -msgid "April" -msgstr "April" +#: agenda/views.py:407 +msgid "Could not change order. Invalid data." +msgstr "Die Reihenfolge kann nicht verändert werden. Ungültige Daten." -#: agenda/templates/agenda/config.html:21 -#: agenda/templates/agenda/config.html:27 -msgid "May" -msgstr "Mai" +#: agenda/views.py:443 +msgid "" +"There is no list of speakers for the current slide. Please choose the agenda " +"item manually from the agenda." +msgstr "" +"Es existiert keine Rednerliste für die aktuelle Folie. Bitte wähle den " +"Tagesordnungseintrag manuell von der Tagesordnung." -#: agenda/templates/agenda/config.html:21 -msgid "June" -msgstr "Juni" +#: agenda/views.py:451 +msgid "You are already on the list of speakers." +msgstr "Sie stehen bereits auf der Rednerliste." -#: agenda/templates/agenda/config.html:22 -msgid "July" -msgstr "Juli" +#: agenda/views.py:453 +msgid "You are now on the list of speakers." +msgstr "Sie stehen jetzt auf der Rednerliste." -#: agenda/templates/agenda/config.html:22 -msgid "August" -msgstr "August" +#: agenda/views.py:455 +msgid "You can not put yourself on the list of speakers." +msgstr "Sie können sich nicht selbst auf die Rednerliste setzen." -#: agenda/templates/agenda/config.html:22 -msgid "September" -msgstr "September" - -#: agenda/templates/agenda/config.html:23 -msgid "October" -msgstr "Oktober" - -#: agenda/templates/agenda/config.html:23 -msgid "November" -msgstr "November" - -#: agenda/templates/agenda/config.html:23 -msgid "December" -msgstr "Dezember" - -#: agenda/templates/agenda/config.html:26 -msgid "Jan" -msgstr "Jan" - -#: agenda/templates/agenda/config.html:26 -msgid "Feb" -msgstr "Feb" - -#: agenda/templates/agenda/config.html:26 -msgid "Mar" -msgstr "Mär" - -#: agenda/templates/agenda/config.html:27 -msgid "Apr" -msgstr "Apr" - -#: agenda/templates/agenda/config.html:27 -msgid "Jun" -msgstr "Jun" - -#: agenda/templates/agenda/config.html:28 -msgid "Jul" -msgstr "Jul" - -#: agenda/templates/agenda/config.html:28 -msgid "Aug" -msgstr "Aug" - -#: agenda/templates/agenda/config.html:28 -msgid "Sep" -msgstr "Sep" - -#: agenda/templates/agenda/config.html:29 -msgid "Oct" -msgstr "Okt" - -#: agenda/templates/agenda/config.html:29 -msgid "Nov" -msgstr "Nov" - -#: agenda/templates/agenda/config.html:29 -msgid "Dec" -msgstr "Dez" - -#: agenda/templates/agenda/config.html:32 -msgid "Sunday" -msgstr "Sonntag" - -#: agenda/templates/agenda/config.html:32 -msgid "Monday" -msgstr "Montag" - -#: agenda/templates/agenda/config.html:32 -msgid "Tuesdey" -msgstr "Dienstag" - -#: agenda/templates/agenda/config.html:32 -msgid "Wednesday" -msgstr "Mittwoch" - -#: agenda/templates/agenda/config.html:33 -msgid "Thursday" -msgstr "Donnerstag" - -#: agenda/templates/agenda/config.html:33 -msgid "Friday" -msgstr "Freitag" - -#: agenda/templates/agenda/config.html:33 -msgid "Saturday" -msgstr "Samstag" - -#: agenda/templates/agenda/config.html:36 -#: agenda/templates/agenda/config.html:40 -msgid "Su" -msgstr "So" - -#: agenda/templates/agenda/config.html:36 -#: agenda/templates/agenda/config.html:40 -msgid "Mo" -msgstr "Mo" - -#: agenda/templates/agenda/config.html:36 -#: agenda/templates/agenda/config.html:40 -msgid "Tu" -msgstr "Di" - -#: agenda/templates/agenda/config.html:36 -#: agenda/templates/agenda/config.html:40 -msgid "We" -msgstr "Mi" - -#: agenda/templates/agenda/config.html:37 -#: agenda/templates/agenda/config.html:41 -msgid "Th" -msgstr "Do" - -#: agenda/templates/agenda/config.html:37 -#: agenda/templates/agenda/config.html:41 -msgid "Fr" -msgstr "Fr" - -#: agenda/templates/agenda/config.html:37 -#: agenda/templates/agenda/config.html:41 -msgid "Sa" -msgstr "Sa" - -#: agenda/templates/agenda/config.html:52 -msgid "Time" -msgstr "Zeit" - -#: agenda/templates/agenda/config.html:53 -msgid "Hour" -msgstr "Stunde" - -#: agenda/templates/agenda/config.html:54 -msgid "Minute" -msgstr "Minute" - -#: agenda/templates/agenda/config.html:55 -msgid "current time" -msgstr "aktuelle Zeit" - -#: agenda/templates/agenda/config.html:56 -msgid "close" -msgstr "Schließen" - -#: agenda/templates/agenda/config.html:63 -msgid "Agenda settings" -msgstr "Tagesordnungs-Einstellungen" - -#: agenda/templates/agenda/config.html:68 -#: assignment/templates/assignment/config.html:9 config/views.py:111 -#: config/templates/config/general.html:9 -#: motion/templates/motion/config.html:9 -#: participant/templates/participant/config.html:9 -msgid "Configuration" -msgstr "Konfiguration" - -#: agenda/templates/agenda/config.html:75 -#: assignment/templates/assignment/poll_view.html:80 -#: motion/templates/motion/motion_form.html:14 -#: motion/templates/motion/poll_form.html:38 -#: projector/templates/projector/select_widgets.html:28 -#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 -msgid "Save" -msgstr "Speichern" - -#: agenda/templates/agenda/config.html:79 agenda/templates/agenda/edit.html:30 -#: assignment/templates/assignment/config.html:18 -#: assignment/templates/assignment/edit.html:31 -#: assignment/templates/assignment/poll_view.html:86 -#: config/templates/config/general.html:70 -#: motion/templates/motion/config.html:18 -#: motion/templates/motion/motion_form.html:21 -#: motion/templates/motion/poll_form.html:44 -#: participant/templates/participant/config.html:18 -#: participant/templates/participant/edit.html:36 -#: participant/templates/participant/group_edit.html:31 -#: participant/templates/participant/import.html:33 -msgid "Cancel" -msgstr "Abbrechen" +#: agenda/views.py:495 +msgid "To the current list of speakers" +msgstr "Zur aktuellen Rednerliste" #: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:17 -#: agenda/templates/agenda/view.html:20 +#: agenda/templates/agenda/view.html:37 msgid "Edit item" msgstr "Eintrag bearbeiten" #: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:19 -#: agenda/templates/agenda/overview.html:72 +#: agenda/templates/agenda/overview.html:58 msgid "New item" msgstr "Neuer Eintrag" -#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:12 +#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:29 #: assignment/templates/assignment/edit.html:22 #: assignment/templates/assignment/view.html:20 +#: mediafile/templates/mediafile/mediafile_form.html:22 +#: motion/templates/motion/category_list.html:15 +#: motion/templates/motion/motion_detail.html:24 +#: motion/templates/motion/motion_form.html:37 #: participant/templates/participant/edit.html:22 #: participant/templates/participant/group_detail.html:12 #: participant/templates/participant/group_edit.html:22 @@ -374,16 +271,29 @@ msgstr "Neuer Eintrag" msgid "Back to overview" msgstr "Zurück zur Übersicht" +#: agenda/templates/agenda/edit.html:30 +#: assignment/templates/assignment/edit.html:31 +#: assignment/templates/assignment/poll_view.html:86 +#: config/templates/config/config_form.html:45 +#: mediafile/templates/mediafile/mediafile_form.html:33 +#: motion/templates/motion/category_form.html:28 +#: motion/templates/motion/motion_form.html:46 +#: motion/templates/motion/poll_form.html:73 +#: participant/templates/participant/edit.html:36 +#: participant/templates/participant/group_edit.html:31 +#: participant/templates/participant/import.html:39 +msgid "Cancel" +msgstr "Abbrechen" + #: agenda/templates/agenda/edit.html:33 -#: assignment/templates/assignment/config.html:21 #: assignment/templates/assignment/edit.html:34 -#: config/templates/config/general.html:73 -#: motion/templates/motion/config.html:21 -#: motion/templates/motion/motion_form.html:24 -#: participant/templates/participant/config.html:21 +#: config/templates/config/config_form.html:47 +#: mediafile/templates/mediafile/mediafile_form.html:35 +#: motion/templates/motion/category_form.html:31 +#: motion/templates/motion/motion_form.html:49 #: participant/templates/participant/edit.html:39 #: participant/templates/participant/group_edit.html:34 -#: participant/templates/participant/import.html:36 +#: participant/templates/participant/import.html:42 #: projector/templates/projector/new.html:19 msgid "required" msgstr "erforderlich" @@ -392,20 +302,22 @@ msgstr "erforderlich" msgid "Change status (open/closed)" msgstr "Status ändern (offen/abgeschlossen)" -#: agenda/templates/agenda/item_row.html:32 +#: agenda/templates/agenda/item_row.html:34 msgid "End" msgstr "Ende" #: agenda/templates/agenda/item_row.html:42 #: agenda/templates/agenda/overview.html:117 -#: agenda/templates/agenda/view.html:26 agenda/templates/agenda/widget.html:6 -#: agenda/templates/agenda/widget.html:19 +#: agenda/templates/agenda/view.html:45 agenda/templates/agenda/widget.html:8 +#: agenda/templates/agenda/widget.html:23 #: assignment/templates/assignment/overview.html:54 #: assignment/templates/assignment/widget.html:7 +#: motion/templates/motion/motion_detail.html:129 +#: motion/templates/motion/motion_list.html:82 #: motion/templates/motion/widget.html:7 #: participant/templates/participant/group_overview.html:29 #: participant/templates/participant/group_widget.html:8 -#: participant/templates/participant/overview.html:128 +#: participant/templates/participant/overview.html:115 #: participant/templates/participant/user_widget.html:7 #: projector/templates/projector/custom_slide_widget.html:6 #: projector/templates/projector/custom_slide_widget.html:19 @@ -413,77 +325,99 @@ msgid "Show" msgstr "Anzeigen" #: agenda/templates/agenda/item_row.html:47 -#: agenda/templates/agenda/widget.html:22 +#: agenda/templates/agenda/widget.html:26 #: assignment/templates/assignment/overview.html:59 -#: assignment/templates/assignment/view.html:172 +#: assignment/templates/assignment/view.html:170 #: assignment/templates/assignment/widget.html:10 +#: mediafile/templates/mediafile/mediafile_list.html:37 +#: motion/templates/motion/category_list.html:30 +#: motion/templates/motion/motion_list.html:87 #: motion/templates/motion/widget.html:10 #: participant/templates/participant/group_overview.html:33 #: participant/templates/participant/group_widget.html:11 -#: participant/templates/participant/overview.html:132 +#: participant/templates/participant/overview.html:119 #: participant/templates/participant/user_widget.html:10 #: projector/templates/projector/custom_slide_widget.html:26 msgid "Edit" msgstr "Bearbeiten" #: agenda/templates/agenda/item_row.html:50 +#: agenda/templates/agenda/view.html:100 agenda/templates/agenda/view.html:114 +#: agenda/templates/agenda/view.html:147 #: assignment/templates/assignment/overview.html:62 -#: assignment/templates/assignment/view.html:173 +#: assignment/templates/assignment/view.html:171 +#: mediafile/templates/mediafile/mediafile_list.html:38 +#: motion/templates/motion/category_list.html:33 +#: motion/templates/motion/motion_detail.html:133 +#: motion/templates/motion/motion_list.html:91 #: participant/templates/participant/group_overview.html:37 -#: participant/templates/participant/overview.html:136 +#: participant/templates/participant/overview.html:123 #: projector/templates/projector/custom_slide_widget.html:23 msgid "Delete" msgstr "Löschen" #: agenda/templates/agenda/item_row.html:54 -#: agenda/templates/agenda/widget.html:29 +#: agenda/templates/agenda/widget.html:40 msgid "Show summary for this item" msgstr "Zusammenfassung für diesen Eintrag anzeigen" +#: agenda/templates/agenda/overlay_speaker_projector.html:27 +#: agenda/templates/agenda/view.html:153 +#: agenda/templates/projector/agenda_list_of_speaker.html:32 +msgid "The list of speakers is empty." +msgstr "Die Rednerliste ist leer." + #: agenda/templates/agenda/overview.html:47 msgid "Do you want to save the changed order of agenda items?" msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?" -#: agenda/templates/agenda/overview.html:49 assignment/models.py:291 -#: assignment/views.py:589 assignment/templates/assignment/view.html:206 -#: assignment/templates/assignment/view.html:210 +#: agenda/templates/agenda/overview.html:49 +#: agenda/templates/agenda/view.html:130 assignment/models.py:288 +#: assignment/views.py:593 assignment/templates/assignment/view.html:204 +#: assignment/templates/assignment/view.html:208 #: assignment/templates/projector/Assignment.html:78 -#: assignment/templates/projector/Assignment.html:82 motion/models.py:617 -#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:66 -#: motion/templates/projector/Motion.html:37 utils/utils.py:45 +#: assignment/templates/projector/Assignment.html:82 motion/models.py:725 +#: motion/pdf.py:147 motion/pdf.py:269 +#: motion/templates/motion/motion_detail.html:210 +#: motion/templates/projector/Motion.html:37 utils/utils.py:46 #: utils/views.py:146 msgid "Yes" msgstr "Ja" -#: agenda/templates/agenda/overview.html:50 assignment/models.py:291 -#: assignment/views.py:590 assignment/templates/assignment/view.html:207 -#: assignment/templates/projector/Assignment.html:79 motion/models.py:617 -#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:67 -#: motion/templates/projector/Motion.html:38 utils/utils.py:45 +#: agenda/templates/agenda/overview.html:50 +#: agenda/templates/agenda/view.html:131 assignment/models.py:288 +#: assignment/views.py:594 assignment/templates/assignment/view.html:205 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:725 +#: motion/pdf.py:147 motion/pdf.py:270 +#: motion/templates/motion/motion_detail.html:211 +#: motion/templates/projector/Motion.html:38 utils/utils.py:46 #: utils/views.py:146 msgid "No" msgstr "Nein" -#: agenda/templates/agenda/overview.html:60 -msgid "Start of event" -msgstr "Beginn der Veranstaltung" - -#: agenda/templates/agenda/overview.html:64 -msgid "Estimated end" -msgstr "Voraussichtliches Ende" - -#: agenda/templates/agenda/overview.html:72 +#: agenda/templates/agenda/overview.html:58 #: assignment/templates/assignment/overview.html:12 +#: mediafile/templates/mediafile/mediafile_list.html:12 +#: motion/templates/motion/category_list.html:13 +#: motion/templates/motion/motion_list.html:14 #: participant/templates/participant/group_overview.html:11 -#: participant/templates/participant/overview.html:20 +#: participant/templates/participant/overview.html:26 #: projector/templates/projector/custom_slide_widget.html:39 msgid "New" msgstr "Neu" -#: agenda/templates/agenda/overview.html:74 +#: agenda/templates/agenda/overview.html:60 msgid "Print agenda as PDF" msgstr "Tagesordnung als PDF drucken" +#: agenda/templates/agenda/overview.html:68 +msgid "Start of event" +msgstr "Beginn der Veranstaltung" + +#: agenda/templates/agenda/overview.html:72 +msgid "Estimated end" +msgstr "Voraussichtliches Ende" + #: agenda/templates/agenda/overview.html:79 msgid "Hide closed items" msgstr "Verstecke abgeschlossene Einträge" @@ -499,34 +433,104 @@ msgid "Item" msgstr "Eintrag" #: agenda/templates/agenda/overview.html:93 -#, fuzzy msgid "Duration" -msgstr "Dauer (hh:mm)" +msgstr "Dauer" #: agenda/templates/agenda/overview.html:96 #: assignment/templates/assignment/overview.html:38 +#: mediafile/templates/mediafile/mediafile_list.html:24 +#: motion/templates/motion/category_list.html:23 +#: motion/templates/motion/motion_detail.html:103 +#: motion/templates/motion/motion_list.html:62 #: participant/templates/participant/group_overview.html:19 -#: participant/templates/participant/overview.html:108 +#: participant/templates/participant/overview.html:71 msgid "Actions" msgstr "Aktionen" #: agenda/templates/agenda/overview.html:133 -#: agenda/templates/agenda/widget.html:40 +#: agenda/templates/agenda/widget.html:51 #: projector/templates/projector/custom_slide_widget.html:34 msgid "No items available." msgstr "Keine Einträge vorhanden." -#: agenda/templates/agenda/view.html:15 +#: agenda/templates/agenda/speaker_widget.html:5 +msgid "Put me on the current list of speakers" +msgstr "Auf die aktuelle Rednerliste setzen" + +#: agenda/templates/agenda/view.html:33 #: assignment/templates/assignment/view.html:29 +#: motion/templates/motion/motion_detail.html:34 msgid "More actions" msgstr "Mehr Aktionen" -#: agenda/templates/agenda/view.html:21 +#: agenda/templates/agenda/view.html:38 msgid "Delete item" msgstr "Eintrag löschen" -#: agenda/templates/agenda/widget.html:9 -#: agenda/templates/agenda/widget.html:25 +#: agenda/templates/agenda/view.html:62 +msgid "closed" +msgstr "geschlossen" + +#: agenda/templates/agenda/view.html:66 +msgid "Open list" +msgstr "Liste öffnen" + +#: agenda/templates/agenda/view.html:68 +msgid "Close list" +msgstr "Liste schließen" + +#: agenda/templates/agenda/view.html:74 agenda/templates/agenda/widget.html:34 +msgid "Show list of speakers" +msgstr "Rednerliste projizieren" + +#: agenda/templates/agenda/view.html:76 +msgid "Show list" +msgstr "Liste projizieren" + +#: agenda/templates/agenda/view.html:84 +msgid "Last speakers" +msgstr "Letzte Redner" + +#: agenda/templates/agenda/view.html:88 +msgid "Show all speakers" +msgstr "Alle Redner anzeigen" + +#: agenda/templates/agenda/view.html:127 +msgid "Do you want to save the changed order of speakers?" +msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?" + +#: agenda/templates/agenda/view.html:138 +msgid "Next speakers:" +msgstr "Nächste Redner" + +#: agenda/templates/agenda/view.html:146 +msgid "Next speaker" +msgstr "Nächster Redner" + +#: agenda/templates/agenda/view.html:160 +msgid "Remove me from the list" +msgstr "Entferne mich von der Liste" + +#: agenda/templates/agenda/view.html:162 +msgid "Put me on the list" +msgstr "Setze mich auf die Liste" + +#: agenda/templates/agenda/view.html:173 +#: assignment/templates/assignment/poll_view.html:83 +#: assignment/templates/assignment/view.html:112 +#: motion/templates/motion/poll_form.html:70 +#: projector/templates/projector/overlay_message_widget.html:9 +#: templates/formbuttons_saveapply.html:7 +msgid "Apply" +msgstr "Übernehmen" + +#: agenda/templates/agenda/view.html:175 +#: assignment/templates/assignment/view.html:114 +msgid "Add new participant" +msgstr "Neue/n Teilnehmer/in hinzufügen" + +#: agenda/templates/agenda/widget.html:11 +#: agenda/templates/agenda/widget.html:29 #: assignment/templates/assignment/widget.html:13 #: motion/templates/motion/widget.html:13 #: participant/templates/participant/group_widget.html:14 @@ -536,8 +540,8 @@ msgstr "Eintrag löschen" msgid "Preview" msgstr "Vorschau" -#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:383 -#: assignment/templates/assignment/view.html:275 +#: assignment/forms.py:24 assignment/models.py:49 assignment/views.py:382 +#: assignment/templates/assignment/view.html:273 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" msgstr "Anzahl der zur Wahl stehenden Posten" @@ -546,181 +550,181 @@ msgstr "Anzahl der zur Wahl stehenden Posten" msgid "Nominate a participant" msgstr "Teilnehmer/in vorschlagen" -#: assignment/forms.py:41 -msgid "Only publish voting results for selected winners (Projector view only)" -msgstr "" -"Wahlergebnisse der nicht gewählten Kandidaten auf dem Projektor verbergen" - -#: assignment/forms.py:46 motion/forms.py:110 -msgid "Number of ballot papers (selection)" -msgstr "Anzahl der Stimmzettel (Vorauswahl)" - -#: assignment/forms.py:48 motion/forms.py:112 -msgid "Number of all delegates" -msgstr "Anzahl aller Delegierten" - -#: assignment/forms.py:49 motion/forms.py:113 -msgid "Number of all participants" -msgstr "Anzahl aller Teilnehmer/innen" - -#: assignment/forms.py:50 motion/forms.py:114 -msgid "Use the following custom number" -msgstr "Verwende die folgende benutzerdefinierte Anzahl" - -#: assignment/forms.py:55 motion/forms.py:121 -msgid "Custom number of ballot papers" -msgstr "Benutzerdefinierte Anzahl von Stimmzetteln" - -#: assignment/forms.py:59 -msgid "Title for PDF document (all elections)" -msgstr "Titel für PDF-Dokument (alle Wahlen)" - -#: assignment/forms.py:63 -msgid "Preamble text for PDF document (all elections)" -msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " - -#: assignment/forms.py:67 -msgid "Election method" -msgstr "Wahlmethode" - -#: assignment/forms.py:69 -msgid "Automatic assign of method." -msgstr "Automatische Zuordnung der Methode." - -#: assignment/forms.py:70 -msgid "Always one option per candidate." -msgstr "Eine Stimme pro Kandidat/in." - -#: assignment/forms.py:71 -msgid "Always Yes-No-Abstain per candidate." -msgstr "Ja, Nein, Enthaltung pro Kandidat/in." - -#: assignment/models.py:44 assignment/templates/assignment/overview.html:24 -#: assignment/templates/assignment/view.html:284 +#: assignment/models.py:42 assignment/templates/assignment/overview.html:24 +#: assignment/templates/assignment/view.html:282 msgid "Searching for candidates" msgstr "Auf Kandidatensuche" -#: assignment/models.py:45 assignment/templates/assignment/overview.html:25 -#: assignment/templates/assignment/view.html:288 +#: assignment/models.py:43 assignment/templates/assignment/overview.html:25 +#: assignment/templates/assignment/view.html:286 msgid "Voting" msgstr "Im Wahlvorgang" -#: assignment/models.py:46 assignment/templates/assignment/overview.html:26 -#: assignment/templates/assignment/view.html:292 +#: assignment/models.py:44 assignment/templates/assignment/overview.html:26 +#: assignment/templates/assignment/view.html:290 msgid "Finished" msgstr "Abgeschlossen" -#: assignment/models.py:49 +#: assignment/models.py:47 msgid "Name" msgstr "Name" -#: assignment/models.py:50 assignment/templates/assignment/view.html:57 -#: participant/models.py:144 +#: assignment/models.py:48 assignment/templates/assignment/view.html:57 +#: participant/models.py:139 msgid "Description" msgstr "Beschreibung" -#: assignment/models.py:54 +#: assignment/models.py:52 msgid "Comment on the ballot paper" msgstr "Kommentar für den Stimmzettel" -#: assignment/models.py:64 +#: assignment/models.py:62 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." -#: assignment/models.py:67 +#: assignment/models.py:65 #, python-format msgid "The assignment status is already %s." msgstr "Der Wahlstatus ist bereits %s." -#: assignment/models.py:80 +#: assignment/models.py:78 #, python-format msgid "%s is already a candidate." msgstr "%s ist bereits ein/e Kandidat/in." -#: assignment/models.py:82 assignment/views.py:196 +#: assignment/models.py:80 assignment/views.py:195 msgid "The candidate list is already closed." msgstr "Die Kandidatenliste ist bereits geschlossen." -#: assignment/models.py:89 +#: assignment/models.py:87 #, python-format msgid "%s does not want to be a candidate." msgstr "%s möchte nicht kandidieren." -#: assignment/models.py:103 +#: assignment/models.py:101 #, python-format msgid "%s is no candidate" msgstr "%s ist kein/e Kandidat/in" -#: assignment/models.py:244 +#: assignment/models.py:242 msgid "Can see assignment" msgstr "Darf Wahlen sehen" -#: assignment/models.py:246 +#: assignment/models.py:243 msgid "Can nominate another person" msgstr "Darf andere Personen für Wahlen vorschlagen" -#: assignment/models.py:247 -msgid "Can nominate themselves" +#: assignment/models.py:244 +msgid "Can nominate oneself" msgstr "Darf selbst für Wahlen kandidieren" -#: assignment/models.py:248 +#: assignment/models.py:245 msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:291 motion/models.py:617 +#: assignment/models.py:288 motion/models.py:725 msgid "Abstain" msgstr "Enthaltung" -#: assignment/models.py:293 motion/templates/motion/poll_form.html:16 +#: assignment/models.py:290 motion/templates/motion/poll_form.html:38 msgid "Votes" msgstr "Stimmen" -#: assignment/models.py:310 motion/models.py:631 +#: assignment/models.py:307 motion/models.py:739 #, python-format msgid "Ballot %d" msgstr "Wahlgang %d" -#: assignment/models.py:319 assignment/views.py:338 assignment/views.py:678 -#: assignment/views.py:693 assignment/templates/assignment/config.html:10 +#: assignment/signals.py:31 +msgid "Only publish voting results for selected winners (Projector view only)" +msgstr "" +"Wahlergebnisse der nicht gewählten Kandidaten auf dem Projektor verbergen" + +#: assignment/signals.py:39 motion/signals.py:58 +msgid "Number of ballot papers (selection)" +msgstr "Anzahl der Stimmzettel (Vorauswahl)" + +#: assignment/signals.py:41 motion/signals.py:60 +msgid "Number of all delegates" +msgstr "Anzahl aller Delegierten" + +#: assignment/signals.py:42 motion/signals.py:61 +msgid "Number of all participants" +msgstr "Anzahl aller Teilnehmer/innen" + +#: assignment/signals.py:43 motion/signals.py:62 +msgid "Use the following custom number" +msgstr "Verwende die folgende benutzerdefinierte Anzahl" + +#: assignment/signals.py:51 motion/signals.py:70 +msgid "Custom number of ballot papers" +msgstr "Benutzerdefinierte Anzahl von Stimmzetteln" + +#: assignment/signals.py:54 assignment/signals.py:78 assignment/views.py:337 +#: assignment/views.py:643 assignment/views.py:658 #: assignment/templates/assignment/overview.html:5 #: assignment/templates/assignment/overview.html:9 msgid "Elections" msgstr "Wahlen" -#: assignment/views.py:80 +#: assignment/signals.py:58 +msgid "Title for PDF document (all elections)" +msgstr "Titel für PDF-Dokument (alle Wahlen)" + +#: assignment/signals.py:65 +msgid "Preamble text for PDF document (all elections)" +msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " + +#: assignment/signals.py:72 +msgid "Election method" +msgstr "Wahlmethode" + +#: assignment/signals.py:74 +msgid "Automatic assign of method" +msgstr "Automatische Zuordnung der Methode" + +#: assignment/signals.py:75 +msgid "Always one option per candidate" +msgstr "Eine Stimme pro Kandidat/in" + +#: assignment/signals.py:76 +msgid "Always Yes-No-Abstain per candidate" +msgstr "Ja, Nein, Enthaltung pro Kandidat/in" + +#: assignment/views.py:79 #, python-format msgid "Candidate %s was nominated successfully." msgstr "Kandidat/in %s wurde erfolgreich vorgeschlagen." -#: assignment/views.py:122 +#: assignment/views.py:121 msgid "New election was successfully created." msgstr "Neue Wahl wurde erfolgreich angelegt." -#: assignment/views.py:124 +#: assignment/views.py:123 msgid "Election was successfully modified." msgstr "Wahl wurde erfolgreich geändert." -#: assignment/views.py:130 participant/views.py:501 participant/views.py:525 -#: utils/views.py:259 utils/views.py:281 utils/views.py:291 +#: assignment/views.py:129 participant/views.py:443 participant/views.py:467 +#: utils/views.py:273 utils/views.py:295 utils/views.py:305 msgid "Please check the form for errors." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." -#: assignment/views.py:150 +#: assignment/views.py:149 #, python-format msgid "Election %s was successfully deleted." msgstr "Wahl %s wurde erfolgreich gelöscht." -#: assignment/views.py:163 +#: assignment/views.py:162 #, python-format msgid "Election status was set to: %s." msgstr "Wahlstatus wurde gesetzt auf: %s." -#: assignment/views.py:176 +#: assignment/views.py:175 msgid "You have set your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich gesetzt." -#: assignment/views.py:193 +#: assignment/views.py:192 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -728,98 +732,98 @@ msgstr "" "Sie haben Ihre Kandidatur erfolgreich zurückgezogen. Sie können nun von " "anderen Teilnehmer/innen nicht mehr vorgeschlagen werden." -#: assignment/views.py:215 +#: assignment/views.py:214 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Die Kandidatur von %s wurde erfolgreich zurückgezogen." -#: assignment/views.py:217 +#: assignment/views.py:216 #, python-format msgid "%s was unblocked successfully." msgstr "%s wurde erfolgreich freigegeben." -#: assignment/views.py:221 +#: assignment/views.py:220 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Soll %s wirklich von der Wahl zurückgezogen werden?" -#: assignment/views.py:223 +#: assignment/views.py:222 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "Soll %s wirklich für die Wahl freigegeben werden?" -#: assignment/views.py:238 +#: assignment/views.py:237 msgid "New ballot was successfully created." msgstr "Neuer Wahlgang erfolgreich angelegt." -#: assignment/views.py:270 +#: assignment/views.py:269 #, python-format msgid "Ballot ID %d does not exist." msgstr "Wahlgang-ID %d existiert nicht." -#: assignment/views.py:277 +#: assignment/views.py:276 msgid "Ballot successfully published." msgstr "Wahlgang wurde erfolgreich veröffentlicht." -#: assignment/views.py:279 +#: assignment/views.py:278 msgid "Ballot successfully unpublished." msgstr "Wahlgang wurde erfolgreich unveröffentlicht." -#: assignment/views.py:292 +#: assignment/views.py:291 msgid "not elected" msgstr "nicht gewählt" -#: assignment/views.py:295 assignment/views.py:484 +#: assignment/views.py:294 assignment/views.py:483 #: assignment/templates/assignment/view.html:77 msgid "elected" msgstr "gewählt" -#: assignment/views.py:323 +#: assignment/views.py:322 msgid "Ballot was successfully deleted." msgstr "Abstimmung wurde erfolgreich gelöscht." -#: assignment/views.py:335 +#: assignment/views.py:334 msgid "Assignment" msgstr "Wahl" -#: assignment/views.py:358 assignment/templates/assignment/overview.html:74 +#: assignment/views.py:357 assignment/templates/assignment/overview.html:74 #: assignment/templates/assignment/widget.html:19 msgid "No assignments available." msgstr "Keine Wahlen vorhanden." -#: assignment/views.py:377 +#: assignment/views.py:376 #, python-format msgid "Election: %s" msgstr "Wahlen: %s" -#: assignment/views.py:390 assignment/views.py:426 +#: assignment/views.py:389 assignment/views.py:425 #: assignment/templates/assignment/overview.html:36 #: assignment/templates/assignment/poll_view.html:34 #: assignment/templates/assignment/view.html:66 -#: assignment/templates/assignment/view.html:157 +#: assignment/templates/assignment/view.html:155 #: assignment/templates/projector/Assignment.html:38 #: assignment/templates/projector/Assignment.html:56 msgid "Candidates" msgstr "Kandidaten/innen" -#: assignment/views.py:415 motion/pdf.py:120 -#: motion/templates/motion/motion_detail.html:46 +#: assignment/views.py:414 motion/pdf.py:133 +#: motion/templates/motion/motion_detail.html:197 msgid "Vote results" msgstr "Abstimmungsergebnis" -#: assignment/views.py:419 assignment/templates/assignment/poll_view.html:5 +#: assignment/views.py:418 assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/poll_view.html:11 -#: assignment/templates/assignment/view.html:152 -#: assignment/templates/assignment/view.html:160 +#: assignment/templates/assignment/view.html:150 +#: assignment/templates/assignment/view.html:158 #: assignment/templates/projector/Assignment.html:59 msgid "ballot" msgstr "Wahlgang" -#: assignment/views.py:422 +#: assignment/views.py:421 msgid "ballots" msgstr "Wahlgänge" -#: assignment/views.py:447 +#: assignment/views.py:446 #, python-format msgid "" "Y: %(YES)s\n" @@ -830,25 +834,25 @@ msgstr "" "N: %(NO)s\n" "E: %(ABSTAIN)s" -#: assignment/views.py:458 assignment/templates/assignment/poll_view.html:51 -#: assignment/templates/assignment/view.html:224 +#: assignment/views.py:457 assignment/templates/assignment/poll_view.html:51 +#: assignment/templates/assignment/view.html:222 #: assignment/templates/projector/Assignment.html:96 -#: motion/templates/motion/poll_form.html:25 +#: motion/templates/motion/poll_form.html:47 msgid "Invalid votes" msgstr "Ungültige Stimmen" -#: assignment/views.py:465 assignment/templates/assignment/poll_view.html:61 -#: assignment/templates/assignment/view.html:240 -#: assignment/templates/assignment/view.html:245 +#: assignment/views.py:464 assignment/templates/assignment/poll_view.html:61 +#: assignment/templates/assignment/view.html:238 +#: assignment/templates/assignment/view.html:243 #: assignment/templates/projector/Assignment.html:109 -#: assignment/templates/projector/Assignment.html:115 motion/pdf.py:135 -#: motion/templates/motion/motion_detail.html:71 -#: motion/templates/motion/poll_form.html:29 +#: assignment/templates/projector/Assignment.html:115 motion/pdf.py:148 +#: motion/templates/motion/motion_detail.html:215 +#: motion/templates/motion/poll_form.html:51 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Abgegebene Stimmen" -#: assignment/views.py:525 assignment/views.py:543 +#: assignment/views.py:524 assignment/views.py:542 #: assignment/templates/assignment/overview.html:35 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 @@ -856,40 +860,32 @@ msgstr "Abgegebene Stimmen" msgid "Election" msgstr "Wahl" -#: assignment/views.py:550 +#: assignment/views.py:549 #, python-format msgid "%d. ballot" msgstr "%d. Wahlgang" -#: assignment/views.py:552 +#: assignment/views.py:551 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d Kandidat/in" msgstr[1] "%d Kandidaten/innen" -#: assignment/views.py:554 +#: assignment/views.py:553 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d verfügbare Posten" msgstr[1] "%d verfügbare Posten" -#: assignment/views.py:590 assignment/templates/assignment/view.html:208 -#: assignment/templates/projector/Assignment.html:80 motion/pdf.py:134 -#: motion/templates/motion/motion_detail.html:68 +#: assignment/views.py:594 assignment/templates/assignment/view.html:206 +#: assignment/templates/projector/Assignment.html:80 motion/pdf.py:147 +#: motion/pdf.py:271 motion/templates/motion/motion_detail.html:212 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" -#: assignment/views.py:671 -msgid "Election settings successfully saved." -msgstr "Wahl-Einstellungen wurden erfolgreich gespeichert." - -#: assignment/templates/assignment/config.html:5 -msgid "Election settings" -msgstr "Wahl-Einstellungen" - #: assignment/templates/assignment/edit.html:8 #: assignment/templates/assignment/edit.html:17 #: assignment/templates/assignment/view.html:34 @@ -907,16 +903,17 @@ msgid "Print all elections as PDF" msgstr "Alle Wahlen als PDF drucken" #: assignment/templates/assignment/overview.html:21 -#: participant/templates/participant/overview.html:53 msgid "Filter" msgstr "Filter" #: assignment/templates/assignment/overview.html:23 #: assignment/templates/assignment/overview.html:37 -#: assignment/templates/assignment/view.html:272 +#: assignment/templates/assignment/view.html:270 #: assignment/templates/projector/Assignment.html:18 +#: motion/templates/motion/motion_detail.html:185 +#: motion/templates/motion/motion_list.html:38 +#: motion/templates/motion/motion_list.html:59 #: motion/templates/projector/Motion.html:11 -#: participant/templates/participant/overview.html:84 msgid "Status" msgstr "Status" @@ -960,33 +957,32 @@ msgid "Short description (for ballot paper)" msgstr "Kurzbeschreibung (für Stimmzettel)" #: assignment/templates/assignment/poll_view.html:29 -#: motion/templates/motion/poll_form.html:9 +#: motion/templates/motion/poll_form.html:30 msgid "Special values" msgstr "Spezielle Werte" #: assignment/templates/assignment/poll_view.html:29 -#: motion/templates/motion/poll_form.html:9 poll/models.py:234 +#: motion/templates/motion/poll_form.html:30 poll/models.py:234 msgid "majority" msgstr "Mehrheit" #: assignment/templates/assignment/poll_view.html:29 -#: motion/templates/motion/poll_form.html:9 poll/models.py:236 +#: motion/templates/motion/poll_form.html:30 poll/models.py:236 #: poll/models.py:238 msgid "undocumented" msgstr "nicht erfasst" #: assignment/templates/assignment/poll_view.html:74 +#: motion/templates/motion/poll_form.html:61 msgid "Ballot paper as PDF" msgstr "Stimmzettel als PDF" -#: assignment/templates/assignment/poll_view.html:83 -#: assignment/templates/assignment/view.html:112 -#: motion/templates/motion/motion_form.html:17 -#: motion/templates/motion/poll_form.html:41 -#: projector/templates/projector/control_overlay_message.html:7 -#: templates/formbuttons_saveapply.html:7 -msgid "Apply" -msgstr "Übernehmen" +#: assignment/templates/assignment/poll_view.html:80 +#: motion/templates/motion/poll_form.html:67 +#: projector/templates/projector/select_widgets.html:28 +#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 +msgid "Save" +msgstr "Speichern" #: assignment/templates/assignment/view.html:36 msgid "Delete election" @@ -997,11 +993,12 @@ msgid "Ballot" msgstr "Wahlgang" #: assignment/templates/assignment/view.html:46 +#: motion/templates/motion/motion_detail.html:49 msgid "New agenda item" msgstr "Neuer Tagesordnungseintrag" #: assignment/templates/assignment/view.html:73 -#: assignment/templates/assignment/view.html:132 +#: assignment/templates/assignment/view.html:130 msgid "Remove candidate" msgstr "Kandidate/in entfernen" @@ -1022,446 +1019,762 @@ msgstr "Eigene Kandidatur zurückziehen" msgid "Self candidature" msgstr "Selbst kandidieren" -#: assignment/templates/assignment/view.html:114 -msgid "Add new participant" -msgstr "Neue/n Teilnehmer/in hinzufügen" - -#: assignment/templates/assignment/view.html:127 +#: assignment/templates/assignment/view.html:125 msgid "Blocked Candidates" msgstr "Blockierte Kandidaten/innen" -#: assignment/templates/assignment/view.html:137 +#: assignment/templates/assignment/view.html:135 msgid "No blocked candidates available." msgstr "Keine blockierten Kandidaten/innen vorhanden." -#: assignment/templates/assignment/view.html:145 +#: assignment/templates/assignment/view.html:143 #: assignment/templates/projector/Assignment.html:52 msgid "Election results" msgstr "Wahlergebnisse" -#: assignment/templates/assignment/view.html:165 +#: assignment/templates/assignment/view.html:163 msgid "Publish/unpublish results" msgstr "Ergebnisse veröffentlichen/unveröffentlichen" -#: assignment/templates/assignment/view.html:180 -#: assignment/templates/assignment/view.html:261 +#: assignment/templates/assignment/view.html:178 +#: assignment/templates/assignment/view.html:259 msgid "New ballot" msgstr "Neuer Wahlgang" -#: assignment/templates/assignment/view.html:193 +#: assignment/templates/assignment/view.html:191 #: assignment/templates/projector/Assignment.html:69 msgid "Candidate is elected" msgstr "Kandidat/in ist gewählt" -#: assignment/templates/assignment/view.html:212 +#: assignment/templates/assignment/view.html:210 #: assignment/templates/projector/Assignment.html:84 msgid "was not a
          candidate" msgstr "war kein Kandidat" -#: assignment/templates/assignment/view.html:229 -#: assignment/templates/projector/Assignment.html:100 motion/pdf.py:134 -#: motion/templates/motion/motion_detail.html:69 +#: assignment/templates/assignment/view.html:227 +#: assignment/templates/projector/Assignment.html:100 motion/pdf.py:147 +#: motion/templates/motion/motion_detail.html:213 #: motion/templates/projector/Motion.html:40 msgid "Invalid" msgstr "Ungültig" -#: assignment/templates/assignment/view.html:257 +#: assignment/templates/assignment/view.html:255 msgid "No ballots available." msgstr "Keine Wahlgänge vorhanden." -#: assignment/templates/assignment/view.html:281 +#: assignment/templates/assignment/view.html:279 msgid "Change status" msgstr "Status ändern" -#: config/forms.py:22 -msgid "Event name" -msgstr "Veranstaltungsname" - -#: config/forms.py:28 -msgid "Short description of event" -msgstr "Kurzbeschreibung der Veranstaltung" - -#: config/forms.py:36 -msgid "Event date" -msgstr "Veranstaltungszeitraum" - -#: config/forms.py:42 -msgid "Event location" -msgstr "Veranstaltungsort" - -#: config/forms.py:48 -msgid "Event organizer" -msgstr "Veranstalter" - -#: config/forms.py:53 -msgid "Allow access for anonymous guest users" -msgstr "Erlaube Zugriff für anonyme Gast-Nutzer" - -#: config/forms.py:65 participant/forms.py:126 -msgid "Welcome text" -msgstr "Willkommenstext" - -#: config/models.py:39 +#: config/models.py:31 msgid "Can manage configuration" msgstr "Darf die Konfiguration verwalten" -#: config/models.py:83 -msgid "Presentation and assembly system" -msgstr "Präsentations- und Versammlungssystem" +#: config/views.py:118 +#, python-format +msgid "%s settings successfully saved." +msgstr "Konfiguration '%s' erfolgreich gespeichert." -#: config/models.py:88 -msgid "Welcome to OpenSlides" -msgstr "Willkommen bei OpenSlides" +#: config/views.py:127 config/templates/config/config_form.html:8 +msgid "Configuration" +msgstr "Konfiguration" -#: config/models.py:89 -msgid "[Place for your welcome text.]" -msgstr "[Platz für Ihren Begrüßungstext.]" - -#: config/models.py:102 config/templates/config/general.html:10 -msgid "General" -msgstr "Allgemein" - -#: config/models.py:126 config/templates/config/version.html:5 -#: config/templates/config/version.html:8 -#: config/templates/config/version.html:13 motion/pdf.py:104 +#: config/templates/config/config_form.html:16 +#: core/templates/core/version.html:5 core/templates/core/version.html.py:9 +#: core/templates/core/version.html:17 core/templates/core/version.html:23 +#: motion/pdf.py:117 motion/templates/motion/motion_detail.html:20 +#: motion/templates/motion/motion_diff.html:36 +#: motion/templates/motion/motion_diff.html:40 msgid "Version" msgstr "Version" -#: config/views.py:70 -msgid "General settings successfully saved." -msgstr "Allgemeine Einstellungen erfolgreich gespeichert." +#: core/signals.py:35 +msgid "Event name" +msgstr "Veranstaltungsname" -#: config/templates/config/general.html:5 -msgid "General settings" -msgstr "Allgemeine Einstellungen" +#: core/signals.py:40 +msgid "Presentation and assembly system" +msgstr "Präsentations- und Versammlungssystem" -#: config/templates/config/general.html:15 +#: core/signals.py:43 +msgid "Short description of event" +msgstr "Kurzbeschreibung der Veranstaltung" + +#: core/signals.py:52 +msgid "Event date" +msgstr "Veranstaltungszeitraum" + +#: core/signals.py:60 +msgid "Event location" +msgstr "Veranstaltungsort" + +#: core/signals.py:68 +msgid "Event organizer" +msgstr "Veranstalter" + +#: core/signals.py:73 +msgid "Welcome to OpenSlides" +msgstr "Willkommen bei OpenSlides" + +#: core/signals.py:81 +msgid "[Place for your welcome text.]" +msgstr "[Platz für Ihren Begrüßungstext.]" + +#: core/signals.py:84 participant/signals.py:46 +msgid "Welcome text" +msgstr "Willkommenstext" + +#: core/signals.py:91 +msgid "Allow access for anonymous guest users" +msgstr "Erlaube Zugriff für anonyme Gast-Nutzer" + +#: core/signals.py:95 msgid "Event" msgstr "Veranstaltung" -#: config/templates/config/general.html:33 +#: core/signals.py:99 msgid "Welcome Widget" msgstr "Willkommens-Widget" -#: config/templates/config/general.html:51 +#: core/signals.py:103 msgid "System" msgstr "System" -#: motion/forms.py:38 motion/models.py:472 +#: core/signals.py:107 +msgid "General" +msgstr "Allgemein" + +#: mediafile/models.py:26 +msgid "File" +msgstr "Datei" + +#: mediafile/models.py:35 mediafile/templates/mediafile/mediafile_list.html:22 +msgid "Uploaded by" +msgstr "Hochgeladen durch" + +#: mediafile/models.py:50 +msgid "Can see the list of files" +msgstr "Darf Dateilisten sehen" + +#: mediafile/models.py:51 +msgid "Can upload files" +msgstr "Darf Dateien hochladen" + +#: mediafile/models.py:52 +msgid "Can manage files" +msgstr "Darf Dateien verwalten" + +#: mediafile/models.py:65 mediafile/models.py:67 +msgid "unknown" +msgstr "unbekannt" + +#: mediafile/views.py:101 mediafile/templates/mediafile/mediafile_list.html:6 +#: mediafile/templates/mediafile/mediafile_list.html:9 +msgid "Media" +msgstr "Medien" + +#: mediafile/templates/mediafile/mediafile_form.html:8 +#: mediafile/templates/mediafile/mediafile_form.html:17 +msgid "Edit media" +msgstr "Mediendatei bearbeiten" + +#: mediafile/templates/mediafile/mediafile_form.html:10 +#: mediafile/templates/mediafile/mediafile_form.html:19 +#: mediafile/templates/mediafile/mediafile_list.html:12 +msgid "New media" +msgstr "Neue Mediendatei" + +#: mediafile/templates/mediafile/mediafile_list.html:20 +msgid "Size" +msgstr "Größe" + +#: mediafile/templates/mediafile/mediafile_list.html:21 +msgid "Upload time" +msgstr "Hochladezeitpunkt" + +#: mediafile/templates/mediafile/mediafile_list.html:45 +msgid "No media available." +msgstr "Keine Mediendatei vorhanden." + +#: motion/forms.py:44 motion/models.py:571 motion/pdf.py:170 +#: motion/templates/motion/motion_detail.html:82 +#: motion/templates/motion/motion_diff.html:55 #: motion/templates/projector/Motion.html:77 msgid "Reason" msgstr "Begründung" -#: motion/forms.py:59 motion/pdf.py:42 +#: motion/forms.py:67 motion/pdf.py:55 +#: motion/templates/motion/motion_detail.html:165 +#: motion/templates/motion/motion_list.html:60 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Antragsteller/in" -#: motion/forms.py:73 motion/pdf.py:66 +#: motion/forms.py:81 motion/pdf.py:79 +#: motion/templates/motion/motion_detail.html:172 msgid "Supporters" msgstr "Unterstützer/innen" -#: motion/forms.py:88 -msgid "Create new version" -msgstr "" +#: motion/forms.py:96 +msgid "Don't create a new version" +msgstr "Keine neue Version erzeugen" -#: motion/forms.py:89 -msgid "Trivial changes don't create a new version." -msgstr "Triviale Änderungen erzeugen keine neue Version." +#: motion/forms.py:97 +msgid "Don't create a new version. Useful e.g. for trivial changes." +msgstr "Keine neue Version erzeugen. Nützlich z.B. für triviale Änderungen." -#: motion/forms.py:98 -msgid "Number of (minimum) required supporters for a motion" -msgstr "Mindestanzahl erforderlicher Unterstützer/innen für einen Antrag" +#: motion/forms.py:105 motion/templates/motion/motion_detail.html:235 +msgid "Category" +msgstr "Sachgebiet" -#: motion/forms.py:100 -msgid "Choose 0 to disable the supporting system" -msgstr "Zum Deaktivieren des Unterstützersystems '0' eingeben" +#: motion/forms.py:111 motion/signals.py:105 +msgid "Identifier" +msgstr "Bezeichner" -#: motion/forms.py:105 -msgid "Motion preamble" -msgstr "Antragseinleitung" - -#: motion/forms.py:126 -msgid "Title for PDF document (all motions)" -msgstr "Titel für PDF-Dokument (alle Anträge)" - -#: motion/forms.py:131 -msgid "Preamble text for PDF document (all motions)" -msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " - -#: motion/forms.py:136 -msgid "Create new versions" -msgstr "" - -#: motion/forms.py:139 -msgid "create allways a new versions" -msgstr "" - -#: motion/forms.py:140 -#, fuzzy -msgid "create never a new version" -msgstr "Triviale Änderungen erzeugen keine neue Version." - -#: motion/forms.py:141 -#, fuzzy -msgid "Let the user choose if he wants to create a new version" -msgstr "Triviale Änderungen erzeugen keine neue Version." - -#: motion/forms.py:146 -msgid "Workflow for the motions" -msgstr "" - -#: motion/models.py:75 +#: motion/models.py:90 msgid "Can see motions" msgstr "Darf Anträge sehen" -#: motion/models.py:76 +#: motion/models.py:91 msgid "Can create motions" msgstr "Darf Anträge erstellen" -#: motion/models.py:77 +#: motion/models.py:92 msgid "Can support motions" msgstr "Darf Anträge unterstützen" -#: motion/models.py:78 +#: motion/models.py:93 msgid "Can manage motions" msgstr "Darf Anträge verwalten" -#: motion/models.py:489 -#, fuzzy +#: motion/models.py:588 msgid "new" msgstr "Neu" -#: motion/pdf.py:35 motion/views.py:459 -#, fuzzy, python-format -msgid "Motion: %s" -msgstr "Anträge" +#: motion/models.py:635 motion/templates/motion/category_list.html:22 +msgid "Category name" +msgstr "Sachgebiet" -#: motion/pdf.py:55 +#: motion/models.py:638 motion/templates/motion/category_list.html:21 +msgid "Prefix" +msgstr "Präfix" + +#: motion/pdf.py:48 motion/views.py:614 +#, python-format +msgid "Motion: %s" +msgstr "Antrag: %s" + +#: motion/pdf.py:68 msgid "Signature" msgstr "Unterschrift" -#: motion/pdf.py:95 -#, fuzzy +#: motion/pdf.py:108 msgid "State" msgstr "Status" -#: motion/pdf.py:130 motion/templates/motion/motion_detail.html:53 -#: motion/templates/motion/motion_detail.html:61 +#: motion/pdf.py:143 motion/templates/motion/motion_detail.html:202 +#: motion/templates/motion/poll_form.html:6 +#: motion/templates/motion/poll_form.html:14 #: motion/templates/projector/Motion.html:33 msgid "Vote" msgstr "Abstimmung" -#: motion/pdf.py:151 -#, fuzzy -msgid "Reason:" -msgstr "Begründung" - -#: motion/pdf.py:167 +#: motion/pdf.py:254 motion/templates/motion/motion_list.html:104 msgid "No motions available." msgstr "Keine Anträge vorhanden." -#: motion/signals.py:24 +#: motion/pdf.py:265 +#, python-format +msgid "Motion No. %s" +msgstr "Antrag Nr. %s" + +#: motion/pdf.py:267 +#, python-format +msgid "%d. Vote" +msgstr "%d. Abstimmung" + +#: motion/signals.py:33 +msgid "Stop submitting new motions by non-staff users" +msgstr "" +"Einreichen von neuen Anträgen stoppen für Nutzer ohne Verwaltungsrechte" + +#: motion/signals.py:40 +msgid "Number of (minimum) required supporters for a motion" +msgstr "Mindestanzahl erforderlicher Unterstützer/innen für einen Antrag" + +#: motion/signals.py:44 +msgid "Choose 0 to disable the supporting system" +msgstr "Zum Deaktivieren des Unterstützersystems '0' eingeben" + +#: motion/signals.py:47 msgid "The assembly may decide," msgstr "Die Versammlung möge beschließen," -#: motion/signals.py:27 motion/views.py:457 motion/views.py:509 -#: motion/views.py:524 motion/templates/motion/config.html:10 -#: motion/templates/motion/motion_list.html:7 +#: motion/signals.py:51 +msgid "Motion preamble" +msgstr "Antragseinleitung" + +#: motion/signals.py:73 motion/views.py:612 motion/views.py:663 +#: motion/views.py:677 motion/templates/motion/category_list.html:6 +#: motion/templates/motion/motion_list.html:6 #: motion/templates/motion/motion_list.html:10 msgid "Motions" msgstr "Anträge" -#: motion/views.py:141 -#, fuzzy -msgid "Motion created" -msgstr "Antragseinleitung" +#: motion/signals.py:77 +msgid "Title for PDF document (all motions)" +msgstr "Titel für PDF-Dokument (alle Anträge)" -#: motion/views.py:158 -#, fuzzy -msgid "Motion updated" -msgstr "Antragstext" +#: motion/signals.py:84 +msgid "Preamble text for PDF document (all motions)" +msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " -#: motion/views.py:194 -#, fuzzy, python-format -msgid "Are you sure you want permit Version %s?" -msgstr "Soll Version %s wirklich zurückgewiesen werden?" +#: motion/signals.py:89 +msgid "Allow to disable versioning" +msgstr "Erlaubt Versionierung zu deaktiveren" -#: motion/views.py:220 -#, fuzzy, python-format -msgid "Are you sure you want reject Version %s?" -msgstr "Soll Version %s wirklich zurückgewiesen werden?" +#: motion/signals.py:96 +msgid "Workflow of new motions" +msgstr "Arbeitsablauf von neuen Anträgen" -#: motion/views.py:252 -msgid "You can not support this motion." -msgstr "Sie dürfen diesen Antrag nicht unterstützen." +#: motion/signals.py:107 +msgid "Set it manually" +msgstr "manuell setzen" -#: motion/views.py:255 -msgid "You can not unsupport this motion." -msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." +#: motion/signals.py:108 +msgid "Numbered per category" +msgstr "pro Sachgebiet nummerieren" -#: motion/views.py:263 -msgid "Do you really want to support this motion?" -msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" - -#: motion/views.py:265 -msgid "Do you really want to unsupport this motion?" -msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" - -#: motion/views.py:277 -#, python-format -msgid "Supporter: +%s" -msgstr "Unterstützer/in: +%s" - -#: motion/views.py:280 -#, python-format -msgid "Supporter: -%s" -msgstr "Unterstützer/in: -%s" - -#: motion/views.py:285 -msgid "You have supported this motion successfully." -msgstr "Sie haben den Antrag erfolgreich unterstützt." - -#: motion/views.py:287 -msgid "You have unsupported this motion successfully." -msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." - -#: motion/views.py:310 -msgid "Poll created" -msgstr "Abstimmung erstellt" - -#: motion/views.py:311 -msgid "New vote was successfully created." -msgstr "Neue Abstimmung erfolgreich angelegt." - -#: motion/views.py:361 -#, fuzzy -msgid "Poll updated" -msgstr "Abstimmung wurde aktualisiert" - -#: motion/views.py:374 -msgid "Poll deleted" -msgstr "Abstimmung gelöscht" - -#: motion/views.py:404 -#, fuzzy, python-format -msgid "Changed state to %s" -msgstr "Status ändern" - -#: motion/views.py:406 -#, fuzzy, python-format -msgid "Motion status was set to: %s." -msgstr "Antragsstatus wurde gesetzt auf: %s." - -#: motion/views.py:431 -#, fuzzy -msgid "Created Agenda Item" -msgstr "Tagesordnungseintrag" - -#: motion/views.py:500 -msgid "Motion settings successfully saved." -msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." - -#: motion/workflow.py:128 -msgid "Unknwon state" -msgstr "" - -#: motion/workflow.py:131 -msgid "Published" -msgstr "Veröffentlicht" - -#: motion/workflow.py:136 -msgid "Permitted" -msgstr "Zugelassen" - -#: motion/workflow.py:137 -msgid "Accepted" -msgstr "Angenommen" - -#: motion/workflow.py:138 -msgid "Rejected" -msgstr "Abgelehnt" - -#: motion/workflow.py:139 -msgid "Withdrawed" -msgstr "Zurückgezogen" - -#: motion/workflow.py:140 -msgid "Adjourned" -msgstr "Vertagt" - -# please check! -#: motion/workflow.py:141 -msgid "Not Concerned" -msgstr "Nicht befasst" - -# please check! -#: motion/workflow.py:142 -msgid "Commited a bill" -msgstr "Verwiesen (in Ausschuss)" - -#: motion/workflow.py:143 -msgid "Needs Review" -msgstr "Benötigt Review" - -#: motion/workflow.py:144 -msgid "Rejected (not authorized)" -msgstr "Verworfen (nicht zulässig)" - -#: motion/templates/motion/config.html:5 -msgid "Motion settings" -msgstr "Antrags Einstellungen" +#: motion/signals.py:109 +msgid "Serially numbered" +msgstr "fortlaufend nummerieren" +#: motion/signals.py:111 motion/views.py:523 #: motion/templates/motion/motion_detail.html:7 +#: motion/templates/motion/motion_detail.html:15 +#: motion/templates/motion/motion_diff.html:7 +#: motion/templates/motion/motion_diff.html:20 +#: motion/templates/motion/poll_form.html:6 +#: motion/templates/motion/poll_form.html:14 #: motion/templates/projector/Motion.html:7 #: motion/templates/projector/Motion.html:65 msgid "Motion" msgstr "Antrag" -#: motion/templates/motion/motion_detail.html:54 +#: motion/signals.py:132 +msgid "Simple Workflow" +msgstr "Einfacher Arbeitsablauf" + +#: motion/signals.py:133 +msgid "submitted" +msgstr "eingereicht" + +#: motion/signals.py:138 motion/signals.py:164 +msgid "accepted" +msgstr "angenommen" + +#: motion/signals.py:140 motion/signals.py:166 +msgid "Accept" +msgstr "annehmen" + +#: motion/signals.py:141 motion/signals.py:168 +msgid "rejected" +msgstr "abgelehnt" + +#: motion/signals.py:143 motion/signals.py:170 +msgid "Reject" +msgstr "ablehnen" + +#: motion/signals.py:144 +msgid "not decided" +msgstr "nicht beschlossen" + +#: motion/signals.py:146 +msgid "Do not decide" +msgstr "nicht beschließen" + +#: motion/signals.py:151 +msgid "Complex Workflow" +msgstr "Komplexer Arbeitsablauf" + +#: motion/signals.py:152 +msgid "published" +msgstr "veröffentlicht" + +#: motion/signals.py:157 +msgid "permitted" +msgstr "zugelassen" + +#: motion/signals.py:159 +msgid "Permit" +msgstr "zulassen" + +#: motion/signals.py:172 +msgid "withdrawed" +msgstr "zurückgezogen" + +#: motion/signals.py:174 +msgid "Withdraw" +msgstr "zurückziehen" + +#: motion/signals.py:176 +msgid "adjourned" +msgstr "vertagt" + +#: motion/signals.py:178 +msgid "Adjourn" +msgstr "vertagen" + +# please check! +#: motion/signals.py:180 +msgid "not concerned" +msgstr "nicht befasst" + +# please check! +#: motion/signals.py:182 +msgid "Do not concern" +msgstr "nicht befassen" + +# please check! +#: motion/signals.py:184 +msgid "commited a bill" +msgstr "in Ausschuss verwiesen" + +# please check! +#: motion/signals.py:186 +msgid "Commit a bill" +msgstr "in Ausschuss verweisen" + +#: motion/signals.py:188 +msgid "needs review" +msgstr "Benötigt Review" + +#: motion/signals.py:191 +msgid "rejected (not authorized)" +msgstr "Verworfen (nicht zulässig)" + +#: motion/signals.py:193 +msgid "reject (not authorized)" +msgstr "Verwerfen (nicht zulässig)" + +#: motion/views.py:173 +msgid "Motion created" +msgstr "Antrag erstellt" + +#: motion/views.py:195 +msgid "Motion updated" +msgstr "Antrag aktualisiert" + +#: motion/views.py:221 +msgid "Version successfully permitted." +msgstr "Version erfolgreich zugelassen." + +#: motion/views.py:240 +#, python-format +msgid "Are you sure you want permit Version %s?" +msgstr "Soll Version %s wirklich zugelassen werden?" + +#: motion/views.py:268 +#, python-format +msgid "Are you sure you want reject Version %s?" +msgstr "Soll Version %s wirklich zurückgewiesen werden?" + +#: motion/views.py:294 +msgid "At least one version number is not valid." +msgstr "Mindestens eine Versionsnummer ist ungültig" + +#: motion/views.py:356 +msgid "You can not support this motion." +msgstr "Sie dürfen diesen Antrag nicht unterstützen." + +#: motion/views.py:359 +msgid "You can not unsupport this motion." +msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." + +#: motion/views.py:367 +msgid "Do you really want to support this motion?" +msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" + +#: motion/views.py:369 +msgid "Do you really want to unsupport this motion?" +msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" + +#: motion/views.py:381 +#, python-format +msgid "Supporter: +%s" +msgstr "Unterstützer/in: +%s" + +#: motion/views.py:384 +#, python-format +msgid "Supporter: -%s" +msgstr "Unterstützer/in: -%s" + +#: motion/views.py:389 +msgid "You have supported this motion successfully." +msgstr "Sie haben den Antrag erfolgreich unterstützt." + +#: motion/views.py:391 +msgid "You have unsupported this motion successfully." +msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." + +#: motion/views.py:414 +msgid "Poll created" +msgstr "Abstimmung erstellt" + +#: motion/views.py:415 +msgid "New vote was successfully created." +msgstr "Neue Abstimmung erfolgreich angelegt." + +#: motion/views.py:479 +msgid "Poll updated" +msgstr "Abstimmung wurde aktualisiert" + +#: motion/views.py:497 +msgid "Poll deleted" +msgstr "Abstimmung gelöscht" + +#: motion/views.py:523 +msgid "Poll" +msgstr "" + +#: motion/views.py:559 +#, python-format +msgid "State changed to %s" +msgstr "Status geändert zu %s" + +#: motion/views.py:561 +#, python-format +msgid "Motion status was set to: %s." +msgstr "Antragsstatus wurde gesetzt auf: %s." + +#: motion/views.py:586 +msgid "Agenda item created" +msgstr "Tagesordnungseintrag angelegt" + +#: motion/templates/motion/category_form.html:9 +#: motion/templates/motion/category_form.html:18 +msgid "Edit category" +msgstr "Sachgebiet bearbeiten" + +#: motion/templates/motion/category_form.html:11 +#: motion/templates/motion/category_form.html:20 +#: motion/templates/motion/category_list.html:13 +msgid "New category" +msgstr "Neues Sachgebiet" + +#: motion/templates/motion/category_list.html:10 +#: motion/templates/motion/motion_list.html:18 +msgid "Categories" +msgstr "Sachgebiete" + +#: motion/templates/motion/category_list.html:41 +msgid "No categories available." +msgstr "Keine Sachgebieter vorhanden." + +#: motion/templates/motion/motion_detail.html:25 +msgid "Print this motion as PDF" +msgstr "Diesen Antrag als PDF drucken" + +#: motion/templates/motion/motion_detail.html:28 +#: motion/templates/motion/poll_form.html:21 +msgid "Show motion" +msgstr "Antrag anzeigen" + +#: motion/templates/motion/motion_detail.html:40 +#: motion/templates/motion/motion_form.html:20 +#: motion/templates/motion/motion_form.html:29 +msgid "Edit motion" +msgstr "Antrag bearbeiten" + +#: motion/templates/motion/motion_detail.html:44 +msgid "Delete motion" +msgstr "Antrag löschen" + +#: motion/templates/motion/motion_detail.html:63 +msgid "This is not the newest version." +msgstr "Dies ist nicht die neuste Version." + +#: motion/templates/motion/motion_detail.html:65 +msgid "Go to last version" +msgstr "Zu letzten Version" + +#: motion/templates/motion/motion_detail.html:70 +msgid "This version is not yet authorized." +msgstr "Diese Version wurde noch nicht zugelassen." + +#: motion/templates/motion/motion_detail.html:72 +msgid "Go to last authorized version" +msgstr "Zur letzten zugelassenen Version" + +#: motion/templates/motion/motion_detail.html:77 +msgid "Motion text" +msgstr "Antragstext" + +#: motion/templates/motion/motion_detail.html:95 +msgid "Version history" +msgstr "Versionshistorie" + +#: motion/templates/motion/motion_detail.html:101 +msgid "Time" +msgstr "Zeit" + +#: motion/templates/motion/motion_detail.html:102 +msgid "Difference" +msgstr "Unterschied" + +#: motion/templates/motion/motion_detail.html:109 +msgid "This version is authorized" +msgstr "Diese Version wurde zugelassen" + +#: motion/templates/motion/motion_detail.html:112 +msgid "Permit this version" +msgstr "Diese Version zulassen" + +#: motion/templates/motion/motion_detail.html:115 +msgid "Reject this version" +msgstr "Diese Version verwerfen" + +#: motion/templates/motion/motion_detail.html:119 +msgid "This version is rejected" +msgstr "Diese Version wurde verworfen" + +#: motion/templates/motion/motion_detail.html:149 +msgid "Show log" +msgstr "Log anzeigen" + +#: motion/templates/motion/motion_detail.html:204 msgid "Edit Vote" msgstr "Abstimmung bearbeiten" -#: motion/templates/motion/motion_detail.html:57 +#: motion/templates/motion/motion_detail.html:205 msgid "Delete Vote" msgstr "Abstimmung löschen" -#: motion/templates/motion/motion_detail.html:77 -#, fuzzy -msgid "Enter result" -msgstr "Abstimmungsergebnis" +#: motion/templates/motion/motion_detail.html:220 +msgid "No results" +msgstr "Keine Ergebnisse" -#: motion/templates/motion/motion_detail.html:87 +#: motion/templates/motion/motion_detail.html:229 msgid "New vote" msgstr "Neue Abstimmung" -#: motion/templates/motion/motion_form.html:7 -#, fuzzy -msgid "Motion Form" -msgstr "Antrag Nr." +#: motion/templates/motion/motion_detail.html:239 +#: motion/templates/motion/motion_list.html:61 +msgid "Creation Time" +msgstr "Erstellungszeit" -#: motion/templates/motion/motion_form.html:10 -#, fuzzy -msgid "Motions Forms" -msgstr "Anträge" +#: motion/templates/motion/motion_detail.html:247 +msgid "Withdraw motion" +msgstr "Antrag zurückziehen" -#: motion/templates/motion/poll_form.html:15 +#: motion/templates/motion/motion_detail.html:256 +msgid "Unsupport" +msgstr "Nicht unterstützen" + +#: motion/templates/motion/motion_detail.html:262 +msgid "Support" +msgstr "Unterstützen" + +#: motion/templates/motion/motion_detail.html:270 +msgid "minimum required supporters" +msgstr "minimal erforderliche Unterstützer/innen" + +#: motion/templates/motion/motion_detail.html:277 +msgid "Manage motion" +msgstr "Antrag verwalten" + +#: motion/templates/motion/motion_detail.html:285 +msgid "For administration only:" +msgstr "Nur zur Administration:" + +#: motion/templates/motion/motion_detail.html:287 +msgid "Reset state" +msgstr "Status zurücksetzen" + +#: motion/templates/motion/motion_diff.html:24 +msgid "Diff view" +msgstr "Änderungsanzeige" + +#: motion/templates/motion/motion_diff.html:28 +#: motion/templates/motion/motion_form.html:35 +#: motion/templates/motion/poll_form.html:18 +msgid "Back to motion" +msgstr "Zurück zum Antrag" + +#: motion/templates/motion/motion_diff.html:37 +#: motion/templates/motion/motion_diff.html:41 +msgid "created" +msgstr "erstellt" + +#: motion/templates/motion/motion_form.html:22 +#: motion/templates/motion/motion_form.html:31 +#: motion/templates/motion/motion_list.html:14 +msgid "New motion" +msgstr "Neuer Antrag" + +#: motion/templates/motion/motion_list.html:21 +msgid "Print all motions as PDF" +msgstr "Alle Anträge als PDF drucken" + +#: motion/templates/motion/motion_list.html:29 +msgid "Need supporters" +msgstr "Benötigt Unterstützer/innen" + +#: motion/templates/motion/motion_list.html:34 +msgid "Without number" +msgstr "Ohne Nummer" + +#: motion/templates/motion/motion_list.html:41 +msgid "Not yet authorized" +msgstr "Noch nicht zugelassen" + +#: motion/templates/motion/motion_list.html:42 +msgid "Authorized" +msgstr "Zugelassen" + +#: motion/templates/motion/motion_list.html:43 +msgid "Accepted" +msgstr "Angenommen" + +#: motion/templates/motion/motion_list.html:44 +msgid "Rejected" +msgstr "Abgelehnt" + +#: motion/templates/motion/motion_list.html:45 +msgid "Withdrawen (by submitter)" +msgstr "Zurückgezogen (durch Antragsteller/in)" + +#: motion/templates/motion/motion_list.html:46 +msgid "Needs Review" +msgstr "Benötigt Review" + +#: motion/templates/motion/motion_list.html:50 +msgctxt "number of motions" +msgid "motion" +msgid_plural "motions" +msgstr[0] "Antrag" +msgstr[1] "Anträge" + +#: motion/templates/motion/motion_list.html:54 +msgid "#" +msgstr "#" + +#: motion/templates/motion/motion_list.html:55 +msgid "Motion title" +msgstr "Antragstitel" + +#: motion/templates/motion/motion_list.html:57 +msgid "Number of supporters" +msgstr "Anzahl der Unterstützer/innen" + +#: motion/templates/motion/motion_list.html:96 +msgid "Print motion as PDF" +msgstr "Antrag als PDF drucken" + +#: motion/templates/motion/poll_form.html:37 msgid "Option" msgstr "Wahlmöglichkeit" -#: motion/templates/motion/widget.html:19 -#: participant/templates/participant/personal_info_widget.html:9 -#: participant/templates/participant/personal_info_widget.html:28 -msgid "motion" -msgstr "Antrag" - -#: motion/templates/motion/widget.html:23 -#: motion/templates/projector/Motion.html:65 -#: participant/templates/participant/personal_info_widget.html:13 -#: participant/templates/participant/personal_info_widget.html:32 -msgid "no number" -msgstr "ohne Nummer" - #: motion/templates/motion/widget.html:27 msgid "No motion available." msgstr "Keine Antrag vorhanden." @@ -1478,250 +1791,256 @@ msgstr "Keine Abstimmungsergebnisse vorhanden." msgid "Motion No." msgstr "Antrag Nr." -#: participant/__init__.py:3 +#: participant/__init__.py:18 participant/signals.py:56 msgid "Participant" msgstr "Teilnehmer" -#: participant/api.py:78 +#: participant/api.py:73 #, python-format msgid "Ignoring malformed line %d in import file." msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." -#: participant/api.py:94 +#: participant/api.py:97 +#, python-format +msgid "Ignoring malformed group id in line %d." +msgstr "Fehlerhafte Gruppen-ID in Zeile %d wurde ignoriert." + +#: participant/api.py:100 +#, python-format +msgid "Group id %(id)s does not exists (line %(line)d)." +msgstr "Gruppen-ID %(id)s existiert nicht (Zeile %(line)d)." + +#: participant/api.py:105 msgid "Import aborted because of severe errors in the input file." msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." -#: participant/api.py:96 +#: participant/api.py:107 msgid "Import file has wrong character encoding, only UTF-8 is supported!" msgstr "" "Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " "wird unterstützt!" -#: participant/forms.py:28 participant/views.py:602 +#: participant/forms.py:28 participant/views.py:520 #: participant/templates/participant/group_overview.html:6 #: participant/templates/participant/group_overview.html:9 -#: participant/templates/participant/overview.html:21 -#: participant/templates/participant/user_detail.html:18 +#: participant/templates/participant/overview.html:27 +#: participant/templates/participant/user_detail.html:34 msgid "Groups" msgstr "Gruppen" -#: participant/forms.py:53 +#: participant/forms.py:72 +msgid "" +"You can not remove the last group containing the permission to manage " +"participants." +msgstr "" +"Sie können nicht die letzte Gruppe löschen, die das Recht zur Verwaltung von " +"Teilnehmern enthält." + +#: participant/forms.py:80 msgid "Permissions" msgstr "Rechte" -#: participant/forms.py:56 participant/views.py:540 participant/views.py:588 -#: participant/templates/participant/config.html:10 +#: participant/forms.py:83 participant/views.py:482 participant/views.py:506 #: participant/templates/participant/overview.html:7 -#: participant/templates/participant/overview.html:16 -#: participant/templates/participant/overview.html:95 +#: participant/templates/participant/overview.html:22 msgid "Participants" msgstr "Teilnehmer/innen" -#: participant/forms.py:93 +#: participant/forms.py:120 msgid "You can not edit the name for this group." msgstr "Sie dürfen den Namen dieser Gruppe nicht bearbeiten." -#: participant/forms.py:97 +#: participant/forms.py:124 #, python-format msgid "Group name \"%s\" is reserved for internal use." msgstr "Der Gruppenname \"%s\" ist für interne Verwendung reserviert." -#: participant/forms.py:114 +#: participant/forms.py:142 msgid "CSV File" msgstr "CSV-Datei" -#: participant/forms.py:121 -msgid "System URL" -msgstr "System URL" - -#: participant/forms.py:122 participant/forms.py:127 -msgid "Printed in PDF of first time passwords only." -msgstr "Erscheint nur im PDF der Erst-Passwörter" - -#: participant/forms.py:130 -msgid "Sort participants by first name" -msgstr "Teilnehmer/innen nach Vornamen sortieren" - -#: participant/forms.py:131 -msgid "Disable for sorting by last name" -msgstr "Deaktivieren für Sortierung nach Nachnamen" - -#: participant/models.py:33 participant/templates/participant/overview.html:57 +#: participant/models.py:30 msgid "Male" msgstr "Männlich" -#: participant/models.py:34 participant/templates/participant/overview.html:58 +#: participant/models.py:31 msgid "Female" msgstr "Weiblich" -#: participant/models.py:37 participant/templates/participant/overview.html:70 -msgid "Delegate" -msgstr "Delegierter" - -#: participant/models.py:38 participant/templates/participant/overview.html:71 -msgid "Observer" -msgstr "Beobachter" - -#: participant/models.py:39 participant/templates/participant/overview.html:72 -msgid "Staff" -msgstr "Mitarbeiter" - -#: participant/models.py:40 participant/templates/participant/overview.html:73 -msgid "Guest" -msgstr "Gast" - -#: participant/models.py:45 participant/templates/participant/overview.html:62 -#: participant/templates/participant/overview.html:102 +#: participant/models.py:36 participant/views.py:183 +#: participant/templates/participant/overview.html:65 +#: participant/templates/participant/user_detail.html:30 msgid "Structure level" msgstr "Gliederungsebene" -#: participant/models.py:46 +#: participant/models.py:37 msgid "Will be shown after the name." msgstr "Wird nach dem Namen angezeigt." -#: participant/models.py:49 participant/templates/participant/overview.html:56 -#: participant/templates/participant/user_detail.html:28 +#: participant/models.py:40 +msgid "Will be shown before the name." +msgstr "Wird vor dem Namen angezeigt." + +#: participant/models.py:43 +#: participant/templates/participant/user_detail.html:20 msgid "Gender" msgstr "Geschlecht" -#: participant/models.py:49 participant/models.py:52 participant/models.py:55 +#: participant/models.py:43 participant/models.py:46 msgid "Only for filtering the participant list." msgstr "Nur zum Filtern der Teilnehmerliste." -#: participant/models.py:52 -msgid "Typ" -msgstr "Typ" - -#: participant/models.py:54 participant/views.py:246 -#: participant/templates/participant/overview.html:77 -#: participant/templates/participant/overview.html:104 -#: participant/templates/participant/user_detail.html:38 +#: participant/models.py:45 participant/views.py:183 +#: participant/templates/participant/overview.html:67 +#: participant/templates/participant/user_detail.html:32 msgid "Committee" msgstr "Amt" -#: participant/models.py:57 -#: participant/templates/participant/user_detail.html:43 +#: participant/models.py:48 +#: participant/templates/participant/user_detail.html:24 msgid "About me" msgstr "Über mich" -#: participant/models.py:58 +#: participant/models.py:49 msgid "Your profile text" msgstr "Ihr Profiltext" -#: participant/models.py:61 +#: participant/models.py:52 msgid "Only for notes." msgstr "Nur für Notizen." -#: participant/models.py:64 +#: participant/models.py:55 msgid "Default password" msgstr "Vorgegebenes Passwort" -#: participant/models.py:118 +#: participant/models.py:113 msgid "Can see participant" msgstr "Darf die Teilnehmer/inen sehen" -#: participant/models.py:120 +#: participant/models.py:115 msgid "Can manage participant" msgstr "Darf die Teilnehmer/inen verwalten" -#: participant/models.py:142 +#: participant/models.py:137 msgid "Use this group as participant" msgstr "Verwende diese Gruppe als Teilnehmer/in" -#: participant/models.py:143 +#: participant/models.py:138 msgid "For example as submitter of a motion." msgstr "Zum Beispiel als Antragsteller." -#: participant/models.py:237 +#: participant/signals.py:38 +msgid "System URL" +msgstr "System URL" + +#: participant/signals.py:39 participant/signals.py:47 +msgid "Printed in PDF of first time passwords only." +msgstr "Erscheint nur im PDF der Erst-Passwörter" + +#: participant/signals.py:42 msgid "Welcome to OpenSlides!" msgstr "Willkommen bei OpenSlides!" -#: participant/views.py:198 +#: participant/signals.py:53 +msgid "Sort participants by first name" +msgstr "Teilnehmer/innen nach Vornamen sortieren" + +#: participant/signals.py:54 +msgid "Disable for sorting by last name" +msgstr "Deaktivieren für Sortierung nach Nachnamen" + +#: participant/signals.py:97 participant/templates/participant/import.html:25 +msgid "Anonymous" +msgstr "Gast" + +#: participant/signals.py:99 participant/templates/participant/import.html:25 +msgid "Registered" +msgstr "Registrierte/r" + +#: participant/signals.py:109 +msgid "Delegates" +msgstr "Delegierte/r" + +#: participant/signals.py:123 participant/templates/participant/import.html:26 +msgid "Staff" +msgstr "Mitarbeiter/in" + +#: participant/views.py:135 msgid "You can not delete yourself." msgstr "Sie dürfen sich nicht selbst löschen." -#: participant/views.py:219 +#: participant/views.py:156 msgid "You can not deactivate yourself." msgstr "Sie dürfen sich nicht selbst deaktivieren." -#: participant/views.py:222 +#: participant/views.py:159 msgid "You can not deactivate the administrator." msgstr "Sie dürfen den Administrator nicht deaktivieren." -#: participant/views.py:241 +#: participant/views.py:178 msgid "Participant-list" msgstr "Teilnehmerliste" -#: participant/views.py:242 +#: participant/views.py:179 msgid "List of Participants" msgstr "Teilnehmerliste" -#: participant/views.py:245 -#: participant/templates/participant/overview.html:101 +#: participant/views.py:182 participant/templates/participant/overview.html:64 msgid "Last Name" msgstr "Nachname" -#: participant/views.py:245 -#: participant/templates/participant/overview.html:100 +#: participant/views.py:182 participant/templates/participant/overview.html:63 msgid "First Name" msgstr "Vorname" -#: participant/views.py:245 +#: participant/views.py:183 #: participant/templates/participant/group_overview.html:18 +#: participant/templates/participant/overview.html:66 msgid "Group" msgstr "Gruppe" -#: participant/views.py:277 +#: participant/views.py:219 msgid "Participant-passwords" msgstr "Teilnehmer-Passwoerter" -#: participant/views.py:299 +#: participant/views.py:249 msgid "Account for OpenSlides" msgstr "Zugang für OpenSlides" -#: participant/views.py:301 +#: participant/views.py:251 #, python-format msgid "for %s" msgstr "für %s" -#: participant/views.py:304 +#: participant/views.py:254 #, python-format msgid "User: %s" msgstr "Nutzername: %s" -#: participant/views.py:308 +#: participant/views.py:258 #, python-format msgid "Password: %s" msgstr "Passwort: %s" -#: participant/views.py:313 -#, python-format -msgid "URL: %s" -msgstr "URL: %s" - -#: participant/views.py:355 +#: participant/views.py:305 #, python-format msgid "%d new participants were successfully imported." msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert." -#: participant/views.py:366 +#: participant/views.py:316 msgid "Do you really want to reset the password?" msgstr "Soll das Passwort wirklich zurückgesetzt werden?" -#: participant/views.py:379 +#: participant/views.py:329 #, python-format msgid "The Password for %s was successfully reset." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." -#: participant/views.py:434 +#: participant/views.py:404 msgid "You can not delete this Group." msgstr "Sie dürfen diese Gruppe nicht löschen." -#: participant/views.py:463 -msgid "Participants settings successfully saved." -msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert." - -#: participant/views.py:473 +#: participant/views.py:415 #, python-format msgid "" "Installation was successfully! Use %(user)s (password: %(password)s) for " @@ -1734,18 +2053,14 @@ msgstr "" "Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese " "Meldung weiterhin für alle und ist ein Sicherheitsrisiko." -#: participant/views.py:499 +#: participant/views.py:441 msgid "User settings successfully saved." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." -#: participant/views.py:522 +#: participant/views.py:464 msgid "Password successfully changed." msgstr "Passwort wurde erfolgreich geändert." -#: participant/templates/participant/config.html:5 -msgid "Participant settings" -msgstr "Teilnehmer/innen-Einstellungen" - #: participant/templates/participant/edit.html:8 #: participant/templates/participant/edit.html:17 msgid "Edit participant" @@ -1753,7 +2068,7 @@ msgstr "Teilnehmer/in bearbeiten" #: participant/templates/participant/edit.html:10 #: participant/templates/participant/edit.html:19 -#: participant/templates/participant/overview.html:20 +#: participant/templates/participant/overview.html:26 msgid "New participant" msgstr "Neue/r Teilnehmer/in" @@ -1790,7 +2105,7 @@ msgstr "Keine Gruppen vorhanden." #: participant/templates/participant/import.html:5 #: participant/templates/participant/import.html:9 -#: participant/templates/participant/overview.html:22 +#: participant/templates/participant/overview.html:28 msgid "Import participants" msgstr "Teilnehmer/innen importieren" @@ -1799,24 +2114,39 @@ msgid "Select a CSV file to import participants!" msgstr "Wählen Sie eine CSV-Datei zum Importieren von Teilnehmer/innen aus!" #: participant/templates/participant/import.html:17 +msgid "Please note" +msgstr "Bitte beachten" + +#: participant/templates/participant/import.html:20 msgid "Required comma separated values" msgstr "Erforderliche kommaseparierte Werte" -#: participant/templates/participant/import.html:18 +#: participant/templates/participant/import.html:21 msgid "" -"first_name, last_name, gender, structure level, type, committee, comment" -msgstr "Vorname, Nachname, Geschlecht, Gliederungsebene, Typ, Amt, Kommentar" +"title, first name, last name, gender, email, group id, structure level, " +"committee, about me, comment, is active" +msgstr "" +"Titel, Vorname, Nachname, Geschlecht, E-Mail, Gruppen-ID, Gliederungsebene, " +"Amt, Über mich, Kommentar, Aktiviert" -#: participant/templates/participant/import.html:20 +#: participant/templates/participant/import.html:24 +msgid "Default groups" +msgstr "Vorgegebene Gruppen" + +#: participant/templates/participant/import.html:26 +msgid "Delegate" +msgstr "Delegierte/r" + +#: participant/templates/participant/import.html:28 msgid "Required CSV file encoding: UTF-8 (Unicode)." msgstr "Erforderliches CSV-Datei-Encoding: UTF-8 (Unicode)." -#: participant/templates/participant/import.html:23 -msgid "A CSV example file is available in OpenSlides Wiki." -msgstr "Eine CSV-Beispiel-Datei gibt es im OpenSlides Wiki." +#: participant/templates/participant/import.html:29 +msgid "Use the CSV example file from OpenSlides Wiki." +msgstr "Verwenden Sie die CSV-Beispiel-Datei vom OpenSlides Wiki." -#: participant/templates/participant/import.html:30 -#: participant/templates/participant/overview.html:22 +#: participant/templates/participant/import.html:36 +#: participant/templates/participant/overview.html:28 msgid "Import" msgstr "Importieren" @@ -1827,6 +2157,7 @@ msgstr "" "erneut." #: participant/templates/participant/login.html:38 +#: participant/templates/participant/user_detail.html:45 msgid "Username" msgstr "Benutzername" @@ -1835,7 +2166,7 @@ msgid "Password" msgstr "Passwort" #: participant/templates/participant/login.html:47 -#: participant/templates/participant/overview.html:37 templates/base.html:46 +#: participant/templates/participant/overview.html:43 templates/base.html:46 msgid "Login" msgstr "Anmelden" @@ -1843,59 +2174,46 @@ msgstr "Anmelden" msgid "Continue as guest" msgstr "Weiter als Gast" -#: participant/templates/participant/overview.html:21 +#: participant/templates/participant/overview.html:27 msgid "All groups" msgstr "Alle Gruppen" -#: participant/templates/participant/overview.html:33 +#: participant/templates/participant/overview.html:39 msgid "List of participants" msgstr "Teilnehmerliste" -#: participant/templates/participant/overview.html:34 +#: participant/templates/participant/overview.html:40 msgid "First time passwords" msgstr "Erst-Passwörter" -#: participant/templates/participant/overview.html:42 +#: participant/templates/participant/overview.html:48 msgid "Print list of participants as PDF" msgstr "Teilnehmerliste als PDF drucken" -#: participant/templates/participant/overview.html:45 +#: participant/templates/participant/overview.html:51 msgid "Print first time passwords as PDF" msgstr "Erst-Passwörter als PDF drucken" -#: participant/templates/participant/overview.html:59 -#: participant/templates/participant/overview.html:74 -msgid "Not specified" -msgstr "Nicht angegeben" +#: participant/templates/participant/overview.html:61 +msgid "Present" +msgstr "Anwesend" -#: participant/templates/participant/overview.html:85 projector/models.py:65 -msgid "Active" -msgstr "Aktiv" - -#: participant/templates/participant/overview.html:86 -msgid "Inactive" -msgstr "Inaktiv" - -#: participant/templates/participant/overview.html:93 -msgid "participant" -msgid_plural "participants" -msgstr[0] "Teilnehmer/in" -msgstr[1] "Teilnehmer/innen" - -#: participant/templates/participant/overview.html:95 -msgid "of" -msgstr "von" - -#: participant/templates/participant/overview.html:107 -#: participant/templates/participant/user_detail.html:53 +#: participant/templates/participant/overview.html:70 +#: participant/templates/participant/user_detail.html:49 msgid "Last Login" msgstr "Letzer Login" -#: participant/templates/participant/overview.html:143 -msgid "Change status (active/inactive)" -msgstr "Status ändern (aktiv/inaktiv)" +#: participant/templates/participant/overview.html:82 +#: participant/templates/participant/overview.html:89 +msgid "present" +msgstr "anwesend" -#: participant/templates/participant/overview.html:153 +#: participant/templates/participant/overview.html:82 +#: participant/templates/participant/overview.html:89 +msgid "absent" +msgstr "abwesend" + +#: participant/templates/participant/overview.html:133 #: participant/templates/participant/user_widget.html:19 msgid "No participants available." msgstr "Keine Teilnehmer/innen vorhanden." @@ -1905,34 +2223,32 @@ msgstr "Keine Teilnehmer/innen vorhanden." msgid "Password Settings" msgstr "Passwort-Einstellungen" -#: participant/templates/participant/personal_info_widget.html:5 -msgid "I submitted the following motions:" -msgstr "Ich habe folgende Anträge gestellt:" - -#: participant/templates/participant/personal_info_widget.html:17 -#: participant/templates/participant/personal_info_widget.html:36 -#: participant/templates/participant/personal_info_widget.html:47 -msgid "None" -msgstr "Keine" - -#: participant/templates/participant/personal_info_widget.html:24 -msgid "I support the following motions:" -msgstr "Ich unterstütze folgende Anträge:" - -#: participant/templates/participant/personal_info_widget.html:43 -msgid "I am candidate for the following elections:" -msgstr "Ich bin Kandidat/in bei folgenden Wahlen:" - #: participant/templates/participant/settings.html:5 #: participant/templates/participant/settings.html:8 templates/base.html:40 msgid "Edit profile" msgstr "Profil bearbeiten" -#: participant/templates/participant/user_detail.html:23 +#: participant/templates/participant/user_detail.html:19 +msgid "Personal data" +msgstr "Persönliche Daten" + +#: participant/templates/participant/user_detail.html:22 +msgid "Email" +msgstr "E-Mail" + +#: participant/templates/participant/user_detail.html:29 +msgid "Event data" +msgstr "Veranstaltungsdaten" + +#: participant/templates/participant/user_detail.html:38 msgid "The participant is not member of any group." msgstr "Teilnehmer/in ist kein Mitglied einer Gruppe." -#: participant/templates/participant/user_detail.html:57 +#: participant/templates/participant/user_detail.html:44 +msgid "Administrative data" +msgstr "Administrative Daten" + +#: participant/templates/participant/user_detail.html:53 msgid "The participant has not logged in yet." msgstr "Teilnehmer/in hat sich noch nicht angemeldet." @@ -1948,63 +2264,38 @@ msgstr "Ungültige Stimmen" msgid "votes" msgstr "Stimmen" -#: projector/models.py:52 +#: projector/models.py:50 msgid "Can manage the projector" msgstr "Darf den Projektor steuern" -#: projector/models.py:53 +#: projector/models.py:51 msgid "Can see the projector" msgstr "Darf den Projektor sehen" -#: projector/models.py:54 +#: projector/models.py:52 msgid "Can see the dashboard" msgstr "Darf das Dashboard sehen" -#: projector/views.py:199 +#: projector/views.py:195 msgid "Errors in the form" msgstr "Fehler im Formular" -#: projector/views.py:373 projector/templates/projector/dashboard.html:18 +#: projector/views.py:364 projector/templates/projector/dashboard.html:18 msgid "Dashboard" msgstr "Dashboard" -#: projector/views.py:401 +#: projector/views.py:392 msgid "Projector live view" msgstr "Projektor-Live-Ansicht" -#: projector/views.py:427 +#: projector/views.py:407 msgid "Overlays" msgstr "Einblendungen" -#: projector/views.py:439 +#: projector/views.py:419 msgid "Custom Slides" msgstr "Benutzerdefinierte Folien" -#: projector/templates/projector/control_countdown.html:7 -msgctxt "seconds" -msgid "s" -msgstr "s" - -#: projector/templates/projector/control_countdown.html:9 -msgid "Save time as default" -msgstr "Zeit als Voreinstellung speichern" - -#: projector/templates/projector/control_countdown.html:12 -msgid "Reset countdown" -msgstr "Countdown zurücksetzen" - -#: projector/templates/projector/control_countdown.html:15 -msgid "Start countdown" -msgstr "Countdown starten" - -#: projector/templates/projector/control_countdown.html:18 -msgid "Stop countdown" -msgstr "Countdown stoppen" - -#: projector/templates/projector/control_overlay_message.html:10 -msgid "Clean message" -msgstr "Message leeren" - #: projector/templates/projector/custom_slide_widget.html:12 msgid "Welcome Page" msgstr "Willkommensseite" @@ -2026,12 +2317,12 @@ msgid "Zoom out" msgstr "Verkleinern" #: projector/templates/projector/live_view_widget.html:16 -msgid "Scroll text up" -msgstr "Text nach oben scrollen" +msgid "Scroll visible view up" +msgstr "Sichtbaren Bereich nach oben scrollen" #: projector/templates/projector/live_view_widget.html:19 -msgid "Scroll text down" -msgstr "Text nach unten scrollen" +msgid "Scroll visible view down" +msgstr "Sichtbaren Bereich nach unten scrollen" #: projector/templates/projector/live_view_widget.html:24 msgid "Reset projector view" @@ -2042,14 +2333,39 @@ msgstr "Projektor-Ansicht zurücksetzen" msgid "Custom slide" msgstr "Benutzerdefinierte Folie" -#: projector/templates/projector/overlay_widget.html:22 +#: projector/templates/projector/overlay_countdown_widget.html:5 msgid "Countdown for speaking time" msgstr "Countdown zur Redezeitbegrenzung" -#: projector/templates/projector/overlay_widget.html:26 +#: projector/templates/projector/overlay_countdown_widget.html:9 +msgctxt "seconds" +msgid "s" +msgstr "s" + +#: projector/templates/projector/overlay_countdown_widget.html:10 +msgid "Save time as default" +msgstr "Zeit als Voreinstellung speichern" + +#: projector/templates/projector/overlay_countdown_widget.html:14 +msgid "Reset countdown" +msgstr "Countdown zurücksetzen" + +#: projector/templates/projector/overlay_countdown_widget.html:17 +msgid "Start countdown" +msgstr "Countdown starten" + +#: projector/templates/projector/overlay_countdown_widget.html:20 +msgid "Stop countdown" +msgstr "Countdown stoppen" + +#: projector/templates/projector/overlay_message_widget.html:5 msgid "Message" msgstr "Mitteilung" +#: projector/templates/projector/overlay_message_widget.html:12 +msgid "Clean message" +msgstr "Message leeren" + #: projector/templates/projector/select_widgets.html:5 #: projector/templates/projector/select_widgets.html:8 msgid "Select widgets" @@ -2079,30 +2395,22 @@ msgstr "Passwort ändern" msgid "Logout" msgstr "Abmelden" -#: templates/base.html:100 -msgid "" -"Get professional " -"support for OpenSlides." -msgstr "" -"Nutzen Sie unseren professionellen Support für OpenSlides." - -#: utils/pdf.py:226 +#: utils/pdf.py:280 #, python-format msgid "As of: %s" msgstr "Stand: %s" -#: utils/pdf.py:237 utils/pdf.py:246 +#: utils/pdf.py:291 utils/pdf.py:300 #, python-format msgid "Page %s" msgstr "Seite %s" -#: utils/utils.py:59 utils/views.py:313 +#: utils/utils.py:60 utils/views.py:328 #, python-format msgid "Do you really want to delete %s?" msgstr "Soll %s wirklich gelöscht werden?" -#: utils/utils.py:106 +#: utils/utils.py:107 msgid "Sorry, you have no rights to see this page." msgstr "Bedaure, Sie haben keine Berechtigung diese Seite zu sehen." @@ -2114,404 +2422,25 @@ msgstr "Sind Sie sicher?" msgid "Thank you for your answer" msgstr "Danke für Ihre Antwort" -#: utils/views.py:285 +#: utils/views.py:299 #, python-format msgid "%s was successfully modified." msgstr "%s wurde erfolgreich bearbeitet." -#: utils/views.py:295 +#: utils/views.py:309 #, python-format msgid "%s was successfully created." msgstr "%s wurde erfolgreich angelegt." -#: utils/views.py:319 +#: utils/views.py:334 #, python-format msgid "%s was successfully deleted." msgstr "%s wurde erfolgreich gelöscht." -#: utils/views.py:329 +#: utils/views.py:347 msgid "undefined-filename" msgstr "undefinierter-dateiname" #: utils/jsonfield/fields.py:22 msgid "Enter valid JSON" msgstr "Gebe valides JSON ein" - -#~ msgid "Item %s was successfully modified." -#~ msgstr "Eintrag %s wurde erfolgreich bearbeitet." - -#~ msgid "Item %s was successfully created." -#~ msgstr "Eintrag %s wurde erfolgreich angelegt." - -#~ msgid "All items" -#~ msgstr "Alle Einträge" - -#~ msgid "Agenda as PDF" -#~ msgstr "Tagesordnung als PDF" - -#~ msgid "View item" -#~ msgstr "Eintrag anzeigen" - -#~ msgid "Show item" -#~ msgstr "Eintrag projizieren" - -#~ msgid "Activate item" -#~ msgstr "Eintrag projizieren" - -#~ msgid "Trivial change" -#~ msgstr "Triviale Änderung" - -#~ msgid "Import motions with status \"authorized\"" -#~ msgstr "Anträge als \"Zugelassen\" importieren" - -#~ msgid "Set the initial status for each motion to \"authorized\"" -#~ msgstr "Setzt den initialen Status für jeden Antrag auf \"zugelassen\"" - -#~ msgid "Allow trivial changes" -#~ msgstr "Triviale Änderungen erlauben" - -#~ msgid "Warning: Trivial changes undermine the motions autorisation system." -#~ msgstr "" -#~ "Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von " -#~ "Anträgen." - -#~ msgid "Version %d authorized" -#~ msgstr "Version %d zugelassen" - -#~ msgctxt "Rejected means not authorized" -#~ msgid "Version %d rejected" -#~ msgstr "Version %d verworfen" - -#~ msgid "Searching for supporters." -#~ msgstr "Auf Unterstützersuche." - -#~ msgid "Not yet authorized." -#~ msgstr "Noch nicht zugelassen." - -#~ msgid "Not yet authorized changes." -#~ msgstr "Noch nicht zugelassene Änderungen." - -#~ msgid "" -#~ "Trivial changes to version %(version)d; changed fields: %(changed_fields)s" -#~ msgstr "" -#~ "Triviale Änderung an Version %(version)d; Geänderte Felder: " -#~ "%(changed_fields)s" - -#~ msgid "Version %s created" -#~ msgstr "Version %s erstellt" - -#~ msgid "Supporters removed" -#~ msgstr "Unterstützer/innen gelöscht" - -#~ msgid "Status reseted to: %s" -#~ msgstr "Status zurückgesetzt auf: %s" - -#~ msgid "Number set: %s" -#~ msgstr "Nummer gesetzt: %s" - -#~ msgid "Version %s authorized" -#~ msgstr "Version %s zugelassen" - -#~ msgid "Version %s not authorized" -#~ msgstr "Version %s nicht zugelassen" - -#~ msgid "The motion status is already '%s.'" -#~ msgstr "Der Antragsstatus ist bereits '%s'." - -#~ msgid "" -#~ "The motion status is: '%(currentstatus)s'. You can not set the status to " -#~ "'%(newstatus)s'." -#~ msgstr "" -#~ "Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht " -#~ "auf '%(newstatus)s' setzen." - -#~ msgid "Status modified" -#~ msgstr "Status geändert" - -#~ msgid "by" -#~ msgstr "von" - -#~ msgid "You have not the necessary rights to create or edit motions." -#~ msgstr "" -#~ "Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " -#~ "bearbeiten." - -#~ msgid "You can not edit this motion." -#~ msgstr "Sie dürfen diesen Antrag nicht bearbeiten." - -#~ msgid "New motion was successfully created." -#~ msgstr "Neuer Antrag wurde erfolgreich angelegt." - -#~ msgid "Motion was successfully modified." -#~ msgstr "Antrag wurde erfolgreich geändert." - -#~ msgid "" -#~ "Attention: Do you really want to edit this motion? The supporters will " -#~ "not be removed automatically because you can manage motions. " -#~ "Please check if the supports are valid after your changing!" -#~ msgstr "" -#~ "Achtung: Wollen Sie den Antrag wirklich ändern? Die Unterstützer/innen " -#~ "werden nicht automatisch entfernt, da Sie Anträge verwalten " -#~ "dürfen. Prüfen Sie, ob die Unterstützungen noch gültig sind." - -#~ msgid "" -#~ "Attention: Do you really want to edit this motion? All %s " -#~ "supporters will be removed! Try to convince the supporters again." -#~ msgstr "" -#~ "Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " -#~ "werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." - -#~ msgid "Motion number was successfully set." -#~ msgstr "Antragsnummer wurde erfolgreich gesetzt." - -#~ msgid "Motion was successfully authorized." -#~ msgstr "Antrag wurde erfolgreich zugelassen." - -#~ msgid "Motion was successfully rejected." -#~ msgstr "Antrag wurde erfolgreich verworfen." - -#~ msgid "Motion status was reset." -#~ msgstr "Antragsstatus wurde zurückgesetzt." - -#~ msgid "Poll was successfully deleted." -#~ msgstr "Abstimmung wurde erfolgreich gelöscht." - -#~ msgid "the %s. poll" -#~ msgstr "die %s. Abstimmung" - -#~ msgid "You can not delete motion %s." -#~ msgstr "Sie können Antrag %s nicht löschen." - -#~ msgid "Motion %s was successfully deleted." -#~ msgstr "Antrag %s wurde erfolgreich gelöscht." - -#~ msgid "Invalid request" -#~ msgstr "Ungültige Anfrage" - -#~ msgid "Version %s accepted." -#~ msgstr "Version %s akzeptiert." - -#~ msgid "Do you really want to authorize version %s?" -#~ msgstr "Soll Version %s wirklich zugelassen werden?" - -#~ msgid "Version %s rejected." -#~ msgstr "Version %s zurückgewiesen." - -#~ msgid "ERROR by rejecting the version." -#~ msgstr "FEHLER beim Zurückweisen der Version." - -#~ msgid "Ignoring line %d because the assigned group may not act as a person." -#~ msgstr "" -#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete " -#~ "Gruppe nicht als Person auftreten darf." - -#~ msgid "Created by motion import." -#~ msgstr "Erstellt durch Antragsimport." - -#~ msgid "" -#~ "Ignoring line %d because it contains an incomplete first / last name pair." -#~ msgstr "" -#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. " -#~ "Nachname Leerstrings enthalten." - -#~ msgid "%d motion was successfully imported." -#~ msgid_plural "%d motions were successfully imported." -#~ msgstr[0] "%d Antrag wurde erfolgreich importiert." -#~ msgstr[1] "%d Anträge wurden erfolgreich importiert." - -#~ msgid "%d motion was successfully modified." -#~ msgid_plural "%d motions were successfully modified." -#~ msgstr[0] "%d Antrag wurde erfolgreich geändert." -#~ msgstr[1] "%d Anträge wurden erfolgreich geändert." - -#~ msgid "%d new user was added." -#~ msgid_plural "%d new users were added." -#~ msgstr[0] "%d neuer Nutzer wurde erstellt." -#~ msgstr[1] "%d neue Nutzer wurden erstellt." - -#~ msgid "%d new group was added." -#~ msgid_plural "%d new groups were added." -#~ msgstr[0] "%d neue Gruppe wurde erstellt." -#~ msgstr[1] "%d neue Gruppen wurden erstellt." - -#~ msgid "%d group assigned to motions." -#~ msgid_plural "%d groups assigned to motions." -#~ msgstr[0] "%d Gruppe wurde zugewiesen." -#~ msgstr[1] "%d Gruppen wurden zugewiesen." - -#~ msgid "" -#~ "Attention: Existing motions will be modified if you import new motions " -#~ "with the same number." -#~ msgstr "" -#~ "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " -#~ "identischer Nummer importieren." - -#~ msgid "" -#~ "Attention: Importing an motions without a number multiple times will " -#~ "create duplicates." -#~ msgstr "" -#~ "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " -#~ "entstehen." - -#~ msgid "Poll" -#~ msgstr "Abstimmung" - -#~ msgid "Motion No. %s" -#~ msgstr "Antrag Nr. %s" - -#~ msgid "%d. Vote" -#~ msgstr "%d. Abstimmung" - -#~ msgid "Edit motion" -#~ msgstr "Antrag bearbeiten" - -#~ msgid "New motion" -#~ msgstr "Neuer Antrag" - -#~ msgid "Import motions" -#~ msgstr "Anträge importieren" - -#~ msgid "Select a CSV file to import motions!" -#~ msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" - -#~ msgid "number, title, text, reason, first_name, last_name, is_group" -#~ msgstr "Nummer, Titel, Text, Begründung, Vorname, Nachname, Gruppenantrag" - -#~ msgid "" -#~ "number, reason and is_group are " -#~ "optional and may be empty" -#~ msgstr "" -#~ "Nummer, Begründung und Gruppenantrag sind optional und können auch leer sein" - -#~ msgid "Print all motions as PDF" -#~ msgstr "Alle Anträge als PDF drucken" - -#~ msgid "Need supporters" -#~ msgstr "Benötigt Unterstützer/innen" - -#~ msgid "Without number" -#~ msgstr "Ohne Nummer" - -#~ msgid "Not yet authorized" -#~ msgstr "Noch nicht zugelassen" - -#~ msgid "Authorized" -#~ msgstr "Zugelassen" - -#~ msgid "Withdrawen (by submitter)" -#~ msgstr "Zurückgezogen (durch Antragsteller/in)" - -#~ msgctxt "number of motions" -#~ msgid "motion" -#~ msgid_plural "motions" -#~ msgstr[0] "Antrag" -#~ msgstr[1] "Anträge" - -#~ msgid "#" -#~ msgstr "#" - -#~ msgid "Motion title" -#~ msgstr "Antragstitel" - -#~ msgid "Number of supporters" -#~ msgstr "Anzahl der Unterstützer/innen" - -#~ msgid "Creation Time" -#~ msgstr "Erstellungszeit" - -#~ msgid "Print motion as PDF" -#~ msgstr "Antrag als PDF drucken" - -#~ msgid "Back to motion" -#~ msgstr "Zurück zum Antrag" - -#~ msgid "Show motion" -#~ msgstr "Antrag anzeigen" - -#~ msgid "Print this motion as PDF" -#~ msgstr "Diesen Antrag als PDF drucken" - -#~ msgid "Delete motion" -#~ msgstr "Antrag löschen" - -#~ msgid "This is not the newest version." -#~ msgstr "Dies ist nicht die neuste Version." - -#~ msgid "Go to version" -#~ msgstr "Gehe zu Version" - -#~ msgid "This is not the authorized version." -#~ msgstr "Dies ist nicht die zugelassene Version." - -#~ msgid "Version History" -#~ msgstr "Versionshistorie" - -#~ msgid "This version is authorized" -#~ msgstr "Diese Version wurde zugelassen" - -#~ msgid "Permit this version" -#~ msgstr "Diese Version zulassen" - -#~ msgid "Reject this version" -#~ msgstr "Diese Version verwerfen" - -#~ msgid "This version is rejected" -#~ msgstr "Diese Version wurde verworfen" - -#~ msgid "unchanged" -#~ msgstr "unverändert" - -#~ msgid "Show log" -#~ msgstr "Log anzeigen" - -#~ msgid "No results" -#~ msgstr "Keine Ergebnisse" - -#~ msgid "Withdraw motion" -#~ msgstr "Antrag zurückziehen" - -#~ msgid "Unsupport motion" -#~ msgstr "Antrag nicht unterstützen" - -#~ msgid "Support" -#~ msgstr "Unterstützen" - -#~ msgid "minimum required supporters" -#~ msgstr "minimal erforderliche Unterstützer/innen" - -#~ msgid "Manage motion" -#~ msgstr "Antrag verwalten" - -#~ msgid "Formal validation" -#~ msgstr "Formale Gültigkeitsprüfung" - -#~ msgid "Publish" -#~ msgstr "Veröffentlichen" - -#~ msgid "Permit" -#~ msgstr "Zulassen" - -#~ msgid "Not permit" -#~ msgstr "Nicht zulassen" - -#~ msgid "Set number" -#~ msgstr "Setze Nummer" - -#~ msgid "Result after vote" -#~ msgstr "Ergebnis nach der Abstimmung" - -#~ msgid "Withdrawed by Submitter" -#~ msgstr "Zurückgezogen durch Antragsteller/in" - -#~ msgid "For Administration only:" -#~ msgstr "Nur zur Administration:" - -#~ msgid "Reset" -#~ msgstr "Zurücksetzen" - -#~ msgid "My motions and elections" -#~ msgstr "Meine Anträge und Wahlen" - -#~ msgid "Countdown" -#~ msgstr "Countdown" diff --git a/openslides/locale/de/LC_MESSAGES/djangojs.mo b/openslides/locale/de/LC_MESSAGES/djangojs.mo index 9bb3fd8c13976a7727d5b7b753985b712367c038..64d72537e9eb2d4fa45201ab308ca4ee981d2979 100644 GIT binary patch literal 2613 zcmZ{kTWDNG7{{mDdRbewH?>};wzaA4Nq0BB#BC#{$wphV+1TA0DZ+ZP=gaPx-I;aH zoTM8>&HSk6s!(`b1sag!SP)Z+Hpufm2VM)l;Qdkm{uS?E^ZpIbw|x7% zAgXxZ`wu~m{|U(RedhfMkmoxE@;<)?dET=iult<$7eHReAHMx>kmD>tQ0})B6v*?P_WoP%&w#wo@4WxX`?Da&J@5Smkk|Pq$Z`GxdA@%@p6@Cg z2K!~6%fWl$SA*Pt7l^JR=lu}K@gMdqf*fbU`@6bnTqU z4)A`6@4FA`fp~2aS|}WY%RSH*=r%Se*)Bu?^7^@Khc-c5*`V+_EEFuGQ|`j^R{xu^ z8S01bhB)u}n^_HUxdGyDp7Vn^}&WmaWh_RaLD}I}G&Al~Q@|V42TSR`O%R6+XjCxmX??tt=Xlh!WO>dCGOv z#KxW9d~D?emEwrnVuDa34TFxALVoPftt2!V#B|$ CM;7`3 delta 419 zcmXZXze>YU6bA59O_QdnMT=Ghg*1*uY2u=xgCG?x1%+%batVRNsDb?HAVP7|O}t3K z!8dSla1lY!$<5KBI`{%Uf__(W;L9)fB%GW)Oy89TUp48PP!(hzIYp+B5h6-25G}$6 zoP!-$g!@o}UhYBuJc1?kFQ5XiU>)AT7QBbzJKwNdpaK2jMn|JNPBa5UD8n--2At>T zOK9Lc%=?dd{{`02e}l_#1RGGpb{I`%M9fnWv6xt1%+(O0St7juUt_q6KN3~ppHjEH z8N^9SJ(i^Wxu{R>#$G>&vV, YEAR. +# German translations for JavaScript file in OpenSlides package. +# Copyright (C) 2011-2013 by OpenSlides team, see AUTHORS. +# This file is distributed under the same license as the OpenSlides package. +# Emanuel Schütze , 2013. # msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 21:29+0100\n" +"POT-Creation-Date: 2013-04-23 16:17+0200\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n" -"Last-Translator: Oskar Hahn \n" +"Last-Translator: Emanuel Schütze \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: agenda/static/javascript/agenda-config-datepicker.js:9 +#: agenda/static/javascript/agenda-config-datepicker.js:39 +msgid "en" +msgstr "en" + +#: agenda/static/javascript/agenda-config-datepicker.js:10 +msgid "previous month" +msgstr "vorheriger Monat" + +#: agenda/static/javascript/agenda-config-datepicker.js:11 +msgid "next month" +msgstr "nächster Monat" + +#: agenda/static/javascript/agenda-config-datepicker.js:13 +msgid "January" +msgstr "Januar" + +#: agenda/static/javascript/agenda-config-datepicker.js:13 +msgid "February" +msgstr "Februar" + +#: agenda/static/javascript/agenda-config-datepicker.js:13 +msgid "March" +msgstr "März" + +#: agenda/static/javascript/agenda-config-datepicker.js:14 +msgid "April" +msgstr "April" + +#: agenda/static/javascript/agenda-config-datepicker.js:14 +#: agenda/static/javascript/agenda-config-datepicker.js:20 +msgid "May" +msgstr "Mai" + +#: agenda/static/javascript/agenda-config-datepicker.js:14 +msgid "June" +msgstr "Juni" + +#: agenda/static/javascript/agenda-config-datepicker.js:15 +msgid "July" +msgstr "Juli" + +#: agenda/static/javascript/agenda-config-datepicker.js:15 +msgid "August" +msgstr "August" + +#: agenda/static/javascript/agenda-config-datepicker.js:15 +msgid "September" +msgstr "September" + +#: agenda/static/javascript/agenda-config-datepicker.js:16 +msgid "October" +msgstr "Oktober" + +#: agenda/static/javascript/agenda-config-datepicker.js:16 +msgid "November" +msgstr "November" + +#: agenda/static/javascript/agenda-config-datepicker.js:16 +msgid "December" +msgstr "Dezember" + +#: agenda/static/javascript/agenda-config-datepicker.js:19 +msgid "Jan" +msgstr "Jan" + +#: agenda/static/javascript/agenda-config-datepicker.js:19 +msgid "Feb" +msgstr "Feb" + +#: agenda/static/javascript/agenda-config-datepicker.js:19 +msgid "Mar" +msgstr "Mär" + +#: agenda/static/javascript/agenda-config-datepicker.js:20 +msgid "Apr" +msgstr "Apr" + +#: agenda/static/javascript/agenda-config-datepicker.js:20 +msgid "Jun" +msgstr "Jun" + +#: agenda/static/javascript/agenda-config-datepicker.js:21 +msgid "Jul" +msgstr "Jul" + +#: agenda/static/javascript/agenda-config-datepicker.js:21 +msgid "Aug" +msgstr "Aug" + +#: agenda/static/javascript/agenda-config-datepicker.js:21 +msgid "Sep" +msgstr "Sep" + +#: agenda/static/javascript/agenda-config-datepicker.js:22 +msgid "Oct" +msgstr "Okt" + +#: agenda/static/javascript/agenda-config-datepicker.js:22 +msgid "Nov" +msgstr "Nov" + +#: agenda/static/javascript/agenda-config-datepicker.js:22 +msgid "Dec" +msgstr "Dez" + +#: agenda/static/javascript/agenda-config-datepicker.js:25 +msgid "Sunday" +msgstr "Sonntag" + +#: agenda/static/javascript/agenda-config-datepicker.js:25 +msgid "Monday" +msgstr "Montag" + +#: agenda/static/javascript/agenda-config-datepicker.js:25 +msgid "Tuesdey" +msgstr "Dienstag" + +#: agenda/static/javascript/agenda-config-datepicker.js:25 +msgid "Wednesday" +msgstr "Mittwoch" + +#: agenda/static/javascript/agenda-config-datepicker.js:26 +msgid "Thursday" +msgstr "Donnerstag" + +#: agenda/static/javascript/agenda-config-datepicker.js:26 +msgid "Friday" +msgstr "Freitag" + +#: agenda/static/javascript/agenda-config-datepicker.js:26 +msgid "Saturday" +msgstr "Samstag" + +#: agenda/static/javascript/agenda-config-datepicker.js:29 +#: agenda/static/javascript/agenda-config-datepicker.js:33 +msgid "Su" +msgstr "So" + +#: agenda/static/javascript/agenda-config-datepicker.js:29 +#: agenda/static/javascript/agenda-config-datepicker.js:33 +msgid "Mo" +msgstr "Mo" + +#: agenda/static/javascript/agenda-config-datepicker.js:29 +#: agenda/static/javascript/agenda-config-datepicker.js:33 +msgid "Tu" +msgstr "Di" + +#: agenda/static/javascript/agenda-config-datepicker.js:29 +#: agenda/static/javascript/agenda-config-datepicker.js:33 +msgid "We" +msgstr "Mi" + +#: agenda/static/javascript/agenda-config-datepicker.js:30 +#: agenda/static/javascript/agenda-config-datepicker.js:34 +msgid "Th" +msgstr "Do" + +#: agenda/static/javascript/agenda-config-datepicker.js:30 +#: agenda/static/javascript/agenda-config-datepicker.js:34 +msgid "Fr" +msgstr "Fr" + +#: agenda/static/javascript/agenda-config-datepicker.js:30 +#: agenda/static/javascript/agenda-config-datepicker.js:34 +msgid "Sa" +msgstr "Sa" + +#: agenda/static/javascript/agenda-config-datepicker.js:45 +msgid "Time" +msgstr "Zeit" + +#: agenda/static/javascript/agenda-config-datepicker.js:46 +msgid "Hour" +msgstr "Stunde" + +#: agenda/static/javascript/agenda-config-datepicker.js:47 +msgid "Minute" +msgstr "Minute" + +#: agenda/static/javascript/agenda-config-datepicker.js:48 +msgid "Current time" +msgstr "Aktuelle Zeit" + +#: agenda/static/javascript/agenda-config-datepicker.js:49 +msgid "Close" +msgstr "Schließen" + #: agenda/static/javascript/agenda.js:27 #, c-format msgid ", of which %s are hidden." diff --git a/openslides/mediafile/models.py b/openslides/mediafile/models.py index 806d9ed70..98ab41f9a 100644 --- a/openslides/mediafile/models.py +++ b/openslides/mediafile/models.py @@ -13,7 +13,7 @@ import mimetypes from django.db import models -from django.utils.translation import ugettext_noop +from django.utils.translation import ugettext_lazy, ugettext_noop from openslides.utils.person.models import PersonField @@ -23,16 +23,16 @@ class Mediafile(models.Model): Class for uploaded files which can be delivered under a certain url. """ - mediafile = models.FileField(upload_to='file') + mediafile = models.FileField(upload_to='file', verbose_name=ugettext_lazy("File")) """ See https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield for more information. """ - title = models.CharField(max_length=255, unique=True) + title = models.CharField(max_length=255, unique=True, verbose_name=ugettext_lazy("Title")) """A string representing the title of the file.""" - uploader = PersonField(blank=True) + uploader = PersonField(blank=True, verbose_name=ugettext_lazy("Uploaded by")) """A person – the uploader of a file.""" timestamp = models.DateTimeField(auto_now_add=True) diff --git a/openslides/mediafile/static/styles/mediafile.css b/openslides/mediafile/static/styles/mediafile.css index 99f7d28cd..1ce9b1168 100644 --- a/openslides/mediafile/static/styles/mediafile.css +++ b/openslides/mediafile/static/styles/mediafile.css @@ -8,5 +8,9 @@ /** Navigation icons (mapping to glyphicons-halflings) **/ .icon-mediafile { - background-position: -96px -24px; + background-image: url("../img/glyphicons_062_paperclip.png"); + background-position: 0; +} +.leftmenu ul li.active a span.ico i.icon-mediafile { + background-image: url("../img/glyphicons_062_paperclip_white.png"); } diff --git a/openslides/mediafile/templates/mediafile/mediafile_list.html b/openslides/mediafile/templates/mediafile/mediafile_list.html index 73b7b3530..eb39c2afe 100644 --- a/openslides/mediafile/templates/mediafile/mediafile_list.html +++ b/openslides/mediafile/templates/mediafile/mediafile_list.html @@ -19,7 +19,7 @@ {% trans 'Type' %} {% trans 'Size' %} {% trans 'Upload time' %} - {% trans 'Uploader' %} + {% trans 'Uploaded by' %} {% if perms.mediafile.can_manage %} {% trans "Actions" %} {% endif %} diff --git a/openslides/motion/forms.py b/openslides/motion/forms.py index d5a7e76c8..989af7a6e 100644 --- a/openslides/motion/forms.py +++ b/openslides/motion/forms.py @@ -11,7 +11,7 @@ """ from django import forms -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy from openslides.utils.forms import CssClassMixin from openslides.utils.forms import CleanHtmlFormMixin @@ -30,18 +30,18 @@ class BaseMotionForm(CleanHtmlFormMixin, CssClassMixin, forms.ModelForm): """ clean_html_fields = ('text', 'reason') - title = forms.CharField(widget=forms.TextInput(), label=_("Title")) + title = forms.CharField(widget=forms.TextInput(), label=ugettext_lazy("Title")) """ Title of the motion. Will be saved in a MotionVersion object. """ - text = forms.CharField(widget=forms.Textarea(), label=_("Text")) + text = forms.CharField(widget=forms.Textarea(), label=ugettext_lazy("Text")) """ Text of the motion. Will be saved in a MotionVersion object. """ reason = forms.CharField( - widget=forms.Textarea(), required=False, label=_("Reason")) + widget=forms.Textarea(), required=False, label=ugettext_lazy("Reason")) """ Reason of the motion. will be saved in a MotionVersion object. """ @@ -64,7 +64,7 @@ class BaseMotionForm(CleanHtmlFormMixin, CssClassMixin, forms.ModelForm): class MotionSubmitterMixin(forms.ModelForm): """Mixin to append the submitter field to a MotionForm.""" - submitter = MultiplePersonFormField(label=_("Submitter")) + submitter = MultiplePersonFormField(label=ugettext_lazy("Submitter")) """Submitter of the motion. Can be one or more persons.""" def __init__(self, *args, **kwargs): @@ -78,7 +78,7 @@ class MotionSubmitterMixin(forms.ModelForm): class MotionSupporterMixin(forms.ModelForm): """Mixin to append the supporter field to a Motionform.""" - supporter = MultiplePersonFormField(required=False, label=_("Supporters")) + supporter = MultiplePersonFormField(required=False, label=ugettext_lazy("Supporters")) """Supporter of the motion. Can be one or more persons.""" def __init__(self, *args, **kwargs): @@ -93,8 +93,8 @@ class MotionDisableVersioningMixin(forms.ModelForm): """Mixin to add the option to the form to choose to disable versioning.""" disable_versioning = forms.BooleanField( - required=False, label=_("Don't create a new version"), - help_text=_("Don't create a new version. Useful e. g. for trivial changes.")) + required=False, label=ugettext_lazy("Don't create a new version"), + help_text=ugettext_lazy("Don't create a new version. Useful e.g. for trivial changes.")) """BooleanField to decide, if a new version will be created, or the last_version will be used.""" @@ -102,10 +102,10 @@ class MotionDisableVersioningMixin(forms.ModelForm): class MotionCategoryMixin(forms.ModelForm): """Mixin to let the user choose the category for the motion.""" - category = forms.ModelChoiceField(queryset=Category.objects.all(), required=False) + category = forms.ModelChoiceField(queryset=Category.objects.all(), required=False, label=ugettext_lazy("Category")) class MotionIdentifierMixin(forms.ModelForm): """Mixin to let the user choose the identifier for the motion.""" - identifier = forms.CharField(required=False) + identifier = forms.CharField(required=False, label=ugettext_lazy("Identifier")) diff --git a/openslides/motion/models.py b/openslides/motion/models.py index 1d3e9f0ff..e54379c87 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -21,7 +21,7 @@ from django.db.models import Max from django.dispatch import receiver from django.utils import formats from django.utils.translation import pgettext -from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from openslides.utils.person import PersonField from openslides.config.api import config @@ -565,7 +565,7 @@ class MotionVersion(models.Model): title = models.CharField(max_length=255, verbose_name=ugettext_lazy("Title")) """The title of a motion.""" - text = models.TextField(verbose_name=_("Text")) + text = models.TextField(verbose_name=ugettext_lazy("Text")) """The text of a motion.""" reason = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Reason")) @@ -585,7 +585,7 @@ class MotionVersion(models.Model): def __unicode__(self): """Return a string, representing this object.""" - counter = self.version_number or _('new') + counter = self.version_number or ugettext_lazy('new') return "%s Version %s" % (self.motion, counter) # TODO: Should this really be self.motion or the title of the specific version? def get_absolute_url(self, link='detail'): diff --git a/openslides/motion/pdf.py b/openslides/motion/pdf.py index 8ea7a0279..a029b2b2f 100644 --- a/openslides/motion/pdf.py +++ b/openslides/motion/pdf.py @@ -167,7 +167,7 @@ def motion_to_pdf(pdf, motion): # motion reason if motion.reason: - pdf.append(Paragraph(_("Reason:"), stylesheet['Heading3'])) + pdf.append(Paragraph(_("Reason")+":", stylesheet['Heading3'])) convert_html_to_reportlab(pdf, motion.reason) return pdf diff --git a/openslides/motion/signals.py b/openslides/motion/signals.py index 76f2f9668..8f86ffc4d 100644 --- a/openslides/motion/signals.py +++ b/openslides/motion/signals.py @@ -30,36 +30,36 @@ def setup_motion_config_page(sender, **kwargs): name='motion_stop_submitting', default_value=False, form_field=forms.BooleanField( - label=_('Stop submitting new motions by non-staff users'), + label=ugettext_lazy('Stop submitting new motions by non-staff users'), required=False)) motion_min_supporters = ConfigVariable( name='motion_min_supporters', default_value=0, form_field=forms.IntegerField( widget=forms.TextInput(attrs={'class': 'small-input'}), - label=_('Number of (minimum) required supporters for a motion'), + label=ugettext_lazy('Number of (minimum) required supporters for a motion'), initial=4, min_value=0, max_value=8, - help_text=_('Choose 0 to disable the supporting system'))) + help_text=ugettext_lazy('Choose 0 to disable the supporting system'))) motion_preamble = ConfigVariable( name='motion_preamble', default_value=_('The assembly may decide,'), form_field=forms.CharField( widget=forms.TextInput(), required=False, - label=_('Motion preamble'))) + label=ugettext_lazy('Motion preamble'))) motion_pdf_ballot_papers_selection = ConfigVariable( name='motion_pdf_ballot_papers_selection', default_value='CUSTOM_NUMBER', form_field=forms.ChoiceField( widget=forms.Select(), required=False, - label=_('Number of ballot papers (selection)'), + label=ugettext_lazy('Number of ballot papers (selection)'), choices=[ - ('NUMBER_OF_DELEGATES', _('Number of all delegates')), - ('NUMBER_OF_ALL_PARTICIPANTS', _('Number of all participants')), - ('CUSTOM_NUMBER', _("Use the following custom number"))])) + ('NUMBER_OF_DELEGATES', ugettext_lazy('Number of all delegates')), + ('NUMBER_OF_ALL_PARTICIPANTS', ugettext_lazy('Number of all participants')), + ('CUSTOM_NUMBER', ugettext_lazy("Use the following custom number"))])) motion_pdf_ballot_papers_number = ConfigVariable( name='motion_pdf_ballot_papers_number', default_value=8, @@ -67,46 +67,46 @@ def setup_motion_config_page(sender, **kwargs): widget=forms.TextInput(attrs={'class': 'small-input'}), required=False, min_value=1, - label=_('Custom number of ballot papers'))) + label=ugettext_lazy('Custom number of ballot papers'))) motion_pdf_title = ConfigVariable( name='motion_pdf_title', default_value=_('Motions'), form_field=forms.CharField( widget=forms.TextInput(), required=False, - label=_('Title for PDF document (all motions)'))) + label=ugettext_lazy('Title for PDF document (all motions)'))) motion_pdf_preamble = ConfigVariable( name='motion_pdf_preamble', default_value='', form_field=forms.CharField( widget=forms.Textarea(), required=False, - label=_('Preamble text for PDF document (all motions)'))) + label=ugettext_lazy('Preamble text for PDF document (all motions)'))) motion_allow_disable_versioning = ConfigVariable( name='motion_allow_disable_versioning', default_value=False, form_field=forms.BooleanField( - label=_('Allow to disable versioning'), + label=ugettext_lazy('Allow to disable versioning'), required=False)) motion_workflow = ConfigVariable( name='motion_workflow', default_value=1, form_field=forms.ChoiceField( widget=forms.Select(), - label=_('Workflow of new motions'), + label=ugettext_lazy('Workflow of new motions'), required=True, - choices=[(workflow.pk, workflow.name) for workflow in Workflow.objects.all()])) + choices=[(workflow.pk, ugettext_lazy(workflow.name)) for workflow in Workflow.objects.all()])) motion_identifier = ConfigVariable( name='motion_identifier', default_value='manually', form_field=forms.ChoiceField( widget=forms.Select(), required=False, - label=_('Identifier'), + label=ugettext_lazy('Identifier'), choices=[ - ('manually', _('Set it manually')), - ('per_category', _('Numbered per category')), - ('serially_numbered', _('Serially numbered'))])) + ('manually', ugettext_lazy('Set it manually')), + ('per_category', ugettext_lazy('Numbered per category')), + ('serially_numbered', ugettext_lazy('Serially numbered'))])) return ConfigPage(title=ugettext_noop('Motion'), url='motion', diff --git a/openslides/motion/templates/motion/category_list.html b/openslides/motion/templates/motion/category_list.html index 41e9f821d..3544997ff 100644 --- a/openslides/motion/templates/motion/category_list.html +++ b/openslides/motion/templates/motion/category_list.html @@ -10,7 +10,7 @@ {% trans "Categories" %} {% if perms.motion.can_manage_motion %} - {% trans 'New' %} + {% trans 'New' %} {% endif %} {% trans "Back to overview" %} diff --git a/openslides/motion/templates/motion/motion_detail.html b/openslides/motion/templates/motion/motion_detail.html index a7969e7c2..10595e5ed 100644 --- a/openslides/motion/templates/motion/motion_detail.html +++ b/openslides/motion/templates/motion/motion_detail.html @@ -126,11 +126,11 @@ - + {# TODO: add delete version function #} - + diff --git a/openslides/motion/templates/motion/motion_diff.html b/openslides/motion/templates/motion/motion_diff.html index f03d54b85..9a4397da0 100644 --- a/openslides/motion/templates/motion/motion_diff.html +++ b/openslides/motion/templates/motion/motion_diff.html @@ -34,11 +34,11 @@ diff --git a/openslides/motion/templates/motion/motion_form.html b/openslides/motion/templates/motion/motion_form.html index e8242cd64..72bb29bdb 100644 --- a/openslides/motion/templates/motion/motion_form.html +++ b/openslides/motion/templates/motion/motion_form.html @@ -31,7 +31,11 @@ {% trans "New motion" %} {% endif %} - {% trans "Back to overview" %} + {% if motion %} + {% trans "Back to motion" %} + {% else %} + {% trans "Back to overview" %} + {% endif %} {% csrf_token %} diff --git a/openslides/motion/templates/motion/motion_list.html b/openslides/motion/templates/motion/motion_list.html index f61f4311e..73e4be414 100644 --- a/openslides/motion/templates/motion/motion_list.html +++ b/openslides/motion/templates/motion/motion_list.html @@ -15,7 +15,7 @@ {% endif %} {% endif %} {% if perms.motion.can_manage_motion %} - {% trans 'Category' %} + {% trans 'Categories' %} {# {% trans 'Import' %}#} {% endif %} PDF diff --git a/openslides/motion/views.py b/openslides/motion/views.py index b459e27f5..16374909a 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -291,7 +291,7 @@ class VersionDiffView(DetailView): diff_text = htmldiff(version_rev1.text, version_rev2.text) diff_reason = htmldiff(version_rev1.reason, version_rev2.reason) except (KeyError, ValueError, MotionVersion.DoesNotExist): - messages.error(self.request, _('At least one version number was not valid.')) + messages.error(self.request, _('At least one version number is not valid.')) version_rev1 = None version_rev2 = None diff_text = None @@ -556,7 +556,7 @@ class MotionSetStateView(SingleObjectMixin, RedirectView): else: self.object.save() # TODO: the state is not translated - self.object.write_log(ugettext_noop('Changed state to %s') % + self.object.write_log(ugettext_noop('State changed to %s') % self.object.state.name, self.request.user) messages.success(request, _('Motion status was set to: %s.' % html_strong(self.object.state))) @@ -583,7 +583,7 @@ class CreateAgendaItemView(SingleObjectMixin, RedirectView): def pre_redirect(self, request, *args, **kwargs): """Create the agenda item.""" self.item = Item.objects.create(related_sid=self.object.sid) - self.object.write_log(ugettext_noop('Created Agenda Item'), self.request.user) + self.object.write_log(ugettext_noop('Agenda item created'), self.request.user) create_agenda_item = CreateAgendaItemView.as_view() @@ -595,7 +595,7 @@ class MotionPDFView(SingleObjectMixin, PDFView): If self.print_all_motions is False, the view returns a PDF with only one motion.""" - permission_required = 'motion.can_manage_motion' + permission_required = 'motion.can_see_motion' model = Motion top_space = 0 print_all_motions = False diff --git a/openslides/participant/api.py b/openslides/participant/api.py index 8c0bd94ed..b4d127dc2 100644 --- a/openslides/participant/api.py +++ b/openslides/participant/api.py @@ -97,7 +97,7 @@ def import_users(csv_file): error_messages.append(_('Ignoring malformed group id in line %d.') % (line_no + 1)) continue except Group.DoesNotExist: - error_messages.append(_('Group id %s does not exists (line %d).') % (groupid, line_no + 1)) + error_messages.append(_('Group id %(id)s does not exists (line %(line)d).') % {'id': groupid, 'line': line_no + 1}) continue user.reset_password() count_success += 1 diff --git a/openslides/participant/forms.py b/openslides/participant/forms.py index 0b6053953..c1d354dce 100644 --- a/openslides/participant/forms.py +++ b/openslides/participant/forms.py @@ -117,11 +117,11 @@ class GroupForm(forms.ModelForm, CssClassMixin): # Editing the anonymous-user if self.instance.name.lower() != data.lower(): raise forms.ValidationError( - ugettext_lazy('You can not edit the name for this group.')) + _('You can not edit the name for this group.')) else: if data.lower() in ['anonymous', 'registered']: raise forms.ValidationError( - ugettext_lazy('Group name "%s" is reserved for internal use.') % data) + _('Group name "%s" is reserved for internal use.') % data) return data class Meta: diff --git a/openslides/participant/models.py b/openslides/participant/models.py index b90ce7963..c48cf1e3d 100644 --- a/openslides/participant/models.py +++ b/openslides/participant/models.py @@ -14,7 +14,7 @@ from django.contrib.auth.models import User as DjangoUser, Group as DjangoGroup from django.db import models from django.db.models import signals from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _, ugettext_noop # TODO: Change this in the code +from django.utils.translation import ugettext_lazy, ugettext_noop from openslides.utils.person import PersonMixin, Person from openslides.utils.person.signals import receive_persons @@ -27,32 +27,32 @@ class User(PersonMixin, Person, SlideMixin, DjangoUser): prefix = 'user' # This is for the slides person_prefix = 'user' GENDER_CHOICES = ( - ('male', _('Male')), - ('female', _('Female')), + ('male', ugettext_lazy('Male')), + ('female', ugettext_lazy('Female')), ) django_user = models.OneToOneField(DjangoUser, editable=False, parent_link=True) structure_level = models.CharField( - max_length=255, blank=True, default='', verbose_name=_("Structure level"), - help_text=_('Will be shown after the name.')) + max_length=255, blank=True, default='', verbose_name=ugettext_lazy("Structure level"), + help_text=ugettext_lazy('Will be shown after the name.')) title = models.CharField( - max_length=50, blank=True, default='', verbose_name=_("Titel"), - help_text=_('Will be shown before the name.')) + max_length=50, blank=True, default='', verbose_name=ugettext_lazy("Title"), + help_text=ugettext_lazy('Will be shown before the name.')) gender = models.CharField( max_length=50, choices=GENDER_CHOICES, blank=True, - verbose_name=_("Gender"), help_text=_('Only for filtering the participant list.')) + verbose_name=ugettext_lazy("Gender"), help_text=ugettext_lazy('Only for filtering the participant list.')) committee = models.CharField( - max_length=255, blank=True, default='', verbose_name=_("Committee"), - help_text=_('Only for filtering the participant list.')) + max_length=255, blank=True, default='', verbose_name=ugettext_lazy("Committee"), + help_text=ugettext_lazy('Only for filtering the participant list.')) about_me = models.TextField( - blank=True, default='', verbose_name=_('About me'), - help_text=_('Your profile text')) + blank=True, default='', verbose_name=ugettext_lazy('About me'), + help_text=ugettext_lazy('Your profile text')) comment = models.TextField( - blank=True, default='', verbose_name=_('Comment'), - help_text=_('Only for notes.')) + blank=True, default='', verbose_name=ugettext_lazy('Comment'), + help_text=ugettext_lazy('Only for notes.')) default_password = models.CharField( max_length=100, blank=True, default='', - verbose_name=_("Default password")) + verbose_name=ugettext_lazy("Default password")) @property def clean_name(self): @@ -134,9 +134,9 @@ class Group(PersonMixin, Person, SlideMixin, DjangoGroup): django_group = models.OneToOneField(DjangoGroup, editable=False, parent_link=True) group_as_person = models.BooleanField( - default=False, verbose_name=_("Use this group as participant"), - help_text=_('For example as submitter of a motion.')) - description = models.TextField(blank=True, verbose_name=_("Description")) + default=False, verbose_name=ugettext_lazy("Use this group as participant"), + help_text=ugettext_lazy('For example as submitter of a motion.')) + description = models.TextField(blank=True, verbose_name=ugettext_lazy("Description")) @models.permalink def get_absolute_url(self, link='view'): diff --git a/openslides/participant/signals.py b/openslides/participant/signals.py index ce9a153b4..f0c9da7ea 100644 --- a/openslides/participant/signals.py +++ b/openslides/participant/signals.py @@ -12,7 +12,7 @@ from django.dispatch import receiver from django import forms -from django.utils.translation import ugettext_noop, ugettext_lazy, ugettext as _ +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission @@ -35,23 +35,23 @@ def setup_participant_config_page(sender, **kwargs): form_field=forms.CharField( widget=forms.TextInput(), required=False, - label=_('System URL'), - help_text=_('Printed in PDF of first time passwords only.'))) + label=ugettext_lazy('System URL'), + help_text=ugettext_lazy('Printed in PDF of first time passwords only.'))) participant_pdf_welcometext = ConfigVariable( name='participant_pdf_welcometext', default_value=_('Welcome to OpenSlides!'), form_field=forms.CharField( widget=forms.Textarea(), required=False, - label=_('Welcome text'), - help_text=_('Printed in PDF of first time passwords only.'))) + label=ugettext_lazy('Welcome text'), + help_text=ugettext_lazy('Printed in PDF of first time passwords only.'))) participant_sort_users_by_first_name = ConfigVariable( name='participant_sort_users_by_first_name', default_value=False, form_field=forms.BooleanField( required=False, - label=_('Sort participants by first name'), - help_text=_('Disable for sorting by last name'))) + label=ugettext_lazy('Sort participants by first name'), + help_text=ugettext_lazy('Disable for sorting by last name'))) return ConfigPage(title=ugettext_noop('Participant'), url='participant', diff --git a/openslides/participant/templates/participant/group_detail.html b/openslides/participant/templates/participant/group_detail.html index 99e46ad8c..a8aa31ec8 100644 --- a/openslides/participant/templates/participant/group_detail.html +++ b/openslides/participant/templates/participant/group_detail.html @@ -3,11 +3,11 @@ {% load i18n %} {% load tags %} -{% block title %}{{ block.super }} – {{ group }}{% endblock %} +{% block title %}{{ block.super }} – {% trans group.name %}{% endblock %} {% block content %} -

          {{ group }} +

          {% trans group.name %} {% trans "Back to overview" %} diff --git a/openslides/participant/templates/participant/group_overview.html b/openslides/participant/templates/participant/group_overview.html index c5115685b..1edffae99 100644 --- a/openslides/participant/templates/participant/group_overview.html +++ b/openslides/participant/templates/participant/group_overview.html @@ -21,7 +21,7 @@ {% for group in groups %}

          {% trans "Version" %} {{ version_rev1.version_number }}
          - {% trans "created: " %} {{ version_rev1.creation_time }}
          + {% trans "created" %}: {{ version_rev1.creation_time }}

          {{ version_rev1.title }}

          {% trans "Version" %} {{ version_rev2.version_number }}
          - {% trans "created: " %} {{ version_rev1.creation_time }}
          + {% trans "created" %}: {{ version_rev1.creation_time }}

          {{ version_rev2.title }}

          - {{ group.name }} + {% trans group.name %} diff --git a/openslides/participant/templates/participant/user_detail.html b/openslides/participant/templates/participant/user_detail.html index 90fa33c4b..9cbda51fe 100644 --- a/openslides/participant/templates/participant/user_detail.html +++ b/openslides/participant/templates/participant/user_detail.html @@ -14,43 +14,44 @@ +
          +
          + {% trans "Personal data" %} + + {{ shown_user.get_gender_display }} + + {{ shown_user.email }} + + {{ shown_user.about_me|linebreaks }} +
          -
          - {% trans "Personal data" %} - - {{ shown_user.get_gender_display }} - - {{ shown_user.email }} - - {{ shown_user.about_me|linebreaks }} -
          +
          + {% trans "Event data" %} + + {{ shown_user.structure_level }} + + {{ shown_user.committee }} + + {% if shown_user.groups.all %} + {{ shown_user.groups.all|join:", " }} + {% else %} + {% trans "The participant is not member of any group." %} + {% endif %} +
          -
          - {% trans "Event data" %} - - {{ shown_user.structure_level }} - - {{ shown_user.committee }} - - {% if shown_user.groups.all %} - {{ shown_user.groups.all|join:", " }} - {% else %} - {% trans "The participant is not member of any group." %} + {% if perms.participant.can_manage_participant %} +
          + {% trans "Administrative data" %} + + {{ shown_user.username }} + + {{ shown_user.comment|linebreaks }} + + {% if shown_user.last_login > shown_user.date_joined %} + {{ shown_user.last_login }} + {% else %} + {% trans "The participant has not logged in yet." %} + {% endif %} {% endif %} -
          - -{% if perms.participant.can_manage_participant %} -
          - {% trans "Administrative data" %} - - {{ shown_user.username }} - - {{ shown_user.comment|linebreaks }} - - {% if shown_user.last_login > shown_user.date_joined %} - {{ shown_user.last_login }} - {% else %} - {% trans "The participant has not logged in yet." %} - {% endif %} -{% endif %} +
          {% endblock %} diff --git a/openslides/projector/models.py b/openslides/projector/models.py index 8705181c3..2dfcd538d 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -12,7 +12,7 @@ from django.db import models from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _, ugettext_noop +from django.utils.translation import ugettext_lazy, ugettext_noop from openslides.projector.api import register_slidemodel from openslides.projector.projector import SlideMixin @@ -24,9 +24,9 @@ class ProjectorSlide(models.Model, SlideMixin): """ prefix = 'ProjectorSlide' - title = models.CharField(max_length=256, verbose_name=_("Title")) - text = models.TextField(null=True, blank=True, verbose_name=_("Text")) - weight = models.IntegerField(default=0, verbose_name=_("Weight")) + title = models.CharField(max_length=256, verbose_name=ugettext_lazy("Title")) + text = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Text")) + weight = models.IntegerField(default=0, verbose_name=ugettext_lazy("Weight")) def slide(self): return { diff --git a/openslides/projector/signals.py b/openslides/projector/signals.py index 672a0ed61..b1700a732 100644 --- a/openslides/projector/signals.py +++ b/openslides/projector/signals.py @@ -13,7 +13,6 @@ from time import time from django.dispatch import Signal, receiver from django import forms -from django.utils.translation import ugettext_lazy, ugettext as _ from django.template.loader import render_to_string from django.core.context_processors import csrf diff --git a/openslides/projector/static/img/glyphicons_054_clock.png b/openslides/projector/static/img/glyphicons_054_clock_big.png similarity index 100% rename from openslides/projector/static/img/glyphicons_054_clock.png rename to openslides/projector/static/img/glyphicons_054_clock_big.png diff --git a/openslides/projector/static/styles/dashboard.css b/openslides/projector/static/styles/dashboard.css index fd5134bdb..e6f5b4266 100644 --- a/openslides/projector/static/styles/dashboard.css +++ b/openslides/projector/static/styles/dashboard.css @@ -77,8 +77,8 @@ visibility: hidden; } -.overlay_list .form-inline { - margin: 5px 0 0 31px; +.overlay_list .overlayblock { + margin: 0 0 0 31px; } #countdown_time { diff --git a/openslides/projector/static/styles/projector.css b/openslides/projector/static/styles/projector.css index 62e5c9622..8ceb44822 100644 --- a/openslides/projector/static/styles/projector.css +++ b/openslides/projector/static/styles/projector.css @@ -58,7 +58,7 @@ body{ top:110px; right:40px; padding-left:30px; - background: url(../img/glyphicons_054_clock.png) no-repeat scroll 0px 4px; + background: url(../img/glyphicons_054_clock_big.png) no-repeat scroll 0px 4px; } #currentTime.ajax_error { @@ -73,6 +73,19 @@ body{ width: 100%; height: 100%; } +#overlay_list_of_speaker_box { + position: fixed; + bottom: 0; + right: 0; + border-radius: 0.4em; + border: 0.1em solid #777777; + background-color: #cccccc; + opacity: 0.9; + padding: 0 1em; + margin: 1em; + z-index: 2; + width: 50%; +} /*** CONTENT ***/ #contentwrapper { @@ -146,6 +159,14 @@ body{ color: #9FA9B7; list-style-type: none; } +.list_of_speakers li { + font-size: 130%; + line-height: 160%; +} +.last_speakers li { + color: #9FA9B7; + list-style: none; +} /* Table */ table { diff --git a/openslides/projector/templates/base-projector.html b/openslides/projector/templates/base-projector.html index d75172e31..27cfc9e92 100644 --- a/openslides/projector/templates/base-projector.html +++ b/openslides/projector/templates/base-projector.html @@ -7,7 +7,7 @@ - + {% block title %} {% get_config 'event_name' %} {% endblock %} diff --git a/openslides/projector/templates/projector/overlay_countdown_widget.html b/openslides/projector/templates/projector/overlay_countdown_widget.html index 902be3666..c79e4fc40 100644 --- a/openslides/projector/templates/projector/overlay_countdown_widget.html +++ b/openslides/projector/templates/projector/overlay_countdown_widget.html @@ -3,14 +3,14 @@ {% trans "Countdown for speaking time" %}: -
          -
          +
          +
          {% trans "s" context "seconds" %} +
          - - - diff --git a/openslides/projector/templates/projector/overlay_message_widget.html b/openslides/projector/templates/projector/overlay_message_widget.html index 813c10ceb..fff6b0d22 100644 --- a/openslides/projector/templates/projector/overlay_message_widget.html +++ b/openslides/projector/templates/projector/overlay_message_widget.html @@ -4,7 +4,7 @@ {% trans "Message" %}: {% csrf_token %} -
          +