summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rw-r--r--django/conf/global_settings.py1
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.mobin40423 -> 44060 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.po2125
-rw-r--r--django/conf/urls/defaults.py4
-rw-r--r--django/contrib/localflavor/ch/__init__.py0
-rw-r--r--django/contrib/localflavor/ch/ch_states.py31
-rw-r--r--django/contrib/localflavor/ch/forms.py109
-rw-r--r--django/core/mail.py220
-rw-r--r--django/core/management.py1
-rw-r--r--django/db/models/fields/__init__.py6
-rw-r--r--django/db/models/query.py13
-rw-r--r--django/test/testcases.py32
-rw-r--r--docs/documentation.txt8
-rw-r--r--docs/email.txt66
-rw-r--r--docs/sessions.txt2
-rw-r--r--docs/settings.txt54
-rw-r--r--docs/syndication_feeds.txt6
-rw-r--r--docs/templates_python.txt2
-rw-r--r--docs/testing.txt54
-rw-r--r--tests/modeltests/custom_columns/models.py2
-rw-r--r--tests/modeltests/lookup/models.py4
-rw-r--r--tests/modeltests/many_to_one/models.py4
-rw-r--r--tests/modeltests/reverse_lookup/models.py2
-rw-r--r--tests/modeltests/test_client/models.py13
-rw-r--r--tests/regressiontests/forms/localflavor.py54
-rw-r--r--tests/regressiontests/null_queries/models.py2
27 files changed, 1929 insertions, 888 deletions
diff --git a/AUTHORS b/AUTHORS
index 564cd0a139..027dbc39ba 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -181,6 +181,7 @@ answer newbie questions, and generally made Django that much better:
Luke Plant <http://lukeplant.me.uk/>
plisk
Daniel Poelzleithner <http://poelzi.org/>
+ polpak@yahoo.com
J. Rademaker
Michael Radziej <mir@noris.de>
ramiro
@@ -224,6 +225,7 @@ answer newbie questions, and generally made Django that much better:
wam-djangobug@wamber.net
Dan Watson <http://theidioteque.net/>
Chris Wesseling <Chris.Wesseling@cwi.nl>
+ charly.wilhelm@gmail.com
Rachel Willmer <http://www.willmer.com/kb/>
Gary Wilson <gary.wilson@gmail.com>
wojtek
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 8a57352f0a..f46189c8f7 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -122,6 +122,7 @@ EMAIL_PORT = 25
# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
+EMAIL_USE_TLS = False
# List of strings representing installed apps.
INSTALLED_APPS = ()
diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo
index b5c518c13c..396fe5a432 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.mo
+++ b/django/conf/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po
index 2f0991c8cc..9237e18b2a 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.po
+++ b/django/conf/locale/de/LC_MESSAGES/django.po
@@ -6,152 +6,180 @@ msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-02-05 02:56+0100\n"
+"POT-Creation-Date: 2007-04-09 22:42+0200\n"
"PO-Revision-Date: 2007-02-05 03:19+0100\n"
-"Last-Translator: Dirk Eschler <dirk.eschler@gmx.net>\n"
+"Last-Translator: Jannis Leidel <jl@websushi.org>\n"
+"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language-Team: \n"
"X-Poedit-Language: German\n"
"X-Poedit-Country: GERMANY\n"
"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: KBabel 1.11.4\n"
-#: .\conf\global_settings.py:39
+#: conf/global_settings.py:39
msgid "Arabic"
msgstr "Arabisch"
-#: .\conf\global_settings.py:40
+#: conf/global_settings.py:40
msgid "Bengali"
msgstr "Bengali"
-#: .\conf\global_settings.py:41
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalanisch"
+
+#: conf/global_settings.py:42
msgid "Czech"
msgstr "Tschechisch"
-#: .\conf\global_settings.py:42
+#: conf/global_settings.py:43
msgid "Welsh"
msgstr "Walisisch"
-#: .\conf\global_settings.py:43
+#: conf/global_settings.py:44
msgid "Danish"
msgstr "Dänisch"
-#: .\conf\global_settings.py:44
+#: conf/global_settings.py:45
msgid "German"
msgstr "Deutsch"
-#: .\conf\global_settings.py:45
+#: conf/global_settings.py:46
msgid "Greek"
msgstr "Griechisch"
-#: .\conf\global_settings.py:46
+#: conf/global_settings.py:47
msgid "English"
msgstr "Englisch"
-#: .\conf\global_settings.py:47
+#: conf/global_settings.py:48
msgid "Spanish"
msgstr "Spanisch"
-#: .\conf\global_settings.py:48
+#: conf/global_settings.py:49
msgid "Argentinean Spanish"
msgstr "Argentinisches Spanisch"
-#: .\conf\global_settings.py:49
+#: conf/global_settings.py:50
msgid "Finnish"
msgstr "Finnisch"
-#: .\conf\global_settings.py:50
+#: conf/global_settings.py:51
msgid "French"
msgstr "Französisch"
-#: .\conf\global_settings.py:51
+#: conf/global_settings.py:52
msgid "Galician"
msgstr "Galicisch"
-#: .\conf\global_settings.py:52
+#: conf/global_settings.py:53
msgid "Hungarian"
msgstr "Ungarisch"
-#: .\conf\global_settings.py:53
+#: conf/global_settings.py:54
msgid "Hebrew"
msgstr "Hebräisch"
-#: .\conf\global_settings.py:54
+#: conf/global_settings.py:55
msgid "Icelandic"
msgstr "Isländisch"
-#: .\conf\global_settings.py:55
+#: conf/global_settings.py:56
msgid "Italian"
msgstr "Italienisch"
-#: .\conf\global_settings.py:56
+#: conf/global_settings.py:57
msgid "Japanese"
msgstr "Japanisch"
-#: .\conf\global_settings.py:57
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Koreanisch"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Lettisch"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Mazedonisch"
+
+#: conf/global_settings.py:62
msgid "Dutch"
msgstr "Holländisch"
-#: .\conf\global_settings.py:58
+#: conf/global_settings.py:63
msgid "Norwegian"
msgstr "Norwegisch"
-#: .\conf\global_settings.py:59
+#: conf/global_settings.py:64
msgid "Polish"
msgstr "Polnisch"
-#: .\conf\global_settings.py:60
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portugiesisch"
+
+#: conf/global_settings.py:66
msgid "Brazilian"
-msgstr "Brasilianisch"
+msgstr "Brasilianisches Portugiesisch"
-#: .\conf\global_settings.py:61
+#: conf/global_settings.py:67
msgid "Romanian"
msgstr "Rumänisch"
-#: .\conf\global_settings.py:62
+#: conf/global_settings.py:68
msgid "Russian"
msgstr "Russisch"
-#: .\conf\global_settings.py:63
+#: conf/global_settings.py:69
msgid "Slovak"
msgstr "Slowakisch"
-#: .\conf\global_settings.py:64
+#: conf/global_settings.py:70
msgid "Slovenian"
msgstr "Slowenisch"
-#: .\conf\global_settings.py:65
+#: conf/global_settings.py:71
msgid "Serbian"
msgstr "Serbisch"
-#: .\conf\global_settings.py:66
+#: conf/global_settings.py:72
msgid "Swedish"
msgstr "Schwedisch"
-#: .\conf\global_settings.py:67
+#: conf/global_settings.py:73
msgid "Tamil"
msgstr "Tamilisch"
-#: .\conf\global_settings.py:68
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugisch"
+
+#: conf/global_settings.py:75
msgid "Turkish"
msgstr "Türkisch"
-#: .\conf\global_settings.py:69
+#: conf/global_settings.py:76
msgid "Ukrainian"
msgstr "Ukrainisch"
-#: .\conf\global_settings.py:70
+#: conf/global_settings.py:77
msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch"
-#: .\conf\global_settings.py:71
+#: conf/global_settings.py:78
msgid "Traditional Chinese"
msgstr "Traditionelles Chinesisch"
-#: .\contrib\admin\filterspecs.py:40
+#: contrib/admin/filterspecs.py:40
#, python-format
msgid ""
"<h3>By %s:</h3>\n"
@@ -160,395 +188,422 @@ msgstr ""
"<h3>Nach %s:</h3>\n"
"<ul>\n"
-#: .\contrib\admin\filterspecs.py:70
-#: .\contrib\admin\filterspecs.py:88
-#: .\contrib\admin\filterspecs.py:143
-#: .\contrib\admin\filterspecs.py:169
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Alle"
-#: .\contrib\admin\filterspecs.py:109
+#: contrib/admin/filterspecs.py:109
msgid "Any date"
msgstr "Alle Daten"
-#: .\contrib\admin\filterspecs.py:110
+#: contrib/admin/filterspecs.py:110
msgid "Today"
msgstr "Heute"
-#: .\contrib\admin\filterspecs.py:113
+#: contrib/admin/filterspecs.py:113
msgid "Past 7 days"
msgstr "Letzte 7 Tage"
-#: .\contrib\admin\filterspecs.py:115
+#: contrib/admin/filterspecs.py:115
msgid "This month"
msgstr "Diesen Monat"
-#: .\contrib\admin\filterspecs.py:117
+#: contrib/admin/filterspecs.py:117
msgid "This year"
msgstr "Dieses Jahr"
-#: .\contrib\admin\filterspecs.py:143
-#: .\newforms\widgets.py:162
-#: .\oldforms\__init__.py:572
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Yes"
msgstr "Ja"
-#: .\contrib\admin\filterspecs.py:143
-#: .\newforms\widgets.py:162
-#: .\oldforms\__init__.py:572
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "No"
msgstr "Nein"
-#: .\contrib\admin\filterspecs.py:150
-#: .\newforms\widgets.py:162
-#: .\oldforms\__init__.py:572
+#: contrib/admin/filterspecs.py:150 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Unknown"
msgstr "Unbekannt"
-#: .\contrib\admin\models.py:16
+#: contrib/admin/models.py:16
msgid "action time"
msgstr "Zeitpunkt der Aktion"
-#: .\contrib\admin\models.py:19
+#: contrib/admin/models.py:19
msgid "object id"
msgstr "Objekt-ID"
-#: .\contrib\admin\models.py:20
+#: contrib/admin/models.py:20
msgid "object repr"
msgstr "Objekt Darst."
-#: .\contrib\admin\models.py:21
+#: contrib/admin/models.py:21
msgid "action flag"
msgstr "Aktionskennzeichen"
-#: .\contrib\admin\models.py:22
+#: contrib/admin/models.py:22
msgid "change message"
msgstr "Änderungsmeldung"
-#: .\contrib\admin\models.py:25
+#: contrib/admin/models.py:25
msgid "log entry"
msgstr "Logeintrag"
-#: .\contrib\admin\models.py:26
+#: contrib/admin/models.py:26
msgid "log entries"
msgstr "Logeinträge"
-#: .\contrib\admin\templates\admin\404.html.py:4
-#: .\contrib\admin\templates\admin\404.html.py:8
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
msgid "Page not found"
msgstr "Seite nicht gefunden"
-#: .\contrib\admin\templates\admin\404.html.py:10
+#: contrib/admin/templates/admin/404.html:10
msgid "We're sorry, but the requested page could not be found."
-msgstr "Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden."
-
-#: .\contrib\admin\templates\admin\500.html.py:4
-#: .\contrib\admin\templates\admin\base.html.py:30
-#: .\contrib\admin\templates\admin\change_form.html.py:13
-#: .\contrib\admin\templates\admin\change_list.html.py:6
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:6
-#: .\contrib\admin\templates\admin\invalid_setup.html.py:4
-#: .\contrib\admin\templates\admin\object_history.html.py:5
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:12
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
-#: .\contrib\admin\templates\registration\logged_out.html.py:4
-#: .\contrib\admin\templates\registration\password_change_done.html.py:4
-#: .\contrib\admin\templates\registration\password_change_form.html.py:4
-#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+msgstr ""
+"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
msgid "Home"
msgstr "Start"
-#: .\contrib\admin\templates\admin\500.html.py:4
+#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
msgstr "Serverfehler"
-#: .\contrib\admin\templates\admin\500.html.py:6
+#: contrib/admin/templates/admin/500.html:6
msgid "Server error (500)"
msgstr "Serverfehler (500)"
-#: .\contrib\admin\templates\admin\500.html.py:9
+#: contrib/admin/templates/admin/500.html:9
msgid "Server Error <em>(500)</em>"
msgstr "Serverfehler <em>(500)</em>"
-#: .\contrib\admin\templates\admin\500.html.py:10
-msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
-msgstr "Ein Fehler ist aufgetreten. Dieser Fehler wurde an die Serververwalter per E-Mail weitergegeben und sollte bald behoben sein. Vielen Dank für Ihr Verständnis."
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ein Fehler ist aufgetreten. Dieser Fehler wurde an die Serververwalter per E-"
+"Mail weitergegeben und sollte bald behoben sein. Vielen Dank für Ihr "
+"Verständnis."
-#: .\contrib\admin\templates\admin\base.html.py:25
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Willkommen,"
-#: .\contrib\admin\templates\admin\base.html.py:25
-#: .\contrib\admin\templates\admin\change_form.html.py:10
-#: .\contrib\admin\templates\admin\change_list.html.py:5
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
-#: .\contrib\admin\templates\admin\object_history.html.py:3
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:9
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
-#: .\contrib\admin\templates\registration\password_change_done.html.py:3
-#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
msgid "Documentation"
msgstr "Dokumentation"
-#: .\contrib\admin\templates\admin\base.html.py:25
-#: .\contrib\admin\templates\admin\change_form.html.py:10
-#: .\contrib\admin\templates\admin\change_list.html.py:5
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
-#: .\contrib\admin\templates\admin\object_history.html.py:3
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:9
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:15
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:46
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
-#: .\contrib\admin\templates\admin_doc\index.html.py:4
-#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
-#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
-#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
-#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
-#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
-#: .\contrib\admin\templates\registration\password_change_done.html.py:3
-#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
msgid "Change password"
msgstr "Passwort ändern"
-#: .\contrib\admin\templates\admin\base.html.py:25
-#: .\contrib\admin\templates\admin\change_form.html.py:10
-#: .\contrib\admin\templates\admin\change_list.html.py:5
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
-#: .\contrib\admin\templates\admin\object_history.html.py:3
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:9
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
-#: .\contrib\admin\templates\admin_doc\index.html.py:4
-#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
-#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
-#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
-#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
-#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
-#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
-#: .\contrib\admin\templates\registration\password_change_done.html.py:3
-#: .\contrib\admin\templates\registration\password_change_form.html.py:3
-#: .\contrib\comments\templates\comments\form.html.py:6
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
msgid "Log out"
msgstr "Abmelden"
-#: .\contrib\admin\templates\admin\base_site.html.py:4
+#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Django Systemverwaltung"
-#: .\contrib\admin\templates\admin\base_site.html.py:7
+#: contrib/admin/templates/admin/base_site.html:7
msgid "Django administration"
msgstr "Django Verwaltung"
-#: .\contrib\admin\templates\admin\change_form.html.py:15
-#: .\contrib\admin\templates\admin\index.html.py:28
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
msgid "Add"
msgstr "Hinzufügen"
-#: .\contrib\admin\templates\admin\change_form.html.py:21
-#: .\contrib\admin\templates\admin\object_history.html.py:5
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
msgid "History"
msgstr "Geschichte"
-#: .\contrib\admin\templates\admin\change_form.html.py:22
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Im Web Anzeigen"
-#: .\contrib\admin\templates\admin\change_form.html.py:32
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:24
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
msgstr[0] "Bitte den aufgeführten Fehler korrigieren."
msgstr[1] "Bitte die aufgeführten Fehler korrigieren."
-#: .\contrib\admin\templates\admin\change_form.html.py:50
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
msgstr "Sortierung"
-#: .\contrib\admin\templates\admin\change_form.html.py:53
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Reihenfolge:"
-#: .\contrib\admin\templates\admin\change_list.html.py:12
+#: contrib/admin/templates/admin/change_list.html:12
#, python-format
msgid "Add %(name)s"
msgstr "%(name)s hinzufügen"
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:9
-#: .\contrib\admin\templates\admin\submit_line.html.py:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
msgstr "Löschen"
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:14
+#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
-msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
-msgstr "Die Löschung des %(object_name)s '%(escaped_object)s' hätte die Löschung von abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die folgenden abhängigen Daten zu löschen:"
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Die Löschung des %(object_name)s '%(escaped_object)s' hätte die Löschung von "
+"abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die "
+"folgenden abhängigen Daten zu löschen:"
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:21
+#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
-msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
-msgstr "Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen wollen? Es werden zusätzlich die folgenden abhängigen Daten mit gelöscht:"
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen "
+"wollen? Es werden zusätzlich die folgenden abhängigen Daten mit gelöscht:"
-#: .\contrib\admin\templates\admin\delete_confirmation.html.py:26
+#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Ja, ich bin sicher"
-#: .\contrib\admin\templates\admin\filter.html.py:2
+#: contrib/admin/templates/admin/filter.html:2
#, python-format
msgid " By %(filter_title)s "
msgstr " Nach %(filter_title)s "
-#: .\contrib\admin\templates\admin\filters.html.py:4
+#: contrib/admin/templates/admin/filters.html:4
msgid "Filter"
msgstr "Filter"
-#: .\contrib\admin\templates\admin\index.html.py:17
+#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
msgstr "Modelle, die in der Anwendung %(name)s vorhanden sind."
-#: .\contrib\admin\templates\admin\index.html.py:18
+#: contrib/admin/templates/admin/index.html:18
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
-#: .\contrib\admin\templates\admin\index.html.py:34
+#: contrib/admin/templates/admin/index.html:34
msgid "Change"
msgstr "Ändern"
-#: .\contrib\admin\templates\admin\index.html.py:44
+#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
msgstr "Sie haben keine Berechtigung irgendwas zu ändern."
-#: .\contrib\admin\templates\admin\index.html.py:52
+#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
msgstr "Kürzliche Aktionen"
-#: .\contrib\admin\templates\admin\index.html.py:53
+#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
msgstr "Meine Aktionen"
-#: .\contrib\admin\templates\admin\index.html.py:57
+#: contrib/admin/templates/admin/index.html:57
msgid "None available"
msgstr "Keine vorhanden"
-#: .\contrib\admin\templates\admin\invalid_setup.html.py:8
-msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
-msgstr "Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, das die richtigen Datenbanktabellen angelegt wurden und bitte sicherstellen, das die Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, das "
+"die richtigen Datenbanktabellen angelegt wurden und bitte sicherstellen, das "
+"die Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
-#: .\contrib\admin\templates\admin\login.html.py:17
-#: .\contrib\comments\templates\comments\form.html.py:6
-#: .\contrib\comments\templates\comments\form.html.py:8
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
msgid "Username:"
msgstr "Benutzername:"
-#: .\contrib\admin\templates\admin\login.html.py:20
-#: .\contrib\comments\templates\comments\form.html.py:8
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
msgid "Password:"
msgstr "Passwort:"
-#: .\contrib\admin\templates\admin\login.html.py:25
-#: .\contrib\admin\views\decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
msgid "Log in"
msgstr "Anmelden"
-#: .\contrib\admin\templates\admin\object_history.html.py:18
+#: contrib/admin/templates/admin/object_history.html:18
msgid "Date/time"
msgstr "Datum/Zeit"
-#: .\contrib\admin\templates\admin\object_history.html.py:19
+#: contrib/admin/templates/admin/object_history.html:19
msgid "User"
msgstr "Benutzer"
-#: .\contrib\admin\templates\admin\object_history.html.py:20
+#: contrib/admin/templates/admin/object_history.html:20
msgid "Action"
msgstr "Aktion"
-#: .\contrib\admin\templates\admin\object_history.html.py:26
+#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
msgstr "j. N Y, H:i"
-#: .\contrib\admin\templates\admin\object_history.html.py:36
-msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
-msgstr "Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht über diese Verwaltungsseiten angelegt."
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
+"über diese Verwaltungsseiten angelegt."
-#: .\contrib\admin\templates\admin\pagination.html.py:10
+#: contrib/admin/templates/admin/pagination.html:10
msgid "Show all"
msgstr "Zeige alle"
-#: .\contrib\admin\templates\admin\search_form.html.py:8
+#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
msgstr "Los"
-#: .\contrib\admin\templates\admin\search_form.html.py:10
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
msgid "1 result"
msgid_plural "%(counter)s results"
msgstr[0] "Ein Ergebnis"
msgstr[1] "%(counter)s Ergebnisse"
-#: .\contrib\admin\templates\admin\search_form.html.py:10
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
msgid "%(full_result_count)s total"
msgstr "%(full_result_count)s gesamt"
-#: .\contrib\admin\templates\admin\submit_line.html.py:4
+#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Als neu sichern"
-#: .\contrib\admin\templates\admin\submit_line.html.py:5
+#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
msgstr "Sichern und neu hinzufügen"
-#: .\contrib\admin\templates\admin\submit_line.html.py:6
+#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
msgstr "Sichern und weiter bearbeiten"
-#: .\contrib\admin\templates\admin\submit_line.html.py:7
+#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
msgstr "Sichern"
-#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:6
-msgid "First, enter a username and password. Then, you'll be able to edit more user options."
-msgstr "Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere Optionen für den Benutzer geändert werden."
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
+"Optionen für den Benutzer geändert werden."
-#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:12
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
msgid "Username"
msgstr "Benutzername"
-#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:18
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
msgid "Password"
msgstr "Passwort"
-#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:23
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
msgid "Password (again)"
msgstr "Passwort (wiederholen)"
-#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:24
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
msgid "Enter the same password as above, for verification."
msgstr "Bitte das gleiche Passwort zur Überprüfung nochmal eingeben."
-#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:28
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
-msgstr "Bitte geben Sie ein neues Passwort für den Benutzer <strong>%(username)s</strong> ein."
+msgstr ""
+"Bitte geben Sie ein neues Passwort für den Benutzer <strong>%(username)s</"
+"strong> ein."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "Bookmarklets"
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
msgstr "Dokumentations-Bookmarklets"
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
"\n"
"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
@@ -560,691 +615,741 @@ msgid ""
msgstr ""
"\n"
"<p class=\"help\">Um Bookmarklets zu installieren müssen diese Links in die\n"
-"Browser-Werkzeugleiste gezogen werden, oder mittels rechter Maustaste in die\n"
-"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder Seite\n"
+"Browser-Werkzeugleiste gezogen werden, oder mittels rechter Maustaste in "
+"die\n"
+"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder "
+"Seite\n"
"aufgerufen werden. Einige Bookmarklets sind für den Zugriff von 'internen'\n"
"Rechnern eingeschränkt. Falls nicht klar ist, ob ein Rechner als 'intern'\n"
"bewertet wird, bitte den Administrator fragen.</p>\n"
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:19
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
msgstr "Dokumentation für diese Seite"
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:20
-msgid "Jumps you from any page to the documentation for the view that generates that page."
-msgstr "Springt von jeder Seite zu der Dokumentation für den View der diese Seite erzeugt."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Springt von jeder Seite zu der Dokumentation für den View der diese Seite "
+"erzeugt."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:22
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
msgstr "Objekt-ID anzeigen"
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:23
-msgid "Shows the content-type and unique ID for pages that represent a single object."
-msgstr "Zeigt den Content-Type und die eindeutige ID für Seiten die ein einzelnes Objekt repräsentieren."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Zeigt den Content-Type und die eindeutige ID für Seiten die ein einzelnes "
+"Objekt repräsentieren."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:25
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
msgstr "Dieses Objekt im aktuellen Fenster ändern."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:26
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein Objekt repräsentiert."
+msgstr ""
+"Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein "
+"Objekt repräsentiert."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
msgstr "Dieses Objekt in einem neuen Fenster ändern."
-#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:29
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
-msgstr "Wie zuvor, aber öffnet die Administrationsseite in einem neuen Fenster."
+msgstr ""
+"Wie zuvor, aber öffnet die Administrationsseite in einem neuen Fenster."
-#: .\contrib\admin\templates\registration\logged_out.html.py:8
+#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten verbracht haben."
-#: .\contrib\admin\templates\registration\logged_out.html.py:10
+#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
msgstr "Erneut anmelden"
-#: .\contrib\admin\templates\registration\password_change_done.html.py:4
-#: .\contrib\admin\templates\registration\password_change_form.html.py:4
-#: .\contrib\admin\templates\registration\password_change_form.html.py:6
-#: .\contrib\admin\templates\registration\password_change_form.html.py:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
msgid "Password change"
msgstr "Passwort ändern"
-#: .\contrib\admin\templates\registration\password_change_done.html.py:6
-#: .\contrib\admin\templates\registration\password_change_done.html.py:10
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
msgid "Password change successful"
msgstr "Passwort erfolgreich geändert"
-#: .\contrib\admin\templates\registration\password_change_done.html.py:12
+#: contrib/admin/templates/registration/password_change_done.html:12
msgid "Your password was changed."
msgstr "Ihr Passwort wurde geändert."
-#: .\contrib\admin\templates\registration\password_change_form.html.py:12
-msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
-msgstr "Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Passwort und darunter dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das neue Kennwort ein."
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Passwort und darunter "
+"dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das "
+"neue Kennwort ein."
-#: .\contrib\admin\templates\registration\password_change_form.html.py:17
+#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
msgstr "Altes Passwort:"
-#: .\contrib\admin\templates\registration\password_change_form.html.py:19
+#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
msgstr "Neues Passwort:"
-#: .\contrib\admin\templates\registration\password_change_form.html.py:21
+#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
msgstr "Passwort wiederholen:"
-#: .\contrib\admin\templates\registration\password_change_form.html.py:23
+#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
msgstr "Mein Passwort ändern"
-#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:6
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
msgid "Password reset"
msgstr "Passwort zurücksetzen"
-#: .\contrib\admin\templates\registration\password_reset_done.html.py:6
-#: .\contrib\admin\templates\registration\password_reset_done.html.py:10
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
msgstr "Passwort wurde erfolgreich zurückgesetzt"
-#: .\contrib\admin\templates\registration\password_reset_done.html.py:12
-msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
-msgstr "Wir haben ein neues Passwort an die von Ihnen angegebene E-Mail-Adresse geschickt. Sie sollten es in Kürze erhalten."
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Wir haben ein neues Passwort an die von Ihnen angegebene E-Mail-Adresse "
+"geschickt. Sie sollten es in Kürze erhalten."
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:2
+#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
msgstr "Sie erhalten diese E-Mail, weil Sie ein neues Passwort"
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:3
+#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
msgid "for your user account at %(site_name)s"
msgstr "für Ihren Benutzer bei %(site_name)s angefordert haben."
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:5
+#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
msgstr "Ihr neues Passwort lautet: %(new_password)s"
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:7
+#: contrib/admin/templates/registration/password_reset_email.html:7
msgid "Feel free to change this password by going to this page:"
msgstr "Sie können das Passwort auf folgender Seite ändern:"
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:11
+#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:"
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:13
+#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
msgstr "Vielen Dank, dass Sie unsere Seiten benutzen!"
-#: .\contrib\admin\templates\registration\password_reset_email.html.py:15
+#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
msgstr "Das Team von %(site_name)s"
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:12
-msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
-msgstr "Passwort vergessen? Einfach die E-Mail-Adresse eingeben und wir setzen das Passwort zurück und lassen es Ihnen per E-Mail zukommen."
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Passwort vergessen? Einfach die E-Mail-Adresse eingeben und wir setzen das "
+"Passwort zurück und lassen es Ihnen per E-Mail zukommen."
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
msgstr "E-Mail-Adresse:"
-#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
msgstr "Mein Passwort zurücksetzen"
-#: .\contrib\admin\templates\widget\date_time.html.py:3
+#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
msgstr "Datum:"
-#: .\contrib\admin\templates\widget\date_time.html.py:4
+#: contrib/admin/templates/widget/date_time.html:4
msgid "Time:"
msgstr "Zeit:"
-#: .\contrib\admin\templates\widget\file.html.py:2
+#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
msgstr "Derzeit:"
-#: .\contrib\admin\templates\widget\file.html.py:3
+#: contrib/admin/templates/widget/file.html:3
msgid "Change:"
msgstr "Ändern:"
-#: .\contrib\admin\templatetags\admin_list.py:238
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Alle Tage"
-#: .\contrib\admin\views\auth.py:19
-#: .\contrib\admin\views\main.py:257
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
-#: .\contrib\admin\views\auth.py:24
-#: .\contrib\admin\views\main.py:261
-#: .\contrib\admin\views\main.py:347
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Das Element kann jetzt weiter bearbeitet werden."
-#: .\contrib\admin\views\auth.py:30
+#: contrib/admin/views/auth.py:30
msgid "Add user"
msgstr "Benutzer hinzufügen"
-#: .\contrib\admin\views\auth.py:57
+#: contrib/admin/views/auth.py:57
msgid "Password changed successfully."
msgstr "Passwort erfolgreich geändert."
-#: .\contrib\admin\views\auth.py:64
+#: contrib/admin/views/auth.py:64
#, python-format
msgid "Change password: %s"
msgstr "Passwort ändern: %s"
-#: .\contrib\admin\views\decorators.py:10
-#: .\contrib\auth\forms.py:59
-msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "Bitte einen Benutzernamen und ein Passwort eingeben. Beide Felder berücksichtigen die Groß-/Kleinschreibung."
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Bitte einen Benutzernamen und ein Passwort eingeben. Beide Felder "
+"berücksichtigen die Groß-/Kleinschreibung."
-#: .\contrib\admin\views\decorators.py:62
-msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-msgstr "Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst, die Beiträge wurden gesichert."
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst, die "
+"Beiträge wurden gesichert."
-#: .\contrib\admin\views\decorators.py:69
-msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "Es sieht danach aus, dass der Browser keine Cookies akzeptiert. Bitte im Browser Cookies aktivieren und diese Seite neu laden."
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Es sieht danach aus, dass der Browser keine Cookies akzeptiert. Bitte im "
+"Browser Cookies aktivieren und diese Seite neu laden."
-#: .\contrib\admin\views\decorators.py:83
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Benutzernamen dürfen das Zeichen '@' nicht enthalten."
-#: .\contrib\admin\views\decorators.py:85
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Die E-Mail-Adresse entspricht nicht Ihrem Benutzernamen. Bitte stattdessen '%s' versuchen."
+msgstr ""
+"Die E-Mail-Adresse entspricht nicht Ihrem Benutzernamen. Bitte stattdessen '%"
+"s' versuchen."
-#: .\contrib\admin\views\doc.py:46
-#: .\contrib\admin\views\doc.py:48
-#: .\contrib\admin\views\doc.py:50
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
msgid "tag:"
msgstr "Schlagwort:"
-#: .\contrib\admin\views\doc.py:77
-#: .\contrib\admin\views\doc.py:79
-#: .\contrib\admin\views\doc.py:81
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
msgid "filter:"
msgstr "Filter:"
-#: .\contrib\admin\views\doc.py:135
-#: .\contrib\admin\views\doc.py:137
-#: .\contrib\admin\views\doc.py:139
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
msgid "view:"
msgstr "Ansicht:"
-#: .\contrib\admin\views\doc.py:164
+#: contrib/admin/views/doc.py:164
#, python-format
msgid "App %r not found"
msgstr "Anwendung %r nicht gefunden"
-#: .\contrib\admin\views\doc.py:171
+#: contrib/admin/views/doc.py:171
#, python-format
-msgid "Model %r not found in app %r"
-msgstr "Modell %r wurde nicht in Anwendung %r gefunden"
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modell %(name)r wurde nicht in Anwendung %(label)r gefunden"
-#: .\contrib\admin\views\doc.py:183
+#: contrib/admin/views/doc.py:183
#, python-format
-msgid "the related `%s.%s` object"
-msgstr "Das verknüpfte `%s.%s` Objekt"
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "Das verknüpfte `%(label)s.%(type)s` Objekt"
-#: .\contrib\admin\views\doc.py:183
-#: .\contrib\admin\views\doc.py:205
-#: .\contrib\admin\views\doc.py:219
-#: .\contrib\admin\views\doc.py:224
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
msgid "model:"
msgstr "Modell:"
-#: .\contrib\admin\views\doc.py:214
+#: contrib/admin/views/doc.py:214
#, python-format
-msgid "related `%s.%s` objects"
-msgstr "verknüpftes `%s.%s` Objekt"
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "verknüpftes `%(label)s.%(name)s` Objekt"
-#: .\contrib\admin\views\doc.py:219
+#: contrib/admin/views/doc.py:219
#, python-format
msgid "all %s"
msgstr "Alle %s"
-#: .\contrib\admin\views\doc.py:224
+#: contrib/admin/views/doc.py:224
#, python-format
msgid "number of %s"
msgstr "Anzahl von %s"
-#: .\contrib\admin\views\doc.py:229
+#: contrib/admin/views/doc.py:229
#, python-format
msgid "Fields on %s objects"
msgstr "Felder am %s Objekt"
-#: .\contrib\admin\views\doc.py:291
-#: .\contrib\admin\views\doc.py:301
-#: .\contrib\admin\views\doc.py:303
-#: .\contrib\admin\views\doc.py:309
-#: .\contrib\admin\views\doc.py:310
-#: .\contrib\admin\views\doc.py:312
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
msgid "Integer"
msgstr "Ganzzahl"
-#: .\contrib\admin\views\doc.py:292
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "Boolscher Wert (True oder False)"
-#: .\contrib\admin\views\doc.py:293
-#: .\contrib\admin\views\doc.py:311
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Zeichenkette (bis zu %(maxlength)s Zeichen)"
-#: .\contrib\admin\views\doc.py:294
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Kommaseparierte Liste von Ganzzahlen"
-#: .\contrib\admin\views\doc.py:295
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Datum (ohne Uhrzeit)"
-#: .\contrib\admin\views\doc.py:296
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Datum (mit Uhrzeit)"
-#: .\contrib\admin\views\doc.py:297
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "E-Mail-Adresse"
-#: .\contrib\admin\views\doc.py:298
-#: .\contrib\admin\views\doc.py:299
-#: .\contrib\admin\views\doc.py:302
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Dateipfad"
-#: .\contrib\admin\views\doc.py:300
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "Dezimalzahl"
-#: .\contrib\admin\views\doc.py:304
-#: .\contrib\comments\models.py:85
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
msgid "IP address"
msgstr "IP-Adresse"
-#: .\contrib\admin\views\doc.py:306
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Boolscher Wert (True, False oder None)"
-#: .\contrib\admin\views\doc.py:307
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "Beziehung zum Eltern-Modell"
-#: .\contrib\admin\views\doc.py:308
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Telefonnummer"
-#: .\contrib\admin\views\doc.py:313
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Text"
-#: .\contrib\admin\views\doc.py:314
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "Zeit"
-#: .\contrib\admin\views\doc.py:315
-#: .\contrib\flatpages\models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "Adresse (URL)"
-#: .\contrib\admin\views\doc.py:316
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "U.S. Bundesstaat (zwei Großbuchstaben)"
-#: .\contrib\admin\views\doc.py:317
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "XML-Text"
-#: .\contrib\admin\views\doc.py:343
+#: contrib/admin/views/doc.py:343
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s ist scheinbar kein urlpattern Objekt"
-#: .\contrib\admin\views\main.py:223
+#: contrib/admin/views/main.py:223
msgid "Site administration"
msgstr "Website Verwaltung"
-#: .\contrib\admin\views\main.py:271
-#: .\contrib\admin\views\main.py:356
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
msgstr "Jetzt kann ein weiteres Element vom Typ %s angelegt werden."
-#: .\contrib\admin\views\main.py:289
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "%s hinzufügen"
-#: .\contrib\admin\views\main.py:335
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "%s hinzugefügt."
-#: .\contrib\admin\views\main.py:335
-#: .\contrib\admin\views\main.py:337
-#: .\contrib\admin\views\main.py:339
-#: .\db\models\manipulators.py:306
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
msgid "and"
msgstr "und"
-#: .\contrib\admin\views\main.py:337
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "%s geändert"
-#: .\contrib\admin\views\main.py:339
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "%s gelöscht."
-#: .\contrib\admin\views\main.py:342
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Keine Felder geändert."
-#: .\contrib\admin\views\main.py:345
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
-#: .\contrib\admin\views\main.py:353
+#: contrib/admin/views/main.py:353
#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt. Das Element kann jetzt geändert werden."
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt. Das Element kann jetzt "
+"geändert werden."
-#: .\contrib\admin\views\main.py:391
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "%s ändern"
-#: .\contrib\admin\views\main.py:473
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Ein oder mehrere %(fieldname)s in %(name)s: %(obj)s"
-#: .\contrib\admin\views\main.py:478
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Ein oder mehrere %(fieldname)s in %(name)s:"
-#: .\contrib\admin\views\main.py:511
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
-#: .\contrib\admin\views\main.py:514
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "Sind Sie ganz sicher?"
-#: .\contrib\admin\views\main.py:536
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
msgstr "Änderungsgeschichte: %s"
-#: .\contrib\admin\views\main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "%s auswählen"
-#: .\contrib\admin\views\main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
msgstr "%s zur Änderung auswählen"
-#: .\contrib\admin\views\main.py:758
+#: contrib/admin/views/main.py:768
msgid "Database error"
msgstr "Datenbankfehler"
-#: .\contrib\auth\forms.py:16
-#: .\contrib\auth\forms.py:137
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
msgid "The two password fields didn't match."
msgstr "Die beiden Passwörter sind nicht identisch."
-#: .\contrib\auth\forms.py:24
+#: contrib/auth/forms.py:25
msgid "A user with that username already exists."
msgstr "Ein Benutzer mit diesem Namen existiert bereits."
-#: .\contrib\auth\forms.py:52
-msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
-msgstr "Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für die Anmeldung zwingend erforderlich."
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für "
+"die Anmeldung zwingend erforderlich."
-#: .\contrib\auth\forms.py:61
+#: contrib/auth/forms.py:62
msgid "This account is inactive."
msgstr "Dieser Benutzer ist inaktiv."
-#: .\contrib\auth\forms.py:84
-msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
-msgstr "Zu dieser E-Mail-Adresse existiert kein Benutzer. Sicher, dass Sie sich mit dieser Adresse angemeldet haben?"
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Zu dieser E-Mail-Adresse existiert kein Benutzer. Sicher, dass Sie sich mit "
+"dieser Adresse angemeldet haben?"
-#: .\contrib\auth\forms.py:116
+#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
msgstr "Die beiden neuen Passwörter sind nicht identisch."
-#: .\contrib\auth\forms.py:123
+#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
msgstr "Das alte Passwort war falsch. Bitte neu eingeben."
-#: .\contrib\auth\models.py:38
-#: .\contrib\auth\models.py:57
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
msgid "name"
msgstr "Name"
-#: .\contrib\auth\models.py:40
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "Codename"
-#: .\contrib\auth\models.py:42
+#: contrib/auth/models.py:43
msgid "permission"
msgstr "Berechtigung"
-#: .\contrib\auth\models.py:43
-#: .\contrib\auth\models.py:58
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
msgid "permissions"
msgstr "Berechtigungen"
-#: .\contrib\auth\models.py:60
+#: contrib/auth/models.py:62
msgid "group"
msgstr "Gruppe"
-#: .\contrib\auth\models.py:61
-#: .\contrib\auth\models.py:100
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
msgid "groups"
msgstr "Gruppen"
-#: .\contrib\auth\models.py:90
+#: contrib/auth/models.py:93
msgid "username"
msgstr "Benutzername"
-#: .\contrib\auth\models.py:90
-msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
-msgstr "Erforderlich. 30 Zeichen oder weniger. Alphanumerische Zeichen (Buchstaben, Ziffern und Unterstriche sind erlaubt)."
+#: contrib/auth/models.py:93
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Erforderlich. 30 Zeichen oder weniger. Alphanumerische Zeichen (Buchstaben, "
+"Ziffern und Unterstriche sind erlaubt)."
-#: .\contrib\auth\models.py:91
+#: contrib/auth/models.py:94
msgid "first name"
msgstr "Vorname"
-#: .\contrib\auth\models.py:92
+#: contrib/auth/models.py:95
msgid "last name"
msgstr "Nachname"
-#: .\contrib\auth\models.py:93
+#: contrib/auth/models.py:96
msgid "e-mail address"
msgstr "E-Mail-Adresse"
-#: .\contrib\auth\models.py:94
+#: contrib/auth/models.py:97
msgid "password"
msgstr "Passwort"
-#: .\contrib\auth\models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
-msgstr "Die Form '[algo]$[salt]$[hexdigest]' verwenden, oder das <a href=\"password/\">Passwort ändern Formular</a> benutzen."
+#: contrib/auth/models.py:97
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Die Form '[algo]$[salt]$[hexdigest]' verwenden, oder das <a href=\"password/"
+"\">Passwort ändern Formular</a> benutzen."
-#: .\contrib\auth\models.py:95
+#: contrib/auth/models.py:98
msgid "staff status"
msgstr "Administrator"
-#: .\contrib\auth\models.py:95
+#: contrib/auth/models.py:98
msgid "Designates whether the user can log into this admin site."
-msgstr "Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann."
+msgstr ""
+"Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann."
-#: .\contrib\auth\models.py:96
+#: contrib/auth/models.py:99
msgid "active"
msgstr "Aktiv"
-#: .\contrib\auth\models.py:96
-msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
-msgstr "Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann. Anstatt einen Benutzer zu löschen, kann er hier auch einfach deaktiviert werden."
+#: contrib/auth/models.py:99
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann. "
+"Anstatt einen Benutzer zu löschen, kann er hier auch einfach deaktiviert "
+"werden."
-#: .\contrib\auth\models.py:97
+#: contrib/auth/models.py:100
msgid "superuser status"
msgstr "Hauptadmin."
-#: .\contrib\auth\models.py:97
-msgid "Designates that this user has all permissions without explicitly assigning them."
-msgstr "Legt fest, dass der Benutzer alle Berechtigungen hat, ohne diese einzeln zuweisen zu müssen."
+#: contrib/auth/models.py:100
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Legt fest, dass der Benutzer alle Berechtigungen hat, ohne diese einzeln "
+"zuweisen zu müssen."
-#: .\contrib\auth\models.py:98
+#: contrib/auth/models.py:101
msgid "last login"
msgstr "Letzte Anmeldung"
-#: .\contrib\auth\models.py:99
+#: contrib/auth/models.py:102
msgid "date joined"
msgstr "Mitglied seit"
-#: .\contrib\auth\models.py:101
-msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
-msgstr "Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch alle Rechte, die seine zugewiesenen Gruppen haben."
+#: contrib/auth/models.py:104
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch "
+"alle Rechte, die seine zugewiesenen Gruppen haben."
-#: .\contrib\auth\models.py:102
+#: contrib/auth/models.py:105
msgid "user permissions"
msgstr "Berechtigungen"
-#: .\contrib\auth\models.py:105
+#: contrib/auth/models.py:109
msgid "user"
msgstr "Benutzer"
-#: .\contrib\auth\models.py:106
+#: contrib/auth/models.py:110
msgid "users"
msgstr "Benutzer"
-#: .\contrib\auth\models.py:111
+#: contrib/auth/models.py:116
msgid "Personal info"
msgstr "Persönliche Infos"
-#: .\contrib\auth\models.py:112
+#: contrib/auth/models.py:117
msgid "Permissions"
msgstr "Berechtigungen"
-#: .\contrib\auth\models.py:113
+#: contrib/auth/models.py:118
msgid "Important dates"
msgstr "Wichtige Daten"
-#: .\contrib\auth\models.py:114
+#: contrib/auth/models.py:119
msgid "Groups"
msgstr "Gruppen"
-#: .\contrib\auth\models.py:258
+#: contrib/auth/models.py:263
msgid "message"
msgstr "Mitteilung"
-#: .\contrib\auth\views.py:39
+#: contrib/auth/views.py:39
msgid "Logged out"
msgstr "Abgemeldet"
-#: .\contrib\comments\models.py:67
-#: .\contrib\comments\models.py:166
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "Objekt-ID"
-#: .\contrib\comments\models.py:68
+#: contrib/comments/models.py:68
msgid "headline"
msgstr "Überschrift"
-#: .\contrib\comments\models.py:69
-#: .\contrib\comments\models.py:90
-#: .\contrib\comments\models.py:167
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
msgid "comment"
msgstr "Kommentar"
-#: .\contrib\comments\models.py:70
+#: contrib/comments/models.py:70
msgid "rating #1"
msgstr "Bewertung #1"
-#: .\contrib\comments\models.py:71
+#: contrib/comments/models.py:71
msgid "rating #2"
msgstr "Bewertung #2"
-#: .\contrib\comments\models.py:72
+#: contrib/comments/models.py:72
msgid "rating #3"
msgstr "Bewertung #3"
-#: .\contrib\comments\models.py:73
+#: contrib/comments/models.py:73
msgid "rating #4"
msgstr "Bewertung #4"
-#: .\contrib\comments\models.py:74
+#: contrib/comments/models.py:74
msgid "rating #5"
msgstr "Bewertung #5"
-#: .\contrib\comments\models.py:75
+#: contrib/comments/models.py:75
msgid "rating #6"
msgstr "Bewertung #6"
-#: .\contrib\comments\models.py:76
+#: contrib/comments/models.py:76
msgid "rating #7"
msgstr "Bewertung #7"
-#: .\contrib\comments\models.py:77
+#: contrib/comments/models.py:77
msgid "rating #8"
msgstr "Bewertung #8"
-#: .\contrib\comments\models.py:82
+#: contrib/comments/models.py:82
msgid "is valid rating"
msgstr "ist eine Bewertung"
-#: .\contrib\comments\models.py:83
-#: .\contrib\comments\models.py:169
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
msgstr "Datum/Zeit Erstellung"
-#: .\contrib\comments\models.py:84
-#: .\contrib\comments\models.py:170
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
msgstr "ist öffentlich"
-#: .\contrib\comments\models.py:86
+#: contrib/comments/models.py:86
msgid "is removed"
msgstr "ist gelöscht"
-#: .\contrib\comments\models.py:86
-msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
-msgstr "Hier einen Haken setzen, wenn der Kommentar unpassend ist. Stattdessen wird dann \"Dieser Kommentar wurde entfernt\" Meldung angezeigt."
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Hier einen Haken setzen, wenn der Kommentar unpassend ist. Stattdessen wird "
+"dann \"Dieser Kommentar wurde entfernt\" Meldung angezeigt."
-#: .\contrib\comments\models.py:91
+#: contrib/comments/models.py:91
msgid "comments"
msgstr "Kommentare"
-#: .\contrib\comments\models.py:131
-#: .\contrib\comments\models.py:207
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
msgid "Content object"
msgstr "Inhaltsobjekt"
-#: .\contrib\comments\models.py:159
+#: contrib/comments/models.py:159
#, python-format
msgid ""
"Posted by %(user)s at %(date)s\n"
@@ -1259,48 +1364,48 @@ msgstr ""
"\n"
"http://%(domain)s%(url)s"
-#: .\contrib\comments\models.py:168
+#: contrib/comments/models.py:168
msgid "person's name"
msgstr "Autorname"
-#: .\contrib\comments\models.py:171
+#: contrib/comments/models.py:171
msgid "ip address"
msgstr "IP-Adresse"
-#: .\contrib\comments\models.py:173
+#: contrib/comments/models.py:173
msgid "approved by staff"
msgstr "Bestätigt vom Betreiber"
-#: .\contrib\comments\models.py:176
+#: contrib/comments/models.py:176
msgid "free comment"
msgstr "Freier Kommentar"
-#: .\contrib\comments\models.py:177
+#: contrib/comments/models.py:177
msgid "free comments"
msgstr "Freie Kommentare"
-#: .\contrib\comments\models.py:233
+#: contrib/comments/models.py:233
msgid "score"
msgstr "Bewertung"
-#: .\contrib\comments\models.py:234
+#: contrib/comments/models.py:234
msgid "score date"
msgstr "Bewertungsdatum"
-#: .\contrib\comments\models.py:237
+#: contrib/comments/models.py:237
msgid "karma score"
msgstr "Karma Bewertung"
-#: .\contrib\comments\models.py:238
+#: contrib/comments/models.py:238
msgid "karma scores"
msgstr "Karma Bewertungen"
-#: .\contrib\comments\models.py:242
+#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
msgstr "%(score)d Bewertung von %(user)s"
-#: .\contrib\comments\models.py:258
+#: contrib/comments/models.py:258
#, python-format
msgid ""
"This comment was flagged by %(user)s:\n"
@@ -1311,100 +1416,107 @@ msgstr ""
"\n"
"%(text)s"
-#: .\contrib\comments\models.py:265
+#: contrib/comments/models.py:265
msgid "flag date"
msgstr "Kennzeichnungsdatum"
-#: .\contrib\comments\models.py:268
+#: contrib/comments/models.py:268
msgid "user flag"
msgstr "Benutzerkennzeichnung"
-#: .\contrib\comments\models.py:269
+#: contrib/comments/models.py:269
msgid "user flags"
msgstr "Benutzerkennzeichnungen"
-#: .\contrib\comments\models.py:273
+#: contrib/comments/models.py:273
#, python-format
msgid "Flag by %r"
msgstr "Gekennzeichnet von %r"
-#: .\contrib\comments\models.py:278
+#: contrib/comments/models.py:278
msgid "deletion date"
msgstr "Löschdatum"
-#: .\contrib\comments\models.py:280
+#: contrib/comments/models.py:280
msgid "moderator deletion"
msgstr "Löschung vom Moderator"
-#: .\contrib\comments\models.py:281
+#: contrib/comments/models.py:281
msgid "moderator deletions"
msgstr "Löschungen vom Moderator"
-#: .\contrib\comments\models.py:285
+#: contrib/comments/models.py:285
#, python-format
msgid "Moderator deletion by %r"
msgstr "Vom Moderator %r gelöscht"
-#: .\contrib\comments\templates\comments\form.html.py:8
+#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
msgstr "Passwort vergessen?"
-#: .\contrib\comments\templates\comments\form.html.py:12
+#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Bewertungen"
-#: .\contrib\comments\templates\comments\form.html.py:12
-#: .\contrib\comments\templates\comments\form.html.py:23
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
msgid "Required"
msgstr "Erforderlich"
-#: .\contrib\comments\templates\comments\form.html.py:12
-#: .\contrib\comments\templates\comments\form.html.py:23
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
msgid "Optional"
msgstr "Optional"
-#: .\contrib\comments\templates\comments\form.html.py:23
+#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
msgstr "Ein Bild veröffentlichen"
-#: .\contrib\comments\templates\comments\form.html.py:28
-#: .\contrib\comments\templates\comments\freeform.html.py:5
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
msgid "Comment:"
msgstr "Kommentar:"
-#: .\contrib\comments\templates\comments\form.html.py:35
-#: .\contrib\comments\templates\comments\freeform.html.py:10
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
msgid "Preview comment"
msgstr "Kommentarvorschau"
-#: .\contrib\comments\templates\comments\freeform.html.py:4
+#: contrib/comments/templates/comments/freeform.html:4
msgid "Your name:"
msgstr "Ihr Name:"
-#: .\contrib\comments\views\comments.py:27
-msgid "This rating is required because you've entered at least one other rating."
-msgstr "Diese Abstimmung ist zwingend erforderlich, da Du an mindestens einer weiteren Abstimmung teilnimmst."
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Diese Abstimmung ist zwingend erforderlich, da Du an mindestens einer "
+"weiteren Abstimmung teilnimmst."
-#: .\contrib\comments\views\comments.py:111
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
-"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
"\n"
"%(text)s"
msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
"\n"
"%(text)s"
msgstr[0] ""
-"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s Kommentar:\n"
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentar:\n"
"\n"
"%(text)s"
msgstr[1] ""
-"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s Kommentaren:\n"
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentaren:\n"
"\n"
"%(text)s"
-#: .\contrib\comments\views\comments.py:116
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -1415,266 +1527,678 @@ msgstr ""
"\n"
"%(text)s"
-#: .\contrib\comments\views\comments.py:188
-#: .\contrib\comments\views\comments.py:280
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Nur POST ist erlaubt"
-#: .\contrib\comments\views\comments.py:192
-#: .\contrib\comments\views\comments.py:284
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Eines oder mehrere der erforderlichen Felder fehlen"
-#: .\contrib\comments\views\comments.py:196
-#: .\contrib\comments\views\comments.py:286
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
+msgstr ""
+"Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
-#: .\contrib\comments\views\comments.py:206
-#: .\contrib\comments\views\comments.py:292
-msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
-msgstr "Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-ID ist ungültig."
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-"
+"ID ist ungültig."
-#: .\contrib\comments\views\comments.py:257
-#: .\contrib\comments\views\comments.py:321
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
+msgstr ""
+"Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
-#: .\contrib\comments\views\karma.py:19
+#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
msgstr "Anonyme Benutzer dürfen nicht abstimmen"
-#: .\contrib\comments\views\karma.py:23
+#: contrib/comments/views/karma.py:23
msgid "Invalid comment ID"
msgstr "Ungültige Kommentar-ID"
-#: .\contrib\comments\views\karma.py:25
+#: contrib/comments/views/karma.py:25
msgid "No voting for yourself"
msgstr "Keine Abstimmung für dich selbst"
-#: .\contrib\contenttypes\models.py:26
+#: contrib/contenttypes/models.py:36
msgid "python model class name"
msgstr "Python Model-Klassenname"
-#: .\contrib\contenttypes\models.py:29
+#: contrib/contenttypes/models.py:39
msgid "content type"
msgstr "Inhaltstyp"
-#: .\contrib\contenttypes\models.py:30
+#: contrib/contenttypes/models.py:40
msgid "content types"
msgstr "Inhaltstypen"
-#: .\contrib\flatpages\models.py:8
-msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr "Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
-#: .\contrib\flatpages\models.py:9
+#: contrib/flatpages/models.py:9
msgid "title"
msgstr "Titel"
-#: .\contrib\flatpages\models.py:10
+#: contrib/flatpages/models.py:10
msgid "content"
msgstr "Inhalt"
-#: .\contrib\flatpages\models.py:11
+#: contrib/flatpages/models.py:11
msgid "enable comments"
msgstr "Kommentare aktivieren"
-#: .\contrib\flatpages\models.py:12
+#: contrib/flatpages/models.py:12
msgid "template name"
msgstr "Name der Vorlage"
-#: .\contrib\flatpages\models.py:13
-msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
-msgstr "Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefüllt ist, wird 'flatpages/default.html' als Standard gewählt."
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefüllt ist, "
+"wird 'flatpages/default.html' als Standard gewählt."
-#: .\contrib\flatpages\models.py:14
+#: contrib/flatpages/models.py:14
msgid "registration required"
msgstr "Registrierung erforderlich"
-#: .\contrib\flatpages\models.py:14
+#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Wenn hier ein Haken gesetzt ist, können nur angemeldete Benutzer diese Seite sehen."
+msgstr ""
+"Wenn hier ein Haken gesetzt ist, können nur angemeldete Benutzer diese Seite "
+"sehen."
-#: .\contrib\flatpages\models.py:18
+#: contrib/flatpages/models.py:18
msgid "flat page"
msgstr "Webseite"
-#: .\contrib\flatpages\models.py:19
+#: contrib/flatpages/models.py:19
msgid "flat pages"
msgstr "Webseiten"
-#: .\contrib\redirects\models.py:7
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "ein"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "zwei"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "drei"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "vier"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "fünf"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sechs"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sieben"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "acht"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "neun"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Bitte eine gültige vierstellige Postleitzahl eingeben."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX-XXX eingeben."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummern müssen das Format XXX-XXX-XXXX haben."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bayern"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Niedersachsen"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nordrhein-Westfalen"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rheinland-Pfalz"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sachsen"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Sachsen-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thüringen"
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX eingeben."
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Bitte eine gültige deutsche Personalausweisnummer im Format "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X eingeben."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Bitte eine gültige finnische Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+"Bitte eine gültige Postleitzahl im Format XXXXXXX oder XXX-XXXX "
+"eingeben."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Zeit"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXX eingeben."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Bitte eine gültige norwegische Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Bitte eine gültige Postleitzahl eingeben. Ein Leerzeichen trennt die zwei Teile."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX oder XXXXX-XXXX eingeben."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Bitte eine gültige US-amerikanische Sozialversicherungsnummer im Format "
+"XXX-XX-XXXX eingeben."
+
+#: contrib/redirects/models.py:7
msgid "redirect from"
msgstr "Umleitung von"
-#: .\contrib\redirects\models.py:8
-msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
-msgstr "Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/events/search/'."
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
+"events/search/'."
-#: .\contrib\redirects\models.py:9
+#: contrib/redirects/models.py:9
msgid "redirect to"
msgstr "Umleitung zu"
-#: .\contrib\redirects\models.py:10
-msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
-msgstr "Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am Anfang stehen."
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
+"Anfang stehen."
-#: .\contrib\redirects\models.py:13
+#: contrib/redirects/models.py:13
msgid "redirect"
msgstr "Umleitung"
-#: .\contrib\redirects\models.py:14
+#: contrib/redirects/models.py:14
msgid "redirects"
msgstr "Umleitungen"
-#: .\contrib\sessions\models.py:51
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "Sitzungs-ID"
-#: .\contrib\sessions\models.py:52
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "Sitzungsdaten"
-#: .\contrib\sessions\models.py:53
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "Verfallsdatum"
-#: .\contrib\sessions\models.py:57
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "Sitzung"
-#: .\contrib\sessions\models.py:58
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "Sitzungen"
-#: .\contrib\sites\models.py:10
+#: contrib/sites/models.py:10
msgid "domain name"
msgstr "Domainname"
-#: .\contrib\sites\models.py:11
+#: contrib/sites/models.py:11
msgid "display name"
msgstr "Anzeigename"
-#: .\contrib\sites\models.py:15
+#: contrib/sites/models.py:15
msgid "site"
msgstr "Website"
-#: .\contrib\sites\models.py:16
+#: contrib/sites/models.py:16
msgid "sites"
msgstr "Websites"
-#: .\core\validators.py:64
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten."
-#: .\core\validators.py:68
-msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
-msgstr "Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche enthalten."
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche "
+"enthalten."
-#: .\core\validators.py:72
+#: core/validators.py:72
msgid "This value must contain only letters, numbers, underscores or hyphens."
-msgstr "Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Bindestriche enthalten."
+msgstr ""
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Bindestriche "
+"enthalten."
-#: .\core\validators.py:76
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "Großbuchstaben sind hier nicht erlaubt."
-#: .\core\validators.py:80
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "Kleinbuchstaben sind hier nicht erlaubt."
-#: .\core\validators.py:87
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt."
-#: .\core\validators.py:99
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Bitte mit Komma getrennte, gültige E-Mail-Adressen eingeben."
-#: .\core\validators.py:103
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "Bitte eine gültige IP-Adresse eingeben."
-#: .\core\validators.py:107
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "Dieses Feld darf nicht leer sein."
-#: .\core\validators.py:111
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt."
-#: .\core\validators.py:115
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen."
-#: .\core\validators.py:120
-#: .\newforms\fields.py:126
+#: core/validators.py:120 newforms/fields.py:128
msgid "Enter a whole number."
msgstr "Bitte eine ganze Zahl eingeben."
-#: .\core\validators.py:124
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "Nur alphabetische Zeichen sind hier erlaubt."
-#: .\core\validators.py:139
+#: core/validators.py:139
msgid "Year must be 1900 or later."
msgstr "Das Jahr muss 1900 oder später sein."
-#: .\core\validators.py:143
+#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
+msgid "Invalid date: %s"
msgstr "Ungültiges Datum: %s"
-#: .\core\validators.py:147
-#: .\db\models\fields\__init__.py:448
+#: core/validators.py:148 db/models/fields/__init__.py:457
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Bitte ein gültiges Datum im Format JJJJ-MM-TT eingeben."
-#: .\core\validators.py:152
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "Bitte eine gültige Zeit im Format SS:MM eingeben."
-#: .\core\validators.py:156
-#: .\db\models\fields\__init__.py:515
+#: core/validators.py:157 db/models/fields/__init__.py:526
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM eingeben."
+msgstr ""
+"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM "
+"eingeben."
-#: .\core\validators.py:161
-#: .\newforms\fields.py:269
+#: core/validators.py:162 newforms/fields.py:271
msgid "Enter a valid e-mail address."
msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
-#: .\core\validators.py:173
-#: .\core\validators.py:442
-#: .\oldforms\__init__.py:667
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Es wurde keine Datei übermittelt. Eventuell ist das Formular-Encoding falsch."
+msgstr ""
+"Es wurde keine Datei übermittelt. Eventuell ist das Formular-Encoding falsch."
-#: .\core\validators.py:177
-msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
-msgstr "Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild, oder ist defekt."
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild, oder ist "
+"defekt."
-#: .\core\validators.py:184
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "Die URL %s zeigt nicht auf ein gültiges Bild."
-#: .\core\validators.py:188
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr "Telefonnummern müssen das Format XXX-XXX-XXXX haben. \"%s\" ist ungültig."
+msgstr ""
+"Telefonnummern müssen das Format XXX-XXX-XXXX haben. \"%s\" ist ungültig."
-#: .\core\validators.py:196
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "Die URL %s zeigt nicht auf ein gültiges QuickTime-Video."
-#: .\core\validators.py:200
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr "Eine gültige URL wird hier verlangt."
-#: .\core\validators.py:214
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -1683,543 +2207,604 @@ msgstr ""
"Bitte gültiges HTML eingeben. Fehler sind:\n"
"%s"
-#: .\core\validators.py:221
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "Ungültiges XML: %s"
-#: .\core\validators.py:238
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "Ungültige URL: %s"
-#: .\core\validators.py:243
-#: .\core\validators.py:245
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "Die URL %s funktioniert nicht."
-#: .\core\validators.py:251
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr "Bitte eine gültige Abkürzung für einen US-Staat eingeben."
-#: .\core\validators.py:265
+#: core/validators.py:266
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
msgstr[0] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!"
msgstr[1] "Keine Schimpfworte! Die Wörter %s sind hier nicht gern gesehen!"
-#: .\core\validators.py:272
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "Dieses Feld muss zum Feld '%s' passen."
-#: .\core\validators.py:291
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "Bitte mindestens eines der Felder ausfüllen."
-#: .\core\validators.py:300
-#: .\core\validators.py:311
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "Bitte entweder beide Felder ausfüllen, oder beide leer lassen."
-#: .\core\validators.py:318
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
-#: .\core\validators.py:330
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
-#: .\core\validators.py:349
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "Doppelte Werte sind hier nicht erlaubt."
-#: .\core\validators.py:364
+#: core/validators.py:367
#, python-format
-msgid "This value must be between %s and %s."
-msgstr "Dieser Wert muss zwischen %s und %s sein."
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Dieser Wert muss zwischen %(lower)s und %(upper)s sein."
-#: .\core\validators.py:366
+#: core/validators.py:369
#, python-format
msgid "This value must be at least %s."
msgstr "Dieser Wert muss mindestens %s sein."
-#: .\core\validators.py:368
+#: core/validators.py:371
#, python-format
msgid "This value must be no more than %s."
msgstr "Dieser Wert darf maximal %s sein."
-#: .\core\validators.py:404
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr "Dieser Wert muss eine Potenz von %s sein."
-#: .\core\validators.py:415
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "Bitte eine gültige Dezimalzahl eingeben."
-#: .\core\validators.py:419
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
-#: .\core\validators.py:422
+#: core/validators.py:425
#, python-format
-msgid "Please enter a valid decimal number with a whole part of at most %s digit."
-msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
-msgstr[0] "Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffer eingeben."
-msgstr[1] "Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffern eingeben."
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffer "
+"eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffern "
+"eingeben."
-#: .\core\validators.py:425
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
-msgid_plural "Please enter a valid decimal number with at most %s decimal places."
-msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
-msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
-#: .\core\validators.py:435
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Bitte sicherstellen, dass die hochgeladene Datei mindestens %s Bytes groß ist."
+msgstr ""
+"Bitte sicherstellen, dass die hochgeladene Datei mindestens %s Bytes groß "
+"ist."
-#: .\core\validators.py:436
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Bitte sicherstellen, dass die hochgeladene Datei maximal %s Bytes groß ist."
+msgstr ""
+"Bitte sicherstellen, dass die hochgeladene Datei maximal %s Bytes groß ist."
-#: .\core\validators.py:453
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "Das Format für dieses Feld ist falsch."
-#: .\core\validators.py:468
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "Dieses Feld ist ungültig."
-#: .\core\validators.py:504
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Konnte nichts von %s empfangen."
-#: .\core\validators.py:507
+#: core/validators.py:510
#, python-format
-msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'."
-#: .\core\validators.py:540
+#: core/validators.py:543
#, python-format
-msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
-msgstr "Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile "
+"beginnt mit \"%(start)s\"."
-#: .\core\validators.py:544
+#: core/validators.py:547
#, python-format
-msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
-msgstr "In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile "
+"beginnt mit \"%(start)s\"."
-#: .\core\validators.py:549
+#: core/validators.py:552
#, python-format
-msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
-msgstr "Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit "
+"\"%(start)s\"."
-#: .\core\validators.py:554
+#: core/validators.py:557
#, python-format
-msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
-msgstr "<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s"
+"\"."
-#: .\core\validators.py:558
+#: core/validators.py:561
#, python-format
-msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
-msgstr "Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die "
+"Zeile beginnt mit \"%(start)s\"."
-#: .\core\validators.py:563
+#: core/validators.py:566
#, python-format
-msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
-msgstr "Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile beginnt mit \"%(start)s\"."
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile "
+"beginnt mit \"%(start)s\"."
-#: .\db\models\manipulators.py:305
+#: db/models/manipulators.py:307
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)s'."
-
-#: .\db\models\fields\related.py:53
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Bitte ein gültiges '%s' eingeben."
-
-#: .\db\models\fields\related.py:642
-msgid "Separate multiple IDs with commas."
-msgstr "Mehrere IDs können mit Komma getrennt werden."
-
-#: .\db\models\fields\related.py:644
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command\", beim Klicken gedrückt halten."
-
-#: .\db\models\fields\related.py:691
-#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] "Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
-msgstr[1] "Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+msgstr ""
+"Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)"
+"s'."
-#: .\db\models\fields\__init__.py:42
+#: db/models/fields/__init__.py:42
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "Ein '%(optname)s' mit diesem '%(fieldname)s' existiert bereits."
-#: .\db\models\fields\__init__.py:116
-#: .\db\models\fields\__init__.py:267
-#: .\db\models\fields\__init__.py:599
-#: .\db\models\fields\__init__.py:610
-#: .\newforms\fields.py:78
-#: .\newforms\fields.py:373
-#: .\newforms\fields.py:449
-#: .\newforms\fields.py:460
-#: .\oldforms\__init__.py:352
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463 newforms/models.py:178 oldforms/__init__.py:357
msgid "This field is required."
msgstr "Dieses Feld ist zwingend erforderlich."
-#: .\db\models\fields\__init__.py:360
+#: db/models/fields/__init__.py:367
msgid "This value must be an integer."
msgstr "Dieser Wert muss eine Ganzzahl sein."
-#: .\db\models\fields\__init__.py:395
+#: db/models/fields/__init__.py:402
msgid "This value must be either True or False."
msgstr "Dieser Wert muss wahr oder falsch sein."
-#: .\db\models\fields\__init__.py:416
+#: db/models/fields/__init__.py:423
msgid "This field cannot be null."
msgstr "Dieses Feld darf nicht leer sein."
-#: .\db\models\fields\__init__.py:619
+#: db/models/fields/__init__.py:630
msgid "Enter a valid filename."
msgstr "Bitte einen gültigen Dateinamen eingeben."
-#: .\newforms\fields.py:101
-#: .\newforms\fields.py:254
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "Dieser Wert muss None, True oder False sein."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Bitte ein gültiges '%s' eingeben."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Mehrere IDs können mit Komma getrennt werden."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command"
+"\", beim Klicken gedrückt halten."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
+msgstr[1] ""
+"Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+
+#: newforms/fields.py:103 newforms/fields.py:256
#, python-format
msgid "Ensure this value has at most %d characters."
msgstr "Bitte sicherstellen, dass der Text maximal %d Zeichen hat."
-#: .\newforms\fields.py:103
-#: .\newforms\fields.py:256
+#: newforms/fields.py:105 newforms/fields.py:258
#, python-format
msgid "Ensure this value has at least %d characters."
msgstr "Bitte sicherstellen, dass der Text wenigstens %d Zeichen hat."
-#: .\newforms\fields.py:128
+#: newforms/fields.py:130
#, python-format
msgid "Ensure this value is less than or equal to %s."
msgstr "Dieser Wert darf maximal %s sein."
-#: .\newforms\fields.py:130
+#: newforms/fields.py:132
#, python-format
msgid "Ensure this value is greater than or equal to %s."
msgstr "Dieser Wert muss größer oder gleich %s sein."
-#: .\newforms\fields.py:163
+#: newforms/fields.py:165
msgid "Enter a valid date."
msgstr "Bitte ein gültiges Datum eingeben."
-#: .\newforms\fields.py:190
+#: newforms/fields.py:192
msgid "Enter a valid time."
msgstr "Bitte eine gültige Uhrzeit eingeben."
-#: .\newforms\fields.py:226
+#: newforms/fields.py:228
msgid "Enter a valid date/time."
msgstr "Bitte gültiges Datum und Uhrzeit eingeben."
-#: .\newforms\fields.py:240
+#: newforms/fields.py:242
msgid "Enter a valid value."
msgstr "Bitte einen gültigen Wert eingeben."
-#: .\newforms\fields.py:287
-#: .\newforms\fields.py:309
+#: newforms/fields.py:289 newforms/fields.py:311
msgid "Enter a valid URL."
msgstr "Bitte eine gültige Adresse eingeben."
-#: .\newforms\fields.py:311
+#: newforms/fields.py:313
msgid "This URL appears to be a broken link."
msgstr "Diese Adresse scheint nicht gültig zu sein."
-#: .\newforms\fields.py:359
-#: .\newforms\fields.py:386
-#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
-msgstr "Bitte eine gültige Auswahl treffen. %s ist keine gültige Auswahl."
+#: newforms/fields.py:362 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen."
-#: .\newforms\fields.py:377
-#: .\newforms\fields.py:453
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
msgid "Enter a list of values."
msgstr "Eine Liste mit Werten eingeben."
-#: .\oldforms\__init__.py:387
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen. %s ist keine gültige Auswahl."
+
+#: oldforms/__init__.py:392
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
msgstr[1] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
-#: .\oldforms\__init__.py:392
+#: oldforms/__init__.py:397
msgid "Line breaks are not allowed here."
msgstr "Zeilenumbrüche sind hier nicht erlaubt."
-#: .\oldforms\__init__.py:493
-#: .\oldforms\__init__.py:566
-#: .\oldforms\__init__.py:605
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
+msgstr ""
+"Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
-#: .\oldforms\__init__.py:669
+#: oldforms/__init__.py:674
msgid "The submitted file is empty."
msgstr "Die ausgewählte Datei ist leer."
-#: .\oldforms\__init__.py:725
+#: oldforms/__init__.py:730
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Bitte eine Ganzzahl zwischen -32.768 und 32.767 eingeben."
-#: .\oldforms\__init__.py:735
+#: oldforms/__init__.py:740
msgid "Enter a positive number."
msgstr "Bitte eine ganze, positive Zahl eingeben."
-#: .\oldforms\__init__.py:745
+#: oldforms/__init__.py:750
msgid "Enter a whole number between 0 and 32,767."
msgstr "Bitte eine ganze Zahl zwischen 0 und 32.767 eingeben."
-#: .\template\defaultfilters.py:419
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
msgstr "Ja,Nein,Vielleicht"
-#: .\utils\dates.py:6
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "nachm."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "vorm."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "nachm."
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "vorm."
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "Mitternacht"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "Mittag"
+
+#: utils/dates.py:6
msgid "Monday"
msgstr "Montag"
-#: .\utils\dates.py:6
+#: utils/dates.py:6
msgid "Tuesday"
msgstr "Dienstag"
-#: .\utils\dates.py:6
+#: utils/dates.py:6
msgid "Wednesday"
msgstr "Mittwoch"
-#: .\utils\dates.py:6
+#: utils/dates.py:6
msgid "Thursday"
msgstr "Donnerstag"
-#: .\utils\dates.py:6
+#: utils/dates.py:6
msgid "Friday"
msgstr "Freitag"
-#: .\utils\dates.py:7
+#: utils/dates.py:7
msgid "Saturday"
msgstr "Samstag"
-#: .\utils\dates.py:7
+#: utils/dates.py:7
msgid "Sunday"
msgstr "Sonntag"
-#: .\utils\dates.py:14
+#: utils/dates.py:14
msgid "January"
msgstr "Januar"
-#: .\utils\dates.py:14
+#: utils/dates.py:14
msgid "February"
msgstr "Februar"
-#: .\utils\dates.py:14
-#: .\utils\dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "March"
msgstr "März"
-#: .\utils\dates.py:14
-#: .\utils\dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "April"
msgstr "April"
-#: .\utils\dates.py:14
-#: .\utils\dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "May"
msgstr "Mai"
-#: .\utils\dates.py:14
-#: .\utils\dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "June"
msgstr "Juni"
-#: .\utils\dates.py:15
-#: .\utils\dates.py:27
+#: utils/dates.py:15 utils/dates.py:27
msgid "July"
msgstr "Juli"
-#: .\utils\dates.py:15
+#: utils/dates.py:15
msgid "August"
msgstr "August"
-#: .\utils\dates.py:15
+#: utils/dates.py:15
msgid "September"
msgstr "September"
-#: .\utils\dates.py:15
+#: utils/dates.py:15
msgid "October"
msgstr "Oktober"
-#: .\utils\dates.py:15
+#: utils/dates.py:15
msgid "November"
msgstr "November"
-#: .\utils\dates.py:16
+#: utils/dates.py:16
msgid "December"
msgstr "Dezember"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "jan"
msgstr "Jan"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "feb"
msgstr "Feb"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "mar"
msgstr "Mär"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "apr"
msgstr "Apr"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "may"
msgstr "Mai"
-#: .\utils\dates.py:19
+#: utils/dates.py:19
msgid "jun"
msgstr "Jun"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "jul"
msgstr "Jul"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "aug"
msgstr "Aug"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "sep"
msgstr "Sep"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "oct"
msgstr "Okt"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "nov"
msgstr "Nov"
-#: .\utils\dates.py:20
+#: utils/dates.py:20
msgid "dec"
msgstr "Dez"
-#: .\utils\dates.py:27
+#: utils/dates.py:27
msgid "Jan."
msgstr "Jan."
-#: .\utils\dates.py:27
+#: utils/dates.py:27
msgid "Feb."
msgstr "Feb."
-#: .\utils\dates.py:28
+#: utils/dates.py:28
msgid "Aug."
msgstr "Aug."
-#: .\utils\dates.py:28
+#: utils/dates.py:28
msgid "Sept."
msgstr "Sept."
-#: .\utils\dates.py:28
+#: utils/dates.py:28
msgid "Oct."
msgstr "Okt."
-#: .\utils\dates.py:28
+#: utils/dates.py:28
msgid "Nov."
msgstr "Nov."
-#: .\utils\dates.py:28
+#: utils/dates.py:28
msgid "Dec."
msgstr "Dez."
-#: .\utils\timesince.py:12
+#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
msgstr[0] "Jahr"
msgstr[1] "Jahre"
-#: .\utils\timesince.py:13
+#: utils/timesince.py:13
msgid "month"
msgid_plural "months"
msgstr[0] "Monat"
msgstr[1] "Monate"
-#: .\utils\timesince.py:14
+#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
msgstr[0] "Woche"
msgstr[1] "Wochen"
-#: .\utils\timesince.py:15
+#: utils/timesince.py:15
msgid "day"
msgid_plural "days"
msgstr[0] "Tag"
msgstr[1] "Tage"
-#: .\utils\timesince.py:16
+#: utils/timesince.py:16
msgid "hour"
msgid_plural "hours"
msgstr[0] "Stunde"
msgstr[1] "Stunden"
-#: .\utils\timesince.py:17
+#: utils/timesince.py:17
msgid "minute"
msgid_plural "minutes"
msgstr[0] "Minute"
msgstr[1] "Minuten"
-#: .\utils\translation\trans_real.py:362
+#: utils/translation/trans_real.py:358
msgid "DATE_FORMAT"
msgstr "j. N Y"
-#: .\utils\translation\trans_real.py:363
+#: utils/translation/trans_real.py:359
msgid "DATETIME_FORMAT"
msgstr "j. N Y, H:i"
-#: .\utils\translation\trans_real.py:364
+#: utils/translation/trans_real.py:360
msgid "TIME_FORMAT"
msgstr "H:i"
-#: .\utils\translation\trans_real.py:380
+#: utils/translation/trans_real.py:376
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: .\utils\translation\trans_real.py:381
+#: utils/translation/trans_real.py:377
msgid "MONTH_DAY_FORMAT"
msgstr "j. F"
-#: .\views\generic\create_update.py:43
+#: views/generic/create_update.py:43
#, python-format
msgid "The %(verbose_name)s was created successfully."
msgstr "%(verbose_name)s wurde erfolgreich angelegt."
-#: .\views\generic\create_update.py:117
+#: views/generic/create_update.py:117
#, python-format
msgid "The %(verbose_name)s was updated successfully."
msgstr "%(verbose_name)s wurde erfolgreich aktualisiert."
-#: .\views\generic\create_update.py:184
+#: views/generic/create_update.py:184
#, python-format
msgid "The %(verbose_name)s was deleted."
msgstr "%(verbose_name)s wurde gelöscht"
-
diff --git a/django/conf/urls/defaults.py b/django/conf/urls/defaults.py
index 13a74331d6..1e87ea708a 100644
--- a/django/conf/urls/defaults.py
+++ b/django/conf/urls/defaults.py
@@ -22,5 +22,7 @@ def url(regex, view, kwargs=None, name=None, prefix=''):
# For include(...) processing.
return RegexURLResolver(regex, view[0], kwargs)
else:
- return RegexURLPattern(regex, prefix and (prefix + '.' + view) or view, kwargs, name)
+ if prefix and isinstance(view, basestring):
+ view = prefix + '.' + view
+ return RegexURLPattern(regex, view, kwargs, name)
diff --git a/django/contrib/localflavor/ch/__init__.py b/django/contrib/localflavor/ch/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/ch/__init__.py
diff --git a/django/contrib/localflavor/ch/ch_states.py b/django/contrib/localflavor/ch/ch_states.py
new file mode 100644
index 0000000000..e9bbcc6268
--- /dev/null
+++ b/django/contrib/localflavor/ch/ch_states.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import gettext_lazy as _
+
+STATE_CHOICES = (
+ ('AG', _('Aargau')),
+ ('AI', _('Appenzell Innerrhoden')),
+ ('AR', _('Appenzell Ausserrhoden')),
+ ('BS', _('Basel-Stadt')),
+ ('BL', _('Basel-Land')),
+ ('BE', _('Berne')),
+ ('FR', _('Fribourg')),
+ ('GE', _('Geneva')),
+ ('GL', _('Glarus')),
+ ('GR', _('Graubuenden')),
+ ('JU', _('Jura')),
+ ('LU', _('Lucerne')),
+ ('NE', _('Neuchatel')),
+ ('NW', _('Nidwalden')),
+ ('OW', _('Obwalden')),
+ ('SH', _('Schaffhausen')),
+ ('SZ', _('Schwyz')),
+ ('SO', _('Solothurn')),
+ ('SG', _('St. Gallen')),
+ ('TG', _('Thurgau')),
+ ('TI', _('Ticino')),
+ ('UR', _('Uri')),
+ ('VS', _('Valais')),
+ ('VD', _('Vaud')),
+ ('ZG', _('Zug')),
+ ('ZH', _('Zurich'))
+)
diff --git a/django/contrib/localflavor/ch/forms.py b/django/contrib/localflavor/ch/forms.py
new file mode 100644
index 0000000000..51e52dc0e9
--- /dev/null
+++ b/django/contrib/localflavor/ch/forms.py
@@ -0,0 +1,109 @@
+"""
+Swiss-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+id_re = re.compile(r"^(?P<idnumber>\w{8})(?P<pos9>(\d{1}|<))(?P<checksum>\d{1})$")
+phone_digits_re = re.compile(r'^0([1-9]{1})\d{8}$')
+
+class CHZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(CHZipCodeField, self).__init__(r'^\d{4}$',
+ max_length=None, min_length=None,
+ error_message=gettext('Enter a zip code in the format XXXX.'),
+ *args, **kwargs)
+
+class CHPhoneNumberField(Field):
+ """
+ Validate local Swiss phone number (not international ones)
+ The correct format is '0XX XXX XX XX'.
+ '0XX.XXX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
+ '0XX XXX XX XX'.
+ """
+ def clean(self, value):
+ super(CHPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
+ m = phone_digits_re.search(value)
+ if m:
+ return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10])
+ raise ValidationError('Phone numbers must be in 0XX XXX XX XX format.')
+
+class CHStateSelect(Select):
+ """
+ A Select widget that uses a list of CH states as its choices.
+ """
+ def __init__(self, attrs=None):
+ from ch_states import STATE_CHOICES # relative import
+ super(CHStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class CHIdentityCardNumberField(Field):
+ """
+ A Swiss identity card number.
+
+ Checks the following rules to determine whether the number is valid:
+
+ * Conforms to the X1234567<0 or 1234567890 format.
+ * Included checksums match calculated checksums
+
+ Algorithm is documented at http://adi.kousz.ch/artikel/IDCHE.htm
+ """
+ def has_valid_checksum(self, number):
+ given_number, given_checksum = number[:-1], number[-1]
+ new_number = given_number
+ calculated_checksum = 0
+ fragment = ""
+ parameter = 7
+
+ first = str(number[:1])
+ if first.isalpha():
+ num = ord(first.upper()) - 65
+ if num < 0 or num > 8:
+ return False
+ new_number = str(num) + new_number[1:]
+ new_number = new_number[:8] + '0'
+
+ if not new_number.isdigit():
+ return False
+
+ for i in range(len(new_number)):
+ fragment = int(new_number[i])*parameter
+ calculated_checksum += fragment
+
+ if parameter == 1:
+ parameter = 7
+ elif parameter == 3:
+ parameter = 1
+ elif parameter ==7:
+ parameter = 3
+
+ return str(calculated_checksum)[-1] == given_checksum
+
+ def clean(self, value):
+ super(CHIdentityCardNumberField, self).clean(value)
+ error_msg = gettext('Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.')
+ if value in EMPTY_VALUES:
+ return u''
+
+ match = re.match(id_re, value)
+ if not match:
+ raise ValidationError(error_msg)
+
+ idnumber, pos9, checksum = match.groupdict()['idnumber'], match.groupdict()['pos9'], match.groupdict()['checksum']
+
+ if idnumber == '00000000' or \
+ idnumber == 'A0000000':
+ raise ValidationError(error_msg)
+
+ all_digits = "%s%s%s" % (idnumber, pos9, checksum)
+ if not self.has_valid_checksum(all_digits):
+ raise ValidationError(error_msg)
+
+ return u'%s%s%s' % (idnumber, pos9, checksum)
+
diff --git a/django/core/mail.py b/django/core/mail.py
index e7dcfb4132..8661d84287 100644
--- a/django/core/mail.py
+++ b/django/core/mail.py
@@ -1,14 +1,22 @@
-# Use this module for e-mailing.
+"""
+Tools for sending email.
+"""
from django.conf import settings
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
+from email import Charset
+import os
import smtplib
import socket
import time
import random
+# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from
+# some spam filters.
+Charset.add_charset('utf-8', Charset.SHORTEST, Charset.QP, 'utf-8')
+
# Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of
# seconds, which slows down the restart of the server.
class CachedDnsName(object):
@@ -22,6 +30,28 @@ class CachedDnsName(object):
DNS_NAME = CachedDnsName()
+# Copied from Python standard library and modified to used the cached hostname
+# for performance.
+def make_msgid(idstring=None):
+ """Returns a string suitable for RFC 2822 compliant Message-ID, e.g:
+
+ <20020201195627.33539.96671@nightshade.la.mastaler.com>
+
+ Optional idstring if given is a string used to strengthen the
+ uniqueness of the message id.
+ """
+ timeval = time.time()
+ utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval))
+ pid = os.getpid()
+ randint = random.randrange(100000)
+ if idstring is None:
+ idstring = ''
+ else:
+ idstring = '.' + idstring
+ idhost = DNS_NAME
+ msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost)
+ return msgid
+
class BadHeaderError(ValueError):
pass
@@ -34,6 +64,131 @@ class SafeMIMEText(MIMEText):
val = Header(val, settings.DEFAULT_CHARSET)
MIMEText.__setitem__(self, name, val)
+class SMTPConnection(object):
+ """
+ A wrapper that manages the SMTP network connection.
+ """
+
+ def __init__(self, host=None, port=None, username=None, password=None,
+ use_tls=None, fail_silently=False):
+ self.host = host or settings.EMAIL_HOST
+ self.port = port or settings.EMAIL_PORT
+ self.username = username or settings.EMAIL_HOST_USER
+ self.password = password or settings.EMAIL_HOST_PASSWORD
+ self.use_tls = (use_tls is not None) and use_tls or settings.EMAIL_USE_TLS
+ self.fail_silently = fail_silently
+ self.connection = None
+
+ def open(self):
+ """
+ Ensure we have a connection to the email server. Returns whether or not
+ a new connection was required.
+ """
+ if self.connection:
+ # Nothing to do if the connection is already open.
+ return False
+ try:
+ self.connection = smtplib.SMTP(self.host, self.port)
+ if self.use_tls:
+ self.connection.ehlo()
+ self.connection.starttls()
+ self.connection.ehlo()
+ if self.username and self.password:
+ self.connection.login(self.username, self.password)
+ return True
+ except:
+ if not self.fail_silently:
+ raise
+
+ def close(self):
+ """Close the connection to the email server."""
+ try:
+ try:
+ self.connection.quit()
+ except socket.sslerror:
+ # This happens when calling quit() on a TLS connection
+ # sometimes.
+ self.connection.close()
+ except:
+ if self.fail_silently:
+ return
+ raise
+ finally:
+ self.connection = None
+
+ def send_messages(self, email_messages):
+ """
+ Send one or more EmailMessage objects and return the number of email
+ messages sent.
+ """
+ if not email_messages:
+ return
+ new_conn_created = self.open()
+ if not self.connection:
+ # We failed silently on open(). Trying to send would be pointless.
+ return
+ num_sent = 0
+ for message in email_messages:
+ sent = self._send(message)
+ if sent:
+ num_sent += 1
+ if new_conn_created:
+ self.close()
+ return num_sent
+
+ def _send(self, email_message):
+ """A helper method that does the actual sending."""
+ if not email_message.to:
+ return False
+ try:
+ self.connection.sendmail(email_message.from_email,
+ email_message.recipients(),
+ email_message.message().as_string())
+ except:
+ if not self.fail_silently:
+ raise
+ return False
+ return True
+
+class EmailMessage(object):
+ """
+ A container for email information.
+ """
+ def __init__(self, subject='', body='', from_email=None, to=None, bcc=None, connection=None):
+ self.to = to or []
+ self.bcc = bcc or []
+ self.from_email = from_email or settings.DEFAULT_FROM_EMAIL
+ self.subject = subject
+ self.body = body
+ self.connection = connection
+
+ def get_connection(self, fail_silently=False):
+ if not self.connection:
+ self.connection = SMTPConnection(fail_silently=fail_silently)
+ return self.connection
+
+ def message(self):
+ msg = SafeMIMEText(self.body, 'plain', settings.DEFAULT_CHARSET)
+ msg['Subject'] = self.subject
+ msg['From'] = self.from_email
+ msg['To'] = ', '.join(self.to)
+ msg['Date'] = formatdate()
+ msg['Message-ID'] = make_msgid()
+ if self.bcc:
+ msg['Bcc'] = ', '.join(self.bcc)
+ return msg
+
+ def recipients(self):
+ """
+ Returns a list of all recipients of the email (includes direct
+ addressees as well as Bcc entries).
+ """
+ return self.to + self.bcc
+
+ def send(self, fail_silently=False):
+ """Send the email message."""
+ return self.get_connection(fail_silently).send_messages([self])
+
def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None):
"""
Easy wrapper for sending a single message to a recipient list. All members
@@ -41,8 +196,13 @@ def send_mail(subject, message, from_email, recipient_list, fail_silently=False,
If auth_user is None, the EMAIL_HOST_USER setting is used.
If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+ NOTE: This method is deprecated. It exists for backwards compatibility.
+ New code should use the EmailMessage class directly.
"""
- return send_mass_mail([[subject, message, from_email, recipient_list]], fail_silently, auth_user, auth_password)
+ connection = SMTPConnection(username=auth_user, password=auth_password,
+ fail_silently=fail_silently)
+ return EmailMessage(subject, message, from_email, recipient_list, connection=connection).send()
def send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None):
"""
@@ -53,52 +213,24 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password
If auth_user and auth_password are set, they're used to log in.
If auth_user is None, the EMAIL_HOST_USER setting is used.
If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+ NOTE: This method is deprecated. It exists for backwards compatibility.
+ New code should use the EmailMessage class directly.
"""
- if auth_user is None:
- auth_user = settings.EMAIL_HOST_USER
- if auth_password is None:
- auth_password = settings.EMAIL_HOST_PASSWORD
- try:
- server = smtplib.SMTP(settings.EMAIL_HOST, settings.EMAIL_PORT)
- if auth_user and auth_password:
- server.login(auth_user, auth_password)
- except:
- if fail_silently:
- return
- raise
- num_sent = 0
- for subject, message, from_email, recipient_list in datatuple:
- if not recipient_list:
- continue
- from_email = from_email or settings.DEFAULT_FROM_EMAIL
- msg = SafeMIMEText(message, 'plain', settings.DEFAULT_CHARSET)
- msg['Subject'] = subject
- msg['From'] = from_email
- msg['To'] = ', '.join(recipient_list)
- msg['Date'] = formatdate()
- try:
- random_bits = str(random.getrandbits(64))
- except AttributeError: # Python 2.3 doesn't have random.getrandbits().
- random_bits = ''.join([random.choice('1234567890') for i in range(19)])
- msg['Message-ID'] = "<%d.%s@%s>" % (time.time(), random_bits, DNS_NAME)
- try:
- server.sendmail(from_email, recipient_list, msg.as_string())
- num_sent += 1
- except:
- if not fail_silently:
- raise
- try:
- server.quit()
- except:
- if fail_silently:
- return
- raise
- return num_sent
+ connection = SMTPConnection(username=auth_user, password=auth_password,
+ fail_silently=fail_silently)
+ messages = [EmailMessage(subject, message, sender, recipient) for subject, message, sender, recipient in datatuple]
+ return connection.send_messages(messages)
def mail_admins(subject, message, fail_silently=False):
"Sends a message to the admins, as defined by the ADMINS setting."
- send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS], fail_silently)
+ EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+ settings.SERVER_EMAIL, [a[1] for a in
+ settings.ADMINS]).send(fail_silently=fail_silently)
def mail_managers(subject, message, fail_silently=False):
"Sends a message to the managers, as defined by the MANAGERS setting."
- send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS], fail_silently)
+ EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+ settings.SERVER_EMAIL, [a[1] for a in
+ settings.MANAGERS]).send(fail_silently=fail_silently)
+
diff --git a/django/core/management.py b/django/core/management.py
index 85592553e6..9f44a0fe27 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -539,6 +539,7 @@ def syncdb(verbosity=1, interactive=True):
# Install custom SQL for the app (but only if this
# is a model we've just created)
for app in models.get_apps():
+ app_name = app.__name__.split('.')[-2]
for model in models.get_models(app):
if model in created_models:
custom_sql = get_custom_sql_for_model(model)
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 77cac7745c..350ffc99f5 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -869,6 +869,12 @@ class USStateField(Field):
def get_manipulator_field_objs(self):
return [oldforms.USStateField]
+ def formfield(self, **kwargs):
+ from django.contrib.localflavor.us.forms import USStateSelect
+ defaults = {'widget': USStateSelect}
+ defaults.update(kwargs)
+ return super(USStateField, self).formfield(**defaults)
+
class XMLField(TextField):
def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
self.schema_path = schema_path
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 91f54e48b9..06163677d4 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -853,6 +853,13 @@ def find_field(name, field_list, related_query):
return None
return matches[0]
+def field_choices(field_list, related_query):
+ if related_query:
+ choices = [f.field.related_query_name() for f in field_list]
+ else:
+ choices = [f.name for f in field_list]
+ return choices
+
def lookup_inner(path, lookup_type, value, opts, table, column):
qn = backend.quote_name
joins, where, params = SortedDict(), [], []
@@ -937,7 +944,11 @@ def lookup_inner(path, lookup_type, value, opts, table, column):
except FieldFound: # Match found, loop has been shortcut.
pass
else: # No match found.
- raise TypeError, "Cannot resolve keyword '%s' into field" % name
+ choices = field_choices(current_opts.many_to_many, False) + \
+ field_choices(current_opts.get_all_related_many_to_many_objects(), True) + \
+ field_choices(current_opts.get_all_related_objects(), True) + \
+ field_choices(current_opts.fields, False)
+ raise TypeError, "Cannot resolve keyword '%s' into field, choices are: %s" % (name, ", ".join(choices))
# Check whether an intermediate join is required between current_table
# and new_table.
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 2bfb9a733a..efe392590f 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -1,8 +1,10 @@
import re, doctest, unittest
+from urlparse import urlparse
from django.db import transaction
from django.core import management
from django.db.models import get_apps
-
+from django.test.client import Client
+
normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
class OutputChecker(doctest.OutputChecker):
@@ -46,5 +48,33 @@ class TestCase(unittest.TestCase):
super().
"""
+ self.client = Client()
self.install_fixtures()
super(TestCase, self).run(result)
+
+ def assertRedirects(self, response, expected_path):
+ """Assert that a response redirected to a specific URL, and that the
+ redirect URL can be loaded.
+
+ """
+ self.assertEqual(response.status_code, 302,
+ "Response didn't redirect: Reponse code was %d" % response.status_code)
+ scheme, netloc, path, params, query, fragment = urlparse(response['Location'])
+ self.assertEqual(path, expected_path,
+ "Response redirected to '%s', expected '%s'" % (path, expected_path))
+ redirect_response = self.client.get(path)
+ self.assertEqual(redirect_response.status_code, 200,
+ "Couldn't retrieve redirection page '%s'" % path)
+
+ def assertContains(self, response, text, count=1):
+ """Assert that a response indicates that a page was retreived successfully,
+ (i.e., the HTTP status code was 200), and that ``text`` occurs ``count``
+ times in the content of the response.
+
+ """
+ self.assertEqual(response.status_code, 200,
+ "Couldn't retrieve page'")
+ real_count = response.content.count(text)
+ self.assertEqual(real_count, count,
+ "Could only find %d of %d instances of '%s' in response" % (real_count, count, text))
+ \ No newline at end of file
diff --git a/docs/documentation.txt b/docs/documentation.txt
index e72dd47ba1..decb066fa1 100644
--- a/docs/documentation.txt
+++ b/docs/documentation.txt
@@ -94,12 +94,10 @@ Formatting
The text documentation is written in ReST (ReStructured Text) format. That
means it's easy to read but is also formatted in a way that makes it easy to
-convert into other formats, such as HTML. If you're interested, the script that
-converts the ReST text docs into djangoproject.com's HTML lives at
-`djangoproject.com/django_website/apps/docs/parts/build_documentation.py`_ in
-the Django Subversion repository.
+convert into other formats, such as HTML. If you have the `reStructuredText`_
+library installed, you can use ``rst2html`` to generate your own HTML files.
-.. _djangoproject.com/django_website/apps/docs/parts/build_documentation.py: http://code.djangoproject.com/browser/djangoproject.com/django_website/apps/docs/parts/build_documentation.py
+.. _reStructuredText: http://docutils.sourceforge.net/rst.html
Differences between versions
============================
diff --git a/docs/email.txt b/docs/email.txt
index 8ebdaa8136..2793ee8ae3 100644
--- a/docs/email.txt
+++ b/docs/email.txt
@@ -22,7 +22,8 @@ In two lines::
Mail will be sent using the SMTP host and port specified in the `EMAIL_HOST`_
and `EMAIL_PORT`_ settings. The `EMAIL_HOST_USER`_ and `EMAIL_HOST_PASSWORD`_
-settings, if set, will be used to authenticate to the SMTP server.
+settings, if set, will be used to authenticate to the SMTP server and the
+`EMAIL_USE_TLS`_ settings will control whether a secure connection is used.
.. note::
@@ -34,6 +35,7 @@ settings, if set, will be used to authenticate to the SMTP server.
.. _EMAIL_PORT: ../settings/#email-port
.. _EMAIL_HOST_USER: ../settings/#email-host-user
.. _EMAIL_HOST_PASSWORD: ../settings/#email-host-password
+.. _EMAIL_USE_TLS: ../settings/#email-use-tls
send_mail()
@@ -183,3 +185,65 @@ from the request's POST data, sends that to admin@example.com and redirects to
return HttpResponse('Make sure all fields are entered and valid.')
.. _Header injection: http://securephp.damonkohler.com/index.php/Email_Injection
+
+The EmailMessage and SMTPConnection classes
+===========================================
+
+**New in Django development version**
+
+Django's ``send_mail()`` and ``send_mass_mail()`` functions are actually thin
+wrappers that make use of the ``EmailMessage`` and ``SMTPConnection`` classes
+in ``django.mail``. If you ever need to customize the way Django sends email,
+you can subclass these two classes to suit your needs.
+
+.. note::
+ Not all features of the ``EmailMessage`` class are available through the
+ ``send_mail()`` and related wrapper functions. If you wish to use advanced
+ features such as including BCC recipients or multi-part email, you will
+ need to create ``EmailMessage`` instances directly.
+
+In general, ``EmailMessage`` is responsible for creating the email message
+itself. ``SMTPConnection`` is responsible for the network connection side of
+the operation. This means you can reuse the same connection (an
+``SMTPConnection`` instance) for multiple messages.
+
+The ``EmailMessage`` class is initialised as follows::
+
+ email = EmailMessage(subject, body, from_email, to, bcc, connection)
+
+All of these parameters are optional. If ``from_email`` is omitted, the value
+from ``settings.DEFAULT_FROM_EMAIL`` is used. Both the ``to`` and ``bcc``
+parameters are lists of addresses.
+
+The class has the following methods that you can use:
+
+ * ``send()`` sends the message, using either the connection that is specified
+ in the ``connection`` attribute, or creating a new connection if none already
+ exists.
+ * ``message()`` constructs a ``django.core.mail.SafeMIMEText`` object (a
+ sub-class of Python's ``email.MIMEText.MIMEText`` class) holding the
+ message to be sent. If you ever need to extend the `EmailMessage` class,
+ you will probably want to override this method to put the content you wish
+ into the MIME object.
+ * ``recipients()`` returns a lists of all the recipients of the message,
+ whether they are recorded in the ``to`` or ``bcc`` attributes. This is
+ another method you need to possibly override when sub-classing, since the
+ SMTP server needs to be told the full list of recipients when the message
+ is sent. If you add another way to specify recipients in your class, they
+ need to be returned from this method as well.
+
+The ``SMTPConnection`` class is initialized with the host, port, username and
+password for the SMTP server. If you don't specify one or more of those
+options, they are read from your settings file.
+
+If you are sending lots of messages at once, the ``send_messages()`` method of
+the ``SMTPConnection`` class will be useful. It takes a list of ``EmailMessage``
+instances (or sub-classes) and sends them over a single connection. For
+example, if you have a function called ``get_notification_email()`` that returns a
+list of ``EmailMessage`` objects representing some periodic email you wish to
+send out, you could send this with::
+
+ connection = SMTPConnection() # Use default settings for connection
+ messages = get_notification_email()
+ connection.send_messages(messages)
+
diff --git a/docs/sessions.txt b/docs/sessions.txt
index 55fbc2c3da..c7124ba703 100644
--- a/docs/sessions.txt
+++ b/docs/sessions.txt
@@ -107,7 +107,7 @@ posts a comment. It doesn't let a user post a comment more than once::
This simplistic view logs in a "member" of the site::
def login(request):
- m = members.get_object(username__exact=request.POST['username'])
+ m = Member.objects.get(username=request.POST['username'])
if m.password == request.POST['password']:
request.session['member_id'] = m.id
return HttpResponse("You're logged in.")
diff --git a/docs/settings.txt b/docs/settings.txt
index 39179248de..4a62a3ecf0 100644
--- a/docs/settings.txt
+++ b/docs/settings.txt
@@ -428,6 +428,15 @@ Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins
or ``django.core.mail.mail_managers``. You'll probably want to include the
trailing space.
+EMAIL_USE_TLS
+-------------
+
+**New in Django development version**
+
+Default: ``False``
+
+Whether to use a TLS (secure) connection when talking to the SMTP server.
+
FILE_CHARSET
------------
@@ -508,44 +517,17 @@ in standard language format. For example, U.S. English is ``"en-us"``. See the
LANGUAGES
---------
-Default: A tuple of all available languages. Currently, this is::
+Default: A tuple of all available languages. This list is continually growing
+and including a copy here would inevitably become rapidly out of date. You can
+see the current list of translated languages by looking in
+``django/conf/global_settings.py`` (or view the `online source`_).
- LANGUAGES = (
- ('ar', _('Arabic')),
- ('bn', _('Bengali')),
- ('cs', _('Czech')),
- ('cy', _('Welsh')),
- ('da', _('Danish')),
- ('de', _('German')),
- ('el', _('Greek')),
- ('en', _('English')),
- ('es', _('Spanish')),
- ('es_AR', _('Argentinean Spanish')),
- ('fr', _('French')),
- ('gl', _('Galician')),
- ('hu', _('Hungarian')),
- ('he', _('Hebrew')),
- ('is', _('Icelandic')),
- ('it', _('Italian')),
- ('ja', _('Japanese')),
- ('nl', _('Dutch')),
- ('no', _('Norwegian')),
- ('pt-br', _('Brazilian')),
- ('ro', _('Romanian')),
- ('ru', _('Russian')),
- ('sk', _('Slovak')),
- ('sl', _('Slovenian')),
- ('sr', _('Serbian')),
- ('sv', _('Swedish')),
- ('ta', _('Tamil')),
- ('uk', _('Ukrainian')),
- ('zh-cn', _('Simplified Chinese')),
- ('zh-tw', _('Traditional Chinese')),
- )
+.. _online source: http://code.djangoproject.com/browser/django/trunk/django/conf/global_settings.py
-A tuple of two-tuples in the format (language code, language name). This
-specifies which languages are available for language selection. See the
-`internationalization docs`_ for details.
+The list is a tuple of two-tuples in the format (language code, language
+name) -- for example, ``('ja', 'Japanese')``. This specifies which languages
+are available for language selection. See the `internationalization docs`_ for
+details.
Generally, the default value should suffice. Only set this setting if you want
to restrict language selection to a subset of the Django-provided languages.
diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt
index c3b02b5d3f..d9d4f53b88 100644
--- a/docs/syndication_feeds.txt
+++ b/docs/syndication_feeds.txt
@@ -646,15 +646,15 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
def item_enclosure_mime_type(self, item):
"""
Takes an item, as returned by items(), and returns the item's
- enclosure mime type.
+ enclosure MIME type.
"""
def item_enclosure_mime_type(self):
"""
- Returns the enclosure length, in bytes, for every item in the feed.
+ Returns the enclosure MIME type for every item in the feed.
"""
- item_enclosure_mime_type = "audio/mpeg" # Hard-coded enclosure mime-type.
+ item_enclosure_mime_type = "audio/mpeg" # Hard-coded enclosure MIME type.
# ITEM PUBDATE -- It's optional to use one of these three. This is a
# hook that specifies how to get the pubdate for a given item.
diff --git a/docs/templates_python.txt b/docs/templates_python.txt
index 7cc9acede8..1eeede1fe8 100644
--- a/docs/templates_python.txt
+++ b/docs/templates_python.txt
@@ -345,7 +345,7 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
``request.user.get_and_delete_messages()`` for every request. That method
collects the user's messages and deletes them from the database.
- Note that messages are set with ``user.add_message()``. See the
+ Note that messages are set with ``user.message_set.create``. See the
`message docs`_ for more.
* ``perms`` -- An instance of
diff --git a/docs/testing.txt b/docs/testing.txt
index a135734144..5a2579b624 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -166,7 +166,7 @@ To assist in testing various features of your application, Django provides
tools that can be used to establish tests and test conditions.
* `Test Client`_
-* Fixtures_
+* `TestCase`_
Test Client
-----------
@@ -357,9 +357,31 @@ The following is a simple unit test using the Test Client::
# Check that the rendered context contains 5 customers
self.failUnlessEqual(len(response.context['customers']), 5)
-Fixtures
+TestCase
--------
+Normal python unit tests extend a base class of ``unittest.testCase``.
+Django provides an extension of this base class - ``django.test.TestCase``
+- that provides some additional capabilities that can be useful for
+testing web sites.
+
+Moving from a normal unittest TestCase to a Django TestCase is easy - just
+change the base class of your test from ``unittest.TestCase`` to
+``django.test.TestCase``. All of the standard Python unit test facilities
+will continue to be available, but they will be augmented with some useful
+extra facilities.
+
+Default Test Client
+~~~~~~~~~~~~~~~~~~~
+** New in Django development version **
+
+Every test case in a ``django.test.TestCase`` instance has access to an
+instance of a Django `Test Client`_. This Client can be accessed as
+``self.client``. This client is recreated for each test.
+
+Fixture loading
+~~~~~~~~~~~~~~~
+
A test case for a database-backed website isn't much use if there isn't any
data in the database. To make it easy to put test data into the database,
Django provides a fixtures framework.
@@ -376,16 +398,14 @@ multiple applications.
This provides a mechanism to populate a new database with any initial
data (such as a default set of categories). Fixtures with other names
can be installed manually using ``django-admin.py loaddata``.
-
However, for the purposes of unit testing, each test must be able to
guarantee the contents of the database at the start of each and every
-test. To do this, Django provides a TestCase baseclass that can integrate
-with fixtures.
+test.
-Moving from a normal unittest TestCase to a Django TestCase is easy - just
-change the base class of your test, and define a list of fixtures
-to be used. For example, the test case from `Writing unittests`_ would
+To define a fixture for a test, all you need to do is add a class
+attribute to your test describing the fixtures you want the test to use.
+For example, the test case from `Writing unittests`_ would
look like::
from django.test import TestCase
@@ -410,6 +430,24 @@ This flush/load procedure is repeated for each test in the test case, so you
can be certain that the outcome of a test will not be affected by
another test, or the order of test execution.
+Assertions
+~~~~~~~~~~
+** New in Django development version **
+
+Normal Python unit tests have a wide range of assertions, such as
+``assertTrue`` and ``assertEquals`` that can be used to validate behavior.
+``django.TestCase`` adds to these, providing some assertions
+that can be useful in testing the behavior of web sites.
+
+``assertRedirects(response, expected_path)``
+ Assert that the response received redirects the browser to the provided
+ path, and that the expected_path can be retrieved.
+
+``assertContains(response, text, count=1)``
+ Assert that a response indicates that a page was retreived successfully,
+ (i.e., the HTTP status code was 200), and that ``text`` occurs ``count``
+ times in the content of the response.
+
Running tests
=============
diff --git a/tests/modeltests/custom_columns/models.py b/tests/modeltests/custom_columns/models.py
index 382ecc72c6..02a17e0595 100644
--- a/tests/modeltests/custom_columns/models.py
+++ b/tests/modeltests/custom_columns/models.py
@@ -71,7 +71,7 @@ __test__ = {'API_TESTS':"""
>>> Author.objects.filter(firstname__exact='John')
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'firstname' into field
+TypeError: Cannot resolve keyword 'firstname' into field, choices are: article, id, first_name, last_name
>>> a = Author.objects.get(last_name__exact='Smith')
>>> a.first_name
diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py
index 731a840347..740e3ab4bc 100644
--- a/tests/modeltests/lookup/models.py
+++ b/tests/modeltests/lookup/models.py
@@ -223,11 +223,11 @@ DoesNotExist: Article matching query does not exist.
>>> Article.objects.filter(pub_date_year='2005').count()
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'pub_date_year' into field
+TypeError: Cannot resolve keyword 'pub_date_year' into field, choices are: id, headline, pub_date
>>> Article.objects.filter(headline__starts='Article')
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'headline__starts' into field
+TypeError: Cannot resolve keyword 'headline__starts' into field, choices are: id, headline, pub_date
"""}
diff --git a/tests/modeltests/many_to_one/models.py b/tests/modeltests/many_to_one/models.py
index b901f7cadc..985c9f8d6e 100644
--- a/tests/modeltests/many_to_one/models.py
+++ b/tests/modeltests/many_to_one/models.py
@@ -174,13 +174,13 @@ False
>>> Article.objects.filter(reporter_id__exact=1)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'reporter_id' into field
+TypeError: Cannot resolve keyword 'reporter_id' into field, choices are: id, headline, pub_date, reporter
# You need to specify a comparison clause
>>> Article.objects.filter(reporter_id=1)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'reporter_id' into field
+TypeError: Cannot resolve keyword 'reporter_id' into field, choices are: id, headline, pub_date, reporter
# You can also instantiate an Article by passing
# the Reporter's ID instead of a Reporter object.
diff --git a/tests/modeltests/reverse_lookup/models.py b/tests/modeltests/reverse_lookup/models.py
index 7e6712676f..d30269c5c6 100644
--- a/tests/modeltests/reverse_lookup/models.py
+++ b/tests/modeltests/reverse_lookup/models.py
@@ -55,5 +55,5 @@ __test__ = {'API_TESTS':"""
>>> Poll.objects.get(choice__name__exact="This is the answer")
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'choice' into field
+TypeError: Cannot resolve keyword 'choice' into field, choices are: poll_choice, related_choice, id, question, creator
"""}
diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py
index 44ddffb55f..58f1d47e50 100644
--- a/tests/modeltests/test_client/models.py
+++ b/tests/modeltests/test_client/models.py
@@ -24,19 +24,14 @@ from django.test import Client, TestCase
class ClientTest(TestCase):
fixtures = ['testdata.json']
- def setUp(self):
- "Set up test environment"
- self.client = Client()
-
def test_get_view(self):
"GET a view"
response = self.client.get('/test_client/get_view/')
# Check some response details
- self.assertEqual(response.status_code, 200)
+ self.assertContains(response, 'This is a test')
self.assertEqual(response.context['var'], 42)
self.assertEqual(response.template.name, 'GET Template')
- self.failUnless('This is a test.' in response.content)
def test_get_post_view(self):
"GET a view that normally expects POSTs"
@@ -80,7 +75,7 @@ class ClientTest(TestCase):
response = self.client.get('/test_client/redirect_view/')
# Check that the response was a 302 (redirect)
- self.assertEqual(response.status_code, 302)
+ self.assertRedirects(response, '/test_client/get_view/')
def test_valid_form(self):
"POST valid data to a form"
@@ -102,7 +97,7 @@ class ClientTest(TestCase):
'value': 37
}
response = self.client.post('/test_client/form_view/', post_data)
- self.assertEqual(response.status_code, 200)
+ self.assertContains(response, 'This field is required', 3)
self.assertEqual(response.template.name, "Invalid POST Template")
def test_form_error(self):
@@ -130,7 +125,7 @@ class ClientTest(TestCase):
# Get the page without logging in. Should result in 302.
response = self.client.get('/test_client/login_protected_view/')
- self.assertEqual(response.status_code, 302)
+ self.assertRedirects(response, '/accounts/login/')
# Request a page that requires a login
response = self.client.login('/test_client/login_protected_view/', 'testclient', 'password')
diff --git a/tests/regressiontests/forms/localflavor.py b/tests/regressiontests/forms/localflavor.py
index f725fb38b7..ede89de2a0 100644
--- a/tests/regressiontests/forms/localflavor.py
+++ b/tests/regressiontests/forms/localflavor.py
@@ -1011,6 +1011,60 @@ Traceback (most recent call last):
...
ValidationError: [u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.']
+# CHZipCodeField ############################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHZipCodeField
+>>> f = CHZipCodeField()
+>>> f.clean('800x')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+>>> f.clean('80 00')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+>>> f.clean('8000')
+u'8000'
+
+# CHPhoneNumberField ########################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHPhoneNumberField
+>>> f = CHPhoneNumberField()
+>>> f.clean('01234567890')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
+>>> f.clean('1234567890')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
+>>> f.clean('0123456789')
+u'012 345 67 89'
+
+# CHIdentityCardNumberField #################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHIdentityCardNumberField
+>>> f = CHIdentityCardNumberField()
+>>> f.clean('C1234567<0')
+u'C1234567<0'
+>>> f.clean('C1234567<1')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
+>>> f.clean('2123456700')
+u'2123456700'
+>>> f.clean('2123456701')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
+
+# CHStateSelect #############################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHStateSelect
+>>> w = CHStateSelect()
+>>> w.render('state', 'AG')
+u'<select name="state">\n<option value="AG" selected="selected">Aargau</option>\n<option value="AI">Appenzell Innerrhoden</option>\n<option value="AR">Appenzell Ausserrhoden</option>\n<option value="BS">Basel-Stadt</option>\n<option value="BL">Basel-Land</option>\n<option value="BE">Berne</option>\n<option value="FR">Fribourg</option>\n<option value="GE">Geneva</option>\n<option value="GL">Glarus</option>\n<option value="GR">Graubuenden</option>\n<option value="JU">Jura</option>\n<option value="LU">Lucerne</option>\n<option value="NE">Neuchatel</option>\n<option value="NW">Nidwalden</option>\n<option value="OW">Obwalden</option>\n<option value="SH">Schaffhausen</option>\n<option value="SZ">Schwyz</option>\n<option value="SO">Solothurn</option>\n<option value="SG">St. Gallen</option>\n<option value="TG">Thurgau</option>\n<option value="TI">Ticino</option>\n<option value="UR">Uri</option>\n<option value="VS">Valais</option>\n<option value="VD">Vaud</option>\n<option value="ZG">Zug</option>\n<option value="ZH">Zurich</option>\n</select>'
+
## AUPostCodeField ##########################################################
A field that accepts a four digit Australian post code.
diff --git a/tests/regressiontests/null_queries/models.py b/tests/regressiontests/null_queries/models.py
index 09024f18c2..4396ab4005 100644
--- a/tests/regressiontests/null_queries/models.py
+++ b/tests/regressiontests/null_queries/models.py
@@ -32,7 +32,7 @@ __test__ = {'API_TESTS':"""
>>> Choice.objects.filter(foo__exact=None)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'foo' into field
+TypeError: Cannot resolve keyword 'foo' into field, choices are: id, poll, choice
# Can't use None on anything other than __exact
>>> Choice.objects.filter(id__gt=None)