From 7e12e1d5e2da1e73ebea24959769feb58d1e3989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Ko=CC=88cher?= Date: Sat, 14 Apr 2012 09:28:28 +0200 Subject: [PATCH] Support for localized permissions on top of the untranslated django model. --- openslides/agenda/models.py | 7 +- openslides/application/models.py | 10 +- openslides/assignment/models.py | 11 +- openslides/locale/de/LC_MESSAGES/django.mo | Bin 29178 -> 30406 bytes openslides/locale/de/LC_MESSAGES/django.po | 314 +++++++++++++-------- openslides/participant/forms.py | 3 +- openslides/participant/models.py | 6 +- openslides/poll/models.py | 3 +- openslides/projector/models.py | 7 +- openslides/system/models.py | 4 +- 10 files changed, 215 insertions(+), 150 deletions(-) diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index 58a99f78d..482ad54e8 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -16,7 +16,6 @@ except ImportError: import simplejson as json from django.db import models -from django.utils.translation import ugettext as _ from mptt.models import MPTTModel, TreeForeignKey @@ -26,7 +25,7 @@ from projector.projector import SlideMixin from projector.api import register_slidemodel from agenda.api import is_summary - +from utils.translation_ext import xugettext as _ class Item(MPTTModel, SlideMixin): """ @@ -124,8 +123,8 @@ class Item(MPTTModel, SlideMixin): class Meta: permissions = ( - ('can_see_agenda', "Can see agenda"), - ('can_manage_agenda', "Can manage agenda"), + ('can_see_agenda', _("Can see agenda", fixstr=True)), + ('can_manage_agenda', _("Can manage agenda", fixstr=True)), ) class MPTTMeta: diff --git a/openslides/application/models.py b/openslides/application/models.py index e866f6cc8..52bfa410b 100644 --- a/openslides/application/models.py +++ b/openslides/application/models.py @@ -15,7 +15,6 @@ from datetime import datetime from django.db import models from django.db.models import Max from django.contrib.auth.models import User -from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse from projector.api import register_slidemodel @@ -24,6 +23,7 @@ from projector.models import SlideMixin from participant.models import Profile from system import config from utils.utils import _propper_unicode +from utils.translation_ext import xugettext as _ from poll.models import BaseOption, BasePoll, CountVotesCast, CountInvalid, Vote @@ -466,10 +466,10 @@ class Application(models.Model, SlideMixin): class Meta: permissions = ( - ('can_see_application', "Can see application"), - ('can_create_application', "Can create application"), - ('can_support_application', "Can support application"), - ('can_manage_application', "Can manage application"), + ('can_see_application', _("Can see application", fixstr=True)), + ('can_create_application', _("Can create application", fixstr=True)), + ('can_support_application', _("Can support application", fixstr=True)), + ('can_manage_application', _("Can manage application", fixstr=True)), ) diff --git a/openslides/assignment/models.py b/openslides/assignment/models.py index a748ceffc..831c7da78 100644 --- a/openslides/assignment/models.py +++ b/openslides/assignment/models.py @@ -11,14 +11,13 @@ """ from django.db import models -from django.utils.translation import ugettext as _ from participant.models import Profile from projector.projector import SlideMixin from projector.api import register_slidemodel from poll.models import BasePoll, CountInvalid, CountVotesCast, BaseOption, PublishPollMixin - +from utils.translation_ext import xugettext as _ class Assignment(models.Model, SlideMixin): prefix = 'assignment' @@ -116,10 +115,10 @@ class Assignment(models.Model, SlideMixin): class Meta: permissions = ( - ('can_see_assignment', "Can see assignment"), - ('can_nominate_other', "Can nominate another person"), - ('can_nominate_self', "Can nominate themselves"), - ('can_manage_assignment', "Can manage assignment"), + ('can_see_assignment', _("Can see assignment", fixstr=True)), + ('can_nominate_other', _("Can nominate another person", fixstr=True)), + ('can_nominate_self', _("Can nominate themselves", fixstr=True)), + ('can_manage_assignment', _("Can manage assignment", fixstr=True)), ) register_slidemodel(Assignment, category=_('Elections')) diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index 953b7c69ef7c0123eb866eea2045678eaa5d7fde..00b13a5e3ff54de9ff1fdc742a701279296113fc 100644 GIT binary patch delta 9675 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 delta 8444 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 Z5Z^cJ+k*~fhf+Vq\n" "Language-Team: LANGUAGE \n" @@ -33,30 +33,38 @@ msgstr "Elternelement" msgid "Countdown (in seconds)" msgstr "Countdown (in Sekunden)" -#: agenda/models.py:39 application/forms.py:41 -#: application/templates/application/view.html:249 projector/models.py:13 +#: agenda/models.py:38 application/forms.py:41 +#: application/templates/application/view.html:249 projector/models.py:12 msgid "Title" msgstr "Titel" -#: agenda/models.py:40 application/forms.py:42 -#: application/templates/application/view.html:250 projector/models.py:14 +#: agenda/models.py:39 application/forms.py:42 +#: application/templates/application/view.html:250 projector/models.py:13 msgid "Text" msgstr "Text" -#: agenda/models.py:41 +#: agenda/models.py:40 msgid "Transcript" msgstr "" -#: agenda/models.py:42 +#: agenda/models.py:41 msgid "Closed" msgstr "Abgeschlossen" -#: agenda/models.py:43 agenda/templates/agenda/overview.html:59 -#: projector/models.py:15 +#: agenda/models.py:42 agenda/templates/agenda/overview.html:59 +#: projector/models.py:14 msgid "Weight" msgstr "Gewichtung" -#: agenda/models.py:135 agenda/models.py:142 agenda/slides.py:7 +#: agenda/models.py:126 +msgid "Can see agenda" +msgstr "Kann die Tagesordnung sehen" + +#: agenda/models.py:127 +msgid "Can manage agenda" +msgstr "Kann die Tagesordnug verwalten" + +#: agenda/models.py:134 agenda/models.py:141 agenda/slides.py:7 #: agenda/views.py:190 agenda/views.py:219 #: agenda/templates/agenda/base_agenda.html:9 #: agenda/templates/agenda/overview.html:7 @@ -67,7 +75,7 @@ msgstr "Gewichtung" msgid "Agenda" msgstr "Tagesordnung" -#: agenda/models.py:135 +#: agenda/models.py:134 msgid "Agenda Item" msgstr "Tagesordnungseintrag" @@ -76,7 +84,7 @@ msgstr "Tagesordnungseintrag" msgid "Item %s and his children were successfully deleted." msgstr "Eintrag %s und seine Kindelemente wurde erfolgreich gelöscht." -#: agenda/views.py:171 +#: agenda/views.py:171 utils/views.py:182 #, python-format msgid "Item %s was successfully deleted." msgstr "Eintrag %s wurde erfolgreich gelöscht." @@ -89,7 +97,7 @@ msgstr "Eintrag %s wurde erfolgreich gelöscht." #: assignment/templates/assignment/view.html:190 #: assignment/templates/projector/Assignment.html:71 #: assignment/templates/projector/Assignment.html:75 utils/pdf.py:364 -#: utils/pdf.py:444 utils/pdf.py:664 utils/utils.py:38 +#: utils/pdf.py:444 utils/pdf.py:664 utils/utils.py:38 utils/views.py:190 msgid "Yes" msgstr "Ja" @@ -99,7 +107,7 @@ msgstr "Ja" #: application/templates/projector/Application.html:34 #: assignment/templates/assignment/view.html:187 #: assignment/templates/projector/Assignment.html:72 utils/pdf.py:364 -#: utils/pdf.py:445 utils/pdf.py:664 utils/utils.py:38 +#: utils/pdf.py:445 utils/pdf.py:664 utils/utils.py:38 utils/views.py:190 msgid "No" msgstr "Nein" @@ -107,8 +115,8 @@ msgstr "Nein" msgid "Yes, with all child items." msgstr "Ja, mit allen Kindelementen." -#: agenda/views.py:183 agenda/views.py:185 participant/views.py:194 -#: participant/views.py:307 utils/utils.py:46 +#: agenda/views.py:183 agenda/views.py:185 participant/views.py:187 +#: participant/views.py:300 utils/utils.py:46 utils/views.py:187 #, python-format msgid "Do you really want to delete %s?" msgstr "Soll %s wirklich gelöscht werden?" @@ -258,7 +266,7 @@ msgstr "Antragsteller/in" msgid "Supporters" msgstr "Unterstützer/innen" -#: application/forms.py:58 participant/forms.py:87 +#: application/forms.py:58 participant/forms.py:88 msgid "CSV File" msgstr "CSV-Datei" @@ -306,115 +314,131 @@ msgstr "Titel für PDF-Dokuemt (alle Anträge)" msgid "Preamble text for PDF document (all applications)" msgstr "Einleitungstext für PDF-Dokument (alle Anträge)" -#: application/models.py:32 +#: application/models.py:33 msgid "Published" msgstr "Veröffentlicht" -#: application/models.py:33 application/templates/application/overview.html:22 +#: application/models.py:34 application/templates/application/overview.html:22 msgid "Permitted" msgstr "Zugelassen" -#: application/models.py:34 application/templates/application/overview.html:23 +#: application/models.py:35 application/templates/application/overview.html:23 #: application/templates/application/view.html:174 msgid "Accepted" msgstr "Angenommen" -#: application/models.py:35 application/templates/application/overview.html:24 +#: application/models.py:36 application/templates/application/overview.html:24 #: application/templates/application/view.html:179 msgid "Rejected" msgstr "Abgelehnt" -#: application/models.py:36 +#: application/models.py:37 msgid "Withdrawed" msgstr "Zurückgezogen" -#: application/models.py:37 application/templates/application/view.html:187 +#: application/models.py:38 application/templates/application/view.html:187 msgid "Adjourned" msgstr "Vertagt" # please check! -#: application/models.py:38 application/templates/application/view.html:190 +#: application/models.py:39 application/templates/application/view.html:190 msgid "Not Concerned" msgstr "Nicht befasst" # please check! -#: application/models.py:39 application/templates/application/view.html:193 +#: application/models.py:40 application/templates/application/view.html:193 msgid "Commited a bill" msgstr "Verwiesen (in Ausschuss)" -#: application/models.py:40 +#: application/models.py:41 msgid "Rejected (not permitted)" msgstr "Verworfen (nicht zulässig)" -#: application/models.py:41 application/templates/application/overview.html:26 +#: application/models.py:42 application/templates/application/overview.html:26 msgid "Needs Review" msgstr "Benötigt Review" -#: application/models.py:124 +#: application/models.py:125 msgid "Searching for supporters." msgstr "Auf Unterstützersuche." -#: application/models.py:126 +#: application/models.py:127 msgid "Not yet permitted." msgstr "Noch nicht zugelassen." -#: application/models.py:128 +#: application/models.py:129 msgid "Not yet permitted changes." msgstr "Noch nicht zugelassene Änderungen." -#: application/models.py:188 +#: application/models.py:189 #, python-format msgid "Version %s modified" msgstr "Version %s bearbeitet" -#: application/models.py:197 +#: application/models.py:198 #, python-format msgid "Version %s created" msgstr "Version %s erstellt" -#: application/models.py:206 +#: application/models.py:207 msgid "Supporters removed" msgstr "Unterstützer/innen gelöscht" -#: application/models.py:215 +#: application/models.py:216 #, python-format msgid "Status reseted to: %s" msgstr "Status zurückgesetzt auf: %s" -#: application/models.py:228 application/views.py:170 +#: application/models.py:229 application/views.py:170 #, python-format msgid "Supporter: +%s" msgstr "Unterstützer/in: +%s" -#: application/models.py:238 application/views.py:181 +#: application/models.py:239 application/views.py:181 #, python-format msgid "Supporter: -%s" msgstr "Unterstützer/in: -%s" -#: application/models.py:254 +#: application/models.py:255 #, python-format msgid "Number set: %s" msgstr "Nummer gesetzt: %s" -#: application/models.py:267 +#: application/models.py:268 #, python-format msgid "Version %s permitted" msgstr "Version %s zugelassen" -#: application/models.py:281 +#: application/models.py:282 #, python-format msgid "Version %s not permitted" msgstr "Version %s nicht zugelassen" -#: application/models.py:307 +#: application/models.py:308 msgid "Status modified" msgstr "Status geändert" -#: application/models.py:423 +#: application/models.py:424 msgid "Poll created" msgstr "Abstimmung erstellt" -#: application/models.py:496 application/views.py:620 +#: application/models.py:469 +msgid "Can see application" +msgstr "Kann Anträge sehen" + +#: application/models.py:470 +msgid "Can create application" +msgstr "Kann Anträge erstellen" + +#: application/models.py:471 +msgid "Can support application" +msgstr "Kann Anträge unterstützen" + +#: application/models.py:472 +msgid "Can manage application" +msgstr "Kann Anträge verwalten" + +#: application/models.py:497 application/views.py:630 #: application/templates/application/base_application.html:8 #: application/templates/application/overview.html:6 #: application/templates/application/overview.html:9 @@ -441,9 +465,9 @@ msgstr "Neuer Antrag wurde erfolgreich angelegt." msgid "Application was successfully modified." msgstr "Antrag wurde erfolgreich geändert." -#: application/views.py:192 application/views.py:581 assignment/views.py:123 -#: participant/views.py:171 participant/views.py:292 participant/views.py:321 -#: participant/views.py:466 system/views.py:53 utils/views.py:132 +#: application/views.py:192 application/views.py:591 assignment/views.py:126 +#: participant/views.py:164 participant/views.py:285 participant/views.py:314 +#: participant/views.py:472 system/views.py:53 utils/views.py:142 msgid "Please check the form for errors." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." @@ -546,45 +570,49 @@ msgstr "FEHLER beim Zurückweisen der Version." msgid "Do you really want to reject version %s?" msgstr "Soll Version %s wirklich zurückgewiesen werden?" -#: application/views.py:487 participant/views.py:337 +#: application/views.py:487 participant/views.py:330 msgid "" "The import function is available for the superuser (without user profile) " "only." msgstr "" "Die Importfunktion ist nur für den 'superuser' (ohne Nutzerprofil) verfügbar." -#: application/views.py:513 application/views.py:517 application/views.py:523 -#: application/views.py:526 +#: application/views.py:518 application/views.py:522 application/views.py:528 +#: application/views.py:531 participant/views.py:399 #, python-format msgid "Ignoring malformed line %d in import file." msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." -#: application/views.py:569 +#: application/views.py:577 #, python-format msgid "%d application was successfully imported." msgid_plural "%d applications were successfully imported." msgstr[0] "%d Antrag wurde erfolgreich importiert." msgstr[1] "%d Anträge wurden erfolgreich importiert." -#: application/views.py:572 +#: application/views.py:580 #, python-format msgid "%d application was successfully modified." msgid_plural "%d applications were successfully modified." msgstr[0] "%d Antrag wurde erfolgreich geändert." msgstr[1] "%d Anträge wurden erfolgreich geändert." -#: application/views.py:575 +#: application/views.py:583 #, python-format 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." -#: application/views.py:579 participant/views.py:464 +#: application/views.py:587 participant/views.py:468 msgid "Import aborted because of severe errors in the input file." msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." -#: application/views.py:583 +#: application/views.py:589 participant/views.py:470 +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!" + +#: application/views.py:593 msgid "" "Attention: Existing applications will be modified if you import new " "applications with the same number." @@ -592,7 +620,7 @@ msgstr "" "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " "identischer Nummer importieren." -#: application/views.py:584 +#: application/views.py:594 msgid "" "Attention: Importing an application without a number multiple times will " "create duplicates." @@ -600,7 +628,7 @@ msgstr "" "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " "entstehen." -#: application/views.py:613 +#: application/views.py:623 msgid "Application settings successfully saved." msgstr "Antrags-Einstellungen erfolgreich gespeichert." @@ -741,12 +769,12 @@ msgid "Results of" msgstr "Ergebnis der" #: application/templates/application/poll_view.html:23 -#: assignment/templates/assignment/poll_view.html:13 poll/models.py:151 +#: assignment/templates/assignment/poll_view.html:13 poll/models.py:154 msgid "majority" msgstr "Mehrheit" #: application/templates/application/poll_view.html:23 -#: assignment/templates/assignment/poll_view.html:13 poll/models.py:153 +#: assignment/templates/assignment/poll_view.html:13 poll/models.py:156 msgid "undocumented" msgstr "nicht erfasst" @@ -966,58 +994,74 @@ msgstr "Titel für PDF-Dokument (alle Wahlen)" msgid "Preamble text for PDF document (all elections)" msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " -#: assignment/models.py:26 assignment/templates/assignment/overview.html:15 +#: assignment/models.py:25 assignment/templates/assignment/overview.html:15 #: assignment/templates/assignment/view.html:30 msgid "Searching for candidates" msgstr "Auf Kandidatensuche" -#: assignment/models.py:27 assignment/templates/assignment/overview.html:16 +#: assignment/models.py:26 assignment/templates/assignment/overview.html:16 #: assignment/templates/assignment/view.html:32 msgid "Voting" msgstr "Im Wahlvorgang" -#: assignment/models.py:28 assignment/templates/assignment/overview.html:17 +#: assignment/models.py:27 assignment/templates/assignment/overview.html:17 msgid "Finished" msgstr "Abgeschlossen" -#: assignment/models.py:31 +#: assignment/models.py:30 msgid "Name" msgstr "Name" -#: assignment/models.py:32 poll/models.py:86 +#: assignment/models.py:31 poll/models.py:86 msgid "Description" msgstr "Beschreibung" -#: assignment/models.py:33 assignment/templates/assignment/view.html:18 +#: assignment/models.py:32 assignment/templates/assignment/view.html:18 #: assignment/templates/projector/Assignment.html:20 utils/pdf.py:499 msgid "Number of available posts" msgstr "Anzahl der zur Wahl stehenden Posten" -#: assignment/models.py:34 +#: assignment/models.py:33 msgid "Short description (for ballot paper)" msgstr "Kurzbeschreibung (für Stimmzettel)" -#: assignment/models.py:46 +#: assignment/models.py:45 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." -#: assignment/models.py:48 +#: assignment/models.py:47 #, python-format msgid "The assignment status is already %s." msgstr "Der Wahlstatus ist bereits %s." -#: assignment/models.py:57 +#: assignment/models.py:56 #, python-format msgid "%s is already a candidate." msgstr "%s ist bereits ein/e Kandidat/in." -#: assignment/models.py:67 +#: assignment/models.py:66 #, python-format msgid "%s is no candidate" msgstr "%s ist kein/e Kandidat/in" -#: assignment/models.py:125 assignment/views.py:300 +#: assignment/models.py:118 +msgid "Can see assignment" +msgstr "Kann Wahlen sehen" + +#: assignment/models.py:119 +msgid "Can nominate another person" +msgstr "Kann eine andere Person wählen" + +#: assignment/models.py:120 +msgid "Can nominate themselves" +msgstr "Kann sich selbst wählen" + +#: assignment/models.py:121 +msgid "Can manage assignment" +msgstr "Kann Wahlen verwalten" + +#: assignment/models.py:124 assignment/views.py:303 #: assignment/templates/assignment/base_assignment.html:13 #: assignment/templates/assignment/overview.html:6 #: assignment/templates/assignment/overview.html:9 @@ -1031,83 +1075,83 @@ msgstr "Wahlen" msgid "Candidate %s was nominated successfully." msgstr "Kandidat/in %s wurde erfolgreich vorgeschlagen." -#: assignment/views.py:115 +#: assignment/views.py:118 msgid "New election was successfully created." msgstr "Neue Wahl wurde erfolgreich angelegt." -#: assignment/views.py:117 +#: assignment/views.py:120 msgid "Election was successfully modified." msgstr "Wahl wurde erfolgreich geändert." -#: assignment/views.py:137 +#: assignment/views.py:140 #, python-format msgid "Election %s was successfully deleted." msgstr "Wahl %s wurde erfolgreich gelöscht." -#: assignment/views.py:150 +#: assignment/views.py:153 #, python-format msgid "Election status was set to: %s." msgstr "Wahlstatus wurde gesetzt auf: %s." -#: assignment/views.py:161 +#: assignment/views.py:164 msgid "You have set your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich gesetzt." -#: assignment/views.py:166 +#: assignment/views.py:169 msgid "You can't candidate. Your user account is only for administration." msgstr "" "Sie können nicht kandidieren. Ihr Nutzerkonto ist nur zur Administration." -#: assignment/views.py:174 +#: assignment/views.py:177 msgid "You have withdrawn your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich zurückgezogen." -#: assignment/views.py:185 +#: assignment/views.py:188 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Die Kandidatur von %s wurde erfolgreich zurückgezogen." -#: assignment/views.py:188 +#: assignment/views.py:191 #, 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:203 +#: assignment/views.py:206 msgid "New ballot was successfully created." msgstr "Neuer Wahlgang erfolgreich angelegt." -#: assignment/views.py:229 +#: assignment/views.py:232 msgid "Poll successfully set to published." msgstr "Abstimmung wurde erfolgreich veröffentlicht." -#: assignment/views.py:231 +#: assignment/views.py:234 msgid "Poll successfully set to unpublished." msgstr "Abstimmung wurde erfolgreich unveröffentlicht." -#: assignment/views.py:233 +#: assignment/views.py:236 #, python-format msgid "Poll ID %d does not exist." msgstr "Abstimmungs-ID %d existiert nicht." -#: assignment/views.py:244 +#: assignment/views.py:247 #, python-format msgid "The %s. ballot was successfully deleted." msgstr "Der %s. Wahlgang wurde erfolgreich gelöscht." -#: assignment/views.py:246 +#: assignment/views.py:249 #, python-format msgid "the %s. ballot" msgstr "der %s. Wahlgang" -#: assignment/views.py:259 +#: assignment/views.py:262 msgid "not elected" msgstr "nicht gewählt" -#: assignment/views.py:262 utils/pdf.py:584 +#: assignment/views.py:265 utils/pdf.py:584 msgid "elected" msgstr "gewählt" -#: assignment/views.py:293 +#: assignment/views.py:296 msgid "Election settings successfully saved." msgstr "Wahl-Einstellungen wurden erfolgreich gespeichert." @@ -1267,27 +1311,27 @@ msgstr "Kandidat/in ist gewählt" msgid "No ballots available." msgstr "Keine Wahlgänge vorhanden." -#: participant/forms.py:37 +#: participant/forms.py:38 msgid "Keep applications, try to reassign submitter" msgstr "Anträge beibehalten, versuchen Antragssteller erneut zuzuweisen" -#: participant/forms.py:38 +#: participant/forms.py:39 msgid "Keep applications, set status to \"needs review\"" msgstr "Anträge beibehalten, Stauts auf \"Benötigt Review\" setzen" -#: participant/forms.py:39 +#: participant/forms.py:40 msgid "Discard applications" msgstr "Alle Anträge löschen" -#: participant/forms.py:43 participant/forms.py:52 +#: participant/forms.py:44 participant/forms.py:53 msgid "First name" msgstr "Vorname" -#: participant/forms.py:44 participant/forms.py:53 +#: participant/forms.py:45 participant/forms.py:54 msgid "Last name" msgstr "Nachname" -#: participant/forms.py:88 +#: participant/forms.py:89 msgid "For existing applications" msgstr "Bei existierenden Anträgen" @@ -1341,88 +1385,99 @@ msgstr "Kommentar" msgid "First Password" msgstr "Erst-Passwort" -#: participant/views.py:163 +#: participant/models.py:68 +msgid "Can see participant" +msgstr "Kann Teilnehmer/inen sehen" + +#: participant/models.py:69 +msgid "Can manage participant" +msgstr "Kann Teilnehmer/inen verwalten" + +#: participant/views.py:156 msgid "New participant was successfully created." msgstr "Neue/r Teilnehmer/in wurde erfolgreich angelegt." -#: participant/views.py:165 +#: participant/views.py:158 msgid "Participant was successfully modified." msgstr "Teilnehmer/in wurde erfolgreich geändert." -#: participant/views.py:192 +#: participant/views.py:185 #, python-format msgid "Participant %s was successfully deleted." msgstr "Teilnehmer/in %s wurde erfolgreich gelöscht." -#: participant/views.py:205 participant/views.py:224 +#: participant/views.py:198 participant/views.py:217 #, python-format msgid "Participant %d does not exist." msgstr "Teilnehmer/in %d existiert nicht." -#: participant/views.py:270 +#: participant/views.py:263 #, python-format msgid "Group name \"%s\" is reserved for internal use." msgstr "Der Gruppenname \"%s\" ist für interne Verwendung reserviert." -#: participant/views.py:284 +#: participant/views.py:277 msgid "New group was successfully created." msgstr "Neue Gruppe wurde erfolgreich angelegt." -#: participant/views.py:286 +#: participant/views.py:279 msgid "Group was successfully modified." msgstr "Gruppe wurde erfolgreich geändert." -#: participant/views.py:305 +#: participant/views.py:298 #, python-format msgid "Group %s was successfully deleted." msgstr "Gruppe %s wurde erfolgreich gelöscht." -#: participant/views.py:319 +#: participant/views.py:312 msgid "User settings successfully saved." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." -#: participant/views.py:385 +#: participant/views.py:382 msgid "Supporters removed after user import." msgstr "Unterstützer/innen nach Benutzerimport zurückgesetzt." -#: participant/views.py:432 +#: participant/views.py:435 #, python-format msgid "Reassigned to \"%s\" after (re)importing users." msgstr "Nach Benutzerimport erneut \"%s\" zugeordnet." -#: participant/views.py:435 participant/views.py:449 +#: participant/views.py:438 participant/views.py:452 #, python-format msgid "Could not reassing application %d - object not found!" -msgstr "Antrag Id#%d konnte nicht neu zugewiesen werden - " -"Das Objekt wurde nicht gefunden!" +msgstr "" +"Antrag Id#%d konnte nicht neu zugewiesen werden - Das Objekt wurde nicht " +"gefunden!" -#: participant/views.py:452 +#: participant/views.py:455 #, python-format msgid "%d application could not be reassigned and needs a review!" msgid_plural "%d applications could not be reassigned and need a review!" -msgstr[0] "%d Antrag konnte nicht neu zugewiesen werden and benötigt ein Review!" -msgstr[1] "%d Anträge konnten nicht neu zugewiesen werden und benötigen ein Review!" +msgstr[0] "" +"%d Antrag konnte nicht neu zugewiesen werden and benötigt ein Review!" +msgstr[1] "" +"%d Anträge konnten nicht neu zugewiesen werden und benötigen ein Review!" -#: participant/views.py:455 +#: participant/views.py:458 #, python-format msgid "%d application was successfully reassigned." msgid_plural "%d applications were successfully reassigned." msgstr[0] "%d Antrag wurde erfolgreich neu zugewiesen." msgstr[1] "%d Anträge wurden erfolgreich neu zugewiesen." -#: participant/views.py:458 +#: participant/views.py:461 #, python-format msgid "%d application was discarded." msgid_plural "%d applications were discarded." msgstr[0] "%d Antrag wurde gelöscht." msgstr[1] "%d Anträge wurden gelöscht." -#: participant/views.py:461 +#: participant/views.py:465 #, python-format msgid "%d new participants were successfully imported." msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert." -#: participant/views.py:468 +#: participant/views.py:474 msgid "" "Attention: All existing participants will be removed if you import new " "participants." @@ -1430,29 +1485,30 @@ msgstr "" "Achtung: Alle existierenden Teilnehmer/innen werden gelöscht, wenn Sie neue " "Teilnehmer/innen importieren." -#: participant/views.py:470 +#: participant/views.py:476 msgid "Attention: Supporters from all existing applications will be removed." msgstr "" "Achtung: Alle Unterstützer/innen werden von existiernden Anträgen gelöscht." -#: participant/views.py:471 +#: participant/views.py:477 msgid "" "Attention: Applications which can't be mapped to new users will be set to " "'Needs Review'." -msgstr "Achtung: Anträge welche keinem Nutzer zugeordnet werden können" -" bekommen automatisch den Status \"Benötigt Review\"." +msgstr "" +"Achtung: Anträge welche keinem Nutzer zugeordnet werden können bekommen " +"automatisch den Status \"Benötigt Review\"." -#: participant/views.py:483 +#: participant/views.py:489 #, python-format msgid "The Password for %s was successfully reset." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." -#: participant/views.py:485 +#: participant/views.py:491 #, python-format msgid "Do you really want to reset the password for %s?" msgstr "Soll das Passwort für %s wirklich zurückgesetzt werden?" -#: participant/views.py:493 +#: participant/views.py:499 #: participant/templates/participant/base_participant.html:11 #: participant/templates/participant/overview.html:5 #: participant/templates/participant/overview.html:15 @@ -1634,14 +1690,22 @@ msgstr "Ungültige Stimmen" msgid "votes" msgstr "Stimmen" -#: projector/models.py:26 projector/views.py:155 +#: projector/models.py:21 +msgid "Can manage the projector" +msgstr "Kann den Beamer verwalten" + +#: projector/models.py:22 +msgid "Can see projector" +msgstr "Kann den Beamer sehen" + +#: projector/models.py:25 projector/views.py:155 #: projector/templates/projector/base_projector.html:6 #: projector/templates/projector/base_projector.html:11 #: projector/templates/projector/control.html:35 msgid "Projector" msgstr "Beamer" -#: projector/models.py:26 +#: projector/models.py:25 msgid "Projector Slide" msgstr "Beamer-Folie" @@ -1751,6 +1815,10 @@ msgstr "Veranstaltungsort" msgid "Event organizer" msgstr "Veranstalter" +#: system/models.py:42 +msgid "Can manage system configuration" +msgstr "Kann die Systemkonfiguration verwalten" + #: system/models.py:93 msgid "General" msgstr "Allgemein" diff --git a/openslides/participant/forms.py b/openslides/participant/forms.py index c267290c5..0f321281d 100644 --- a/openslides/participant/forms.py +++ b/openslides/participant/forms.py @@ -16,6 +16,7 @@ from django.contrib.auth.forms import AdminPasswordChangeForm from django.utils.translation import ugettext as _ from utils.forms import CssClassMixin +from utils.translation_ext import LocalizedModelMultipleChoiceField # required for USER_VISIBLE_PERMISSIONS from agenda.models import Item @@ -67,7 +68,7 @@ class ProfileForm(ModelForm, CssClassMixin): model = Profile class GroupForm(ModelForm, CssClassMixin): - permissions = ModelMultipleChoiceField(queryset=Permission.objects.filter(codename__in=USER_VISIBLE_PERMISSIONS)) + permissions = LocalizedModelMultipleChoiceField(queryset=Permission.objects.filter(codename__in=USER_VISIBLE_PERMISSIONS)) def __init__(self, *args, **kwargs): super(GroupForm, self).__init__(*args, **kwargs) diff --git a/openslides/participant/models.py b/openslides/participant/models.py index 793b435f0..b1abe2ff8 100644 --- a/openslides/participant/models.py +++ b/openslides/participant/models.py @@ -13,8 +13,8 @@ from django.db import models from django.db.models import Q from django.contrib.auth.models import User -from django.utils.translation import ugettext as _ +from utils.translation_ext import xugettext as _ from participant.api import gen_password class Profile(models.Model): @@ -65,6 +65,6 @@ class Profile(models.Model): class Meta: permissions = ( - ('can_see_participant', "Can see participant"), - ('can_manage_participant', "Can manage participant"), + ('can_see_participant', _("Can see participant", fixstr=True)), + ('can_manage_participant', _("Can manage participant", fixstr=True)), ) diff --git a/openslides/poll/models.py b/openslides/poll/models.py index 9269433e0..d07c95f5f 100644 --- a/openslides/poll/models.py +++ b/openslides/poll/models.py @@ -11,11 +11,10 @@ """ from django.db import models -from django.utils.translation import ugettext as _ from projector.api import register_slidemodel from projector.models import SlideMixin - +from utils.translation_ext import xugettext as _ class BaseOption(models.Model): poll = models.ForeignKey('BasePoll') diff --git a/openslides/projector/models.py b/openslides/projector/models.py index 14cccf501..1d99ce504 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -1,11 +1,10 @@ from django.db import models -from django.utils.translation import ugettext as _ from api import register_slidemodel from projector import SlideMixin from system import config - +from utils.translation_ext import xugettext as _ class ProjectorSlide(models.Model, SlideMixin): prefix = 'ProjectorSlide' @@ -19,8 +18,8 @@ class ProjectorSlide(models.Model, SlideMixin): class Meta: permissions = ( - ('can_manage_projector', "Can manage the projector"), - ('can_see_projector', "Can see projector"), + ('can_manage_projector', _("Can manage the projector", fixstr=True)), + ('can_see_projector', _("Can see projector", fixstr=True)), ) register_slidemodel(ProjectorSlide, category=_('Projector'), model_name=_('Projector Slide')) diff --git a/openslides/system/models.py b/openslides/system/models.py index d72d7559b..a2daec439 100644 --- a/openslides/system/models.py +++ b/openslides/system/models.py @@ -13,7 +13,7 @@ from pickle import dumps, loads import base64 from django.db import models -from django.utils.translation import ugettext as _ +from utils.translation_ext import xugettext as _ DEFAULT_DATA = { 'event_name': 'OpenSlides', @@ -39,7 +39,7 @@ class ConfigStore(models.Model): class Meta: verbose_name = 'config' permissions = ( - ('can_manage_system', "Can manage system configuration"), + ('can_manage_system', _("Can manage system configuration", fixstr=True)), ) # TODO: