summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Dunck <jdunck@gmail.com>2007-12-01 22:12:44 +0000
committerJeremy Dunck <jdunck@gmail.com>2007-12-01 22:12:44 +0000
commit23384af79b2f43f08e8395d0a84a57c2a98df392 (patch)
tree77e45f0e0fc6cb9b3380982313f45febf2ebf6f0
parent85ce45bc441e4ace2fba83bc2d2432e22ec9da94 (diff)
gis: Merged 6672-6783 vis svnmerge from trunk
git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@6815 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS4
-rw-r--r--README1
-rwxr-xr-xdjango/bin/compile-messages.py5
-rw-r--r--django/conf/global_settings.py2
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.mobin627 -> 627 bytes
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.po3681
-rw-r--r--django/conf/locale/en/LC_MESSAGES/djangojs.mobin367 -> 367 bytes
-rw-r--r--django/conf/locale/en/LC_MESSAGES/djangojs.po49
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.mobin44528 -> 50899 bytes
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.po4583
-rw-r--r--django/contrib/admin/media/css/base.css4
-rw-r--r--django/contrib/admin/media/js/admin/RelatedObjectLookups.js14
-rw-r--r--django/contrib/admin/templates/admin/field_line.html2
-rw-r--r--django/contrib/admin/templates/admin_doc/template_filter_index.html2
-rw-r--r--django/contrib/admin/templates/admin_doc/template_tag_index.html2
-rw-r--r--django/contrib/admin/templates/admin_doc/view_index.html4
-rw-r--r--django/contrib/admin/templatetags/admin_list.py4
-rw-r--r--django/contrib/admin/templatetags/admin_modify.py2
-rw-r--r--django/contrib/admin/views/main.py9
-rw-r--r--django/contrib/comments/models.py10
-rw-r--r--django/contrib/comments/tests.py13
-rw-r--r--django/contrib/formtools/models.py1
-rw-r--r--django/contrib/formtools/preview.py2
-rw-r--r--django/contrib/formtools/test_urls.py12
-rw-r--r--django/contrib/formtools/tests.py93
-rw-r--r--django/contrib/localflavor/ca/ca_provinces.py2
-rw-r--r--django/core/cache/backends/base.py11
-rw-r--r--django/core/cache/backends/locmem.py7
-rw-r--r--django/core/management/__init__.py49
-rw-r--r--django/core/management/base.py13
-rw-r--r--django/core/paginator.py2
-rw-r--r--django/core/servers/basehttp.py13
-rw-r--r--django/db/models/base.py4
-rw-r--r--django/db/models/fields/__init__.py2
-rw-r--r--django/db/models/fields/subclassing.py4
-rw-r--r--django/middleware/cache.py23
-rw-r--r--django/middleware/gzip.py18
-rw-r--r--django/newforms/extras/widgets.py3
-rw-r--r--django/newforms/fields.py13
-rw-r--r--django/newforms/models.py37
-rw-r--r--django/newforms/widgets.py25
-rw-r--r--django/template/__init__.py24
-rw-r--r--django/template/defaultfilters.py5
-rw-r--r--django/template/loader_tags.py3
-rw-r--r--django/templatetags/i18n.py32
-rw-r--r--django/test/testcases.py6
-rw-r--r--django/utils/cache.py43
-rw-r--r--django/utils/datastructures.py76
-rw-r--r--django/utils/html.py19
-rw-r--r--django/utils/safestring.py2
-rw-r--r--django/utils/translation/trans_null.py6
-rw-r--r--django/utils/translation/trans_real.py22
-rw-r--r--django/utils/tzinfo.py8
-rw-r--r--django/views/debug.py12
-rw-r--r--django/views/i18n.py8
-rw-r--r--django/views/static.py3
-rw-r--r--docs/authentication.txt2
-rw-r--r--docs/cache.txt34
-rw-r--r--docs/custom_model_fields.txt10
-rw-r--r--docs/databases.txt70
-rw-r--r--docs/django-admin.txt8
-rw-r--r--docs/flatpages.txt7
-rw-r--r--docs/i18n.txt6
-rw-r--r--docs/install.txt25
-rw-r--r--docs/middleware.txt3
-rw-r--r--docs/model-api.txt4
-rw-r--r--docs/modpython.txt13
-rw-r--r--docs/newforms.txt46
-rw-r--r--docs/release_notes_0.96.txt2
-rw-r--r--docs/settings.txt12
-rw-r--r--docs/syndication_feeds.txt21
-rw-r--r--docs/templates.txt40
-rw-r--r--docs/templates_python.txt137
-rw-r--r--docs/tutorial01.txt2
-rw-r--r--docs/unicode.txt2
-rw-r--r--docs/url_dispatch.txt2
-rw-r--r--tests/modeltests/field_subclassing/models.py10
-rw-r--r--tests/modeltests/model_forms/models.py73
-rw-r--r--tests/modeltests/pagination/models.py3
-rw-r--r--tests/regressiontests/cache/tests.py30
-rw-r--r--tests/regressiontests/datastructures/tests.py12
-rw-r--r--tests/regressiontests/dateformat/tests.py4
-rw-r--r--tests/regressiontests/defaultfilters/tests.py2
-rw-r--r--tests/regressiontests/forms/error_messages.py45
-rw-r--r--tests/regressiontests/forms/fields.py14
-rw-r--r--tests/regressiontests/forms/localflavor/ca.py4
-rw-r--r--tests/regressiontests/forms/models.py4
-rw-r--r--tests/regressiontests/forms/widgets.py61
-rw-r--r--tests/regressiontests/i18n/tests.py14
-rw-r--r--tests/regressiontests/templates/filters.py44
-rw-r--r--tests/regressiontests/templates/tests.py59
-rw-r--r--tests/regressiontests/templates/unicode.py10
-rw-r--r--tests/regressiontests/utils/datastructures.py51
-rw-r--r--tests/regressiontests/utils/tests.py13
-rw-r--r--tests/regressiontests/utils/timesince.py2
-rw-r--r--tests/regressiontests/views/tests/static.py10
96 files changed, 6410 insertions, 3495 deletions
diff --git a/AUTHORS b/AUTHORS
index 1f8e40edbe..0768645f1c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -71,6 +71,7 @@ answer newbie questions, and generally made Django that much better:
Jonathan Buchanan <jonathan.buchanan@gmail.com>
Trevor Caira <trevor@caira.com>
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
+ Graham Carlyle <graham.carlyle@maplecroft.net>
Antonio Cavedoni <http://cavedoni.com/>
C8E
cedric@terramater.net
@@ -100,6 +101,7 @@ answer newbie questions, and generally made Django that much better:
Alex Dedul
deric@monowerks.com
Max Derkachev <mderk@yandex.ru>
+ Rajesh Dhawan <rajesh.dhawan@gmail.com>
Sander Dijkhuis <sander.dijkhuis@gmail.com>
Jordan Dimov <s3x3y1@gmail.com>
dne@mayonnaise.net
@@ -187,6 +189,7 @@ answer newbie questions, and generally made Django that much better:
krzysiek.pawlik@silvermedia.pl
Joseph Kocherhans
konrad@gwu.edu
+ knox <christobzr@gmail.com>
kurtiss@meetro.com
lakin.wecker@gmail.com
Nick Lane <nick.lane.au@gmail.com>
@@ -272,6 +275,7 @@ answer newbie questions, and generally made Django that much better:
Vinay Sajip <vinay_sajip@yahoo.co.uk>
David Schein
scott@staplefish.com
+ Ilya Semenov <semenov@inetss.com>
serbaut@gmail.com
John Shaffer <jshaffer2112@gmail.com>
Pete Shinners <pete@shinners.org>
diff --git a/README b/README
index 084f863a1e..503949041e 100644
--- a/README
+++ b/README
@@ -34,4 +34,3 @@ To contribute to Django:
* Check out http://www.djangoproject.com/community/ for information
about getting involved.
-
diff --git a/django/bin/compile-messages.py b/django/bin/compile-messages.py
index 8693022644..0d71413e5a 100755
--- a/django/bin/compile-messages.py
+++ b/django/bin/compile-messages.py
@@ -11,11 +11,10 @@ except NameError:
def compile_messages(locale=None):
- basedirs = [os.path.join('conf', 'locale'), 'locale']
+ basedirs = (os.path.join('conf', 'locale'), 'locale')
if os.environ.get('DJANGO_SETTINGS_MODULE'):
from django.conf import settings
- if hasattr(settings, 'LOCALE_PATHS'):
- basedirs += settings.LOCALE_PATHS
+ basedirs += settings.LOCALE_PATHS
# Gather existing directories.
basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs)))
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 994e908caf..2853d6c618 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -90,6 +90,8 @@ LANGUAGES_BIDI = ("he", "ar", "fa")
# to load the internationalization machinery.
USE_I18N = True
+LOCALE_PATHS = ()
+
# Not-necessarily-technical managers of the site. They get broken link
# notifications and other various e-mails.
MANAGERS = ADMINS
diff --git a/django/conf/locale/en/LC_MESSAGES/django.mo b/django/conf/locale/en/LC_MESSAGES/django.mo
index 038e794a83..5bb3059a2c 100644
--- a/django/conf/locale/en/LC_MESSAGES/django.mo
+++ b/django/conf/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/en/LC_MESSAGES/django.po b/django/conf/locale/en/LC_MESSAGES/django.po
index 7e36c6358c..a2dd52978b 100644
--- a/django/conf/locale/en/LC_MESSAGES/django.po
+++ b/django/conf/locale/en/LC_MESSAGES/django.po
@@ -7,86 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-04-05 01:32+1000\n"
+"POT-Creation-Date: 2007-11-29 10:57-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: db/models/manipulators.py:307
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
-
-#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
-#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
-msgid "and"
-msgstr ""
-
-#: db/models/fields/related.py:53
-#, python-format
-msgid "Please enter a valid %s."
-msgstr ""
-
-#: db/models/fields/related.py:642
-msgid "Separate multiple IDs with commas."
-msgstr ""
-
-#: db/models/fields/related.py:644
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-
-#: 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] ""
-msgstr[1] ""
-
-#: db/models/fields/__init__.py:42
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr ""
-
-#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
-#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
-#: oldforms/__init__.py:357 newforms/fields.py:80 newforms/fields.py:376
-#: newforms/fields.py:452 newforms/fields.py:463 newforms/models.py:178
-msgid "This field is required."
-msgstr ""
-
-#: db/models/fields/__init__.py:367
-msgid "This value must be an integer."
-msgstr ""
-
-#: db/models/fields/__init__.py:402
-msgid "This value must be either True or False."
-msgstr ""
-
-#: db/models/fields/__init__.py:423
-msgid "This field cannot be null."
-msgstr ""
-
-#: db/models/fields/__init__.py:457 core/validators.py:148
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr ""
-
-#: db/models/fields/__init__.py:526 core/validators.py:157
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr ""
-
-#: db/models/fields/__init__.py:630
-msgid "Enter a valid filename."
-msgstr ""
-
-#: db/models/fields/__init__.py:751
-msgid "This value must be either None, True or False."
-msgstr ""
-
#: conf/global_settings.py:39
msgid "Arabic"
msgstr ""
@@ -96,1088 +24,1171 @@ msgid "Bengali"
msgstr ""
#: conf/global_settings.py:41
-msgid "Catalan"
+msgid "Bulgarian"
msgstr ""
#: conf/global_settings.py:42
-msgid "Czech"
+msgid "Catalan"
msgstr ""
#: conf/global_settings.py:43
-msgid "Welsh"
+msgid "Czech"
msgstr ""
#: conf/global_settings.py:44
-msgid "Danish"
+msgid "Welsh"
msgstr ""
#: conf/global_settings.py:45
-msgid "German"
+msgid "Danish"
msgstr ""
#: conf/global_settings.py:46
-msgid "Greek"
+msgid "German"
msgstr ""
#: conf/global_settings.py:47
-msgid "English"
+msgid "Greek"
msgstr ""
#: conf/global_settings.py:48
-msgid "Spanish"
+msgid "English"
msgstr ""
#: conf/global_settings.py:49
-msgid "Argentinean Spanish"
+msgid "Spanish"
msgstr ""
#: conf/global_settings.py:50
-msgid "Finnish"
+msgid "Argentinean Spanish"
msgstr ""
#: conf/global_settings.py:51
-msgid "French"
+msgid "Persian"
msgstr ""
#: conf/global_settings.py:52
-msgid "Galician"
+msgid "Finnish"
msgstr ""
#: conf/global_settings.py:53
-msgid "Hungarian"
+msgid "French"
msgstr ""
#: conf/global_settings.py:54
-msgid "Hebrew"
+msgid "Gaeilge"
msgstr ""
#: conf/global_settings.py:55
-msgid "Icelandic"
+msgid "Galician"
msgstr ""
#: conf/global_settings.py:56
-msgid "Italian"
+msgid "Hungarian"
msgstr ""
#: conf/global_settings.py:57
-msgid "Japanese"
+msgid "Hebrew"
msgstr ""
#: conf/global_settings.py:58
-msgid "Kannada"
+msgid "Croatian"
msgstr ""
#: conf/global_settings.py:59
-msgid "Latvian"
+msgid "Icelandic"
msgstr ""
#: conf/global_settings.py:60
-msgid "Macedonian"
+msgid "Italian"
msgstr ""
#: conf/global_settings.py:61
-msgid "Dutch"
+msgid "Japanese"
msgstr ""
#: conf/global_settings.py:62
-msgid "Norwegian"
+msgid "Korean"
msgstr ""
#: conf/global_settings.py:63
-msgid "Polish"
+msgid "Khmer"
msgstr ""
#: conf/global_settings.py:64
-msgid "Portugese"
+msgid "Kannada"
msgstr ""
#: conf/global_settings.py:65
-msgid "Brazilian"
+msgid "Latvian"
msgstr ""
#: conf/global_settings.py:66
-msgid "Romanian"
+msgid "Macedonian"
msgstr ""
#: conf/global_settings.py:67
-msgid "Russian"
+msgid "Dutch"
msgstr ""
#: conf/global_settings.py:68
-msgid "Slovak"
+msgid "Norwegian"
msgstr ""
#: conf/global_settings.py:69
-msgid "Slovenian"
+msgid "Polish"
msgstr ""
#: conf/global_settings.py:70
-msgid "Serbian"
+msgid "Portugese"
msgstr ""
#: conf/global_settings.py:71
-msgid "Swedish"
+msgid "Brazilian"
msgstr ""
#: conf/global_settings.py:72
-msgid "Tamil"
+msgid "Romanian"
msgstr ""
#: conf/global_settings.py:73
-msgid "Telugu"
+msgid "Russian"
msgstr ""
#: conf/global_settings.py:74
-msgid "Turkish"
+msgid "Slovak"
msgstr ""
#: conf/global_settings.py:75
-msgid "Ukrainian"
+msgid "Slovenian"
msgstr ""
#: conf/global_settings.py:76
-msgid "Simplified Chinese"
+msgid "Serbian"
msgstr ""
#: conf/global_settings.py:77
-msgid "Traditional Chinese"
+msgid "Swedish"
msgstr ""
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/dates.py:6
-msgid "Monday"
+#: conf/global_settings.py:78
+msgid "Tamil"
msgstr ""
-#: utils/dates.py:6
-msgid "Tuesday"
+#: conf/global_settings.py:79
+msgid "Telugu"
msgstr ""
-#: utils/dates.py:6
-msgid "Wednesday"
+#: conf/global_settings.py:80
+msgid "Turkish"
msgstr ""
-#: utils/dates.py:6
-msgid "Thursday"
+#: conf/global_settings.py:81
+msgid "Ukrainian"
msgstr ""
-#: utils/dates.py:6
-msgid "Friday"
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
msgstr ""
-#: utils/dates.py:7
-msgid "Saturday"
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
msgstr ""
-#: utils/dates.py:7
-msgid "Sunday"
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
msgstr ""
-#: utils/dates.py:14
-msgid "January"
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
msgstr ""
-#: utils/dates.py:14
-msgid "February"
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
msgstr ""
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
msgstr ""
-#: utils/dates.py:15
-msgid "August"
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
msgstr ""
-#: utils/dates.py:15
-msgid "September"
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
msgstr ""
-#: utils/dates.py:15
-msgid "October"
+#: contrib/admin/models.py:18
+msgid "action time"
msgstr ""
-#: utils/dates.py:15
-msgid "November"
+#: contrib/admin/models.py:21
+msgid "object id"
msgstr ""
-#: utils/dates.py:16
-msgid "December"
+#: contrib/admin/models.py:22
+msgid "object repr"
msgstr ""
-#: utils/dates.py:19
-msgid "jan"
+#: contrib/admin/models.py:23
+msgid "action flag"
msgstr ""
-#: utils/dates.py:19
-msgid "feb"
+#: contrib/admin/models.py:24
+msgid "change message"
msgstr ""
-#: utils/dates.py:19
-msgid "mar"
+#: contrib/admin/models.py:27
+msgid "log entry"
msgstr ""
-#: utils/dates.py:19
-msgid "apr"
+#: contrib/admin/models.py:28
+msgid "log entries"
msgstr ""
-#: utils/dates.py:19
-msgid "may"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
msgstr ""
-#: utils/dates.py:19
-msgid "jun"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
msgstr ""
-#: utils/dates.py:20
-msgid "jul"
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
msgstr ""
-#: utils/dates.py:20
-msgid "aug"
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
msgstr ""
-#: utils/dates.py:20
-msgid "sep"
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
msgstr ""
-#: utils/dates.py:20
-msgid "oct"
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
msgstr ""
-#: utils/dates.py:20
-msgid "nov"
+#: 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 ""
-#: utils/dates.py:20
-msgid "dec"
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
msgstr ""
-#: utils/dates.py:27
-msgid "Jan."
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
msgstr ""
-#: utils/dates.py:27
-msgid "Feb."
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
msgstr ""
-#: utils/dates.py:28
-msgid "Aug."
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
msgstr ""
-#: utils/dates.py:28
-msgid "Sept."
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
msgstr ""
-#: utils/dates.py:28
-msgid "Oct."
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
msgstr ""
-#: utils/dates.py:28
-msgid "Nov."
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
msgstr ""
-#: utils/dates.py:28
-msgid "Dec."
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
msgstr ""
-#: utils/dateformat.py:40
-msgid "p.m."
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
msgstr ""
-#: utils/dateformat.py:41
-msgid "a.m."
-msgstr ""
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
-#: utils/dateformat.py:46
-msgid "PM"
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
msgstr ""
-#: utils/dateformat.py:47
-msgid "AM"
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
msgstr ""
-#: utils/dateformat.py:95
-msgid "midnight"
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
msgstr ""
-#: utils/dateformat.py:97
-msgid "noon"
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
msgstr ""
-#: utils/translation/trans_real.py:358
-msgid "DATE_FORMAT"
-msgstr "N j, Y"
-
-#: utils/translation/trans_real.py:359
-msgid "DATETIME_FORMAT"
-msgstr "N j, Y, P"
-
-#: utils/translation/trans_real.py:360
-msgid "TIME_FORMAT"
-msgstr "P"
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, 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 ""
-#: utils/translation/trans_real.py:376
-msgid "YEAR_MONTH_FORMAT"
-msgstr "F Y"
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, 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 ""
-#: utils/translation/trans_real.py:377
-msgid "MONTH_DAY_FORMAT"
-msgstr "F j"
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr ""
-#: oldforms/__init__.py:392
+#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] ""
-msgstr[1] ""
+msgid " By %(filter_title)s "
+msgstr ""
-#: oldforms/__init__.py:397
-msgid "Line breaks are not allowed here."
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
msgstr ""
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#: contrib/admin/templates/admin/index.html:17
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgid "Models available in the %(name)s application."
msgstr ""
-#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150
-#: newforms/widgets.py:174
-msgid "Unknown"
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
msgstr ""
-#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
-#: newforms/widgets.py:174
-msgid "Yes"
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
msgstr ""
-#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
-#: newforms/widgets.py:174
-msgid "No"
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
msgstr ""
-#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
-msgid "No file was submitted. Check the encoding type on the form."
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
msgstr ""
-#: oldforms/__init__.py:674
-msgid "The submitted file is empty."
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
msgstr ""
-#: oldforms/__init__.py:730
-msgid "Enter a whole number between -32,768 and 32,767."
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
msgstr ""
-#: oldforms/__init__.py:740
-msgid "Enter a positive number."
+#: 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 ""
-#: oldforms/__init__.py:750
-msgid "Enter a whole number between 0 and 32,767."
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
msgstr ""
-#: contrib/localflavor/no/forms.py:15
-msgid "Enter a zip code in the format XXXX."
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
msgstr ""
-#: contrib/localflavor/no/forms.py:36
-msgid "Enter a valid Norwegian social security number."
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
msgstr ""
-#: contrib/localflavor/it/forms.py:14 contrib/localflavor/fr/forms.py:17
-#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
-msgid "Enter a zip code in the format XXXXX."
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
msgstr ""
-#: contrib/localflavor/jp/forms.py:21
-msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:4
-msgid "Hokkaido"
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:5
-msgid "Aomori"
-msgstr ""
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
-#: contrib/localflavor/jp/jp_prefectures.py:6
-msgid "Iwate"
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:7
-msgid "Miyagi"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:8
-msgid "Akita"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:9
-msgid "Yamagata"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:10
-msgid "Fukushima"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:11
-msgid "Ibaraki"
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:12
-msgid "Tochigi"
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:13
-msgid "Gunma"
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:14
-msgid "Saitama"
+#: 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 ""
-#: contrib/localflavor/jp/jp_prefectures.py:15
-msgid "Chiba"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:16
-msgid "Tokyo"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:17
-msgid "Kanagawa"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:18
-msgid "Yamanashi"
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:19
-msgid "Nagano"
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:20
-msgid "Niigata"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:21
-msgid "Toyama"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:22
-msgid "Ishikawa"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:23
-msgid "Fukui"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:24
-msgid "Gifu"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:25
-msgid "Shizuoka"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:26
-msgid "Aichi"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:27
-msgid "Mie"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:28
-msgid "Shiga"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:29
-msgid "Kyoto"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:30
-msgid "Osaka"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:31
-msgid "Hyogo"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:32
-msgid "Nara"
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:33
-msgid "Wakayama"
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:34
-msgid "Tottori"
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:35
-msgid "Shimane"
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:36
-msgid "Okayama"
+#: contrib/admin/templates/registration/password_change_form.html:11
+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 ""
-#: contrib/localflavor/jp/jp_prefectures.py:37
-msgid "Hiroshima"
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:38
-msgid "Yamaguchi"
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:39
-msgid "Tokushima"
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:40
-msgid "Kagawa"
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:41
-msgid "Ehime"
+#: 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 ""
-#: contrib/localflavor/jp/jp_prefectures.py:42
-msgid "Kochi"
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:43
-msgid "Fukuoka"
+#: 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 ""
-#: contrib/localflavor/jp/jp_prefectures.py:44
-msgid "Saga"
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:45
-msgid "Nagasaki"
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:46
-msgid "Kumamoto"
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:47
-msgid "Oita"
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:48
-msgid "Miyazaki"
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:49
-msgid "Kagoshima"
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
msgstr ""
-#: contrib/localflavor/jp/jp_prefectures.py:50
-msgid "Okinawa"
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
msgstr ""
-#: contrib/localflavor/br/forms.py:18
-msgid "Enter a zip code in the format XXXXX-XXX."
+#: 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 ""
-#: contrib/localflavor/br/forms.py:30
-msgid "Phone numbers must be in XX-XXXX-XXXX format."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
msgstr ""
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
-msgid "Enter a valid Finnish social security number."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
msgstr ""
-#: contrib/localflavor/uk/forms.py:18
-msgid "Enter a postcode. A space is required between the two postcode parts."
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
msgstr ""
-#: contrib/localflavor/de/forms.py:63
-msgid ""
-"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
-"format"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
msgstr ""
-#: contrib/localflavor/de/de_states.py:5
-msgid "Baden-Wuerttemberg"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
msgstr ""
-#: contrib/localflavor/de/de_states.py:6
-msgid "Bavaria"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
msgstr ""
-#: contrib/localflavor/de/de_states.py:7
-msgid "Berlin"
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
msgstr ""
-#: contrib/localflavor/de/de_states.py:8
-msgid "Brandenburg"
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr ""
-#: contrib/localflavor/de/de_states.py:9
-msgid "Bremen"
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
msgstr ""
-#: contrib/localflavor/de/de_states.py:10
-msgid "Hamburg"
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
msgstr ""
-#: contrib/localflavor/de/de_states.py:11
-msgid "Hessen"
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
msgstr ""
-#: contrib/localflavor/de/de_states.py:12
-msgid "Mecklenburg-Western Pomerania"
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
msgstr ""
-#: contrib/localflavor/de/de_states.py:13
-msgid "Lower Saxony"
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
msgstr ""
-#: contrib/localflavor/de/de_states.py:14
-msgid "North Rhine-Westphalia"
+#: contrib/admin/views/decorators.py:63
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
msgstr ""
-#: contrib/localflavor/de/de_states.py:15
-msgid "Rhineland-Palatinate"
+#: contrib/admin/views/decorators.py:70
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
msgstr ""
-#: contrib/localflavor/de/de_states.py:16
-msgid "Saarland"
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
msgstr ""
-#: contrib/localflavor/de/de_states.py:17
-msgid "Saxony"
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
-#: contrib/localflavor/de/de_states.py:18
-msgid "Saxony-Anhalt"
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
msgstr ""
-#: contrib/localflavor/de/de_states.py:19
-msgid "Schleswig-Holstein"
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
msgstr ""
-#: contrib/localflavor/de/de_states.py:20
-msgid "Thuringia"
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
msgstr ""
-#: contrib/localflavor/usa/forms.py:18
-msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
msgstr ""
-#: contrib/localflavor/usa/forms.py:51
-msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
msgstr ""
-#: contrib/sessions/models.py:68
-msgid "session key"
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
msgstr ""
-#: contrib/sessions/models.py:69
-msgid "session data"
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
msgstr ""
-#: contrib/sessions/models.py:70
-msgid "expire date"
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
msgstr ""
-#: contrib/sessions/models.py:74
-msgid "session"
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
msgstr ""
-#: contrib/sessions/models.py:75
-msgid "sessions"
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
msgstr ""
-#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
-msgid "The two password fields didn't match."
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
msgstr ""
-#: contrib/auth/forms.py:25
-msgid "A user with that username already exists."
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
msgstr ""
-#: contrib/auth/forms.py:53
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
msgstr ""
-#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
msgstr ""
-#: contrib/auth/forms.py:62
-msgid "This account is inactive."
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
msgstr ""
-#: contrib/auth/forms.py:85
-msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
msgstr ""
-#: contrib/auth/forms.py:117
-msgid "The two 'new password' fields didn't match."
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
msgstr ""
-#: contrib/auth/forms.py:124
-msgid "Your old password was entered incorrectly. Please enter it again."
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
msgstr ""
-#: contrib/auth/views.py:39
-msgid "Logged out"
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
msgstr ""
-#: contrib/auth/models.py:38 contrib/auth/models.py:57
-msgid "name"
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
msgstr ""
-#: contrib/auth/models.py:40
-msgid "codename"
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
msgstr ""
-#: contrib/auth/models.py:42
-msgid "permission"
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:85
+msgid "IP address"
msgstr ""
-#: contrib/auth/models.py:43 contrib/auth/models.py:58
-msgid "permissions"
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
msgstr ""
-#: contrib/auth/models.py:60
-msgid "group"
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
msgstr ""
-#: contrib/auth/models.py:61 contrib/auth/models.py:100
-msgid "groups"
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
msgstr ""
-#: contrib/auth/models.py:90
-msgid "username"
+#: contrib/admin/views/doc.py:316
+msgid "Text"
msgstr ""
-#: contrib/auth/models.py:90
-msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
+#: contrib/admin/views/doc.py:317
+msgid "Time"
msgstr ""
-#: contrib/auth/models.py:91
-msgid "first name"
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
msgstr ""
-#: contrib/auth/models.py:92
-msgid "last name"
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
msgstr ""
-#: contrib/auth/models.py:93
-msgid "e-mail address"
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
msgstr ""
-#: contrib/auth/models.py:94
-msgid "password"
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
msgstr ""
-#: contrib/auth/models.py:94
-msgid ""
-"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
-"password form</a>."
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
msgstr ""
-#: contrib/auth/models.py:95
-msgid "staff status"
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
msgstr ""
-#: contrib/auth/models.py:95
-msgid "Designates whether the user can log into this admin site."
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
msgstr ""
-#: contrib/auth/models.py:96
-msgid "active"
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
msgstr ""
-#: contrib/auth/models.py:96
-msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
msgstr ""
-#: contrib/auth/models.py:97
-msgid "superuser status"
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
msgstr ""
-#: contrib/auth/models.py:97
-msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
msgstr ""
-#: contrib/auth/models.py:98
-msgid "last login"
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
msgstr ""
-#: contrib/auth/models.py:99
-msgid "date joined"
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr ""
-#: contrib/auth/models.py:101
+#: contrib/admin/views/main.py:362
+#, python-format
msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-#: contrib/auth/models.py:102
-msgid "user permissions"
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
msgstr ""
-#: contrib/auth/models.py:105
-msgid "user"
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr ""
-#: contrib/auth/models.py:106
-msgid "users"
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
msgstr ""
-#: contrib/auth/models.py:111
-msgid "Personal info"
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr ""
-#: contrib/auth/models.py:112
-msgid "Permissions"
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
msgstr ""
-#: contrib/auth/models.py:113
-msgid "Important dates"
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
msgstr ""
-#: contrib/auth/models.py:114
-msgid "Groups"
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
msgstr ""
-#: contrib/auth/models.py:258
-msgid "message"
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "th"
+#: contrib/admin/views/main.py:784
+msgid "Database error"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "st"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "nd"
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "rd"
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:47
-#, python-format
-msgid "%(value).1f million"
-msgid_plural "%(value).1f million"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr ""
-#: contrib/humanize/templatetags/humanize.py:50
-#, python-format
-msgid "%(value).1f billion"
-msgid_plural "%(value).1f billion"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
-#: contrib/humanize/templatetags/humanize.py:53
+#: contrib/auth/forms.py:107
#, python-format
-msgid "%(value).1f trillion"
-msgid_plural "%(value).1f trillion"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Password reset on %s"
+msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "one"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "two"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "three"
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "four"
+#: contrib/auth/models.py:75
+msgid "codename"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "five"
+#: contrib/auth/models.py:78
+msgid "permission"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "six"
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "seven"
+#: contrib/auth/models.py:97
+msgid "group"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "eight"
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
msgstr ""
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "nine"
+#: contrib/auth/models.py:131
+msgid "username"
msgstr ""
-#: contrib/contenttypes/models.py:36
-msgid "python model class name"
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
msgstr ""
-#: contrib/contenttypes/models.py:39
-msgid "content type"
+#: contrib/auth/models.py:132
+msgid "first name"
msgstr ""
-#: contrib/contenttypes/models.py:40
-msgid "content types"
+#: contrib/auth/models.py:133
+msgid "last name"
msgstr ""
-#: contrib/redirects/models.py:7
-msgid "redirect from"
+#: contrib/auth/models.py:134
+msgid "e-mail address"
msgstr ""
-#: contrib/redirects/models.py:8
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr ""
+
+#: contrib/auth/models.py:135
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
msgstr ""
-#: contrib/redirects/models.py:9
-msgid "redirect to"
+#: contrib/auth/models.py:136
+msgid "staff status"
msgstr ""
-#: contrib/redirects/models.py:10
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr ""
+
+#: contrib/auth/models.py:137
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
msgstr ""
-#: contrib/redirects/models.py:13
-msgid "redirect"
+#: contrib/auth/models.py:138
+msgid "superuser status"
msgstr ""
-#: contrib/redirects/models.py:14
-msgid "redirects"
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
msgstr ""
-#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
-msgid "URL"
+#: contrib/auth/models.py:139
+msgid "last login"
msgstr ""
-#: contrib/flatpages/models.py:8
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr ""
+
+#: contrib/auth/models.py:142
msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
msgstr ""
-#: contrib/flatpages/models.py:9
-msgid "title"
+#: contrib/auth/models.py:143
+msgid "user permissions"
msgstr ""
-#: contrib/flatpages/models.py:10
-msgid "content"
+#: contrib/auth/models.py:147
+msgid "user"
msgstr ""
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
+#: contrib/auth/models.py:148
+msgid "users"
msgstr ""
-#: contrib/flatpages/models.py:12
-msgid "template name"
+#: contrib/auth/models.py:154
+msgid "Personal info"
msgstr ""
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
+#: contrib/auth/models.py:155
+msgid "Permissions"
msgstr ""
-#: contrib/flatpages/models.py:14
-msgid "registration required"
+#: contrib/auth/models.py:156
+msgid "Important dates"
msgstr ""
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
+#: contrib/auth/models.py:157
+msgid "Groups"
msgstr ""
-#: contrib/flatpages/models.py:18
-msgid "flat page"
+#: contrib/auth/models.py:316
+msgid "message"
msgstr ""
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
+#: contrib/auth/views.py:47
+msgid "Logged out"
msgstr ""
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#: contrib/comments/models.py:67 contrib/comments/models.py:169
msgid "object ID"
msgstr ""
@@ -1186,7 +1197,7 @@ msgid "headline"
msgstr ""
#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
+#: contrib/comments/models.py:170
msgid "comment"
msgstr ""
@@ -1226,18 +1237,14 @@ msgstr ""
msgid "is valid rating"
msgstr ""
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
+#: contrib/comments/models.py:83 contrib/comments/models.py:172
msgid "date/time submitted"
msgstr ""
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
+#: contrib/comments/models.py:84 contrib/comments/models.py:173
msgid "is public"
msgstr ""
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
-msgid "IP address"
-msgstr ""
-
#: contrib/comments/models.py:86
msgid "is removed"
msgstr ""
@@ -1252,11 +1259,11 @@ msgstr ""
msgid "comments"
msgstr ""
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#: contrib/comments/models.py:134 contrib/comments/models.py:213
msgid "Content object"
msgstr ""
-#: contrib/comments/models.py:159
+#: contrib/comments/models.py:162
#, python-format
msgid ""
"Posted by %(user)s at %(date)s\n"
@@ -1266,48 +1273,48 @@ msgid ""
"http://%(domain)s%(url)s"
msgstr ""
-#: contrib/comments/models.py:168
+#: contrib/comments/models.py:171
msgid "person's name"
msgstr ""
-#: contrib/comments/models.py:171
+#: contrib/comments/models.py:174
msgid "ip address"
msgstr ""
-#: contrib/comments/models.py:173
+#: contrib/comments/models.py:176
msgid "approved by staff"
msgstr ""
-#: contrib/comments/models.py:176
+#: contrib/comments/models.py:179
msgid "free comment"
msgstr ""
-#: contrib/comments/models.py:177
+#: contrib/comments/models.py:180
msgid "free comments"
msgstr ""
-#: contrib/comments/models.py:233
+#: contrib/comments/models.py:239
msgid "score"
msgstr ""
-#: contrib/comments/models.py:234
+#: contrib/comments/models.py:240
msgid "score date"
msgstr ""
-#: contrib/comments/models.py:237
+#: contrib/comments/models.py:243
msgid "karma score"
msgstr ""
-#: contrib/comments/models.py:238
+#: contrib/comments/models.py:244
msgid "karma scores"
msgstr ""
-#: contrib/comments/models.py:242
+#: contrib/comments/models.py:248
#, python-format
msgid "%(score)d rating by %(user)s"
msgstr ""
-#: contrib/comments/models.py:258
+#: contrib/comments/models.py:264
#, python-format
msgid ""
"This comment was flagged by %(user)s:\n"
@@ -1315,73 +1322,40 @@ msgid ""
"%(text)s"
msgstr ""
-#: contrib/comments/models.py:265
+#: contrib/comments/models.py:271
msgid "flag date"
msgstr ""
-#: contrib/comments/models.py:268
+#: contrib/comments/models.py:274
msgid "user flag"
msgstr ""
-#: contrib/comments/models.py:269
+#: contrib/comments/models.py:275
msgid "user flags"
msgstr ""
-#: contrib/comments/models.py:273
+#: contrib/comments/models.py:279
#, python-format
msgid "Flag by %r"
msgstr ""
-#: contrib/comments/models.py:278
+#: contrib/comments/models.py:284
msgid "deletion date"
msgstr ""
-#: contrib/comments/models.py:280
+#: contrib/comments/models.py:286
msgid "moderator deletion"
msgstr ""
-#: contrib/comments/models.py:281
+#: contrib/comments/models.py:287
msgid "moderator deletions"
msgstr ""
-#: contrib/comments/models.py:285
+#: contrib/comments/models.py:291
#, python-format
msgid "Moderator deletion by %r"
msgstr ""
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr ""
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-msgid "Log out"
-msgstr ""
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr ""
-
#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
msgstr ""
@@ -1418,24 +1392,12 @@ msgstr ""
msgid "Your name:"
msgstr ""
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr ""
-
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr ""
-
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr ""
-
-#: contrib/comments/views/comments.py:27
+#: contrib/comments/views/comments.py:28
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
-#: contrib/comments/views/comments.py:111
+#: contrib/comments/views/comments.py:112
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -1450,7 +1412,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: contrib/comments/views/comments.py:116
+#: contrib/comments/views/comments.py:117
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -1458,1097 +1420,1757 @@ msgid ""
"%(text)s"
msgstr ""
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
msgid "Only POSTs are allowed"
msgstr ""
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
msgid "One or more of the required fields wasn't submitted"
msgstr ""
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
msgid ""
"The comment form had an invalid 'target' parameter -- the object ID was "
"invalid"
msgstr ""
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr ""
-#: contrib/sites/models.py:10
-msgid "domain name"
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
msgstr ""
-#: contrib/sites/models.py:11
-msgid "display name"
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
msgstr ""
-#: contrib/sites/models.py:15
-msgid "site"
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
msgstr ""
-#: contrib/sites/models.py:16
-msgid "sites"
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
msgstr ""
-#: contrib/admin/filterspecs.py:40
-#, python-format
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
msgid ""
-"<h3>By %s:</h3>\n"
-"<ul>\n"
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
msgstr ""
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
-msgid "All"
+#: contrib/flatpages/models.py:9
+msgid "title"
msgstr ""
-#: contrib/admin/filterspecs.py:109
-msgid "Any date"
+#: contrib/flatpages/models.py:10
+msgid "content"
msgstr ""
-#: contrib/admin/filterspecs.py:110
-msgid "Today"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
msgstr ""
-#: contrib/admin/filterspecs.py:113
-msgid "Past 7 days"
+#: contrib/flatpages/models.py:12
+msgid "template name"
msgstr ""
-#: contrib/admin/filterspecs.py:115
-msgid "This month"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-#: contrib/admin/filterspecs.py:117
-msgid "This year"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
msgstr ""
-#: contrib/admin/models.py:16
-msgid "action time"
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
msgstr ""
-#: contrib/admin/models.py:19
-msgid "object id"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
msgstr ""
-#: contrib/admin/models.py:20
-msgid "object repr"
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
msgstr ""
-#: contrib/admin/models.py:21
-msgid "action flag"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
msgstr ""
-#: contrib/admin/models.py:22
-msgid "change message"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
msgstr ""
-#: contrib/admin/models.py:25
-msgid "log entry"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
msgstr ""
-#: contrib/admin/models.py:26
-msgid "log entries"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
msgstr ""
-#: contrib/admin/templatetags/admin_list.py:247
-msgid "All dates"
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/auth/user/change_password.html:12
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-msgid "Home"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-msgid "Documentation"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:25
-#: 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/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-msgid "Change password"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:9
-msgid ""
-"\n"
-"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
-"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
-"select the bookmarklet from any page in the site. Note that some of these\n"
-"bookmarklets require you to be viewing the site from a computer designated\n"
-"as \"internal\" (talk to your system administrator if you aren't sure if\n"
-"your computer is \"internal\").</p>\n"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
-msgid ""
-"Jumps you from any page to the documentation for the view that generates "
-"that page."
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/localflavor/ar/forms.py:30 contrib/localflavor/ar/forms.py:38
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:61 contrib/localflavor/br/forms.py:103
+#: contrib/localflavor/pe/forms.py:34 contrib/localflavor/pe/forms.py:57
+msgid "This field requires only numbers."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:64
+msgid "This field requires 7 or 8 digits."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:75
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:88
+msgid "Invalid CUIT."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:23
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:35
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:68
msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
+"Select a valid brazilian state. That state is not one of the available "
+"states."
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
+#: contrib/localflavor/br/forms.py:105
+msgid "This field requires at most 11 digits or 14 characters."
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
+#: contrib/localflavor/br/forms.py:115
+msgid "Invalid CPF number."
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
+#: contrib/localflavor/br/forms.py:137
+msgid "This field requires at least 14 digits"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
+#: contrib/localflavor/br/forms.py:147
+msgid "Invalid CNPJ number."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:3
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-msgid "Delete"
+#: contrib/localflavor/ca/forms.py:19
+msgid "Enter a postal code in the format XXX XXX."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
+#: contrib/localflavor/ca/forms.py:81
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
msgstr ""
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
msgstr ""
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
msgstr ""
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
msgstr ""
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
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."
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
msgstr ""
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
msgstr ""
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
msgstr ""
-#: contrib/admin/templates/admin/invalid_setup.html:8
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
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."
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
msgstr ""
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
msgstr ""
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "History"
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "N j, Y, P"
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
-#: contrib/admin/templates/admin/object_history.html:36
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:22
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:14
+#: contrib/localflavor/es/forms.py:73 contrib/localflavor/es/forms.py:108
+#: db/models/fields/related.py:55
#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:91
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:97
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:106
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:136
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:"
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
+#: contrib/localflavor/es/forms.py:150
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:16
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
-"All of the following related items will be deleted:"
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
msgstr ""
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
msgstr ""
-#: contrib/admin/templates/admin/change_list.html:12
-#, python-format
-msgid "Add %(name)s"
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:15
-#: contrib/admin/templates/admin/index.html:28
-msgid "Add"
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:22
-msgid "View on site"
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
msgstr ""
-#: 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] ""
-msgstr[1] ""
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
-#: contrib/admin/templates/admin/change_form.html:50
-msgid "Ordering"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:53
-msgid "Order:"
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
msgstr ""
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
msgstr ""
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
msgstr ""
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
msgstr ""
-#: contrib/admin/templates/admin/login.html:25
-#: contrib/admin/views/decorators.py:24
-msgid "Log in"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
msgstr ""
-#: contrib/admin/templates/admin/index.html:17
-#, python-format
-msgid "Models available in the %(name)s application."
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
msgstr ""
-#: contrib/admin/templates/admin/index.html:18
-#, python-format
-msgid "%(name)s"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
msgstr ""
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
msgstr ""
-#: contrib/admin/templates/admin/index.html:44
-msgid "You don't have permission to edit anything."
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
msgstr ""
-#: contrib/admin/templates/admin/index.html:52
-msgid "Recent Actions"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
msgstr ""
-#: contrib/admin/templates/admin/index.html:53
-msgid "My Actions"
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
msgstr ""
-#: contrib/admin/templates/admin/index.html:57
-msgid "None available"
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
msgstr ""
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
msgstr ""
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
msgstr ""
-#: 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."
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:18
-#: contrib/admin/templates/admin/auth/user/change_password.html:34
-msgid "Password"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:23
-#: contrib/admin/templates/admin/auth/user/change_password.html:39
-msgid "Password (again)"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
msgstr ""
-#: 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."
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/change_password.html:28
-#, python-format
-msgid "Enter a new password for the user <strong>%(username)s</strong>."
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
msgstr ""
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
msgstr ""
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
msgstr ""
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
msgstr ""
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
msgstr ""
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
msgstr ""
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:2
-msgid "You're receiving this e-mail because you requested a password reset"
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:3
-#, python-format
-msgid "for your user account at %(site_name)s"
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:5
-#, python-format
-msgid "Your new password is: %(new_password)s"
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:7
-msgid "Feel free to change this password by going to this page:"
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:11
-msgid "Your username, in case you've forgotten:"
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:13
-msgid "Thanks for using our site!"
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:15
-#, python-format
-msgid "The %(site_name)s team"
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
msgstr ""
-#: 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"
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
msgstr ""
-#: 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."
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
msgstr ""
-#: 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
-#: contrib/admin/templates/registration/password_change_done.html:4
-msgid "Password change"
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
msgstr ""
-#: 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."
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
msgstr ""
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
msgstr ""
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
msgstr ""
-#: 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."
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
+#: contrib/localflavor/nl/forms.py:25
+msgid "Enter a valid postal code"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
+#: contrib/localflavor/nl/forms.py:53
+msgid "Enter a valid phone number"
msgstr ""
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
+#: contrib/localflavor/nl/forms.py:76
+msgid "Enter a valid SoFi number"
msgstr ""
-#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
msgstr ""
-#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:24
-msgid "You may edit it again below."
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
msgstr ""
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
-#, python-format
-msgid "You may add another %s below."
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
msgstr ""
-#: contrib/admin/views/main.py:289
-#, python-format
-msgid "Add %s"
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
msgstr ""
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
msgstr ""
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
msgstr ""
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
msgstr ""
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
msgstr ""
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
msgstr ""
-#: contrib/admin/views/main.py:353
-#, python-format
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:36
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:59
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:41
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:47
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
msgstr ""
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
+#: contrib/localflavor/pl/forms.py:78
+msgid "Wrong checksum for the Tax Number (NIP)."
msgstr ""
-#: contrib/admin/views/main.py:476
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+#: contrib/localflavor/pl/forms.py:107
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
msgstr ""
-#: contrib/admin/views/main.py:481
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
msgstr ""
-#: contrib/admin/views/main.py:514
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+#: contrib/localflavor/pl/forms.py:148
+msgid "Enter a postal code in the format XX-XXX."
msgstr ""
-#: contrib/admin/views/main.py:517
-msgid "Are you sure?"
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
msgstr ""
-#: contrib/admin/views/main.py:539
-#, python-format
-msgid "Change history: %s"
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
msgstr ""
-#: contrib/admin/views/main.py:573
-#, python-format
-msgid "Select %s"
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
msgstr ""
-#: contrib/admin/views/main.py:573
-#, python-format
-msgid "Select %s to change"
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
msgstr ""
-#: contrib/admin/views/main.py:768
-msgid "Database error"
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
msgstr ""
-#: contrib/admin/views/decorators.py:62
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
msgstr ""
-#: 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."
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
msgstr ""
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
msgstr ""
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
msgstr ""
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
-msgid "tag:"
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
msgstr ""
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
-msgid "filter:"
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
msgstr ""
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
-msgid "view:"
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
msgstr ""
-#: contrib/admin/views/doc.py:164
-#, python-format
-msgid "App %r not found"
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
msgstr ""
-#: contrib/admin/views/doc.py:171
-#, python-format
-msgid "Model %(name)r not found in app %(label)r"
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
msgstr ""
-#: contrib/admin/views/doc.py:183
-#, python-format
-msgid "the related `%(label)s.%(type)s` object"
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
msgstr ""
-#: 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:"
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
msgstr ""
-#: contrib/admin/views/doc.py:214
-#, python-format
-msgid "related `%(label)s.%(name)s` objects"
+#: contrib/localflavor/sk/forms.py:32
+msgid "Enter a postal code in the format XXXXX or XXX XX."
msgstr ""
-#: contrib/admin/views/doc.py:219
-#, python-format
-msgid "all %s"
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
msgstr ""
-#: contrib/admin/views/doc.py:224
-#, python-format
-msgid "number of %s"
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
msgstr ""
-#: contrib/admin/views/doc.py:229
-#, python-format
-msgid "Fields on %s objects"
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
msgstr ""
-#: 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"
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
msgstr ""
-#: contrib/admin/views/doc.py:292
-msgid "Boolean (Either True or False)"
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
msgstr ""
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
-#, python-format
-msgid "String (up to %(maxlength)s)"
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
msgstr ""
-#: contrib/admin/views/doc.py:294
-msgid "Comma-separated integers"
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
msgstr ""
-#: contrib/admin/views/doc.py:295
-msgid "Date (without time)"
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
msgstr ""
-#: contrib/admin/views/doc.py:296
-msgid "Date (with time)"
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
msgstr ""
-#: contrib/admin/views/doc.py:297
-msgid "E-mail address"
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
msgstr ""
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
-msgid "File path"
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
msgstr ""
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
msgstr ""
-#: contrib/admin/views/doc.py:306
-msgid "Boolean (Either True, False or None)"
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
msgstr ""
-#: contrib/admin/views/doc.py:307
-msgid "Relation to parent model"
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
msgstr ""
-#: contrib/admin/views/doc.py:308
-msgid "Phone number"
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
msgstr ""
-#: contrib/admin/views/doc.py:313
-msgid "Text"
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
msgstr ""
-#: contrib/admin/views/doc.py:314
-msgid "Time"
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
msgstr ""
-#: contrib/admin/views/doc.py:316
-msgid "U.S. state (two uppercase letters)"
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
msgstr ""
-#: contrib/admin/views/doc.py:317
-msgid "XML text"
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
msgstr ""
-#: contrib/admin/views/doc.py:343
-#, python-format
-msgid "%s does not appear to be a urlpattern object"
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
msgstr ""
-#: contrib/admin/views/auth.py:30
-msgid "Add user"
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
msgstr ""
-#: contrib/admin/views/auth.py:57
-msgid "Password changed successfully."
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
msgstr ""
-#: contrib/admin/views/auth.py:64
-#, python-format
-msgid "Change password: %s"
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
msgstr ""
-#: newforms/fields.py:103 newforms/fields.py:256
-#, python-format
-msgid "Ensure this value has at most %d characters."
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
msgstr ""
-#: newforms/fields.py:105 newforms/fields.py:258
-#, python-format
-msgid "Ensure this value has at least %d characters."
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
msgstr ""
-#: newforms/fields.py:128 core/validators.py:120
-msgid "Enter a whole number."
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
msgstr ""
-#: newforms/fields.py:130
-#, python-format
-msgid "Ensure this value is less than or equal to %s."
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
msgstr ""
-#: newforms/fields.py:132
-#, python-format
-msgid "Ensure this value is greater than or equal to %s."
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
msgstr ""
-#: newforms/fields.py:165
-msgid "Enter a valid date."
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
msgstr ""
-#: newforms/fields.py:192
-msgid "Enter a valid time."
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
msgstr ""
-#: newforms/fields.py:228
-msgid "Enter a valid date/time."
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
msgstr ""
-#: newforms/fields.py:242
-msgid "Enter a valid value."
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
msgstr ""
-#: newforms/fields.py:271 core/validators.py:162
-msgid "Enter a valid e-mail address."
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
msgstr ""
-#: newforms/fields.py:289 newforms/fields.py:311
-msgid "Enter a valid URL."
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
msgstr ""
-#: newforms/fields.py:313
-msgid "This URL appears to be a broken link."
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
msgstr ""
-#: newforms/fields.py:362 newforms/models.py:165
-msgid "Select a valid choice. That choice is not one of the available choices."
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
msgstr ""
-#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
-msgid "Enter a list of values."
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
msgstr ""
-#: newforms/fields.py:389 newforms/models.py:188
-#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
msgstr ""
-#: template/defaultfilters.py:491
-msgid "yes,no,maybe"
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
msgstr ""
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
msgstr ""
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
msgstr ""
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
msgstr ""
-#: core/validators.py:64
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr ""
+
+#: contrib/sessions/models.py:80
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:81
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:82
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:87
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:88
+msgid "sessions"
+msgstr ""
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr ""
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr ""
+
+#: core/validators.py:72
msgid "This value must contain only letters, numbers and underscores."
msgstr ""
-#: core/validators.py:68
+#: core/validators.py:76
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-#: core/validators.py:72
+#: core/validators.py:80
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
-#: core/validators.py:76
+#: core/validators.py:84
msgid "Uppercase letters are not allowed here."
msgstr ""
-#: core/validators.py:80
+#: core/validators.py:88
msgid "Lowercase letters are not allowed here."
msgstr ""
-#: core/validators.py:87
+#: core/validators.py:95
msgid "Enter only digits separated by commas."
msgstr ""
-#: core/validators.py:99
+#: core/validators.py:107
msgid "Enter valid e-mail addresses separated by commas."
msgstr ""
-#: core/validators.py:103
+#: core/validators.py:111
msgid "Please enter a valid IP address."
msgstr ""
-#: core/validators.py:107
+#: core/validators.py:115
msgid "Empty values are not allowed here."
msgstr ""
-#: core/validators.py:111
+#: core/validators.py:119
msgid "Non-numeric characters aren't allowed here."
msgstr ""
-#: core/validators.py:115
+#: core/validators.py:123
msgid "This value can't be comprised solely of digits."
msgstr ""
-#: core/validators.py:124
+#: core/validators.py:128 newforms/fields.py:157
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:132
msgid "Only alphabetical characters are allowed here."
msgstr ""
-#: core/validators.py:139
+#: core/validators.py:147
msgid "Year must be 1900 or later."
msgstr ""
-#: core/validators.py:143
+#: core/validators.py:151
#, python-format
msgid "Invalid date: %s"
msgstr ""
-#: core/validators.py:153
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:161
msgid "Enter a valid time in HH:MM format."
msgstr ""
-#: core/validators.py:178
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:170 newforms/fields.py:408
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:438
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:193 newforms/fields.py:462
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: core/validators.py:185
+#: core/validators.py:200
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr ""
-#: core/validators.py:189
+#: core/validators.py:204
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-#: core/validators.py:197
+#: core/validators.py:212
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr ""
-#: core/validators.py:201
+#: core/validators.py:216
msgid "A valid URL is required."
msgstr ""
-#: core/validators.py:215
+#: core/validators.py:230
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-#: core/validators.py:222
+#: core/validators.py:237
#, python-format
msgid "Badly formed XML: %s"
msgstr ""
-#: core/validators.py:239
+#: core/validators.py:254
#, python-format
msgid "Invalid URL: %s"
msgstr ""
-#: core/validators.py:244 core/validators.py:246
+#: core/validators.py:259 core/validators.py:261
#, python-format
msgid "The URL %s is a broken link."
msgstr ""
-#: core/validators.py:252
+#: core/validators.py:267
msgid "Enter a valid U.S. state abbreviation."
msgstr ""
-#: core/validators.py:266
+#: core/validators.py:281
#, 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] ""
msgstr[1] ""
-#: core/validators.py:273
+#: core/validators.py:288
#, python-format
msgid "This field must match the '%s' field."
msgstr ""
-#: core/validators.py:292
+#: core/validators.py:307
msgid "Please enter something for at least one field."
msgstr ""
-#: core/validators.py:301 core/validators.py:312
+#: core/validators.py:316 core/validators.py:327
msgid "Please enter both fields or leave them both empty."
msgstr ""
-#: core/validators.py:320
+#: core/validators.py:335
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr ""
-#: core/validators.py:333
+#: core/validators.py:348
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr ""
-#: core/validators.py:352
+#: core/validators.py:367
msgid "Duplicate values are not allowed."
msgstr ""
-#: core/validators.py:367
+#: core/validators.py:382
#, python-format
msgid "This value must be between %(lower)s and %(upper)s."
msgstr ""
-#: core/validators.py:369
+#: core/validators.py:384
#, python-format
msgid "This value must be at least %s."
msgstr ""
-#: core/validators.py:371
+#: core/validators.py:386
#, python-format
msgid "This value must be no more than %s."
msgstr ""
-#: core/validators.py:407
+#: core/validators.py:427
#, python-format
msgid "This value must be a power of %s."
msgstr ""
-#: core/validators.py:418
+#: core/validators.py:437
msgid "Please enter a valid decimal number."
msgstr ""
-#: core/validators.py:422
+#: core/validators.py:444
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
@@ -2556,7 +3178,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:425
+#: core/validators.py:447
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
@@ -2565,7 +3187,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:428
+#: core/validators.py:450
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -2573,73 +3195,574 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:438
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr ""
+
+#: core/validators.py:467
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-#: core/validators.py:439
+#: core/validators.py:468
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-#: core/validators.py:456
+#: core/validators.py:485
msgid "The format for this field is wrong."
msgstr ""
-#: core/validators.py:471
+#: core/validators.py:500
msgid "This field is invalid."
msgstr ""
-#: core/validators.py:507
+#: core/validators.py:536
#, python-format
msgid "Could not retrieve anything from %s."
msgstr ""
-#: core/validators.py:510
+#: core/validators.py:539
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-#: core/validators.py:543
+#: core/validators.py:572
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-#: core/validators.py:547
+#: core/validators.py:576
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-#: core/validators.py:552
+#: core/validators.py:581
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-#: core/validators.py:557
+#: core/validators.py:586
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-#: core/validators.py:561
+#: core/validators.py:590
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-#: core/validators.py:566
+#: core/validators.py:595
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr ""
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr ""
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr ""
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/__init__.py:904
+msgid "This value must be either None, True or False."
+msgstr ""
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:660
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:707
+#, 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] ""
+msgstr[1] ""
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr ""
+
+#: newforms/fields.py:129
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:158 newforms/fields.py:187 newforms/fields.py:216
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:159 newforms/fields.py:188 newforms/fields.py:217
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:186 newforms/fields.py:215
+msgid "Enter a number."
+msgstr ""
+
+#: newforms/fields.py:218
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr ""
+
+#: newforms/fields.py:219
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr ""
+
+#: newforms/fields.py:220
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+
+#: newforms/fields.py:268 newforms/fields.py:724
+msgid "Enter a valid date."
+msgstr ""
+
+#: newforms/fields.py:301 newforms/fields.py:725
+msgid "Enter a valid time."
+msgstr ""
+
+#: newforms/fields.py:340
+msgid "Enter a valid date/time."
+msgstr ""
+
+#: newforms/fields.py:439
+msgid "No file was submitted."
+msgstr ""
+
+#: newforms/fields.py:440 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr ""
+
+#: newforms/fields.py:498
+msgid "Enter a valid URL."
+msgstr ""
+
+#: newforms/fields.py:499
+msgid "This URL appears to be a broken link."
+msgstr ""
+
+#: newforms/fields.py:560 newforms/models.py:155
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:599
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:215
+msgid "Enter a list of values."
+msgstr ""
+
+#: newforms/fields.py:753
+msgid "Enter a valid IPv4 address."
+msgstr ""
+
+#: newforms/models.py:216
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr ""
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:658
+msgid "yes,no,maybe"
+msgstr ""
+
+#: template/defaultfilters.py:689
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:691
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:693
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:694
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr ""
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "December"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr ""
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr ""
+
+#: utils/text.py:127
+msgid "or"
+msgstr ""
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr ""
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/translation/trans_real.py:399
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:400
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:401
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:417
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:418
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr ""
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr ""
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr ""
diff --git a/django/conf/locale/en/LC_MESSAGES/djangojs.mo b/django/conf/locale/en/LC_MESSAGES/djangojs.mo
index b51ec1c702..41cc5b54c0 100644
--- a/django/conf/locale/en/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/en/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/en/LC_MESSAGES/djangojs.po b/django/conf/locale/en/LC_MESSAGES/djangojs.po
index 802e0db605..c90b390589 100644
--- a/django/conf/locale/en/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/en/LC_MESSAGES/djangojs.po
@@ -7,12 +7,12 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"POT-Creation-Date: 2007-11-29 10:58-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: contrib/admin/media/js/SelectFilter2.js:33
@@ -45,64 +45,73 @@ msgstr ""
msgid "Clear all"
msgstr ""
-#: contrib/admin/media/js/dateparse.js:26
#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
-#: contrib/admin/media/js/dateparse.js:27
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr ""
-#: contrib/admin/media/js/calendar.js:25
-msgid "S M T W T F S"
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr ""
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr ""
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo
index 798f8d72c4..b5ed35225d 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.mo
+++ b/django/conf/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po
index 0fa18ce80c..e8516bba33 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.po
+++ b/django/conf/locale/pl/LC_MESSAGES/django.po
@@ -5,147 +5,16 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-05-08 20:19+0200\n"
+"POT-Creation-Date: 2007-11-15 15:28+0100\n"
"PO-Revision-Date: 2007-05-08 20:29+0200\n"
-"Last-Translator: Michal Chruszcz <troll@pld-linux.org>\n"
+"Last-Translator: Jarek Zgoda <jarek.zgoda@gmail.com>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
-#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:612
-#: db/models/fields/__init__.py:623 newforms/models.py:178
-#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
-#: newforms/fields.py:463
-msgid "This field is required."
-msgstr "To pole jest wymagane."
-
-#: 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] "Upewnij się, że tekst ma mniej niż %s znak."
-msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaki."
-msgstr[2] "Upewnij się, że tekst ma mniej niż %s znaków."
-
-#: oldforms/__init__.py:397
-msgid "Line breaks are not allowed here."
-msgstr "Znaki nowej linii są tutaj niedopuszczalne."
-
-#: 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 "Wybierz poprawną opcję; '%(data)s' nie jest wśród %(choices)s."
-
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Nieznany"
-
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Tak"
-
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Nie"
-
-#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
-msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza."
-
-#: oldforms/__init__.py:674
-msgid "The submitted file is empty."
-msgstr "Wysłany plik jest pusty."
-
-#: oldforms/__init__.py:730
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Proszę wpisać liczbę całkowitą z zakresu od -32 768 do 32 767"
-
-#: oldforms/__init__.py:740
-msgid "Enter a positive number."
-msgstr "Proszę wpisać liczbę dodatnią."
-
-#: oldforms/__init__.py:750
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Proszę wpisać liczbę całkowitą z zakresu od 0 do 32 767"
-
-#: db/models/manipulators.py:307
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s z %(type)s już istnieje dla %(field)s."
-
-#: db/models/manipulators.py:308 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340 contrib/admin/views/main.py:342
-msgid "and"
-msgstr "i"
-
-#: db/models/fields/__init__.py:42
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "Już istnieje %(optname)s z %(fieldname)s."
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be an integer."
-msgstr "Ta wartość musi być liczbą całkowitą."
-
-#: db/models/fields/__init__.py:404
-msgid "This value must be either True or False."
-msgstr "Ta wartość musi być logiczna (True, False - prawda lub fałsz)."
-
-#: db/models/fields/__init__.py:425
-msgid "This field cannot be null."
-msgstr "To pole nie może być puste."
-
-#: db/models/fields/__init__.py:459 core/validators.py:148
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
-
-#: db/models/fields/__init__.py:528 core/validators.py:157
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Wprowadź poprawną datę i godzinę w formacie RRRR-MM-DD GG:MM."
-
-#: db/models/fields/__init__.py:632
-msgid "Enter a valid filename."
-msgstr "Wpisz poprawną nazwę pliku."
-
-#: db/models/fields/__init__.py:753
-msgid "This value must be either None, True or False."
-msgstr "Ta wartość musi być jedną z None (żadne), True (prawda) lub False (fałsz)."
-
-#: db/models/fields/related.py:53
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Proszę wpisać poprawne %s."
-
-#: db/models/fields/related.py:642
-msgid "Separate multiple IDs with commas."
-msgstr "Oddziel identyfikatory przecinkami."
-
-#: db/models/fields/related.py:644
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Przytrzymaj wciśnięty klawisz \"Ctrl\" lub \"Command\" na Mac'u aby "
-"zaznaczyć więcej niż jeden wybór."
-
-#: 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] ""
-"Proszę podać poprawne identyfikatory %(self)s. Wartość %(value)r jest "
-"niepoprawna."
-msgstr[1] ""
-"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
-"niepoprawne."
-msgstr[2] ""
-"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
-"niepoprawne."
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%"
+"100<10 || n%100>=20) ? 1 : 2);\n"
#: conf/global_settings.py:39
msgid "Arabic"
@@ -156,1075 +25,773 @@ msgid "Bengali"
msgstr "Bengalski"
#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bułgarski"
+
+#: conf/global_settings.py:42
msgid "Catalan"
msgstr "Kataloński"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:43
msgid "Czech"
msgstr "Czeski"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:44
msgid "Welsh"
msgstr "Walijski"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:45
msgid "Danish"
msgstr "Duński"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:46
msgid "German"
msgstr "Niemiecki"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:47
msgid "Greek"
msgstr "Grecki"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:48
msgid "English"
msgstr "Angielski"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:49
msgid "Spanish"
msgstr "Hiszpański"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:50
msgid "Argentinean Spanish"
msgstr "Hiszpański argentyński"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Perski"
+
+#: conf/global_settings.py:52
msgid "Finnish"
msgstr "Fiński"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:53
msgid "French"
msgstr "Francuski"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr "Gaelicki"
+
+#: conf/global_settings.py:55
msgid "Galician"
msgstr "Galicyjski"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:56
msgid "Hungarian"
msgstr "Węgierski"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:57
msgid "Hebrew"
msgstr "Hebrajski"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr "Horwacki"
+
+#: conf/global_settings.py:59
msgid "Icelandic"
msgstr "Islandzki"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:60
msgid "Italian"
msgstr "Włoski"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:61
msgid "Japanese"
msgstr "Japoński"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:62
msgid "Korean"
msgstr "Koreański"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr "Khmerski"
+
+#: conf/global_settings.py:64
msgid "Kannada"
msgstr "Kannada"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:65
msgid "Latvian"
msgstr "Łotewski"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:66
msgid "Macedonian"
msgstr "Macedoński"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:67
msgid "Dutch"
msgstr "Holenderski"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:68
msgid "Norwegian"
msgstr "Norweski"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:69
msgid "Polish"
msgstr "Polski"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:70
msgid "Portugese"
msgstr "Portugalski"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:71
msgid "Brazilian"
msgstr "Brazylijski"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:72
msgid "Romanian"
msgstr "Rumuński"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:73
msgid "Russian"
msgstr "Rosyjski"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:74
msgid "Slovak"
msgstr "Słowacki"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:75
msgid "Slovenian"
msgstr "Słoweński"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:76
msgid "Serbian"
msgstr "Serbski"
-#: conf/global_settings.py:72
+#: conf/global_settings.py:77
msgid "Swedish"
msgstr "Szwedzki"
-#: conf/global_settings.py:73
+#: conf/global_settings.py:78
msgid "Tamil"
msgstr "Tamilski"
-#: conf/global_settings.py:74
+#: conf/global_settings.py:79
msgid "Telugu"
msgstr "Telugu"
-#: conf/global_settings.py:75
+#: conf/global_settings.py:80
msgid "Turkish"
msgstr "Turecki"
-#: conf/global_settings.py:76
+#: conf/global_settings.py:81
msgid "Ukrainian"
msgstr "Ukraiński"
-#: conf/global_settings.py:77
+#: conf/global_settings.py:82
msgid "Simplified Chinese"
msgstr "Uproszczony chiński"
-#: conf/global_settings.py:78
+#: conf/global_settings.py:83
msgid "Traditional Chinese"
msgstr "Chiński tradycyjny"
-#: core/validators.py:64
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "To pole może zawierać tylko litery, cyfry i podkreślenia."
-
-#: core/validators.py:68
+#: contrib/admin/filterspecs.py:44
+#, python-format
msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
+"<h3>By %s:</h3>\n"
+"<ul>\n"
msgstr ""
-"To pole może zawierać jedynie litery, cyfry, podkreślenia, myślniki i "
-"ukośniki."
-
-#: core/validators.py:72
-msgid "This value must contain only letters, numbers, underscores or hyphens."
-msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i pauzy."
-
-#: core/validators.py:76
-msgid "Uppercase letters are not allowed here."
-msgstr "Wielkie litery nie są tutaj dozwolone."
-
-#: core/validators.py:80
-msgid "Lowercase letters are not allowed here."
-msgstr "Małe litery nie są tutaj dozwolone."
-
-#: core/validators.py:87
-msgid "Enter only digits separated by commas."
-msgstr "Wpisz tylko cyfry odddzielone przecinkami."
-
-#: core/validators.py:99
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Wpisz poprawne adresy e-mail oddzielone przecinkami."
-
-#: core/validators.py:103
-msgid "Please enter a valid IP address."
-msgstr "Proszę wpisać poprawny adres IP."
-
-#: core/validators.py:107
-msgid "Empty values are not allowed here."
-msgstr "Proszę wypełnić te pola."
-
-#: core/validators.py:111
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Tu mogą być tylko cyfry."
-
-#: core/validators.py:115
-msgid "This value can't be comprised solely of digits."
-msgstr "To pole nie może zawierać jedynie cyfr."
-
-#: core/validators.py:120 newforms/fields.py:128
-msgid "Enter a whole number."
-msgstr "Wpisz liczbę całkowitą."
-
-#: core/validators.py:124
-msgid "Only alphabetical characters are allowed here."
-msgstr "Tutaj są dozwolone tylko litery."
-
-#: core/validators.py:139
-msgid "Year must be 1900 or later."
-msgstr "Rok nie może być wcześniejszy niż 1900."
-
-#: core/validators.py:143
-#, python-format
-msgid "Invalid date: %s"
-msgstr "Niepoprawna data: %s"
+"<h3>Przez %s:</h3>\n"
+"</ul>\n"
-#: core/validators.py:153
-msgid "Enter a valid time in HH:MM format."
-msgstr "Proszę wpisać poprawną godzinę w formacie HH:MM."
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Wszystko"
-#: core/validators.py:162 newforms/fields.py:271
-msgid "Enter a valid e-mail address."
-msgstr "Wprowadź poprawny adres e-mail."
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Dowolna data"
-#: core/validators.py:178
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Wgraj poprawny plik graficzny. Ten, który został wgrany, nie jest obrazem, "
-"albo jest uszkodzony."
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Dzisiaj"
-#: core/validators.py:185
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Ostatnie 7 dni"
-#: core/validators.py:189
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
-"niepoprawny."
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Ten miesiąc"
-#: core/validators.py:197
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Odnośnik %s nie wskazuje na poprawne nagranie QuickTime video."
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Ten rok"
-#: core/validators.py:201
-msgid "A valid URL is required."
-msgstr "Wymagany jest poprawny URL."
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:229
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Tak"
-#: core/validators.py:215
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Wymagany jest poprawny HTML. Błędy, które wystąpiły:\n"
-"%s"
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:229
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Nie"
-#: core/validators.py:222
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Nieprawidłowy format XML: %s"
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:229
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Nieznany"
-#: core/validators.py:239
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Niepoprawny odnośnik: %s"
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "czas akcji"
-#: core/validators.py:244 core/validators.py:246
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "Odnośnik %s jest nieprawidłowy."
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "id obiektu"
-#: core/validators.py:252
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Wpisz poprawny kod stanu U.S.A."
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "reprezentacj obiektu"
-#: 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] "Nie wolno przeklinać! Słowo %s nie jest dozwolone."
-msgstr[1] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
-msgstr[2] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "flaga akcji"
-#: core/validators.py:273
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "To pole musi pasować do pola '%s'."
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "zmień wiadomość"
-#: core/validators.py:292
-msgid "Please enter something for at least one field."
-msgstr "Proszę uzupełnić przynajmniej jedno pole."
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "log"
-#: core/validators.py:301 core/validators.py:312
-msgid "Please enter both fields or leave them both empty."
-msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "logi"
-#: core/validators.py:320
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość %(value)s"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
-#: core/validators.py:333
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość inną niż %(value)s"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Niestety nie można znaleźć rządanej strony."
-#: core/validators.py:352
-msgid "Duplicate values are not allowed."
-msgstr "Duplikaty nie są dozwolone."
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Początek"
-#: core/validators.py:367
-#, python-format
-msgid "This value must be between %(lower)s and %(upper)s."
-msgstr "Ta wartość musi być pomiędzy %(lower)s a %(upper)s."
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Błąd serwera"
-#: core/validators.py:369
-#, python-format
-msgid "This value must be at least %s."
-msgstr "Ta wartość nie może być mniejsza od %s."
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Bład serwera (500)"
-#: core/validators.py:371
-#, python-format
-msgid "This value must be no more than %s."
-msgstr "Ta wartość nie może być większa od %s."
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Błąd Serwera <em>(500)</em>"
-#: core/validators.py:407
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Ta wartość musi być potęgą %s."
+#: 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 ""
+"Wystąpił niespodziewany błąd. Raport został wysłany emailem administratorowi "
+"strony."
-#: core/validators.py:418
-msgid "Please enter a valid decimal number."
-msgstr "Proszę wpisać poprawną liczbę dziesiętną."
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Witaj,"
-#: 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."
-msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrze."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
-msgstr[2] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacja"
-#: 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] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfrę."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry."
-msgstr[2] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Zmiana hasła"
-#: 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] ""
-"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po "
-"przecinku."
-msgstr[1] ""
-"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
-"przecinku."
-msgstr[2] ""
-"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
-"przecinku."
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Wyloguj się"
-#: core/validators.py:438
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Upewnij się, że wgrany plik ma conajmniej %s bajtów."
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administracja stroną Django"
-#: core/validators.py:439
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Upewnij się, że wgrany plik ma co najwyżej %s bajtów."
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administracja Django"
-#: core/validators.py:456
-msgid "The format for this field is wrong."
-msgstr "Format tego pola jest nieprawidłowy."
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Dodaj"
-#: core/validators.py:471
-msgid "This field is invalid."
-msgstr "To pole jest nieprawidłowe."
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Historia"
-#: core/validators.py:507
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Nie można nic pobrać z %s."
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pokaż na stronie"
-#: core/validators.py:510
-#, python-format
-msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr "URL %(url)s zwrócił niepoprawny nagłówek Content-Type '%(contenttype)s'."
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Proszę popraw poniższy błąd"
+msgstr[1] "Proszę popraw poniższe błędy"
+msgstr[2] "Proszę popraw poniższe błędy"
-#: core/validators.py:543
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Proszę zamknąć tag %(tag)s z linii %(line)s. (Linia zaczyna się od \"%(start)"
-"s\".)"
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Sortowanie"
-#: 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 ""
-"Część tekstu od linii %(line)s nie jest dozwolony w tym kontekście. (Linia "
-"zaczyna się od \"%(start)s\".)"
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Porządek:"
-#: core/validators.py:552
+#: contrib/admin/templates/admin/change_list.html:11
#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"%(attr)s\" w linii %(line)s jest niepoprawnym atrybutem. (Linia zaczyna "
-"się od \"%(start)s\".)"
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
-#: 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>\" w linii %(line)s nie jest poprawnym tagiem. (Linia zaczyna się "
-"od \"%(start)s\".)"
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Usuń"
-#: core/validators.py:561
+#: contrib/admin/templates/admin/delete_confirmation.html:13
#, python-format
msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
+"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 ""
-"Tag w linii %(line)s nie posiada jednego lub więcej wymaganych atrybutów. "
-"(Linia zaczyna się od \"%(start)s\".)"
+"Skasowanie %(object_name)s '%(escaped_object)s' spowoduje usunięcie "
+"zależnych obiektów, lecz nie posiadasz uprawnień do usunięcia następujących "
+"typów obiektów:"
-#: core/validators.py:566
+#: contrib/admin/templates/admin/delete_confirmation.html:20
#, python-format
msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Atrybut \"%(attr)s\" w linii %(line)s ma niepoprawną wartość. (Linia zaczyna "
-"się od \"%(start)s\".)"
-
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "%(verbose_name)s zostało pomyślnie utworzone."
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "%(verbose_name)s zostało pomyślnie zmienione."
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "%(verbose_name)s zostało usunięte."
-
-#: newforms/models.py:165 newforms/fields.py:364
-msgid "Select a valid choice. That choice is not one of the available choices."
-msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów."
-
-#: newforms/models.py:182 newforms/fields.py:380 newforms/fields.py:456
-msgid "Enter a list of values."
-msgstr "Podaj listę wartości."
-
-#: newforms/models.py:188 newforms/fields.py:389
-#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
-msgstr "Wybierz poprawną wartość. %s nie jest jednym z dostępnych wyborów."
-
-#: newforms/fields.py:103 newforms/fields.py:256
-#, python-format
-msgid "Ensure this value has at most %d characters."
-msgstr "Upewnij się, że tekst ma co najwyżej %d znaków."
-
-#: newforms/fields.py:105 newforms/fields.py:258
-#, python-format
-msgid "Ensure this value has at least %d characters."
-msgstr "Upewnij się, że tekst ma co najmniej %d znaków."
+"Czy chcesz skasować %(object_name)s \"%(escaped_object)s\"? Następujące "
+"zależne obiekty zostaną skasowane:"
-#: newforms/fields.py:130
-#, python-format
-msgid "Ensure this value is less than or equal to %s."
-msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %s."
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Tak, usuń"
-#: newforms/fields.py:132
+#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid "Ensure this value is greater than or equal to %s."
-msgstr "Upewnij się, że ta wartość jest większa lub równa %s."
-
-#: newforms/fields.py:165
-msgid "Enter a valid date."
-msgstr "Wpisz poprawną datę."
-
-#: newforms/fields.py:192
-msgid "Enter a valid time."
-msgstr "Wpisz poprawną godzinę."
-
-#: newforms/fields.py:228
-msgid "Enter a valid date/time."
-msgstr "Wpisz poprawną datę/godzinę."
-
-#: newforms/fields.py:242
-msgid "Enter a valid value."
-msgstr "Wpisz poprawną wartość."
-
-#: newforms/fields.py:289 newforms/fields.py:311
-msgid "Enter a valid URL."
-msgstr "Wpisz poprawny URL."
-
-#: newforms/fields.py:313
-msgid "This URL appears to be a broken link."
-msgstr "Ten odnośnik jest nieprawidłowy."
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "th"
-msgstr "-y"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "st"
-msgstr "-szy"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "nd"
-msgstr "-gi"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "rd"
-msgstr "-ci"
+msgid " By %(filter_title)s "
+msgstr " Używając %(filter_title)s "
-#: contrib/humanize/templatetags/humanize.py:47
-#, python-format
-msgid "%(value).1f million"
-msgid_plural "%(value).1f million"
-msgstr[0] "%(value).1f milion"
-msgstr[1] "%(value).1f miliony"
-msgstr[2] "%(value).1f milionów"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtr"
-#: contrib/humanize/templatetags/humanize.py:50
+#: contrib/admin/templates/admin/index.html:17
#, python-format
-msgid "%(value).1f billion"
-msgid_plural "%(value).1f billion"
-msgstr[0] "%(value).1f miliard"
-msgstr[1] "%(value).1f miliardy"
-msgstr[2] "%(value).1f miliardów"
+msgid "Models available in the %(name)s application."
+msgstr "Modele dostępne w aplikacji %(name)s."
-#: contrib/humanize/templatetags/humanize.py:53
+#: contrib/admin/templates/admin/index.html:18
#, python-format
-msgid "%(value).1f trillion"
-msgid_plural "%(value).1f trillion"
-msgstr[0] "%(value).1f bilion"
-msgstr[1] "%(value).1f biliony"
-msgstr[2] "%(value).1f bilionów"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "one"
-msgstr "jeden"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "two"
-msgstr "dwa"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "three"
-msgstr "trzy"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "four"
-msgstr "cztery"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "five"
-msgstr "pięć"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "six"
-msgstr "sześć"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "seven"
-msgstr "siedem"
+msgid "%(name)s"
+msgstr "%(name)s"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "eight"
-msgstr "osiem"
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Zmień"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "nine"
-msgstr "dziewięć"
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nie masz uprawnień by edytować cokolwiek"
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "przekieruj z"
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Ostatnie akcje"
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr "Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/events/search/'."
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje akcje"
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "przekierowanie do"
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Brak"
-#: contrib/redirects/models.py:10
+#: contrib/admin/templates/admin/invalid_setup.html:8
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr "Ścieżka jak wyżej lub pełny URL z http://"
-
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "przekieruj"
-
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "przekierowania"
-
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "ID obiektu"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "nagłówek"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "komentarz"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "ocena #1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "ocena #2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "ocena #3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "ocena #4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "ocena #5"
-
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "ocena #6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "ocena #7"
+"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 ""
+"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie "
+"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich "
+"odczytu."
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "ocena #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 "Nazwa użytkownika:"
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "jest poprawną oceną"
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Hasło:"
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "data/czas dodania"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr "Zaloguj się"
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "publicznie dostepny"
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Data/czas"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
-msgid "IP address"
-msgstr "Adres IP"
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Użytkownik"
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "usunięty"
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Akcja"
-#: 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."
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
msgstr ""
-"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie "
-"tekst \"Ten komentarz został usunięty\". "
-#: contrib/comments/models.py:91
-msgid "comments"
-msgstr "komentarze"
-
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Obiekt treści"
-
-#: contrib/comments/models.py:159
-#, python-format
+#: contrib/admin/templates/admin/object_history.html:35
msgid ""
-"Posted by %(user)s at %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
msgstr ""
-"Dodane przez %(user)s dnia %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
-
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "Nazwa osoby"
-
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "adres ip"
+"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis ten nie został "
+"dodany poprzez panel administracyjny."
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "zaakceptowano"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Pokaż wszystko"
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "wolny komentarz"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Szukaj"
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "wolne komentarze"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 wynik"
+msgstr[1] "%(counter)s wyniki"
+msgstr[2] "%(counter)s wyników"
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "ilość punktów"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s trafień"
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "data przyznania punktów"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Zapisz jako nowe"
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "ilość punktów"
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Zapisz i dodaj nowe"
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "wyniki"
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Zapisz i kontynuuj edycję"
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "%(score)d ocenę przez %(user)s"
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Zapisz"
-#: contrib/comments/models.py:258
-#, python-format
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
msgstr ""
-"Komentarz oflagowany przez %(user)s:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "data flagi"
-
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "flaga użytkownika"
-
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "flagi użytkownika"
+"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować "
+"więcej opcji użytkownika."
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Flaga %r"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nazwa użytkownika"
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "data skasowania"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Hasło"
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "usunięcie moderatora"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Hasło (powtórz)"
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "usunięcia moderatorów"
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Podaj powyższe hasło w celu weryfikacji."
-#: contrib/comments/models.py:285
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Usunięcie moderatora przez %r"
-
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Anonimowi użytkownicy nie mogą głosować"
-
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "Błędny ID komentarza"
-
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "Nie można głosować na siebie"
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Podaj nowe hasło dla użytkownika <strong>%(username)s</strong>."
-#: contrib/comments/views/comments.py:27
-msgid "This rating is required because you've entered at least one other rating."
-msgstr "Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Zakładki"
-#: 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"
-"\n"
-"%(text)s"
-msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
-"\n"
-"%(text)s"
-msgstr[0] ""
-"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
-"(count)s komentarz:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
-"(count)s komentarze:\n"
-"\n"
-"%(text)s"
-msgstr[2] ""
-"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
-"(count)s komentarzy:\n"
-"\n"
-"%(text)s"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Zakładki Dokumentacji"
-#: contrib/comments/views/comments.py:116
-#, python-format
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
msgid ""
-"This comment was posted by a sketchy user:\n"
"\n"
-"%(text)s"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
msgstr ""
-"Ten komentarze został dodany przez użytkownika::\n"
"\n"
-"%(text)s"
+"<p class=\"help\">Aby zainstalować skryptozakładki, przeciągnij łącze do "
+"paska zakładek\n"
+"lub kliknij prawym klawiszem na łączu i dodaj je do zakładek. Teraz możesz\n"
+"wybrać skryptozakładkę na dowolnej stronie serwisu. Uwaga: niektóre z tych "
+"skryptozakładek wymagają przeglądania serwisu z komputera\n"
+"\"wewnętrznego\" (skontaktuj się z administratorem systemu, jeśli nie jesteś "
+"pewien, czy ten komputer jest \"wewnętrznym\").</p>\n"
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Dozwolone tylko POSTy"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentacja dla tej strony"
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Przekierowuje z dowolnej strony do dokumentacji dla widoku, który ją "
+"generuje."
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Ktoś próbował obejść zabezpieczenia formularza komentarzy"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Pokaż ID obiektu"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
msgstr ""
-"Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
-"niepoprawne"
+"Pokazuje typ i unikalne ID dla stron, które reprezentują pojedynczy obiekt."
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Formularz komentarza nie zapewnił obiektów 'preview' ani 'post'"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Edytuj ten obiekt (bieżące okno)"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Nazwa użytkownika:"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Przeskok do panelu admina dla stron reprezentujących pojedynczy obiekt"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-msgid "Log out"
-msgstr "Wyloguj się"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Edytuj ten obiekt (nowe onko)"
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Hasło:"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Jak wyżej, tyle że otwiera nowe okno."
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
-msgstr "Zapomniałeś hasło?"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dziękujemy za odwiedzenie serwisu."
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Oceny"
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Zaloguj ponownie"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Wymagane"
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Zmiana hasła"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Opcjonalne"
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Hasło zmienione"
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Wyślij zdjęcie"
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Twoje hasło zostało zmienione"
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Komentarz:"
+#: contrib/admin/templates/registration/password_change_form.html:11
+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 "Podaj swoje stare hasło i dwa razy nowe."
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
-msgstr "Podgląd"
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Stare hasło:"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Twoje imię:"
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Nowe hasło:"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nazwa domeny"
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Potwierdź hasło:"
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "wyświetlana nazwa"
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Zmień hasło"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "strona"
+#: 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 "Zresetuj hasło"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "strony"
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Udane resetowanie hasła"
-#: contrib/admin/filterspecs.py:40
-#, python-format
+#: contrib/admin/templates/registration/password_reset_done.html:12
msgid ""
-"<h3>By %s:</h3>\n"
-"<ul>\n"
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
msgstr ""
-"<h3>Przez %s:</h3>\n"
-"</ul>\n"
+"Nowe hasło zostało wysłane na podany adres email. Powinieneś otrzymać je "
+"niebawem."
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
-msgid "All"
-msgstr "Wszystko"
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Otrzymałeś email gdyż zarządałeś zresetowania hasła"
-#: contrib/admin/filterspecs.py:109
-msgid "Any date"
-msgstr "Dowolna data"
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "dla twojego konta użytkownika na stronie %(site_name)s"
-#: contrib/admin/filterspecs.py:110
-msgid "Today"
-msgstr "Dzisiaj"
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Twoje nowe hasło to: %(new_password)s"
-#: contrib/admin/filterspecs.py:113
-msgid "Past 7 days"
-msgstr "Ostatnie 7 dni"
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Możesz zmienić je na stronie:"
-#: contrib/admin/filterspecs.py:115
-msgid "This month"
-msgstr "Ten miesiąc"
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Twój login:"
-#: contrib/admin/filterspecs.py:117
-msgid "This year"
-msgstr "Ten rok"
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Dziękujemy za używanie strony!"
-#: contrib/admin/models.py:16
-msgid "action time"
-msgstr "czas akcji"
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Zespół %(site_name)s"
-#: contrib/admin/models.py:19
-msgid "object id"
-msgstr "id obiektu"
+#: 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 ""
+"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój adres "
+"email."
-#: contrib/admin/models.py:20
-msgid "object repr"
-msgstr "reprezentacj obiektu"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adres e-mail:"
-#: contrib/admin/models.py:21
-msgid "action flag"
-msgstr "flaga akcji"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Zresetuj moje hasło"
-#: contrib/admin/models.py:22
-msgid "change message"
-msgstr "zmień wiadomość"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
-#: contrib/admin/models.py:25
-msgid "log entry"
-msgstr "log"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Czas:"
-#: contrib/admin/models.py:26
-msgid "log entries"
-msgstr "logi"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Teraz:"
-#: contrib/admin/templatetags/admin_list.py:247
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Zmień:"
+
+#: contrib/admin/templatetags/admin_list.py:255
msgid "All dates"
msgstr "Wszystkie daty"
-#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:260
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
-#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:264
-#: contrib/admin/views/main.py:350
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:357
msgid "You may edit it again below."
msgstr "Możesz ponownie edytować wpis poniżej."
-#: contrib/admin/views/auth.py:30
+#: contrib/admin/views/auth.py:31
msgid "Add user"
msgstr "Dodaj użytkownika"
-#: contrib/admin/views/auth.py:57
+#: contrib/admin/views/auth.py:58
msgid "Password changed successfully."
msgstr "Hasło zostało zmienione pomyślnie."
-#: contrib/admin/views/auth.py:64
+#: contrib/admin/views/auth.py:65
#, python-format
msgid "Change password: %s"
msgstr "Zmień hasło: %s"
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -1232,12 +799,7 @@ msgstr ""
"Proszę wpisać poprawną nazwę użytkownika i hasło. Uwaga: wielkość liter ma "
"znaczenie."
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Zaloguj się"
-
-#: contrib/admin/views/decorators.py:62
+#: contrib/admin/views/decorators.py:63
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -1245,7 +807,7 @@ msgstr ""
"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie zostało "
"zapisane."
-#: contrib/admin/views/decorators.py:69
+#: contrib/admin/views/decorators.py:70
msgid ""
"Looks like your browser isn't configured to accept cookies. Please enable "
"cookies, reload this page, and try again."
@@ -1253,1026 +815,1126 @@ msgstr ""
"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień jej ustawienia i "
"spróbuj ponownie."
-#: contrib/admin/views/decorators.py:83
+#: contrib/admin/views/decorators.py:84
msgid "Usernames cannot contain the '@' character."
msgstr "Nazwy użytkowników nie mogą zawierać znaków '@'."
-#: contrib/admin/views/decorators.py:85
+#: contrib/admin/views/decorators.py:86
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr "Twój adres e-mail to nie jest twój login. Spróbuj '%s'."
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
msgid "tag:"
msgstr "tag:"
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
msgid "filter:"
msgstr "filtr:"
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
msgid "view:"
msgstr "widok:"
-#: contrib/admin/views/doc.py:164
+#: contrib/admin/views/doc.py:166
#, python-format
msgid "App %r not found"
msgstr "Aplikacja %r nie została znaleziona"
-#: contrib/admin/views/doc.py:171
+#: contrib/admin/views/doc.py:173
#, python-format
msgid "Model %(name)r not found in app %(label)r"
msgstr "Model %(name)r nie został znaleziony w aplikacji %(label)r"
-#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:185
#, python-format
msgid "the related `%(label)s.%(type)s` object"
msgstr "powiązany obiekt `%(label)s.%(type)s`"
-#: 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:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
msgid "model:"
msgstr "model:"
-#: contrib/admin/views/doc.py:214
+#: contrib/admin/views/doc.py:216
#, python-format
msgid "related `%(label)s.%(name)s` objects"
msgstr "powiązane obiekty `%(label)s.%(name)s`"
-#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:221
#, python-format
msgid "all %s"
msgstr "wszystkie %s"
-#: contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:226
#, python-format
msgid "number of %s"
msgstr "liczba %s"
-#: contrib/admin/views/doc.py:229
+#: contrib/admin/views/doc.py:231
#, python-format
msgid "Fields on %s objects"
msgstr "Pola obiektów %s"
-#: 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:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
msgid "Integer"
msgstr "Liczba całkowita"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:294
msgid "Boolean (Either True or False)"
msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Łańcuch (do %(maxlength)s znaków)"
+msgid "String (up to %(max_length)s)"
+msgstr "Łańcuch (do %(max_length)s znaków)"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:296
msgid "Comma-separated integers"
msgstr "Liczby całkowite rozdzielone przecinkami"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:297
msgid "Date (without time)"
msgstr "Data (bez godziny)"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:298
msgid "Date (with time)"
msgstr "Data (z godziną)"
-#: contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Numer dziesiętny"
+
+#: contrib/admin/views/doc.py:300
msgid "E-mail address"
msgstr "Adres e-mail"
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
msgid "File path"
msgstr "Ścieżka do pliku"
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
-msgstr "Numer dziesiętny"
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Liczba zmiennoprzecinkowa"
-#: contrib/admin/views/doc.py:306
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "Adres IP"
+
+#: contrib/admin/views/doc.py:309
msgid "Boolean (Either True, False or None)"
msgstr "Wartość logiczna (True, False, None - prawda, fałsz lub nic)"
-#: contrib/admin/views/doc.py:307
+#: contrib/admin/views/doc.py:310
msgid "Relation to parent model"
msgstr "Relacja do modelu rodzica"
-#: contrib/admin/views/doc.py:308
+#: contrib/admin/views/doc.py:311
msgid "Phone number"
msgstr "Numer telefonu"
-#: contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:316
msgid "Text"
msgstr "Tekst"
-#: contrib/admin/views/doc.py:314
+#: contrib/admin/views/doc.py:317
msgid "Time"
msgstr "Czas"
-#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:316
+#: contrib/admin/views/doc.py:319
msgid "U.S. state (two uppercase letters)"
msgstr "Stan USA (dwie duże litery)"
-#: contrib/admin/views/doc.py:317
+#: contrib/admin/views/doc.py:320
msgid "XML text"
msgstr "Tekst XML"
-#: contrib/admin/views/doc.py:343
+#: contrib/admin/views/doc.py:346
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s nie jest obiektem urlpattern"
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:233
msgid "Site administration"
msgstr "Administracja stroną"
-#: contrib/admin/views/main.py:274 contrib/admin/views/main.py:359
+#: contrib/admin/views/main.py:281 contrib/admin/views/main.py:366
#, python-format
msgid "You may add another %s below."
msgstr "Możesz dodać nowy wpis %s poniżej."
-#: contrib/admin/views/main.py:292
+#: contrib/admin/views/main.py:299
#, python-format
msgid "Add %s"
msgstr "Dodaj %s"
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:345
#, python-format
msgid "Added %s."
msgstr "Dodano %s"
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:345 contrib/admin/views/main.py:347
+#: contrib/admin/views/main.py:349 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:347
#, python-format
msgid "Changed %s."
msgstr "Zmieniono %s"
-#: contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:349
#, python-format
msgid "Deleted %s."
msgstr "Skasowano %s"
-#: contrib/admin/views/main.py:345
+#: contrib/admin/views/main.py:352
msgid "No fields changed."
msgstr "Żadne pole nie zmienione."
-#: contrib/admin/views/main.py:348
+#: contrib/admin/views/main.py:355
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
-#: contrib/admin/views/main.py:356
+#: contrib/admin/views/main.py:363
#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
-#: contrib/admin/views/main.py:394
+#: contrib/admin/views/main.py:401
#, python-format
msgid "Change %s"
msgstr "Zmień %s"
-#: contrib/admin/views/main.py:479
+#: contrib/admin/views/main.py:488
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:484
+#: contrib/admin/views/main.py:493
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Jedno lub więcej %(fieldname)s w %(name)s:"
-#: contrib/admin/views/main.py:517
+#: contrib/admin/views/main.py:525
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
-#: contrib/admin/views/main.py:520
+#: contrib/admin/views/main.py:528
msgid "Are you sure?"
msgstr "Jesteś pewien?"
-#: contrib/admin/views/main.py:542
+#: contrib/admin/views/main.py:550
#, python-format
msgid "Change history: %s"
msgstr "Historia zmian: %s"
-#: contrib/admin/views/main.py:576
+#: contrib/admin/views/main.py:584
#, python-format
msgid "Select %s"
msgstr "Zaznacz %s"
-#: contrib/admin/views/main.py:576
+#: contrib/admin/views/main.py:584
#, python-format
msgid "Select %s to change"
msgstr "Zaznacz %s aby zmienić"
-#: contrib/admin/views/main.py:771
+#: contrib/admin/views/main.py:785
msgid "Database error"
msgstr "Błąd bazy danych"
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Teraz:"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Hasła się nie zgadzają."
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Zmień:"
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Użytkownik o tej nazwie już istnieje."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Data:"
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Twoja przeglądarka nie chce akceptować ciasteczek. Są one wymagane do "
+"zalogowania się."
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Czas:"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "To konto jest nieaktywne."
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Documentation"
-msgstr "Dokumentacja"
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Ten adres e-mail nie ma przypisanego konta. Jesteś pewien, że "
+"zarejestrowałeś się?"
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: 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/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-msgid "Change password"
-msgstr "Zmiana hasła"
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Hasło zresetowane dla %s"
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/auth/user/change_password.html:12
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Początek"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Pola 'nowe hasło' nie zgadzają się."
-#: contrib/admin/templates/admin/change_list.html:12
-#, python-format
-msgid "Add %(name)s"
-msgstr "Dodaj %(name)s"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Podane stare hasło jest niepoprawne. Proszę podać je jeszcze raz."
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
-msgstr " Używając %(filter_title)s "
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "nazwa"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "History"
-msgstr "Historia"
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nazwa kodowa"
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Data/czas"
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "uprawnienie"
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Użytkownik"
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "uprawnienia"
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Akcja"
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grupa"
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr ""
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "grupy"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "użytkownik"
-#: contrib/admin/templates/admin/object_history.html:36
+#: contrib/auth/models.py:131
msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
msgstr ""
-"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis ten nie został "
-"dodany poprzez panel administracyjny."
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Szukaj"
+"Wymagane. 30 znaków lub mniej. Tylko znaki alfanumeryczne (litery, cyfry i "
+"podkreślenia)."
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "1 wynik"
-msgstr[1] "%(counter)s wyniki"
-msgstr[2] "%(counter)s wyników"
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "Imię"
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr "%(full_result_count)s trafień"
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "Nazwisko"
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Pokaż wszystko"
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "adres e-mail"
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Administracja stroną Django"
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "hasło"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administracja Django"
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Użyj '[algo]$[salt]$[hexdigest]' lub <a href=\"password/\">formularza zmiany "
+"hasła</a>."
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Błąd serwera"
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "w zespole"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Bład serwera (500)"
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Oznacza czy użytkownik może zalogować się do panelu admina."
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Błąd Serwera <em>(500)</em>"
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "aktywny"
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/auth/models.py:137
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."
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
msgstr ""
-"Wystąpił niespodziewany błąd. Raport został wysłany emailem administratorowi "
-"strony."
+"Oznacza czy użytkownik może zalogować się do panelu administratora. Odznacz "
+"to zamiast usuwać konta."
-#: contrib/admin/templates/admin/invalid_setup.html:8
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "Główny Administrator"
+
+#: contrib/auth/models.py:138
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."
+"Designates that this user has all permissions without explicitly assigning "
+"them."
msgstr ""
-"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie "
-"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich "
-"odczytu."
-
-#: contrib/admin/templates/admin/index.html:17
-#, python-format
-msgid "Models available in the %(name)s application."
-msgstr "Modele dostępne w aplikacji %(name)s."
+"Oznacza, że ten użytkownik ma wszystkie uprawnienia bez jawnego "
+"przypisywania ich."
-#: contrib/admin/templates/admin/index.html:18
-#, python-format
-msgid "%(name)s"
-msgstr "%(name)s"
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "ostatnio zalogowany"
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
-msgid "Add"
-msgstr "Dodaj"
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "data przyłączenia"
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
-msgstr "Zmień"
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on "
+"uprawnienia grup, do których należy."
-#: contrib/admin/templates/admin/index.html:44
-msgid "You don't have permission to edit anything."
-msgstr "Nie masz uprawnień by edytować cokolwiek"
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "uprawnienia użytkownika"
-#: contrib/admin/templates/admin/index.html:52
-msgid "Recent Actions"
-msgstr "Ostatnie akcje"
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "użytkownik"
-#: contrib/admin/templates/admin/index.html:53
-msgid "My Actions"
-msgstr "Moje akcje"
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "użytkownicy"
-#: contrib/admin/templates/admin/index.html:57
-msgid "None available"
-msgstr "Brak"
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Dane osobowe"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Strona nie znaleziona"
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Uprawnienia"
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Niestety nie można znaleźć rządanej strony."
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Ważne daty"
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Filtr"
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Grupy"
-#: contrib/admin/templates/admin/change_form.html:22
-msgid "View on site"
-msgstr "Pokaż na stronie"
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "wiadomość"
-#: 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] "Proszę popraw poniższy błąd"
-msgstr[1] "Proszę popraw poniższe błędy"
-msgstr[2] "Proszę popraw poniższe błędy"
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Wylogowany"
-#: contrib/admin/templates/admin/change_form.html:50
-msgid "Ordering"
-msgstr "Sortowanie"
+#: contrib/comments/models.py:67 contrib/comments/models.py:169
+msgid "object ID"
+msgstr "ID obiektu"
-#: contrib/admin/templates/admin/change_form.html:53
-msgid "Order:"
-msgstr "Porządek:"
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "nagłówek"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Usuń"
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:170
+msgid "comment"
+msgstr "komentarz"
-#: 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 ""
-"Skasowanie %(object_name)s '%(escaped_object)s' spowoduje usunięcie "
-"zależnych obiektów, lecz nie posiadasz uprawnień do usunięcia następujących "
-"typów obiektów:"
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "ocena #1"
-#: 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 ""
-"Czy chcesz skasować %(object_name)s \"%(escaped_object)s\"? Następujące "
-"zależne obiekty zostaną skasowane:"
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "ocena #2"
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "Tak, usuń"
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "ocena #3"
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
-msgstr "Witaj,"
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "ocena #4"
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Zapisz jako nowe"
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "ocena #5"
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Zapisz i dodaj nowe"
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "ocena #6"
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Zapisz i kontynuuj edycję"
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "ocena #7"
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Zapisz"
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "ocena #8"
-#: 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 "Podaj nowe hasło dla użytkownika <strong>%(username)s</strong>."
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "jest poprawną oceną"
-#: contrib/admin/templates/admin/auth/user/change_password.html:34
-#: contrib/admin/templates/admin/auth/user/add_form.html:18
-msgid "Password"
-msgstr "Hasło"
+#: contrib/comments/models.py:83 contrib/comments/models.py:172
+msgid "date/time submitted"
+msgstr "data/czas dodania"
-#: contrib/admin/templates/admin/auth/user/change_password.html:39
-#: contrib/admin/templates/admin/auth/user/add_form.html:23
-msgid "Password (again)"
-msgstr "Hasło (powtórz)"
+#: contrib/comments/models.py:84 contrib/comments/models.py:173
+msgid "is public"
+msgstr "publicznie dostepny"
-#: contrib/admin/templates/admin/auth/user/change_password.html:40
-#: contrib/admin/templates/admin/auth/user/add_form.html:24
-msgid "Enter the same password as above, for verification."
-msgstr "Podaj powyższe hasło w celu weryfikacji."
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "usunięty"
-#: contrib/admin/templates/admin/auth/user/add_form.html:6
+#: contrib/comments/models.py:86
msgid ""
-"First, enter a username and password. Then, you'll be able to edit more user "
-"options."
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
msgstr ""
-"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować "
-"więcej opcji użytkownika."
+"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie "
+"tekst \"Ten komentarz został usunięty\". "
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
-msgstr "Nazwa użytkownika"
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentarze"
-#: 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 "Zmiana hasła"
+#: contrib/comments/models.py:134 contrib/comments/models.py:213
+msgid "Content object"
+msgstr "Obiekt treści"
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Hasło zmienione"
+#: contrib/comments/models.py:162
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Dodane przez %(user)s dnia %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Twoje hasło zostało zmienione"
+#: contrib/comments/models.py:171
+msgid "person's name"
+msgstr "Nazwa osoby"
-#: 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
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
-msgstr "Zresetuj hasło"
+#: contrib/comments/models.py:174
+msgid "ip address"
+msgstr "adres ip"
-#: 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 ""
-"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój adres "
-"email."
+#: contrib/comments/models.py:176
+msgid "approved by staff"
+msgstr "zaakceptowano"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "Adres e-mail:"
+#: contrib/comments/models.py:179
+msgid "free comment"
+msgstr "wolny komentarz"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Zresetuj moje hasło"
+#: contrib/comments/models.py:180
+msgid "free comments"
+msgstr "wolne komentarze"
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Dziękujemy za odwiedzenie serwisu."
+#: contrib/comments/models.py:239
+msgid "score"
+msgstr "ilość punktów"
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "Zaloguj ponownie"
+#: contrib/comments/models.py:240
+msgid "score date"
+msgstr "data przyznania punktów"
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Udane resetowanie hasła"
+#: contrib/comments/models.py:243
+msgid "karma score"
+msgstr "ilość punktów"
-#: contrib/admin/templates/registration/password_reset_done.html:12
+#: contrib/comments/models.py:244
+msgid "karma scores"
+msgstr "wyniki"
+
+#: contrib/comments/models.py:248
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d ocenę przez %(user)s"
+
+#: contrib/comments/models.py:264
+#, python-format
msgid ""
-"We've e-mailed a new password to the e-mail address you submitted. You "
-"should be receiving it shortly."
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Nowe hasło zostało wysłane na podany adres email. Powinieneś otrzymać je "
-"niebawem."
+"Komentarz oflagowany przez %(user)s:\n"
+"\n"
+"%(text)s"
-#: 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 "Podaj swoje stare hasło i dwa razy nowe."
+#: contrib/comments/models.py:271
+msgid "flag date"
+msgstr "data flagi"
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
-msgstr "Stare hasło:"
+#: contrib/comments/models.py:274
+msgid "user flag"
+msgstr "flaga użytkownika"
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
-msgstr "Nowe hasło:"
+#: contrib/comments/models.py:275
+msgid "user flags"
+msgstr "flagi użytkownika"
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
-msgstr "Potwierdź hasło:"
+#: contrib/comments/models.py:279
+#, python-format
+msgid "Flag by %r"
+msgstr "Flaga %r"
-#: contrib/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
-msgstr "Zmień hasło"
+#: contrib/comments/models.py:284
+msgid "deletion date"
+msgstr "data skasowania"
-#: contrib/admin/templates/registration/password_reset_email.html:2
-msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Otrzymałeś email gdyż zarządałeś zresetowania hasła"
+#: contrib/comments/models.py:286
+msgid "moderator deletion"
+msgstr "usunięcie moderatora"
-#: contrib/admin/templates/registration/password_reset_email.html:3
-#, python-format
-msgid "for your user account at %(site_name)s"
-msgstr "dla twojego konta użytkownika na stronie %(site_name)s"
+#: contrib/comments/models.py:287
+msgid "moderator deletions"
+msgstr "usunięcia moderatorów"
-#: contrib/admin/templates/registration/password_reset_email.html:5
+#: contrib/comments/models.py:291
#, python-format
-msgid "Your new password is: %(new_password)s"
-msgstr "Twoje nowe hasło to: %(new_password)s"
+msgid "Moderator deletion by %r"
+msgstr "Usunięcie moderatora przez %r"
-#: contrib/admin/templates/registration/password_reset_email.html:7
-msgid "Feel free to change this password by going to this page:"
-msgstr "Możesz zmienić je na stronie:"
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zapomniałeś hasło?"
-#: contrib/admin/templates/registration/password_reset_email.html:11
-msgid "Your username, in case you've forgotten:"
-msgstr "Twój login:"
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Oceny"
-#: contrib/admin/templates/registration/password_reset_email.html:13
-msgid "Thanks for using our site!"
-msgstr "Dziękujemy za używanie strony!"
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Wymagane"
-#: contrib/admin/templates/registration/password_reset_email.html:15
-#, python-format
-msgid "The %(site_name)s team"
-msgstr "Zespół %(site_name)s"
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcjonalne"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "Zakładki"
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Wyślij zdjęcie"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "Zakładki Dokumentacji"
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentarz:"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Podgląd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Twoje imię:"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
"\n"
-"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
-"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
-"select the bookmarklet from any page in the site. Note that some of these\n"
-"bookmarklets require you to be viewing the site from a computer designated\n"
-"as \"internal\" (talk to your system administrator if you aren't sure if\n"
-"your computer is \"internal\").</p>\n"
-msgstr ""
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
"\n"
-"<p class=\"help\">Aby zainstalować skryptozakładki, przeciągnij łącze do "
-"paska zakładek\n"
-"lub kliknij prawym klawiszem na łączu i dodaj je do zakładek. Teraz możesz\n"
-"wybrać skryptozakładkę na dowolnej stronie serwisu. Uwaga: niektóre z tych "
-"skryptozakładek wymagają przeglądania serwisu z komputera\n"
-"\"wewnętrznego\" (skontaktuj się z administratorem systemu, jeśli nie jesteś "
-"pewien, czy ten komputer jest \"wewnętrznym\").</p>\n"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "Dokumentacja dla tej strony"
+"%(text)s"
+msgstr[0] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarz:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarze:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarzy:\n"
+"\n"
+"%(text)s"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+#: contrib/comments/views/comments.py:117
+#, python-format
msgid ""
-"Jumps you from any page to the documentation for the view that generates "
-"that page."
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Przekierowuje z dowolnej strony do dokumentacji dla widoku, który ją "
-"generuje."
+"Ten komentarze został dodany przez użytkownika::\n"
+"\n"
+"%(text)s"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "Pokaż ID obiektu"
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Dozwolone tylko POSTy"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Ktoś próbował obejść zabezpieczenia formularza komentarzy"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
-msgstr "Pokazuje typ i unikalne ID dla stron, które reprezentują pojedynczy obiekt."
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
+"niepoprawne"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "Edytuj ten obiekt (bieżące okno)"
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formularz komentarza nie zapewnił obiektów 'preview' ani 'post'"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "Przeskok do panelu admina dla stron reprezentujących pojedynczy obiekt"
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonimowi użytkownicy nie mogą głosować"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "Edytuj ten obiekt (nowe onko)"
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Błędny ID komentarza"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
-msgstr "Jak wyżej, tyle że otwiera nowe okno."
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Nie można głosować na siebie"
-#: contrib/contenttypes/models.py:36
+#: contrib/contenttypes/models.py:37
msgid "python model class name"
msgstr "nazwa pythonowa modelu klasy"
-#: contrib/contenttypes/models.py:39
+#: contrib/contenttypes/models.py:40
msgid "content type"
msgstr "typ zawartości"
-#: contrib/contenttypes/models.py:40
+#: contrib/contenttypes/models.py:41
msgid "content types"
msgstr "typy zawartości"
-#: contrib/auth/views.py:40
-msgid "Logged out"
-msgstr "Wylogowany"
-
-#: contrib/auth/models.py:44 contrib/auth/models.py:64
-msgid "name"
-msgstr "nazwa"
-
-#: contrib/auth/models.py:46
-msgid "codename"
-msgstr "nazwa kodowa"
-
-#: contrib/auth/models.py:49
-msgid "permission"
-msgstr "uprawnienie"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i "
+"zamykający ukośnik."
-#: contrib/auth/models.py:50 contrib/auth/models.py:65
-msgid "permissions"
-msgstr "uprawnienia"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tytuł"
-#: contrib/auth/models.py:68
-msgid "group"
-msgstr "grupa"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "zawartość"
-#: contrib/auth/models.py:69 contrib/auth/models.py:109
-msgid "groups"
-msgstr "grupy"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "włącz komentarze"
-#: contrib/auth/models.py:99
-msgid "username"
-msgstr "użytkownik"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nazwa szablonu"
-#: contrib/auth/models.py:99
+#: contrib/flatpages/models.py:13
msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-"Wymagane. 30 znaków lub mniej. Tylko znaki alfanumeryczne (litery, cyfry i "
-"podkreślenia)."
-
-#: contrib/auth/models.py:100
-msgid "first name"
-msgstr "Imię"
-
-#: contrib/auth/models.py:101
-msgid "last name"
-msgstr "Nazwisko"
-
-#: contrib/auth/models.py:102
-msgid "e-mail address"
-msgstr "adres e-mail"
+"Przykład: 'flatpages/contact_page.html'. Jeżeli nie zostanie podane, system "
+"użyje 'flatpages/default.html'."
-#: contrib/auth/models.py:103
-msgid "password"
-msgstr "hasło"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "wymagana rejestracja"
-#: contrib/auth/models.py:103
-msgid ""
-"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
-"password form</a>."
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
msgstr ""
-"Użyj '[algo]$[salt]$[hexdigest]' lub <a href=\"password/\">formularza zmiany "
-"hasła</a>."
+"Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
-#: contrib/auth/models.py:104
-msgid "staff status"
-msgstr "w zespole"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "strona statyczna"
-#: contrib/auth/models.py:104
-msgid "Designates whether the user can log into this admin site."
-msgstr "Oznacza czy użytkownik może zalogować się do panelu admina."
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "strony statyczne"
-#: contrib/auth/models.py:105
-msgid "active"
-msgstr "aktywny"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "-y"
-#: contrib/auth/models.py:105
-msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
-msgstr ""
-"Oznacza czy użytkownik może zalogować się do panelu administratora. Odznacz "
-"to zamiast usuwać konta."
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "-szy"
-#: contrib/auth/models.py:106
-msgid "superuser status"
-msgstr "Główny Administrator"
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "-gi"
-#: contrib/auth/models.py:106
-msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
-msgstr ""
-"Oznacza, że ten użytkownik ma wszystkie uprawnienia bez jawnego "
-"przypisywania ich."
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "-ci"
-#: contrib/auth/models.py:107
-msgid "last login"
-msgstr "ostatnio zalogowany"
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milion"
+msgstr[1] "%(value).1f miliony"
+msgstr[2] "%(value).1f milionów"
-#: contrib/auth/models.py:108
-msgid "date joined"
-msgstr "data przyłączenia"
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliard"
+msgstr[1] "%(value).1f miliardy"
+msgstr[2] "%(value).1f miliardów"
-#: contrib/auth/models.py:110
-msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
-msgstr ""
-"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on "
-"uprawnienia grup, do których należy."
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilion"
+msgstr[1] "%(value).1f biliony"
+msgstr[2] "%(value).1f bilionów"
-#: contrib/auth/models.py:111
-msgid "user permissions"
-msgstr "uprawnienia użytkownika"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr "jeden"
-#: contrib/auth/models.py:115
-msgid "user"
-msgstr "użytkownik"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr "dwa"
-#: contrib/auth/models.py:116
-msgid "users"
-msgstr "użytkownicy"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr "trzy"
-#: contrib/auth/models.py:122
-msgid "Personal info"
-msgstr "Dane osobowe"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr "cztery"
-#: contrib/auth/models.py:123
-msgid "Permissions"
-msgstr "Uprawnienia"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr "pięć"
-#: contrib/auth/models.py:124
-msgid "Important dates"
-msgstr "Ważne daty"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr "sześć"
-#: contrib/auth/models.py:125
-msgid "Groups"
-msgstr "Grupy"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr "siedem"
-#: contrib/auth/models.py:269
-msgid "message"
-msgstr "wiadomość"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr "osiem"
-#: contrib/auth/models.py:282
-msgid "AnonymousUser"
-msgstr "UżytkownikAnonimowy"
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr "dziewięć"
-#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
-msgid "The two password fields didn't match."
-msgstr "Hasła się nie zgadzają."
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr "dzisiaj"
-#: contrib/auth/forms.py:25
-msgid "A user with that username already exists."
-msgstr "Użytkownik o tej nazwie już istnieje."
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr "jutro"
-#: contrib/auth/forms.py:53
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Twoja przeglądarka nie chce akceptować ciasteczek. Są one wymagane do "
-"zalogowania się."
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr "wczoraj"
-#: contrib/auth/forms.py:62
-msgid "This account is inactive."
-msgstr "To konto jest nieaktywne."
+#: contrib/localflavor/ar/forms.py:30 contrib/localflavor/ar/forms.py:38
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Wpisz kod pocztowy w formacie NNNN lub ANNNNAAA."
-#: contrib/auth/forms.py:85
-msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
-msgstr ""
-"Ten adres e-mail nie ma przypisanego konta. Jesteś pewien, że "
-"zarejestrowałeś się?"
+#: contrib/localflavor/ar/forms.py:61 contrib/localflavor/br/forms.py:103
+#: contrib/localflavor/pe/forms.py:34 contrib/localflavor/pe/forms.py:57
+msgid "This field requires only numbers."
+msgstr "To pole może zawierać jedynie liczby."
-#: contrib/auth/forms.py:117
-msgid "The two 'new password' fields didn't match."
-msgstr "Pola 'nowe hasło' nie zgadzają się."
+#: contrib/localflavor/ar/forms.py:64
+msgid "This field requires 7 or 8 digits."
+msgstr "To pole musi zawierać 7 lub 8 cyfr."
-#: contrib/auth/forms.py:124
-msgid "Your old password was entered incorrectly. Please enter it again."
-msgstr "Podane stare hasło jest niepoprawne. Proszę podać je jeszcze raz."
+#: contrib/localflavor/ar/forms.py:75
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Podaj poprawny numer CUIT w formacie XX-XXXXXXXX-X lub XXXXXXXXXXXX."
-#: contrib/localflavor/uk/forms.py:18
-msgid "Enter a postcode. A space is required between the two postcode parts."
-msgstr "Wpisz kod pocztowy. Biały znak pomiędzy dwiema częściami kodu jest wymagany."
+#: contrib/localflavor/ar/forms.py:88
+msgid "Invalid CUIT."
+msgstr "Niepoprawny CUIT"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Wpisz czterocyfrowy kod pocztowy."
-#: contrib/localflavor/br/forms.py:18
+#: contrib/localflavor/br/forms.py:23
msgid "Enter a zip code in the format XXXXX-XXX."
msgstr "Wpisz kod pocztowy w formacie XXXXX-XXX."
-#: contrib/localflavor/br/forms.py:30
+#: contrib/localflavor/br/forms.py:35
msgid "Phone numbers must be in XX-XXXX-XXXX format."
msgstr "Numery telefoniczne muszą być w formacie XX-XXXX-XXXX."
-#: contrib/localflavor/br/forms.py:72
-msgid "This field requires only numbers."
-msgstr "To pole może zawierać jedynie liczby."
+#: contrib/localflavor/br/forms.py:68
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Wybierz poprawny brazylijski stan. Ten stan nie jest jednym z dostępnych "
+"stanów."
-#: contrib/localflavor/br/forms.py:74
+#: contrib/localflavor/br/forms.py:105
msgid "This field requires at most 11 digits or 14 characters."
msgstr "To pole nie może zawierać więcej niż 11 cyfr lub 14 znaków."
-#: contrib/localflavor/br/forms.py:84
+#: contrib/localflavor/br/forms.py:115
msgid "Invalid CPF number."
msgstr "Błędny numer CPF."
-#: contrib/localflavor/br/forms.py:106
+#: contrib/localflavor/br/forms.py:137
msgid "This field requires at least 14 digits"
msgstr "To pole musi zawierać co najmniej 14 cyfr."
-#: contrib/localflavor/br/forms.py:116
+#: contrib/localflavor/br/forms.py:147
msgid "Invalid CNPJ number."
msgstr "Błędny numer CNPJ."
-#: contrib/localflavor/au/forms.py:18
-msgid "Enter a 4 digit post code."
-msgstr "Wpisz czterocyfrowy kod pocztowy."
+#: contrib/localflavor/ca/forms.py:19
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Wpisz kod pocztowy w formacie XXX XXX."
-#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
-#: contrib/localflavor/fi/forms.py:14
-msgid "Enter a zip code in the format XXXXX."
-msgstr "Wpisz kod pocztowy w formacie XXXXX."
+#: contrib/localflavor/ca/forms.py:81
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format."
+msgstr ""
+"Wpisz poprawny numer kanadyjskiego ubezpieczenia w formacie XXX-XXX-XXXX."
-#: contrib/localflavor/us/forms.py:18
-msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
-msgstr "Wpisz kod pocztowy w formacie XXXXX. lub XXXXX-XXXX."
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
-#: contrib/localflavor/us/forms.py:51
-msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
-msgstr "Wpisz poprawny numer U.S. Social Security w formacie XXX-XX-XXXX."
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Podaj poprawny numer szwajcarskiego dowodu osobistego lub paszportu w "
+"formacie X1234567<0 lub 1234567890."
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Podaj poprawny czilijski RUT w formacie XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr "Wpisz poprawny czilijski RUT"
#: contrib/localflavor/de/de_states.py:5
msgid "Baden-Wuerttemberg"
-msgstr ""
+msgstr "Badenia-Wirtembergia"
#: contrib/localflavor/de/de_states.py:6
msgid "Bavaria"
-msgstr ""
+msgstr "Bawaria"
#: contrib/localflavor/de/de_states.py:7
msgid "Berlin"
-msgstr ""
+msgstr "Berlin"
#: contrib/localflavor/de/de_states.py:8
msgid "Brandenburg"
-msgstr ""
+msgstr "Brandenburgia"
#: contrib/localflavor/de/de_states.py:9
msgid "Bremen"
-msgstr ""
+msgstr "Brema"
#: contrib/localflavor/de/de_states.py:10
msgid "Hamburg"
-msgstr ""
+msgstr "Hamburg"
#: contrib/localflavor/de/de_states.py:11
msgid "Hessen"
-msgstr ""
+msgstr "Hesja"
#: contrib/localflavor/de/de_states.py:12
msgid "Mecklenburg-Western Pomerania"
-msgstr ""
+msgstr "Meklemburgia-Pomorze Zachodnie"
#: contrib/localflavor/de/de_states.py:13
msgid "Lower Saxony"
-msgstr ""
+msgstr "Dolna Saksonia"
#: contrib/localflavor/de/de_states.py:14
msgid "North Rhine-Westphalia"
-msgstr ""
+msgstr "Nadrenia Północna-Westfalia"
#: contrib/localflavor/de/de_states.py:15
msgid "Rhineland-Palatinate"
-msgstr ""
+msgstr "Nadrenia-Palatynat"
#: contrib/localflavor/de/de_states.py:16
msgid "Saarland"
-msgstr ""
+msgstr "Kraj Saary"
#: contrib/localflavor/de/de_states.py:17
msgid "Saxony"
-msgstr ""
+msgstr "Saksonia"
#: contrib/localflavor/de/de_states.py:18
msgid "Saxony-Anhalt"
-msgstr ""
+msgstr "Saksonia-Anhalt"
#: contrib/localflavor/de/de_states.py:19
msgid "Schleswig-Holstein"
@@ -2280,7 +1942,12 @@ msgstr ""
#: contrib/localflavor/de/de_states.py:20
msgid "Thuringia"
-msgstr ""
+msgstr "Turyngia"
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX."
#: contrib/localflavor/de/forms.py:60
msgid ""
@@ -2290,6 +1957,357 @@ msgstr ""
"Podaj poprawny niemiecki numer dowodu osobistego w formacie XXXXXXXXXXX-"
"XXXXXXX-XXXXXXX-X."
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+#, fuzzy
+msgid "Granada"
+msgstr "Kannada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+#, fuzzy
+msgid "Huesca"
+msgstr "Wtorek"
+
+#: contrib/localflavor/es/es_provinces.py:27
+#, fuzzy
+msgid "Jaen"
+msgstr "Sty."
+
+#: contrib/localflavor/es/es_provinces.py:28
+#, fuzzy
+msgid "Leon"
+msgstr "Zaloguj się"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+#, fuzzy
+msgid "Palencia"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+#, fuzzy
+msgid "Cantabria"
+msgstr "Kataloński"
+
+#: contrib/localflavor/es/es_provinces.py:44
+#, fuzzy
+msgid "Segovia"
+msgstr "Słoweński"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+#, fuzzy
+msgid "Soria"
+msgstr "Serbski"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+#, fuzzy
+msgid "Valencia"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+#, fuzzy
+msgid "Catalonia"
+msgstr "Kataloński"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+#, fuzzy
+msgid "Galicia"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:22
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Wpisz kod pocztowy w zakresie i formacie 01XXX - 52XX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Wpisz numer telefoniczny w formacie 6XXXXXXXX, 8XXXXXXXX lub 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:73 contrib/localflavor/es/forms.py:108
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Proszę wpisać poprawne %s."
+
+#: contrib/localflavor/es/forms.py:91
+msgid "Invalid checksum for NIF."
+msgstr "Niepoprawna suma kontrolna NIF."
+
+#: contrib/localflavor/es/forms.py:97
+msgid "Invalid checksum for NIE."
+msgstr "Niepoprawna suma kontrolna NIE."
+
+#: contrib/localflavor/es/forms.py:106
+msgid "Invalid checksum for CIF."
+msgstr "Niepoprawna suma kontrolna CIF."
+
+#: contrib/localflavor/es/forms.py:136
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Podaj poprawny numer konta bankowego w formacie XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:150
+msgid "Invalid checksum for bank account number."
+msgstr "Niepoprawna suma kontrolna numeru konta bankowego."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Wpis poprawny numer fińskiego ubezpieczenia socjalnego."
+
+#: contrib/localflavor/in_/forms.py:16
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Podaj poprawny numer islandzkiego dowodu osobistego w formacie XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "Numer islandzkiego dowodu osobistego jest błędny."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Wpisz poprawny kod pocztowy."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Wpisz poprawny numer ubezpieczenia socjalnego."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Wpisz poprawny numer VAT."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXXXX lub XXX-XXXX."
+
#: contrib/localflavor/jp/jp_prefectures.py:4
msgid "Hokkaido"
msgstr ""
@@ -2478,225 +2496,1192 @@ msgstr ""
msgid "Okinawa"
msgstr ""
-#: contrib/localflavor/jp/forms.py:21
-msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
-msgstr "Wpisz kod pocztowy w formacie XXXXXXX lub XXX-XXXX."
-
-#: contrib/localflavor/it/forms.py:16
-msgid "Enter a valid zip code."
+#: contrib/localflavor/nl/forms.py:25
+msgid "Enter a valid postal code"
msgstr "Wpisz poprawny kod pocztowy."
-#: contrib/localflavor/it/forms.py:41
-msgid "Enter a valid Social Security number."
-msgstr "Wpisz poprawny numer ubezpieczenia socjalnego."
+#: contrib/localflavor/nl/forms.py:53
+msgid "Enter a valid phone number"
+msgstr "Wpisz poprawny numer telefonu."
-#: contrib/localflavor/it/forms.py:68
-msgid "Enter a valid VAT number."
-msgstr "Wpisz poprawny numer VAT."
+#: contrib/localflavor/nl/forms.py:76
+msgid "Enter a valid SoFi number"
+msgstr "Wpisz poprawny numer SoFi."
-#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
-msgid "Enter a zip code in the format XXXX."
-msgstr "Wpisz kod pocztowy w formacie XXXX."
+#: contrib/localflavor/nl/nl_provinces.py:4
+#, fuzzy
+msgid "Drente"
+msgstr "Usuń"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+#, fuzzy
+msgid "Gelderland"
+msgstr "Niemiecki"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+#, fuzzy
+msgid "Groningen"
+msgstr "dziewięć"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+#, fuzzy
+msgid "Utrecht"
+msgstr "Francuski"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+#, fuzzy
+msgid "Zeeland"
+msgstr "Islandzki"
-#: contrib/localflavor/no/forms.py:36
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:35
msgid "Enter a valid Norwegian social security number."
msgstr "Wpis poprawny numer norweskiego ubezpieczenia socjalnego."
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
-msgid "Enter a valid Finnish social security number."
-msgstr "Wpis poprawny numer fińskiego ubezpieczenia socjalnego."
+#: contrib/localflavor/pe/forms.py:36
+msgid "This field requires 8 digits."
+msgstr "To pole musi zawierać 8 cyfr."
-#: contrib/localflavor/ch/ch_states.py:5
-msgid "Aargau"
+#: contrib/localflavor/pe/forms.py:59
+msgid "This field requires 11 digits."
+msgstr "To pole musi zawierać 11 cyfr."
+
+#: contrib/localflavor/pl/forms.py:41
+msgid "National Identification Number consists of 11 digits."
+msgstr "Numer PESEL składa się z 11 cyfr."
+
+#: contrib/localflavor/pl/forms.py:47
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Błędna suma kontrolna numeru PESEL."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Wpisz numer NIP w formacie XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:78
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Błędna suma kontrolna numeru NIP"
+
+#: contrib/localflavor/pl/forms.py:107
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Numer REGON składa się z 7 lub 9 cyfr."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Błędna suma kontrolna numeru REGON"
+
+#: contrib/localflavor/pl/forms.py:148
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Wpisz kod pocztowy w formacie XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Dolnośląskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kujawsko-Pomorskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lubelskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubuskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Łódzkie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Małopolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Mazowieckie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Podkarpackie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlaskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomorskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Śląskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Świętokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmińsko-Mazurskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Wielkopolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Zachodniopomorskie"
+
+#: contrib/localflavor/sk/forms.py:32
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:6
-msgid "Appenzell Innerrhoden"
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:7
-msgid "Appenzell Ausserrhoden"
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:8
-msgid "Basel-Stadt"
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:9
-msgid "Basel-Land"
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:10
-msgid "Berne"
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:11
-msgid "Fribourg"
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:12
-msgid "Geneva"
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:13
-msgid "Glarus"
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:14
-msgid "Graubuenden"
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:15
-msgid "Jura"
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:16
-msgid "Lucerne"
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:17
-msgid "Neuchatel"
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:18
-msgid "Nidwalden"
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:19
-msgid "Obwalden"
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:20
-msgid "Schaffhausen"
+#: contrib/localflavor/sk/sk_districts.py:23
+#, fuzzy
+msgid "Galanta"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+#, fuzzy
+msgid "Gelnica"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:21
-msgid "Schwyz"
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:22
-msgid "Solothurn"
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:23
-msgid "St. Gallen"
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:24
-msgid "Thurgau"
+#: contrib/localflavor/sk/sk_districts.py:29
+#, fuzzy
+msgid "Komarno"
+msgstr "Koreański"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:25
-msgid "Ticino"
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:26
-msgid "Uri"
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:27
-msgid "Valais"
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:28
-msgid "Vaud"
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:29
-msgid "Zug"
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
msgstr ""
-#: contrib/localflavor/ch/ch_states.py:30
-msgid "Zurich"
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
msgstr ""
-#: contrib/localflavor/ch/forms.py:90
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+#, fuzzy
+msgid "Malacky"
+msgstr "Maj"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+#, fuzzy
+msgid "Martin"
+msgstr "Łotewski"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+#, fuzzy
+msgid "Sabinov"
+msgstr "list"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+#, fuzzy
+msgid "Senica"
+msgstr "Słoweński"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+#, fuzzy
+msgid "Skalica"
+msgstr "Galicyjski"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+#, fuzzy
+msgid "Snina"
+msgstr "dziewięć"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+#, fuzzy
+msgid "Sala"
+msgstr "Słowacki"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+#, fuzzy
+msgid "Trencin"
+msgstr "Francuski"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Wpisz kod pocztowy. Biały znak pomiędzy dwiema częściami kodu jest wymagany."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX. lub XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Wpisz poprawny numer U.S. Social Security w formacie XXX-XX-XXXX."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "przekieruj z"
+
+#: contrib/redirects/models.py:8
msgid ""
-"Enter a valid Swiss identity or passport card number in X1234567<0 or "
-"1234567890 format."
-msgstr "Podaj poprawny numer szwajarskiego dowodu osobistego lub paszportu w formacie X1234567<0 lub 1234567890."
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/events/search/'."
-#: contrib/localflavor/is_/forms.py:16
-msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
-msgstr "Podaj poprawny numer islandzkiego dowodu osobistego w formacie XXXXXX-XXXX."
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "przekierowanie do"
-#: contrib/localflavor/is_/forms.py:30
-msgid "The Icelandic identification number is not valid."
-msgstr "Numer islandzkiego dowodu osobistego jest błędny."
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Ścieżka jak wyżej lub pełny URL z http://"
-#: contrib/localflavor/cl/forms.py:21
-msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
-msgstr "Podaj poprawny czilijski RUT w formacie XX.XXX.XXX-X."
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "przekieruj"
-#: contrib/localflavor/cl/forms.py:26
-msgid "Enter valid a Chilean RUT"
-msgstr "Wpisz poprawny czilijski RUT"
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "przekierowania"
-#: contrib/sessions/models.py:68
+#: contrib/sessions/models.py:80
msgid "session key"
msgstr "klucz sesji"
-#: contrib/sessions/models.py:69
+#: contrib/sessions/models.py:81
msgid "session data"
msgstr "data sesji"
-#: contrib/sessions/models.py:70
+#: contrib/sessions/models.py:82
msgid "expire date"
msgstr "data wygaśnięcia sesji"
-#: contrib/sessions/models.py:74
+#: contrib/sessions/models.py:87
msgid "session"
msgstr "sesja"
-#: contrib/sessions/models.py:75
+#: contrib/sessions/models.py:88
msgid "sessions"
msgstr "sesje"
-#: contrib/flatpages/models.py:8
-msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nazwa domeny"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "wyświetlana nazwa"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "strona"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "strony"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "To pole może zawierać tylko litery, cyfry i podkreślenia."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
msgstr ""
-"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i "
-"zamykający ukośnik."
+"To pole może zawierać jedynie litery, cyfry, podkreślenia, myślniki i "
+"ukośniki."
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "tytuł"
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i pauzy."
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "zawartość"
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Wielkie litery nie są tutaj dozwolone."
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "włącz komentarze"
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Małe litery nie są tutaj dozwolone."
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nazwa szablonu"
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Wpisz tylko cyfry odddzielone przecinkami."
-#: contrib/flatpages/models.py:13
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Wpisz poprawne adresy e-mail oddzielone przecinkami."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Proszę wpisać poprawny adres IP."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Proszę wypełnić te pola."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Tu mogą być tylko cyfry."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "To pole nie może zawierać jedynie cyfr."
+
+#: core/validators.py:128 newforms/fields.py:157
+msgid "Enter a whole number."
+msgstr "Wpisz liczbę całkowitą."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tutaj są dozwolone tylko litery."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Rok nie może być wcześniejszy niż 1900."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Niepoprawna data: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Proszę wpisać poprawną godzinę w formacie HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Wprowadź poprawną datę i godzinę w formacie RRRR-MM-DD GG:MM."
+
+#: core/validators.py:170 newforms/fields.py:408
+msgid "Enter a valid e-mail address."
+msgstr "Wprowadź poprawny adres e-mail."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:438
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza."
+
+#: core/validators.py:193 newforms/fields.py:462
msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
msgstr ""
-"Przykład: 'flatpages/contact_page.html'. Jeżeli nie zostanie podane, system "
-"użyje 'flatpages/default.html'."
+"Wgraj poprawny plik graficzny. Ten, który został wgrany, nie jest obrazem, "
+"albo jest uszkodzony."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "wymagana rejestracja"
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
+"niepoprawny."
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "strona statyczna"
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Odnośnik %s nie wskazuje na poprawne nagranie QuickTime video."
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "strony statyczne"
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Wymagany jest poprawny URL."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Wymagany jest poprawny HTML. Błędy, które wystąpiły:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Nieprawidłowy format XML: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Niepoprawny odnośnik: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odnośnik %s jest nieprawidłowy."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Wpisz poprawny kod stanu U.S.A."
+
+#: core/validators.py:281
+#, 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] "Nie wolno przeklinać! Słowo %s nie jest dozwolone."
+msgstr[1] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+msgstr[2] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To pole musi pasować do pola '%s'."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Proszę uzupełnić przynajmniej jedno pole."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"To pole musi być uzupełnione, jeśli %(field)s ma wartość inną niż %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Duplikaty nie są dozwolone."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Ta wartość musi być pomiędzy %(lower)s a %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Ta wartość nie może być mniejsza od %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Ta wartość nie może być większa od %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ta wartość musi być potęgą %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:444
+#, 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."
+msgstr[0] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrze."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+
+#: core/validators.py:447
+#, 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] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfrę."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s "
+"cyfry."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
+
+#: core/validators.py:450
+#, 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] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po "
+"przecinku."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
+"przecinku."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
+"przecinku."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Proszę wpisać poprawną liczbę rzeczywistą."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma conajmniej %s bajtów."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma co najwyżej %s bajtów."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Format tego pola jest nieprawidłowy."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "To pole jest nieprawidłowe."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nie można nic pobrać z %s."
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s zwrócił niepoprawny nagłówek Content-Type '%(contenttype)s'."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Proszę zamknąć tag %(tag)s z linii %(line)s. (Linia zaczyna się od \"%(start)"
+"s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Część tekstu od linii %(line)s nie jest dozwolony w tym kontekście. (Linia "
+"zaczyna się od \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" w linii %(line)s jest niepoprawnym atrybutem. (Linia zaczyna "
+"się od \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" w linii %(line)s nie jest poprawnym tagiem. (Linia zaczyna się "
+"od \"%(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tag w linii %(line)s nie posiada jednego lub więcej wymaganych atrybutów. "
+"(Linia zaczyna się od \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atrybut \"%(attr)s\" w linii %(line)s ma niepoprawną wartość. (Linia zaczyna "
+"się od \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s z %(type)s już istnieje dla %(field)s."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Już istnieje %(optname)s z %(fieldname)s."
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 newforms/models.py:220 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "To pole jest wymagane."
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr "Ta wartość musi być liczbą całkowitą."
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr "Ta wartość musi być logiczna (True, False - prawda lub fałsz)."
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr "To pole nie może być puste."
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr "Ta wartość musi być liczbą dziesiętną."
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr "Wpisz poprawną nazwę pliku."
+
+#: db/models/fields/__init__.py:904
+msgid "This value must be either None, True or False."
+msgstr ""
+"Ta wartość musi być jedną z None (żadne), True (prawda) lub False (fałsz)."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Oddziel identyfikatory przecinkami."
+
+#: db/models/fields/related.py:660
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Przytrzymaj wciśnięty klawisz \"Ctrl\" lub \"Command\" na Mac'u aby "
+"zaznaczyć więcej niż jeden wybór."
+
+#: db/models/fields/related.py:707
+#, 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] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartość %(value)r jest "
+"niepoprawna."
+msgstr[1] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
+"niepoprawne."
+msgstr[2] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
+"niepoprawne."
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Wpisz poprawną wartość."
+
+#: newforms/fields.py:129
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Upewnij się, że ta wartość ma co najwyżej %(max)d znaków (ma długość %"
+"(length)d)."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Upewnij się, że ta wartość ma co najmniej %(min)d znaków (ma długość %"
+"(length)d)."
+
+#: newforms/fields.py:158 newforms/fields.py:187 newforms/fields.py:216
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %s."
+
+#: newforms/fields.py:159 newforms/fields.py:188 newforms/fields.py:217
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest większa lub równa %s."
+
+#: newforms/fields.py:186 newforms/fields.py:215
+msgid "Enter a number."
+msgstr "Wpisz liczbę."
+
+#: newforms/fields.py:218
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Upewnij się, że jest nie więcej niż %s cyfr."
+
+#: newforms/fields.py:219
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Upewnij się, że jest nie więcej niż %s miejsc po przecinku."
+
+#: newforms/fields.py:220
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Upewnij się, że jest nie więcej niż %s miejsc przed przecinkiem."
+
+#: newforms/fields.py:268 newforms/fields.py:724
+msgid "Enter a valid date."
+msgstr "Wpisz poprawną datę."
+
+#: newforms/fields.py:301 newforms/fields.py:725
+msgid "Enter a valid time."
+msgstr "Wpisz poprawną godzinę."
+
+#: newforms/fields.py:340
+msgid "Enter a valid date/time."
+msgstr "Wpisz poprawną datę/godzinę."
+
+#: newforms/fields.py:439
+msgid "No file was submitted."
+msgstr "Żaden plik nie został przesłany."
+
+#: newforms/fields.py:440 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Wysłany plik jest pusty."
+
+#: newforms/fields.py:498
+msgid "Enter a valid URL."
+msgstr "Wpisz poprawny URL."
+
+#: newforms/fields.py:499
+msgid "This URL appears to be a broken link."
+msgstr "Ten odnośnik jest nieprawidłowy."
+
+#: newforms/fields.py:560 newforms/models.py:203
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów."
+
+#: newforms/fields.py:599
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Wybierz poprawną wartość. %(value)s nie jest jednym z dostępnych wyborów."
+
+#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:224
+msgid "Enter a list of values."
+msgstr "Podaj listę wartości."
+
+#: newforms/fields.py:753
+msgid "Enter a valid IPv4 address."
+msgstr "Wprowadź poprawny adres IPv4."
+
+#: newforms/models.py:230
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Wybierz poprawną wartość. %s nie jest jednym z dostępnych wyborów."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak."
+msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaki."
+msgstr[2] "Upewnij się, że tekst ma mniej niż %s znaków."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Znaki nowej linii są tutaj niedopuszczalne."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Wybierz poprawną opcję; '%(data)s' nie jest wśród %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od -32 768 do 32 767"
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Proszę wpisać liczbę dodatnią."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od 0 do 32 767"
+
+#: template/defaultfilters.py:655
+msgid "yes,no,maybe"
+msgstr "tak,nie,może"
+
+#: template/defaultfilters.py:686
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajty"
+msgstr[2] "%(size)d bajtów"
+
+#: template/defaultfilters.py:688
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:690
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:691
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "po południu"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "rano"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "po południu"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "rano"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "północ"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "południe"
#: utils/dates.py:6
msgid "Monday"
@@ -2726,255 +3711,255 @@ msgstr "Sobota"
msgid "Sunday"
msgstr "Niedziela"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Pon"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Wt"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Śr"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Czw"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Pi"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "So"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Nd"
+
+#: utils/dates.py:18
msgid "January"
msgstr "Styczeń"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "Luty"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "Marzec"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "Kwiecień"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "Maj"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "Czerwiec"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "Lipiec"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "Sierpień"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "Wrzesień"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "Pażdziernik"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "Listopad"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "Grudzień"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "sty"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "luty"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
msgstr "marz"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "kwie"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "maj"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
msgstr "czerw"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
msgstr "lip"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "sier"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
msgstr "wrze"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "paź"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "list"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "gru"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
msgstr "Sty."
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
msgstr "Lut."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
msgstr "Sier."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
msgstr "Wrz."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
msgstr "Paź."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
msgstr "Lis."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
msgstr "Gru."
-#: utils/timesince.py:12
+#: utils/text.py:127
+msgid "or"
+msgstr "lub"
+
+#: utils/timesince.py:21
msgid "year"
msgid_plural "years"
msgstr[0] "rok"
msgstr[1] "lata"
msgstr[2] "lat"
-#: utils/timesince.py:13
+#: utils/timesince.py:22
msgid "month"
msgid_plural "months"
msgstr[0] "miesiąc"
msgstr[1] "miesięce"
msgstr[2] "miesięcy"
-#: utils/timesince.py:14
+#: utils/timesince.py:23
msgid "week"
msgid_plural "weeks"
msgstr[0] "tydzień"
msgstr[1] "tygodnie"
msgstr[2] "tygodni"
-#: utils/timesince.py:15
+#: utils/timesince.py:24
msgid "day"
msgid_plural "days"
msgstr[0] "dzień"
msgstr[1] "dni"
msgstr[2] "dni"
-#: utils/timesince.py:16
+#: utils/timesince.py:25
msgid "hour"
msgid_plural "hours"
msgstr[0] "godzina"
msgstr[1] "godziny"
msgstr[2] "godzin"
-#: utils/timesince.py:17
+#: utils/timesince.py:26
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuta"
msgstr[1] "minuty"
msgstr[2] "minut"
-#: utils/timesince.py:40
-#, python-format
-msgid "%d milliseconds"
-msgstr "%d milisekund"
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuty"
-#: utils/timesince.py:41
+#: utils/timesince.py:51
#, python-format
msgid "%(number)d %(type)s"
msgstr "%(number)d %(type)s"
-#: utils/timesince.py:47
+#: utils/timesince.py:57
#, python-format
msgid ", %(number)d %(type)s"
msgstr ", %(number)d %(type)s"
-#: utils/dateformat.py:40
-msgid "p.m."
-msgstr "po południu"
-
-#: utils/dateformat.py:41
-msgid "a.m."
-msgstr "rano"
-
-#: utils/dateformat.py:46
-msgid "PM"
-msgstr "po południu"
-
-#: utils/dateformat.py:47
-msgid "AM"
-msgstr "rano"
-
-#: utils/dateformat.py:95
-msgid "midnight"
-msgstr "północ"
-
-#: utils/dateformat.py:97
-msgid "noon"
-msgstr "południe"
-
-#: utils/translation/trans_real.py:358
+#: utils/translation/trans_real.py:395
msgid "DATE_FORMAT"
msgstr "Y-m-d"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:396
msgid "DATETIME_FORMAT"
msgstr "Y-m-d H:i:s"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:397
msgid "TIME_FORMAT"
msgstr "H:i:s"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:413
msgid "YEAR_MONTH_FORMAT"
msgstr "Y-m"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:414
msgid "MONTH_DAY_FORMAT"
msgstr "m-d"
-#: template/defaultfilters.py:491
-msgid "yes,no,maybe"
-msgstr "tak,nie,może"
-
-#: template/defaultfilters.py:520
+#: views/generic/create_update.py:43
#, python-format
-msgid "%(size)d byte"
-msgid_plural "%(size)d bytes"
-msgstr[0] "%(size)d bajt"
-msgstr[1] "%(size)d bajty"
-msgstr[2] "%(size)d bajtów"
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s zostało pomyślnie utworzone."
-#: template/defaultfilters.py:522
+#: views/generic/create_update.py:117
#, python-format
-msgid "%.1f KB"
-msgstr "%.1f KB"
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s zostało pomyślnie zmienione."
-#: template/defaultfilters.py:524
+#: views/generic/create_update.py:184
#, python-format
-msgid "%.1f MB"
-msgstr "%.1f MB"
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s zostało usunięte."
-#: template/defaultfilters.py:525
-#, python-format
-msgid "%.1f GB"
-msgstr "%.1f GB"
+#~ msgid "AnonymousUser"
+#~ msgstr "UżytkownikAnonimowy"
+#~ msgid "%d milliseconds"
+#~ msgstr "%d milisekund"
diff --git a/django/contrib/admin/media/css/base.css b/django/contrib/admin/media/css/base.css
index 88f7d9a95a..9760d67dc4 100644
--- a/django/contrib/admin/media/css/base.css
+++ b/django/contrib/admin/media/css/base.css
@@ -4,11 +4,11 @@
*/
/* Block IE 5 */
-@import "null?\"\{";
+@import "null.css?\"\{";
/* Import other styles */
@import url('global.css');
@import url('layout.css');
/* Import patch for IE 6 Windows */
-/*\*/ @import "patch-iewin.css"; /**/ \ No newline at end of file
+/*\*/ @import "patch-iewin.css"; /**/
diff --git a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
index 36ae21411d..f6a39ca091 100644
--- a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
+++ b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
@@ -1,6 +1,16 @@
// Handles related-objects functionality: lookup link for raw_id_admin=True
// and Add Another links.
+function html_unescape(text) {
+ // Unescape a string that was escaped using django.utils.html.escape.
+ text = text.replace(/&lt;/g, '<');
+ text = text.replace(/&gt;/g, '>');
+ text = text.replace(/&quot;/g, '"');
+ text = text.replace(/&#39;/g, "'");
+ text = text.replace(/&amp;/g, '&');
+ return text;
+}
+
function showRelatedObjectLookupPopup(triggeringLink) {
var name = triggeringLink.id.replace(/^lookup_/, '');
// IE doesn't like periods in the window name, so convert temporarily.
@@ -42,6 +52,10 @@ function showAddAnotherPopup(triggeringLink) {
}
function dismissAddAnotherPopup(win, newId, newRepr) {
+ // newId and newRepr are expected to have previously been escaped by
+ // django.utils.html.escape.
+ newId = html_unescape(newId);
+ newRepr = html_unescape(newRepr);
var name = win.name.replace(/___/g, '.');
var elem = document.getElementById(name);
if (elem) {
diff --git a/django/contrib/admin/templates/admin/field_line.html b/django/contrib/admin/templates/admin/field_line.html
index 680830b506..f4b53fff67 100644
--- a/django/contrib/admin/templates/admin/field_line.html
+++ b/django/contrib/admin/templates/admin/field_line.html
@@ -5,6 +5,6 @@
{% if bound_field.has_label_first %}{% field_label bound_field %}{% endif %}
{% field_widget bound_field %}
{% if not bound_field.has_label_first %}{% field_label bound_field %}{% endif %}
- {% if bound_field.field.help_text %}<p class="help">{{ bound_field.field.help_text }}</p>{% endif %}
+ {% if bound_field.field.help_text %}<p class="help">{{ bound_field.field.help_text|safe }}</p>{% endif %}
{% endfor %}
</div>
diff --git a/django/contrib/admin/templates/admin_doc/template_filter_index.html b/django/contrib/admin/templates/admin_doc/template_filter_index.html
index f67f14eb35..902396d416 100644
--- a/django/contrib/admin/templates/admin_doc/template_filter_index.html
+++ b/django/contrib/admin/templates/admin_doc/template_filter_index.html
@@ -13,7 +13,7 @@
{% for library in filter_libraries %}
<div class="module">
<h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}</h2>
- {% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr>{% endif %}
+ {% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr />{% endif %}
{% for filter in library.list|dictsort:"name" %}
<h3 id="{{ filter.name }}">{{ filter.name }}</h3>
<p>{{ filter.title }}</p>
diff --git a/django/contrib/admin/templates/admin_doc/template_tag_index.html b/django/contrib/admin/templates/admin_doc/template_tag_index.html
index 9bd66b70e7..ea49529393 100644
--- a/django/contrib/admin/templates/admin_doc/template_tag_index.html
+++ b/django/contrib/admin/templates/admin_doc/template_tag_index.html
@@ -13,7 +13,7 @@
{% for library in tag_libraries %}
<div class="module">
<h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}</h2>
- {% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr>{% endif %}
+ {% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr />{% endif %}
{% for tag in library.list|dictsort:"name" %}
<h3 id="{{ tag.name }}">{{ tag.name }}</h3>
<h4>{{ tag.title }}</h4>
diff --git a/django/contrib/admin/templates/admin_doc/view_index.html b/django/contrib/admin/templates/admin_doc/view_index.html
index 47f99350a3..1ed5ba2ac1 100644
--- a/django/contrib/admin/templates/admin_doc/view_index.html
+++ b/django/contrib/admin/templates/admin_doc/view_index.html
@@ -29,10 +29,10 @@
{% for view in site_views.list|dictsort:"url" %}
{% ifchanged %}
-<h3><a href="{{ view.module }}.{{ view.name }}/"/>{{ view.url|escape }}</a></h3>
+<h3><a href="{{ view.module }}.{{ view.name }}/">{{ view.url|escape }}</a></h3>
<p class="small quiet">View function: {{ view.module }}.{{ view.name }}</p>
<p>{{ view.title }}</p>
-<hr>
+<hr />
{% endifchanged %}
{% endfor %}
</div>
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index b23013becd..a4e6269b6f 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -148,6 +148,8 @@ def items_for_result(cl, result):
# function has an "allow_tags" attribute set to True.
if not allow_tags:
result_repr = escape(result_repr)
+ else:
+ result_repr = mark_safe(result_repr)
else:
field_val = getattr(result, f.attname)
@@ -185,7 +187,7 @@ def items_for_result(cl, result):
else:
result_repr = escape(field_val)
if force_unicode(result_repr) == '':
- result_repr = '&nbsp;'
+ result_repr = mark_safe('&nbsp;')
# If list_display_links not defined, add the link tag to the first field
if (first and not cl.lookup_opts.admin.list_display_links) or field_name in cl.lookup_opts.admin.list_display_links:
table_tag = {True:'th', False:'td'}[first]
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py
index e5f31ba723..ef33bb33b0 100644
--- a/django/contrib/admin/templatetags/admin_modify.py
+++ b/django/contrib/admin/templatetags/admin_modify.py
@@ -118,7 +118,7 @@ class FieldWrapper(object):
return not isinstance(self.field, models.AutoField)
def header_class_attribute(self):
- return self.field.blank and ' class="optional"' or ''
+ return self.field.blank and mark_safe(' class="optional"') or ''
def use_raw_id_admin(self):
return isinstance(self.field.rel, (models.ManyToOneRel, models.ManyToManyRel)) \
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index fa314803a3..9786935bf8 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -159,7 +159,7 @@ class AdminBoundField(object):
return repr(self.__dict__)
def html_error_list(self):
- return " ".join([form_field.html_error_list() for form_field in self.form_fields if form_field.errors])
+ return mark_safe(" ".join([form_field.html_error_list() for form_field in self.form_fields if form_field.errors]))
def original_url(self):
if self.is_file_field and self.original and self.field.attname:
@@ -273,10 +273,9 @@ def add_stage(request, app_label, model_name, show_delete=False, form_url='', po
post_url_continue += "?_popup=1"
return HttpResponseRedirect(post_url_continue % pk_value)
if "_popup" in request.POST:
- if type(pk_value) is str: # Quote if string, so JavaScript doesn't think it's a variable.
- pk_value = '"%s"' % pk_value.replace('"', '\\"')
- return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, %s, "%s");</script>' % \
- (pk_value, force_unicode(new_object).replace('"', '\\"')))
+ return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
+ # escape() calls force_unicode.
+ (escape(pk_value), escape(new_object)))
elif "_addanother" in request.POST:
request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
return HttpResponseRedirect(request.path)
diff --git a/django/contrib/comments/models.py b/django/contrib/comments/models.py
index a88d2b3a8e..912f5a6cd2 100644
--- a/django/contrib/comments/models.py
+++ b/django/contrib/comments/models.py
@@ -102,7 +102,7 @@ class Comment(models.Model):
date_hierarchy = 'submit_date'
search_fields = ('comment', 'user__username')
- def __repr__(self):
+ def __unicode__(self):
return "%s: %s..." % (self.user.username, self.comment[:100])
def get_absolute_url(self):
@@ -190,7 +190,7 @@ class FreeComment(models.Model):
date_hierarchy = 'submit_date'
search_fields = ('comment', 'person_name')
- def __repr__(self):
+ def __unicode__(self):
return "%s: %s..." % (self.person_name, self.comment[:100])
def get_absolute_url(self):
@@ -244,7 +244,7 @@ class KarmaScore(models.Model):
verbose_name_plural = _('karma scores')
unique_together = (('user', 'comment'),)
- def __repr__(self):
+ def __unicode__(self):
return _("%(score)d rating by %(user)s") % {'score': self.score, 'user': self.user}
class UserFlagManager(models.Manager):
@@ -275,7 +275,7 @@ class UserFlag(models.Model):
verbose_name_plural = _('user flags')
unique_together = (('user', 'comment'),)
- def __repr__(self):
+ def __unicode__(self):
return _("Flag by %r") % self.user
class ModeratorDeletion(models.Model):
@@ -287,5 +287,5 @@ class ModeratorDeletion(models.Model):
verbose_name_plural = _('moderator deletions')
unique_together = (('user', 'comment'),)
- def __repr__(self):
+ def __unicode__(self):
return _("Moderator deletion by %r") % self.user
diff --git a/django/contrib/comments/tests.py b/django/contrib/comments/tests.py
new file mode 100644
index 0000000000..a8275debf6
--- /dev/null
+++ b/django/contrib/comments/tests.py
@@ -0,0 +1,13 @@
+# coding: utf-8
+
+r"""
+>>> from django.contrib.comments.models import Comment
+>>> from django.contrib.auth.models import User
+>>> u = User.objects.create_user('commenttestuser', 'commenttest@example.com', 'testpw')
+>>> c = Comment(user=u, comment=u'\xe2')
+>>> c
+<Comment: commenttestuser: â...>
+>>> print c
+commenttestuser: â...
+"""
+
diff --git a/django/contrib/formtools/models.py b/django/contrib/formtools/models.py
new file mode 100644
index 0000000000..13990e24af
--- /dev/null
+++ b/django/contrib/formtools/models.py
@@ -0,0 +1 @@
+""" models.py (even empty) currently required by the runtests.py to enable unit tests """
diff --git a/django/contrib/formtools/preview.py b/django/contrib/formtools/preview.py
index 2e4fb92cda..bd0ce5cbb7 100644
--- a/django/contrib/formtools/preview.py
+++ b/django/contrib/formtools/preview.py
@@ -109,7 +109,7 @@ class FormPreview(object):
data = [(bf.name, bf.data) for bf in form] + [settings.SECRET_KEY]
# Use HIGHEST_PROTOCOL because it's the most efficient. It requires
# Python 2.3, but Django requires 2.3 anyway, so that's OK.
- pickled = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
+ pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
return md5.new(pickled).hexdigest()
def failed_hash(self, request):
diff --git a/django/contrib/formtools/test_urls.py b/django/contrib/formtools/test_urls.py
new file mode 100644
index 0000000000..19dbbd1ae4
--- /dev/null
+++ b/django/contrib/formtools/test_urls.py
@@ -0,0 +1,12 @@
+"""
+
+This is a urlconf to be loaded by tests.py. Add any urls needed
+for tests only.
+
+"""
+from django.conf.urls.defaults import *
+from django.contrib.formtools.tests import *
+
+urlpatterns = patterns('',
+ (r'^test1/', TestFormPreview(TestForm)),
+ )
diff --git a/django/contrib/formtools/tests.py b/django/contrib/formtools/tests.py
new file mode 100644
index 0000000000..a5a9222c46
--- /dev/null
+++ b/django/contrib/formtools/tests.py
@@ -0,0 +1,93 @@
+from django import newforms as forms
+from django.contrib.formtools import preview
+from django import http
+from django.conf import settings
+from django.test import TestCase
+from django.test.client import Client
+
+
+success_string = "Done was called!"
+test_data = {'field1': u'foo',
+ 'field1_': u'asdf'}
+
+
+class TestFormPreview(preview.FormPreview):
+
+ def done(self, request, cleaned_data):
+ return http.HttpResponse(success_string)
+
+
+class TestForm(forms.Form):
+ field1 = forms.CharField()
+ field1_ = forms.CharField()
+
+
+class PreviewTests(TestCase):
+
+ def setUp(self):
+ settings.ROOT_URLCONF = 'django.contrib.formtools.test_urls'
+ # Create a FormPreview instance to share between tests
+ self.preview = preview.FormPreview(TestForm)
+ input_template = '<input type="hidden" name="%s" value="%s" />'
+ self.input = input_template % (self.preview.unused_name('stage'), "%d")
+
+ def test_unused_name(self):
+ """
+ Verifies name mangling to get uniue field name.
+ """
+ self.assertEqual(self.preview.unused_name('field1'), 'field1__')
+
+ def test_form_get(self):
+ """
+ Test contrib.formtools.preview form retrieval.
+
+ Use the client library to see if we can sucessfully retrieve
+ the form (mostly testing the setup ROOT_URLCONF
+ process). Verify that an additional hidden input field
+ is created to manage the stage.
+
+ """
+ response = self.client.get('/test1/')
+ stage = self.input % 1
+ self.assertContains(response, stage, 1)
+
+ def test_form_preview(self):
+ """
+ Test contrib.formtools.preview form preview rendering.
+
+ Use the client library to POST to the form to see if a preview
+ is returned. If we do get a form back check that the hidden
+ value is correctly managing the state of the form.
+
+ """
+ # Pass strings for form submittal and add stage variable to
+ # show we previously saw first stage of the form.
+ test_data.update({'stage': 1})
+ response = self.client.post('/test1/', test_data)
+ # Check to confirm stage is set to 2 in output form.
+ stage = self.input % 2
+ self.assertContains(response, stage, 1)
+
+ def test_form_submit(self):
+ """
+ Test contrib.formtools.preview form submittal.
+
+ Use the client library to POST to the form with stage set to 3
+ to see if our forms done() method is called. Check first
+ without the security hash, verify failure, retry with security
+ hash and verify sucess.
+
+ """
+ # Pass strings for form submittal and add stage variable to
+ # show we previously saw first stage of the form.
+ test_data.update({'stage': 2})
+ response = self.client.post('/test1/', test_data)
+ self.failIfEqual(response.content, success_string)
+ hash = self.preview.security_hash(None, TestForm(test_data))
+ test_data.update({'hash': hash})
+ response = self.client.post('/test1/', test_data)
+ self.assertEqual(response.content, success_string)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/django/contrib/localflavor/ca/ca_provinces.py b/django/contrib/localflavor/ca/ca_provinces.py
index 072159ad57..746716fd21 100644
--- a/django/contrib/localflavor/ca/ca_provinces.py
+++ b/django/contrib/localflavor/ca/ca_provinces.py
@@ -33,6 +33,8 @@ PROVINCES_NORMALIZED = {
'british columbia': 'BC',
'mb': 'MB',
'manitoba': 'MB',
+ 'nb': 'NB',
+ 'new brunswick': 'NB',
'nf': 'NF',
'newfoundland': 'NF',
'newfoundland and labrador': 'NF',
diff --git a/django/core/cache/backends/base.py b/django/core/cache/backends/base.py
index cd0d7bd103..ff4223bf86 100644
--- a/django/core/cache/backends/base.py
+++ b/django/core/cache/backends/base.py
@@ -16,7 +16,7 @@ class BaseCache(object):
def add(self, key, value, timeout=None):
"""
- Set a value in the cache if the key does not already exist. If
+ Set a value in the cache if the key does not already exist. If
timeout is given, that timeout will be used for the key; otherwise
the default cache timeout will be used.
"""
@@ -24,14 +24,14 @@ class BaseCache(object):
def get(self, key, default=None):
"""
- Fetch a given key from the cache. If the key does not exist, return
+ Fetch a given key from the cache. If the key does not exist, return
default, which itself defaults to None.
"""
raise NotImplementedError
def set(self, key, value, timeout=None):
"""
- Set a value in the cache. If timeout is given, that timeout will be
+ Set a value in the cache. If timeout is given, that timeout will be
used for the key; otherwise the default cache timeout will be used.
"""
raise NotImplementedError
@@ -44,10 +44,10 @@ class BaseCache(object):
def get_many(self, keys):
"""
- Fetch a bunch of keys from the cache. For certain backends (memcached,
+ Fetch a bunch of keys from the cache. For certain backends (memcached,
pgsql) this can be *much* faster when fetching multiple values.
- Returns a dict mapping each key in keys to its value. If the given
+ Returns a dict mapping each key in keys to its value. If the given
key is missing, it will be missing from the response dict.
"""
d = {}
@@ -64,4 +64,3 @@ class BaseCache(object):
return self.get(key) is not None
__contains__ = has_key
-
diff --git a/django/core/cache/backends/locmem.py b/django/core/cache/backends/locmem.py
index 5998f7bfd5..2d74e2b132 100644
--- a/django/core/cache/backends/locmem.py
+++ b/django/core/cache/backends/locmem.py
@@ -16,8 +16,12 @@ class CacheClass(SimpleCacheClass):
def add(self, key, value, timeout=None):
self._lock.writer_enters()
+ # Python 2.3 and 2.4 don't allow combined try-except-finally blocks.
try:
- SimpleCacheClass.add(self, key, value, timeout)
+ try:
+ super(CacheClass, self).add(key, pickle.dumps(value), timeout)
+ except pickle.PickleError:
+ pass
finally:
self._lock.writer_leaves()
@@ -49,6 +53,7 @@ class CacheClass(SimpleCacheClass):
def set(self, key, value, timeout=None):
self._lock.writer_enters()
+ # Python 2.3 and 2.4 don't allow combined try-except-finally blocks.
try:
try:
super(CacheClass, self).set(key, pickle.dumps(value), timeout)
diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py
index dce2fd493d..fcbc9d1110 100644
--- a/django/core/management/__init__.py
+++ b/django/core/management/__init__.py
@@ -52,7 +52,7 @@ def load_command_class(app_name, name):
return getattr(__import__('%s.management.commands.%s' % (app_name, name),
{}, {}, ['Command']), 'Command')()
-def get_commands(load_user_commands=True, project_directory=None):
+def get_commands():
"""
Returns a dictionary of commands against the application in which
those commands can be found. This works by looking for a
@@ -60,10 +60,10 @@ def get_commands(load_user_commands=True, project_directory=None):
application -- if a commands package exists, all commands in that
package are registered.
- Core commands are always included; user-defined commands will also
- be included if ``load_user_commands`` is True. If a project directory
- is provided, the startproject command will be disabled, and the
- startapp command will be modified to use that directory.
+ Core commands are always included. If a settings module has been
+ specified, user-defined commands will also be included, the
+ startproject command will be disabled, and the startapp command
+ will be modified to use the directory in which that module appears.
The dictionary is in the format {command_name: app_name}. Key-value
pairs from this dictionary can then be used in calls to
@@ -80,16 +80,27 @@ def get_commands(load_user_commands=True, project_directory=None):
if _commands is None:
_commands = dict([(name, 'django.core')
for name in find_commands(__path__[0])])
- if load_user_commands:
- # Get commands from all installed apps.
+ # Get commands from all installed apps.
+ try:
+ from django.conf import settings
+ apps = settings.INSTALLED_APPS
+ except (AttributeError, EnvironmentError):
+ apps = []
+
+ for app_name in apps:
+ try:
+ path = find_management_module(app_name)
+ _commands.update(dict([(name, app_name)
+ for name in find_commands(path)]))
+ except ImportError:
+ pass # No management module - ignore this app
+
+ # Try to determine the project directory
+ try:
from django.conf import settings
- for app_name in settings.INSTALLED_APPS:
- try:
- path = find_management_module(app_name)
- _commands.update(dict([(name, app_name)
- for name in find_commands(path)]))
- except ImportError:
- pass # No management module - ignore this app
+ project_directory = setup_environ(__import__(settings.SETTINGS_MODULE))
+ except (AttributeError, EnvironmentError, ImportError):
+ project_directory = None
if project_directory:
# Remove the "startproject" command from self.commands, because
@@ -146,8 +157,6 @@ class ManagementUtility(object):
def __init__(self, argv=None):
self.argv = argv or sys.argv[:]
self.prog_name = os.path.basename(self.argv[0])
- self.project_directory = None
- self.user_commands = False
def main_help_text(self):
"""
@@ -159,8 +168,7 @@ class ManagementUtility(object):
usage.append("Type '%s help <subcommand>' for help on a specific"
" subcommand." % self.prog_name)
usage.append('Available subcommands:')
- commands = get_commands(self.user_commands,
- self.project_directory).keys()
+ commands = get_commands().keys()
commands.sort()
for cmd in commands:
usage.append(' %s' % cmd)
@@ -173,8 +181,7 @@ class ManagementUtility(object):
django-admin.py or manage.py) if it can't be found.
"""
try:
- app_name = get_commands(self.user_commands,
- self.project_directory)[subcommand]
+ app_name = get_commands()[subcommand]
if isinstance(app_name, BaseCommand):
# If the command is already loaded, use it directly.
klass = app_name
@@ -235,8 +242,6 @@ class ProjectManagementUtility(ManagementUtility):
"""
def __init__(self, argv, project_directory):
super(ProjectManagementUtility, self).__init__(argv)
- self.project_directory = project_directory
- self.user_commands = True
def setup_environ(settings_mod):
"""
diff --git a/django/core/management/base.py b/django/core/management/base.py
index 0c458126e8..31c2849075 100644
--- a/django/core/management/base.py
+++ b/django/core/management/base.py
@@ -172,14 +172,13 @@ def copy_helper(style, app_or_project, name, directory, other_name=''):
"""
Copies either a Django application layout template or a Django project
layout template into the specified directory.
-
- * style - A color style object (see django.core.management.color).
- * app_or_project - The string 'app' or 'project'.
- * name - The name of the application or project.
- * directory - The directory to copy the layout template to.
- * other_name - When copying an application layout, this should be the name
- of the project.
"""
+ # style -- A color style object (see django.core.management.color).
+ # app_or_project -- The string 'app' or 'project'.
+ # name -- The name of the application or project.
+ # directory -- The directory to which the layout template should be copied.
+ # other_name -- When copying an application layout, this should be the name
+ # of the project.
import re
import shutil
other = {'project': 'app', 'app': 'project'}[app_or_project]
diff --git a/django/core/paginator.py b/django/core/paginator.py
index b50ca826c4..71a5479fd5 100644
--- a/django/core/paginator.py
+++ b/django/core/paginator.py
@@ -91,7 +91,7 @@ class ObjectPaginator(object):
a template for loop.
"""
if self._page_range is None:
- self._page_range = range(1, self._pages + 1)
+ self._page_range = range(1, self.pages + 1)
return self._page_range
hits = property(_get_hits)
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index 380e571b00..e98957da2c 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -8,7 +8,6 @@ been reviewed for security issues. Don't use it for production use.
"""
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
-from types import ListType, StringType
import mimetypes
import os
import re
@@ -72,7 +71,7 @@ def _formatparam(param, value=None, quote=1):
class Headers(object):
"""Manage a collection of HTTP response headers"""
def __init__(self,headers):
- if type(headers) is not ListType:
+ if not isinstance(headers, list):
raise TypeError("Headers must be a list of name/value tuples")
self._headers = headers
@@ -327,7 +326,7 @@ class ServerHandler(object):
"""Compute Content-Length or switch to chunked encoding if possible"""
try:
blocks = len(self.result)
- except (TypeError,AttributeError,NotImplementedError):
+ except (TypeError, AttributeError, NotImplementedError):
pass
else:
if blocks==1:
@@ -356,14 +355,14 @@ class ServerHandler(object):
elif self.headers is not None:
raise AssertionError("Headers already set!")
- assert type(status) is StringType,"Status must be a string"
+ assert isinstance(status, str),"Status must be a string"
assert len(status)>=4,"Status must be at least 4 characters"
assert int(status[:3]),"Status message must begin w/3-digit code"
assert status[3]==" ", "Status message must have a space after code"
if __debug__:
for name,val in headers:
- assert type(name) is StringType,"Header names must be strings"
- assert type(val) is StringType,"Header values must be strings"
+ assert isinstance(name, str),"Header names must be strings"
+ assert isinstance(val, str),"Header values must be strings"
assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"
self.status = status
self.headers = self.headers_class(headers)
@@ -386,7 +385,7 @@ class ServerHandler(object):
def write(self, data):
"""'write()' callable as specified by PEP 333"""
- assert type(data) is StringType,"write() argument must be string"
+ assert isinstance(data, str), "write() argument must be string"
if not self.status:
raise AssertionError("write() before start_response()")
diff --git a/django/db/models/base.py b/django/db/models/base.py
index ae1bf20c7a..bc90e8d543 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -471,5 +471,5 @@ def method_get_order(ordered_obj, self):
# HELPER FUNCTIONS (CURRIED MODEL FUNCTIONS) #
##############################################
-def get_absolute_url(opts, func, self):
- return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self)
+def get_absolute_url(opts, func, self, *args, **kwargs):
+ return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs)
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 5abb73ead8..20aa56d408 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -396,7 +396,7 @@ class Field(object):
"Returns a django.newforms.Field instance for this database Field."
defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
if self.choices:
- defaults['widget'] = forms.Select(choices=self.get_choices())
+ defaults['widget'] = forms.Select(choices=self.get_choices(include_blank=self.blank or not (self.has_default() or 'initial' in kwargs)))
if self.has_default():
defaults['initial'] = self.get_default()
defaults.update(kwargs)
diff --git a/django/db/models/fields/subclassing.py b/django/db/models/fields/subclassing.py
index 1e4c8ca2e0..36f7e4d934 100644
--- a/django/db/models/fields/subclassing.py
+++ b/django/db/models/fields/subclassing.py
@@ -28,10 +28,10 @@ class Creator(object):
def __get__(self, obj, type=None):
if obj is None:
raise AttributeError('Can only be accessed via an instance.')
- return self.value
+ return obj.__dict__[self.field.name]
def __set__(self, obj, value):
- self.value = self.field.to_python(value)
+ obj.__dict__[self.field.name] = self.field.to_python(value)
def make_contrib(func=None):
"""
diff --git a/django/middleware/cache.py b/django/middleware/cache.py
index a88b4956b2..23a907f8be 100644
--- a/django/middleware/cache.py
+++ b/django/middleware/cache.py
@@ -1,14 +1,18 @@
from django.conf import settings
from django.core.cache import cache
-from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers
+from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers, get_max_age
class CacheMiddleware(object):
"""
Cache middleware. If this is enabled, each Django-powered page will be
- cached for CACHE_MIDDLEWARE_SECONDS seconds. Cache is based on URLs.
+ cached (based on URLs).
Only parameter-less GET or HEAD-requests with status code 200 are cached.
+ The number of seconds each page is stored for is set by the
+ "max-age" section of the response's "Cache-Control" header, falling back to
+ the CACHE_MIDDLEWARE_SECONDS setting if the section was not found.
+
If CACHE_MIDDLEWARE_ANONYMOUS_ONLY is set to True, only anonymous requests
(i.e., those not made by a logged-in user) will be cached. This is a
simple and effective way of avoiding the caching of the Django admin (and
@@ -78,7 +82,16 @@ class CacheMiddleware(object):
return response
if not response.status_code == 200:
return response
- patch_response_headers(response, self.cache_timeout)
- cache_key = learn_cache_key(request, response, self.cache_timeout, self.key_prefix)
- cache.set(cache_key, response, self.cache_timeout)
+ # Try to get the timeout from the "max-age" section of the "Cache-
+ # Control" header before reverting to using the default cache_timeout
+ # length.
+ timeout = get_max_age(response)
+ if timeout == None:
+ timeout = self.cache_timeout
+ elif timeout == 0:
+ # max-age was set to 0, don't bother caching.
+ return response
+ patch_response_headers(response, timeout)
+ cache_key = learn_cache_key(request, response, timeout, self.key_prefix)
+ cache.set(cache_key, response, timeout)
return response
diff --git a/django/middleware/gzip.py b/django/middleware/gzip.py
index aa2a8ea5a6..62a2456b97 100644
--- a/django/middleware/gzip.py
+++ b/django/middleware/gzip.py
@@ -1,4 +1,5 @@
import re
+
from django.utils.text import compress_string
from django.utils.cache import patch_vary_headers
@@ -11,18 +12,21 @@ class GZipMiddleware(object):
on the Accept-Encoding header.
"""
def process_response(self, request, response):
+ # It's not worth compressing non-OK or really short responses.
if response.status_code != 200 or len(response.content) < 200:
- # Not worth compressing really short responses or 304 status
- # responses, etc.
return response
patch_vary_headers(response, ('Accept-Encoding',))
- # Avoid gzipping if we've already got a content-encoding or if the
- # content-type is Javascript and the user's browser is IE.
- is_js = ("msie" in request.META.get('HTTP_USER_AGENT', '').lower() and
- "javascript" in response.get('Content-Type', '').lower())
- if response.has_header('Content-Encoding') or is_js:
+ # Avoid gzipping if we've already got a content-encoding.
+ if response.has_header('Content-Encoding'):
+ return response
+
+ # Older versions of IE have issues with gzipped javascript.
+ # See http://code.djangoproject.com/ticket/2449
+ is_ie = "msie" in request.META.get('HTTP_USER_AGENT', '').lower()
+ is_js = "javascript" in response.get('Content-Type', '').lower()
+ if is_ie and is_js:
return response
ae = request.META.get('HTTP_ACCEPT_ENCODING', '')
diff --git a/django/newforms/extras/widgets.py b/django/newforms/extras/widgets.py
index 60936a6bd6..0097ba3f54 100644
--- a/django/newforms/extras/widgets.py
+++ b/django/newforms/extras/widgets.py
@@ -6,6 +6,7 @@ import datetime
from django.newforms.widgets import Widget, Select
from django.utils.dates import MONTHS
+from django.utils.safestring import mark_safe
__all__ = ('SelectDateWidget',)
@@ -51,7 +52,7 @@ class SelectDateWidget(Widget):
select_html = Select(choices=year_choices).render(self.year_field % name, year_val)
output.append(select_html)
- return u'\n'.join(output)
+ return mark_safe(u'\n'.join(output))
def value_from_datadict(self, data, files, name):
y, m, d = data.get(self.year_field % name), data.get(self.month_field % name), data.get(self.day_field % name)
diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index 9bb2ced583..4a54a98d61 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -17,7 +17,7 @@ except NameError:
from sets import Set as set
from django.utils.translation import ugettext_lazy as _
-from django.utils.encoding import StrAndUnicode, smart_unicode
+from django.utils.encoding import StrAndUnicode, smart_unicode, smart_str
from util import ErrorList, ValidationError
from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput
@@ -235,7 +235,7 @@ class DecimalField(Field):
super(DecimalField, self).clean(value)
if not self.required and value in EMPTY_VALUES:
return None
- value = str(value).strip()
+ value = smart_str(value).strip()
try:
value = Decimal(value)
except DecimalException:
@@ -536,11 +536,12 @@ class BooleanField(Field):
widget = CheckboxInput
def clean(self, value):
- "Returns a Python boolean object."
+ """Returns a Python boolean object."""
super(BooleanField, self).clean(value)
- # Explicitly check for the string '0', which is what as hidden field
- # will submit for False.
- if value == '0':
+ # Explicitly check for the string 'False', which is what a hidden field
+ # will submit for False (since bool("True") == True we don't need to
+ # handle that explicitly).
+ if value == 'False':
return False
return bool(value)
diff --git a/django/newforms/models.py b/django/newforms/models.py
index c86b9b3a42..51ed16ff7f 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -3,13 +3,13 @@ Helper functions for creating Form classes from Django models
and database field objects.
"""
-from django.utils.translation import ugettext
+from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode
from django.utils.datastructures import SortedDict
from util import ValidationError
from forms import BaseForm
-from fields import Field, ChoiceField
+from fields import Field, ChoiceField, EMPTY_VALUES
from widgets import Select, SelectMultiple, MultipleHiddenInput
__all__ = (
@@ -151,15 +151,20 @@ class ModelChoiceField(ChoiceField):
"""A ChoiceField whose choices are a model QuerySet."""
# This class is a subclass of ChoiceField for purity, but it doesn't
# actually use any of ChoiceField's implementation.
+ default_error_messages = {
+ 'invalid_choice': _(u'Select a valid choice. That choice is not one of'
+ u' the available choices.'),
+ }
def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
required=True, widget=Select, label=None, initial=None,
- help_text=None):
+ help_text=None, *args, **kwargs):
self.empty_label = empty_label
self.cache_choices = cache_choices
# Call Field instead of ChoiceField __init__() because we don't need
# ChoiceField.__init__().
- Field.__init__(self, required, widget, label, initial, help_text)
+ Field.__init__(self, required, widget, label, initial, help_text,
+ *args, **kwargs)
self.queryset = queryset
def _get_queryset(self):
@@ -195,41 +200,43 @@ class ModelChoiceField(ChoiceField):
def clean(self, value):
Field.clean(self, value)
- if value in ('', None):
+ if value in EMPTY_VALUES:
return None
try:
value = self.queryset.get(pk=value)
except self.queryset.model.DoesNotExist:
- raise ValidationError(ugettext(u'Select a valid choice. That'
- u' choice is not one of the'
- u' available choices.'))
+ raise ValidationError(self.error_messages['invalid_choice'])
return value
class ModelMultipleChoiceField(ModelChoiceField):
"""A MultipleChoiceField whose choices are a model QuerySet."""
hidden_widget = MultipleHiddenInput
+ default_error_messages = {
+ 'list': _(u'Enter a list of values.'),
+ 'invalid_choice': _(u'Select a valid choice. %s is not one of the'
+ u' available choices.'),
+ }
def __init__(self, queryset, cache_choices=False, required=True,
widget=SelectMultiple, label=None, initial=None,
- help_text=None):
+ help_text=None, *args, **kwargs):
super(ModelMultipleChoiceField, self).__init__(queryset, None,
- cache_choices, required, widget, label, initial, help_text)
+ cache_choices, required, widget, label, initial, help_text,
+ *args, **kwargs)
def clean(self, value):
if self.required and not value:
- raise ValidationError(ugettext(u'This field is required.'))
+ raise ValidationError(self.error_messages['required'])
elif not self.required and not value:
return []
if not isinstance(value, (list, tuple)):
- raise ValidationError(ugettext(u'Enter a list of values.'))
+ raise ValidationError(self.error_messages['list'])
final_values = []
for val in value:
try:
obj = self.queryset.get(pk=val)
except self.queryset.model.DoesNotExist:
- raise ValidationError(ugettext(u'Select a valid choice. %s is'
- u' not one of the available'
- u' choices.') % val)
+ raise ValidationError(self.error_messages['invalid_choice'] % val)
else:
final_values.append(obj)
return final_values
diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py
index 350b878af9..580834857e 100644
--- a/django/newforms/widgets.py
+++ b/django/newforms/widgets.py
@@ -11,7 +11,7 @@ import copy
from itertools import chain
from django.utils.datastructures import MultiValueDict
-from django.utils.html import escape
+from django.utils.html import escape, conditional_escape
from django.utils.translation import ugettext
from django.utils.encoding import StrAndUnicode, force_unicode
from django.utils.safestring import mark_safe
@@ -155,7 +155,7 @@ class Textarea(Widget):
value = force_unicode(value)
final_attrs = self.build_attrs(attrs, name=name)
return mark_safe(u'<textarea%s>%s</textarea>' % (flatatt(final_attrs),
- escape(value)))
+ conditional_escape(force_unicode(value))))
class DateTimeInput(Input):
input_type = 'text'
@@ -217,7 +217,9 @@ class Select(Widget):
for option_value, option_label in chain(self.choices, choices):
option_value = force_unicode(option_value)
selected_html = (option_value == str_value) and u' selected="selected"' or ''
- output.append(u'<option value="%s"%s>%s</option>' % (escape(option_value), selected_html, escape(force_unicode(option_label))))
+ output.append(u'<option value="%s"%s>%s</option>' % (
+ escape(option_value), selected_html,
+ conditional_escape(force_unicode(option_label))))
output.append(u'</select>')
return mark_safe(u'\n'.join(output))
@@ -254,7 +256,9 @@ class SelectMultiple(Widget):
for option_value, option_label in chain(self.choices, choices):
option_value = force_unicode(option_value)
selected_html = (option_value in str_values) and ' selected="selected"' or ''
- output.append(u'<option value="%s"%s>%s</option>' % (escape(option_value), selected_html, escape(force_unicode(option_label))))
+ output.append(u'<option value="%s"%s>%s</option>' % (
+ escape(option_value), selected_html,
+ conditional_escape(force_unicode(option_label))))
output.append(u'</select>')
return mark_safe(u'\n'.join(output))
@@ -278,7 +282,7 @@ class RadioInput(StrAndUnicode):
def __unicode__(self):
return mark_safe(u'<label>%s %s</label>' % (self.tag(),
- self.choice_label))
+ conditional_escape(force_unicode(self.choice_label))))
def is_checked(self):
return self.value == self.choice_value
@@ -317,11 +321,13 @@ class RadioFieldRenderer(StrAndUnicode):
% force_unicode(w) for w in self]))
class RadioSelect(Select):
+ renderer = RadioFieldRenderer
def __init__(self, *args, **kwargs):
- self.renderer = kwargs.pop('renderer', None)
- if not self.renderer:
- self.renderer = RadioFieldRenderer
+ # Override the default renderer if we were passed one.
+ renderer = kwargs.pop('renderer', None)
+ if renderer:
+ self.renderer = renderer
super(RadioSelect, self).__init__(*args, **kwargs)
def get_renderer(self, name, value, attrs=None, choices=()):
@@ -361,7 +367,8 @@ class CheckboxSelectMultiple(SelectMultiple):
cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
option_value = force_unicode(option_value)
rendered_cb = cb.render(name, option_value)
- output.append(u'<li><label>%s %s</label></li>' % (rendered_cb, escape(force_unicode(option_label))))
+ output.append(u'<li><label>%s %s</label></li>' % (rendered_cb,
+ conditional_escape(force_unicode(option_label))))
output.append(u'</ul>')
return mark_safe(u'\n'.join(output))
diff --git a/django/template/__init__.py b/django/template/__init__.py
index 1fd3171c12..9b1868cfce 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -547,9 +547,9 @@ class FilterExpression(object):
if var == None:
var, constant, i18n_constant = match.group("var", "constant", "i18n_constant")
if i18n_constant:
- var = '"%s"' % _(i18n_constant)
+ var = '"%s"' % _(i18n_constant.replace(r'\"', '"'))
elif constant:
- var = '"%s"' % constant
+ var = '"%s"' % constant.replace(r'\"', '"')
upto = match.end()
if var == None:
raise TemplateSyntaxError, "Could not find variable at start of %s" % token
@@ -594,7 +594,7 @@ class FilterExpression(object):
arg_vals = []
for lookup, arg in args:
if not lookup:
- arg_vals.append(arg)
+ arg_vals.append(mark_safe(arg))
else:
arg_vals.append(arg.resolve(context))
if getattr(func, 'needs_autoescape', False):
@@ -678,6 +678,7 @@ class Variable(object):
self.var = var
self.literal = None
self.lookups = None
+ self.translate = False
try:
# First try to treat this variable as a number.
@@ -698,11 +699,15 @@ class Variable(object):
except ValueError:
# A ValueError means that the variable isn't a number.
+ if var.startswith('_(') and var.endswith(')'):
+ # The result of the lookup should be translated at rendering
+ # time.
+ self.translate = True
+ var = var[2:-1]
# If it's wrapped with quotes (single or double), then
# we're also dealing with a literal.
if var[0] in "\"'" and var[0] == var[-1]:
- self.literal = var[1:-1]
-
+ self.literal = mark_safe(var[1:-1])
else:
# Otherwise we'll set self.lookups so that resolve() knows we're
# dealing with a bonafide variable
@@ -712,10 +717,13 @@ class Variable(object):
"""Resolve this variable against a given context."""
if self.lookups is not None:
# We're dealing with a variable that needs to be resolved
- return self._resolve_lookup(context)
+ value = self._resolve_lookup(context)
else:
# We're dealing with a literal, so it's already been "resolved"
- return self.literal
+ value = self.literal
+ if self.translate:
+ return _(value)
+ return value
def __repr__(self):
return "<%s: %r>" % (self.__class__.__name__, self.var)
@@ -796,7 +804,7 @@ class NodeList(list):
bits.append(self.render_node(node, context))
else:
bits.append(node)
- return ''.join([force_unicode(b) for b in bits])
+ return mark_safe(''.join([force_unicode(b) for b in bits]))
def get_nodes_by_type(self, nodetype):
"Return a list of all nodes of the given type"
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 7d4a72efb3..f2be64ef1d 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -25,6 +25,8 @@ def stringfilter(func):
if args:
args = list(args)
args[0] = force_unicode(args[0])
+ if isinstance(args[0], SafeData) and getattr(func, 'is_safe', False):
+ return mark_safe(func(*args, **kwargs))
return func(*args, **kwargs)
# Include a reference to the real function (used to check original
@@ -89,7 +91,7 @@ def floatformat(text, arg=-1):
"""
try:
f = float(text)
- except ValueError:
+ except (ValueError, TypeError):
return u''
try:
d = int(arg)
@@ -106,6 +108,7 @@ floatformat.is_safe = True
def iriencode(value):
"""Escapes an IRI value for use in a URL."""
return force_unicode(iri_to_uri(value))
+iriencode.is_safe = True
iriencode = stringfilter(iriencode)
def linenumbers(value, autoescape=None):
diff --git a/django/template/loader_tags.py b/django/template/loader_tags.py
index 652fda11ce..c83768ef91 100644
--- a/django/template/loader_tags.py
+++ b/django/template/loader_tags.py
@@ -2,6 +2,7 @@ from django.template import TemplateSyntaxError, TemplateDoesNotExist, Variable
from django.template import Library, Node
from django.template.loader import get_template, get_template_from_string, find_template_source
from django.conf import settings
+from django.utils.safestring import mark_safe
register = Library()
@@ -26,7 +27,7 @@ class BlockNode(Node):
def super(self):
if self.parent:
- return self.parent.render(self.context)
+ return mark_safe(self.parent.render(self.context))
return ''
def add_parent(self, nodelist):
diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py
index cec35fb48e..b4438fdf42 100644
--- a/django/templatetags/i18n.py
+++ b/django/templatetags/i18n.py
@@ -1,9 +1,10 @@
import re
-from django.template import Node, Variable
+from django.template import Node, Variable, VariableNode
from django.template import TemplateSyntaxError, TokenParser, Library
from django.template import TOKEN_TEXT, TOKEN_VAR
from django.utils import translation
+from django.utils.encoding import force_unicode
register = Library()
@@ -45,7 +46,8 @@ class TranslateNode(Node):
return translation.ugettext(value)
class BlockTranslateNode(Node):
- def __init__(self, extra_context, singular, plural=None, countervar=None, counter=None):
+ def __init__(self, extra_context, singular, plural=None, countervar=None,
+ counter=None):
self.extra_context = extra_context
self.singular = singular
self.plural = plural
@@ -54,29 +56,32 @@ class BlockTranslateNode(Node):
def render_token_list(self, tokens):
result = []
+ vars = []
for token in tokens:
if token.token_type == TOKEN_TEXT:
result.append(token.contents)
elif token.token_type == TOKEN_VAR:
- result.append('%%(%s)s' % token.contents)
- return ''.join(result)
+ result.append(u'%%(%s)s' % token.contents)
+ vars.append(token.contents)
+ return ''.join(result), vars
def render(self, context):
context.push()
- for var,val in self.extra_context.items():
- context[var] = val.resolve(context)
- singular = self.render_token_list(self.singular)
+ for var, val in self.extra_context.items():
+ context[var] = val.render(context)
+ singular, vars = self.render_token_list(self.singular)
if self.plural and self.countervar and self.counter:
count = self.counter.resolve(context)
context[self.countervar] = count
- plural = self.render_token_list(self.plural)
+ plural, vars = self.render_token_list(self.plural)
result = translation.ungettext(singular, plural, count)
else:
result = translation.ugettext(singular)
# Escape all isolated '%' before substituting in the context.
- result = re.sub('%(?!\()', '%%', result) % context
+ result = re.sub(u'%(?!\()', u'%%', result)
+ data = dict([(v, force_unicode(context[v])) for v in vars])
context.pop()
- return result
+ return result % data
def do_get_available_languages(parser, token):
"""
@@ -198,7 +203,6 @@ def do_block_translate(parser, token):
This is much like ngettext, only in template syntax.
"""
class BlockTranslateParser(TokenParser):
-
def top(self):
countervar = None
counter = None
@@ -209,7 +213,8 @@ def do_block_translate(parser, token):
value = self.value()
if self.tag() != 'as':
raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'with value as variable'"
- extra_context[self.tag()] = parser.compile_filter(value)
+ extra_context[self.tag()] = VariableNode(
+ parser.compile_filter(value))
elif tag == 'count':
counter = parser.compile_filter(self.value())
if self.tag() != 'as':
@@ -241,7 +246,8 @@ def do_block_translate(parser, token):
if token.contents.strip() != 'endblocktrans':
raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags (seen %r) inside it" % token.contents
- return BlockTranslateNode(extra_context, singular, plural, countervar, counter)
+ return BlockTranslateNode(extra_context, singular, plural, countervar,
+ counter)
register.tag('get_available_languages', do_get_available_languages)
register.tag('get_current_language', do_get_current_language)
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 2aa0a0783d..1d65ee1d23 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -51,9 +51,9 @@ class TestCase(unittest.TestCase):
def _pre_setup(self):
"""Performs any pre-test setup. This includes:
- * If the Test Case class has a 'fixtures' member, clearing the
- database and installing the named fixtures at the start of each
- test.
+ * Flushing the database.
+ * If the Test Case class has a 'fixtures' member, installing the
+ named fixtures.
* Clearing the mail test outbox.
"""
call_command('flush', verbosity=0, interactive=False)
diff --git a/django/utils/cache.py b/django/utils/cache.py
index ae4de6dd87..4fcf493944 100644
--- a/django/utils/cache.py
+++ b/django/utils/cache.py
@@ -20,6 +20,10 @@ An example: i18n middleware would need to distinguish caches by the
import md5
import re
import time
+try:
+ set
+except NameError:
+ from sets import Set as set # Python 2.3 fallback
from django.conf import settings
from django.core.cache import cache
@@ -70,7 +74,20 @@ def patch_cache_control(response, **kwargs):
cc = ', '.join([dictvalue(el) for el in cc.items()])
response['Cache-Control'] = cc
-vary_delim_re = re.compile(r',\s*')
+def get_max_age(response):
+ """
+ Returns the max-age from the response Cache-Control header as an integer
+ (or ``None`` if it wasn't found or wasn't an integer.
+ """
+ if not response.has_header('Cache-Control'):
+ return
+ cc = dict([_to_tuple(el) for el in
+ cc_delim_re.split(response['Cache-Control'])])
+ if 'max-age' in cc:
+ try:
+ return int(cc['max-age'])
+ except (ValueError, TypeError):
+ pass
def patch_response_headers(response, cache_timeout=None):
"""
@@ -109,14 +126,15 @@ def patch_vary_headers(response, newheaders):
# Note that we need to keep the original order intact, because cache
# implementations may rely on the order of the Vary contents in, say,
# computing an MD5 hash.
- vary = []
if response.has_header('Vary'):
- vary = vary_delim_re.split(response['Vary'])
- oldheaders = dict([(el.lower(), 1) for el in vary])
- for newheader in newheaders:
- if not newheader.lower() in oldheaders:
- vary.append(newheader)
- response['Vary'] = ', '.join(vary)
+ vary_headers = cc_delim_re.split(response['Vary'])
+ else:
+ vary_headers = []
+ # Use .lower() here so we treat headers as case-insensitive.
+ existing_headers = set([header.lower() for header in vary_headers])
+ additional_headers = [newheader for newheader in newheaders
+ if newheader.lower() not in existing_headers]
+ response['Vary'] = ', '.join(vary_headers + additional_headers)
def _generate_cache_key(request, headerlist, key_prefix):
"""Returns a cache key from the headers given in the header list."""
@@ -169,7 +187,7 @@ def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
key_prefix, iri_to_uri(request.path))
if response.has_header('Vary'):
headerlist = ['HTTP_'+header.upper().replace('-', '_')
- for header in vary_delim_re.split(response['Vary'])]
+ for header in cc_delim_re.split(response['Vary'])]
cache.set(cache_key, headerlist, cache_timeout)
return _generate_cache_key(request, headerlist, key_prefix)
else:
@@ -177,3 +195,10 @@ def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
# for the request.path
cache.set(cache_key, [], cache_timeout)
return _generate_cache_key(request, [], key_prefix)
+
+
+def _to_tuple(s):
+ t = s.split('=',1)
+ if len(t) == 2:
+ return t[0].lower(), t[1]
+ return t[0].lower(), True
diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py
index 549aa3f183..ee156b11d0 100644
--- a/django/utils/datastructures.py
+++ b/django/utils/datastructures.py
@@ -7,9 +7,9 @@ class MergeDict(object):
self.dicts = dicts
def __getitem__(self, key):
- for dict in self.dicts:
+ for dict_ in self.dicts:
try:
- return dict[key]
+ return dict_[key]
except KeyError:
pass
raise KeyError
@@ -24,22 +24,22 @@ class MergeDict(object):
return default
def getlist(self, key):
- for dict in self.dicts:
+ for dict_ in self.dicts:
try:
- return dict.getlist(key)
+ return dict_.getlist(key)
except KeyError:
pass
raise KeyError
def items(self):
item_list = []
- for dict in self.dicts:
- item_list.extend(dict.items())
+ for dict_ in self.dicts:
+ item_list.extend(dict_.items())
return item_list
def has_key(self, key):
- for dict in self.dicts:
- if key in dict:
+ for dict_ in self.dicts:
+ if key in dict_:
return True
return False
@@ -56,11 +56,14 @@ class SortedDict(dict):
def __init__(self, data=None):
if data is None:
data = {}
- dict.__init__(self, data)
+ super(SortedDict, self).__init__(data)
if isinstance(data, dict):
self.keyOrder = data.keys()
else:
- self.keyOrder = [key for key, value in data]
+ self.keyOrder = []
+ for key, value in data:
+ if key not in self.keyOrder:
+ self.keyOrder.append(key)
def __deepcopy__(self, memo):
from copy import deepcopy
@@ -68,12 +71,12 @@ class SortedDict(dict):
for key, value in self.iteritems()])
def __setitem__(self, key, value):
- dict.__setitem__(self, key, value)
+ super(SortedDict, self).__setitem__(key, value)
if key not in self.keyOrder:
self.keyOrder.append(key)
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ super(SortedDict, self).__delitem__(key)
self.keyOrder.remove(key)
def __iter__(self):
@@ -81,7 +84,7 @@ class SortedDict(dict):
yield k
def pop(self, k, *args):
- result = dict.pop(self, k, *args)
+ result = super(SortedDict, self).pop(k, *args)
try:
self.keyOrder.remove(k)
except ValueError:
@@ -90,7 +93,7 @@ class SortedDict(dict):
return result
def popitem(self):
- result = dict.popitem(self)
+ result = super(SortedDict, self).popitem()
self.keyOrder.remove(result[0])
return result
@@ -99,7 +102,7 @@ class SortedDict(dict):
def iteritems(self):
for key in self.keyOrder:
- yield key, dict.__getitem__(self, key)
+ yield key, super(SortedDict, self).__getitem__(key)
def keys(self):
return self.keyOrder[:]
@@ -108,20 +111,20 @@ class SortedDict(dict):
return iter(self.keyOrder)
def values(self):
- return [dict.__getitem__(self, k) for k in self.keyOrder]
+ return [super(SortedDict, self).__getitem__(k) for k in self.keyOrder]
def itervalues(self):
for key in self.keyOrder:
- yield dict.__getitem__(self, key)
+ yield super(SortedDict, self).__getitem__(key)
- def update(self, dict):
- for k, v in dict.items():
+ def update(self, dict_):
+ for k, v in dict_.items():
self.__setitem__(k, v)
def setdefault(self, key, default):
if key not in self.keyOrder:
self.keyOrder.append(key)
- return dict.setdefault(self, key, default)
+ return super(SortedDict, self).setdefault(key, default)
def value_for_index(self, index):
"""Returns the value of the item at the given zero-based index."""
@@ -135,7 +138,7 @@ class SortedDict(dict):
if n < index:
index -= 1
self.keyOrder.insert(index, key)
- dict.__setitem__(self, key, value)
+ super(SortedDict, self).__setitem__(key, value)
def copy(self):
"""Returns a copy of this object."""
@@ -173,10 +176,11 @@ class MultiValueDict(dict):
single name-value pairs.
"""
def __init__(self, key_to_list_mapping=()):
- dict.__init__(self, key_to_list_mapping)
+ super(MultiValueDict, self).__init__(key_to_list_mapping)
def __repr__(self):
- return "<%s: %s>" % (self.__class__.__name__, dict.__repr__(self))
+ return "<%s: %s>" % (self.__class__.__name__,
+ super(MultiValueDict, self).__repr__())
def __getitem__(self, key):
"""
@@ -184,7 +188,7 @@ class MultiValueDict(dict):
raises KeyError if not found.
"""
try:
- list_ = dict.__getitem__(self, key)
+ list_ = super(MultiValueDict, self).__getitem__(key)
except KeyError:
raise MultiValueDictKeyError, "Key %r not found in %r" % (key, self)
try:
@@ -193,10 +197,10 @@ class MultiValueDict(dict):
return []
def __setitem__(self, key, value):
- dict.__setitem__(self, key, [value])
+ super(MultiValueDict, self).__setitem__(key, [value])
def __copy__(self):
- return self.__class__(dict.items(self))
+ return self.__class__(super(MultiValueDict, self).items())
def __deepcopy__(self, memo=None):
import copy
@@ -210,7 +214,10 @@ class MultiValueDict(dict):
return result
def get(self, key, default=None):
- """Returns the default value if the requested data doesn't exist."""
+ """
+ Returns the last data value for the passed key. If key doesn't exist
+ or value is an empty list, then default is returned.
+ """
try:
val = self[key]
except KeyError:
@@ -220,14 +227,17 @@ class MultiValueDict(dict):
return val
def getlist(self, key):
- """Returns an empty list if the requested data doesn't exist."""
+ """
+ Returns the list of values for the passed key. If key doesn't exist,
+ then an empty list is returned.
+ """
try:
- return dict.__getitem__(self, key)
+ return super(MultiValueDict, self).__getitem__(key)
except KeyError:
return []
def setlist(self, key, list_):
- dict.__setitem__(self, key, list_)
+ super(MultiValueDict, self).__setitem__(key, list_)
def setdefault(self, key, default=None):
if key not in self:
@@ -242,7 +252,7 @@ class MultiValueDict(dict):
def appendlist(self, key, value):
"""Appends an item to the internal list associated with key."""
self.setlistdefault(key, [])
- dict.__setitem__(self, key, self.getlist(key) + [value])
+ super(MultiValueDict, self).__setitem__(key, self.getlist(key) + [value])
def items(self):
"""
@@ -253,7 +263,7 @@ class MultiValueDict(dict):
def lists(self):
"""Returns a list of (key, list) pairs."""
- return dict.items(self)
+ return super(MultiValueDict, self).items()
def values(self):
"""Returns a list of the last value on every key list."""
@@ -315,7 +325,7 @@ class DotExpandedDict(dict):
try:
current[bits[-1]] = v
except TypeError: # Special-case if current isn't a dict.
- current = {bits[-1] : v}
+ current = {bits[-1]: v}
class FileDict(dict):
"""
diff --git a/django/utils/html.py b/django/utils/html.py
index 8eeaa66330..cb786db1e4 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -6,6 +6,7 @@ import string
from django.utils.safestring import SafeData, mark_safe
from django.utils.encoding import force_unicode
from django.utils.functional import allow_lazy
+from django.utils.http import urlquote
# Configuration for urlize() function
LEADING_PUNCTUATION = ['(', '<', '&lt;']
@@ -101,14 +102,24 @@ def urlize(text, trim_url_limit=None, nofollow=False, autoescape=False):
if middle.startswith('www.') or ('@' not in middle and not middle.startswith('http://') and \
len(middle) > 0 and middle[0] in string.letters + string.digits and \
(middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))):
- middle = '<a href="http://%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle))
+ middle = '<a href="http://%s"%s>%s</a>' % (
+ urlquote(middle, safe='/&=:;#?+'), nofollow_attr,
+ trim_url(middle))
if middle.startswith('http://') or middle.startswith('https://'):
- middle = '<a href="%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle))
- if '@' in middle and not middle.startswith('www.') and not ':' in middle \
- and simple_email_re.match(middle):
+ middle = '<a href="%s"%s>%s</a>' % (
+ urlquote(middle, safe='/&=:;#?+'), nofollow_attr,
+ trim_url(middle))
+ if '@' in middle and not middle.startswith('www.') and \
+ not ':' in middle and simple_email_re.match(middle):
middle = '<a href="mailto:%s">%s</a>' % (middle, middle)
if lead + middle + trail != word:
words[i] = lead + middle + trail
+ elif autoescape and not safe_input:
+ words[i] = escape(word)
+ elif safe_input:
+ words[i] = mark_safe(word)
+ elif autoescape:
+ words[i] = escape(word)
return u''.join(words)
urlize = allow_lazy(urlize, unicode)
diff --git a/django/utils/safestring.py b/django/utils/safestring.py
index c7234af0f3..f6f4c1eb2f 100644
--- a/django/utils/safestring.py
+++ b/django/utils/safestring.py
@@ -57,7 +57,6 @@ class SafeString(str, SafeData):
else:
return SafeUnicode(data)
- encode = curry(_proxy_method, method = str.encode)
decode = curry(_proxy_method, method = str.decode)
class SafeUnicode(unicode, SafeData):
@@ -89,7 +88,6 @@ class SafeUnicode(unicode, SafeData):
return SafeUnicode(data)
encode = curry(_proxy_method, method = unicode.encode)
- decode = curry(_proxy_method, method = unicode.decode)
def mark_safe(s):
"""
diff --git a/django/utils/translation/trans_null.py b/django/utils/translation/trans_null.py
index 0b62907e44..98c6de6197 100644
--- a/django/utils/translation/trans_null.py
+++ b/django/utils/translation/trans_null.py
@@ -4,6 +4,7 @@
from django.conf import settings
from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe, SafeData
def ngettext(singular, plural, number):
if number == 1: return singular
@@ -31,7 +32,10 @@ TECHNICAL_ID_MAP = {
}
def gettext(message):
- return TECHNICAL_ID_MAP.get(message, message)
+ result = TECHNICAL_ID_MAP.get(message, message)
+ if isinstance(message, SafeData):
+ return mark_safe(result)
+ return result
def ugettext(message):
return force_unicode(gettext(message))
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index 98b4769031..a7259b3ce5 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -8,6 +8,7 @@ import gettext as gettext_module
from cStringIO import StringIO
from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe, SafeData
try:
import threading
@@ -167,10 +168,9 @@ def translation(language):
res.merge(t)
return res
- if hasattr(settings, 'LOCALE_PATHS'):
- for localepath in settings.LOCALE_PATHS:
- if os.path.isdir(localepath):
- res = _merge(localepath)
+ for localepath in settings.LOCALE_PATHS:
+ if os.path.isdir(localepath):
+ res = _merge(localepath)
if projectpath and os.path.isdir(projectpath):
res = _merge(projectpath)
@@ -271,11 +271,15 @@ def do_translate(message, translation_function):
global _default, _active
t = _active.get(currentThread(), None)
if t is not None:
- return getattr(t, translation_function)(message)
- if _default is None:
- from django.conf import settings
- _default = translation(settings.LANGUAGE_CODE)
- return getattr(_default, translation_function)(message)
+ result = getattr(t, translation_function)(message)
+ else:
+ if _default is None:
+ from django.conf import settings
+ _default = translation(settings.LANGUAGE_CODE)
+ result = getattr(_default, translation_function)(message)
+ if isinstance(message, SafeData):
+ return mark_safe(result)
+ return result
def gettext(message):
return do_translate(message, 'gettext')
diff --git a/django/utils/tzinfo.py b/django/utils/tzinfo.py
index e2e1d10fc1..7d5ead9290 100644
--- a/django/utils/tzinfo.py
+++ b/django/utils/tzinfo.py
@@ -54,6 +54,12 @@ class LocalTimezone(tzinfo):
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1)
- stamp = time.mktime(tt)
+ try:
+ stamp = time.mktime(tt)
+ except OverflowError:
+ # 32 bit systems can't handle dates after Jan 2038, so we fake it
+ # in that case (since we only care about the DST flag here).
+ tt = (2037,) + tt[1:]
+ stamp = time.mktime(tt)
tt = time.localtime(stamp)
return tt.tm_isdst > 0
diff --git a/django/views/debug.py b/django/views/debug.py
index 7c45af230a..3358d2f08e 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -422,11 +422,11 @@ TECHNICAL_500_TEMPLATE = """
{% if frame.context_line %}
<div class="context" id="c{{ frame.id }}">
{% if frame.pre_context %}
- <ol start="{{ frame.pre_context_lineno }}" class="pre-context" id="pre{{ frame.id }}">{% for line in frame.pre_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line }}</li>{% endfor %}</ol>
+ <ol start="{{ frame.pre_context_lineno }}" class="pre-context" id="pre{{ frame.id }}">{% for line in frame.pre_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
{% endif %}
- <ol start="{{ frame.lineno }}" class="context-line"><li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ frame.context_line }} <span>...</span></li></ol>
+ <ol start="{{ frame.lineno }}" class="context-line"><li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ frame.context_line|escape }} <span>...</span></li></ol>
{% if frame.post_context %}
- <ol start='{{ frame.lineno|add:"1" }}' class="post-context" id="post{{ frame.id }}">{% for line in frame.post_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line }}</li>{% endfor %}</ol>
+ <ol start='{{ frame.lineno|add:"1" }}' class="post-context" id="post{{ frame.id }}">{% for line in frame.post_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
{% endif %}
</div>
{% endif %}
@@ -445,8 +445,8 @@ TECHNICAL_500_TEMPLATE = """
<tbody>
{% for var in frame.vars|dictsort:"0" %}
<tr>
- <td>{{ var.0 }}</td>
- <td class="code"><div>{{ var.1|pprint }}</div></td>
+ <td>{{ var.0|escape }}</td>
+ <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
</tr>
{% endfor %}
</tbody>
@@ -466,7 +466,7 @@ Traceback (most recent call last):<br/>
{% for frame in frames %}
File "{{ frame.filename }}" in {{ frame.function }}<br/>
{% if frame.context_line %}
- &nbsp;&nbsp;{{ frame.lineno }}. {{ frame.context_line }}<br/>
+ &nbsp;&nbsp;{{ frame.lineno }}. {{ frame.context_line|escape }}<br/>
{% endif %}
{% endfor %}<br/>
&nbsp;&nbsp;{{ exception_type }} at {{ request.path|escape }}<br/>
diff --git a/django/views/i18n.py b/django/views/i18n.py
index cccec13941..cd23ff8777 100644
--- a/django/views/i18n.py
+++ b/django/views/i18n.py
@@ -120,8 +120,12 @@ def javascript_catalog(request, domain='djangojs', packages=None):
p = __import__(package, {}, {}, [''])
path = os.path.join(os.path.dirname(p.__file__), 'locale')
paths.append(path)
- catalog = gettext_module.translation(domain, path, ['en'])
- t.update(catalog._catalog)
+ try:
+ catalog = gettext_module.translation(domain, path, ['en'])
+ t.update(catalog._catalog)
+ except IOError:
+ # 'en' catalog was missing. This is harmless.
+ pass
# next load the settings.LANGUAGE_CODE translations if it isn't english
if default_locale != 'en':
for path in paths:
diff --git a/django/views/static.py b/django/views/static.py
index b556c60ca6..8095fc9231 100644
--- a/django/views/static.py
+++ b/django/views/static.py
@@ -1,5 +1,5 @@
"""
-Views and functions for serving static files. These are only to be used
+Views and functions for serving static files. These are only to be used
during development, and SHOULD NOT be used in a production setting.
"""
@@ -33,6 +33,7 @@ def serve(request, path, document_root=None, show_indexes=False):
# Clean up given path to only allow serving files below document_root.
path = posixpath.normpath(urllib.unquote(path))
+ path = path.lstrip('/')
newpath = ''
for part in path.split('/'):
if not part:
diff --git a/docs/authentication.txt b/docs/authentication.txt
index aee9c5224a..2c34c6663d 100644
--- a/docs/authentication.txt
+++ b/docs/authentication.txt
@@ -170,7 +170,7 @@ The ``User`` model has a custom manager that has the following helper functions:
If no password is provided, ``set_unusable_password()`` will be called.
- See _`Creating users` for example usage.
+ See `Creating users`_ for example usage.
* ``make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')``
Returns a random password with the given length and given string of
diff --git a/docs/cache.txt b/docs/cache.txt
index 4f177b8c07..af6cb35c42 100644
--- a/docs/cache.txt
+++ b/docs/cache.txt
@@ -263,6 +263,18 @@ See the `middleware documentation`_ for more on middleware.
.. _`middleware documentation`: ../middleware/
+**New in Django development version**
+
+If a view sets its own cache expiry time (i.e. it has a ``max-age`` section in
+its ``Cache-Control`` header) then the page will be cached until the expiry
+time, rather than ``CACHE_MIDDLEWARE_SECONDS``. Using the decorators in
+``django.views.decorators.cache`` you can easily set a view's expiry time
+(using the ``cache_control`` decorator) or disable caching for a view (using
+the ``never_cache`` decorator). See the `using other headers`__ section for
+more on these decorators.
+
+__ `Controlling cache: Using other headers`_
+
The per-view cache
==================
@@ -291,7 +303,7 @@ minutes.
Template fragment caching
=========================
-**New in development version**.
+**New in development version**
If you're after even more control, you can also cache template fragments using
the ``cache`` template tag. To give your template access to this tag, put
@@ -307,18 +319,18 @@ and the name to give the cache fragment. For example::
{% endcache %}
Sometimes you might want to cache multiple copies of a fragment depending on
-some dynamic data that appears inside the fragment. For example you may want a
+some dynamic data that appears inside the fragment. For example, you might want a
separate cached copy of the sidebar used in the previous example for every user
-of your site. This can be easily achieved by passing additional arguments to
-the ``{% cache %}`` template tag to uniquely identify the cache fragment::
+of your site. Do this by passing additional arguments to the ``{% cache %}``
+template tag to uniquely identify the cache fragment::
{% load cache %}
{% cache 500 sidebar request.user.username %}
.. sidebar for logged in user ..
{% endcache %}
-If you need more than one argument to identify the fragment that's fine, simply
-pass as many arguments to ``{% cache %}`` as you need!
+It's perfectly fine to specify more than one argument to identify the fragment.
+Simply pass as many arguments to ``{% cache %}`` as you need.
The low-level cache API
=======================
@@ -358,16 +370,16 @@ get() can take a ``default`` argument::
>>> cache.get('my_key', 'has expired')
'has expired'
-To add a key only if it doesn't already exist, there is an add() method. It
-takes the same parameters as set(), but will not attempt to update the cache
-if the key specified is already present::
+**New in Django development version:** To add a key only if it doesn't already
+exist, use the ``add()`` method. It takes the same parameters as ``set()``, but
+it will not attempt to update the cache if the key specified is already present::
>>> cache.set('add_key', 'Initial value')
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'
-There's also a get_many() interface that only hits the cache once. get_many()
+There's also a ``get_many()`` interface that only hits the cache once. ``get_many()``
returns a dictionary with all the keys you asked for that actually exist in the
cache (and haven't expired)::
@@ -566,7 +578,7 @@ the value of the ``CACHE_MIDDLEWARE_SETTINGS`` setting. If you use a custom
precedence, and the header values will be merged correctly.)
If you want to use headers to disable caching altogether,
-``django.views.decorators.never_cache`` is a view decorator that adds
+``django.views.decorators.cache.never_cache`` is a view decorator that adds
headers to ensure the response won't be cached by browsers or other caches. Example::
from django.views.decorators.cache import never_cache
diff --git a/docs/custom_model_fields.txt b/docs/custom_model_fields.txt
index c12d1844cd..74eb10aa82 100644
--- a/docs/custom_model_fields.txt
+++ b/docs/custom_model_fields.txt
@@ -56,7 +56,7 @@ would like to be able to things like this in our models (we assume the
We assign to and retrieve from the ``hand`` attribute in our model just like
any other Python class. The trick is to tell Django how to handle saving and
-loading such an object
+loading such an object.
In order to use the ``Hand`` class in our models, we **do not** have to change
this class at all. This is ideal, because it means you can easily write
@@ -98,7 +98,7 @@ For our ``Hand`` example, we could convert the card data to a string of 104
characters by concatenating all the cards together in a pre-determined order.
Say, all the *north* cards first, then the *east*, *south* and *west* cards, in
that order. So ``Hand`` objects can be saved to text or character columns in
-the database
+the database.
What does a field class do?
---------------------------
@@ -233,9 +233,9 @@ sure your field subclass uses ``django.db.models.SubfieldBase`` as its
metaclass. This ensures that the ``to_python()`` method, documented below_,
will always be called when the attribute is initialised.
-Our ``HandleField`` class now looks like this::
+Our ``HandField`` class now looks like this::
- class HandleField(models.Field):
+ class HandField(models.Field):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
@@ -549,7 +549,7 @@ we can reuse some existing conversion code::
Some general advice
--------------------
-Writing a custom field can be a tricky process sometime, particularly if you
+Writing a custom field can be a tricky process sometimes, particularly if you
are doing complex conversions between your Python types and your database and
serialization formats. A couple of tips to make things go more smoothly:
diff --git a/docs/databases.txt b/docs/databases.txt
index 4530a1b896..d4853f75f8 100644
--- a/docs/databases.txt
+++ b/docs/databases.txt
@@ -172,22 +172,32 @@ storage engine, you have a couple of options.
.. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB
-Oracle Notes
+Oracle notes
============
-Django supports `Oracle Database Server`_ versions 9i and higher. Oracle
+Django supports `Oracle Database Server`_ versions 9i and higher. Oracle
version 10g or later is required to use Django's ``regex`` and ``iregex`` query
-operators. You will also need the `cx_Oracle`_ driver, version 4.3.1 or newer.
+operators. You will also need the `cx_Oracle`_ driver, version 4.3.1 or newer.
.. _`Oracle Database Server`: http://www.oracle.com/
.. _`cx_Oracle`: http://cx-oracle.sourceforge.net/
-To run ``python manage.py syncdb``, you'll need to create an Oracle database
-user with CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE, and CREATE TRIGGER
-privileges. To run Django's test suite, the user also needs
-CREATE and DROP DATABASE and CREATE and DROP TABLESPACE privileges.
+In order for the ``python manage.py syncdb`` command to work, your Oracle
+database user must have privileges to run the following commands:
-Connecting to the Database
+ * CREATE TABLE
+ * CREATE SEQUENCE
+ * CREATE PROCEDURE
+ * CREATE TRIGGER
+
+To run Django's test suite, the user needs these *additional* privileges:
+
+ * CREATE DATABASE
+ * DROP DATABASE
+ * CREATE TABLESPACE
+ * DROP TABLESPACE
+
+Connecting to the database
--------------------------
Your Django settings.py file should look something like this for Oracle::
@@ -213,29 +223,29 @@ and ``DATABASE_PORT`` like so::
You should supply both ``DATABASE_HOST`` and ``DATABASE_PORT``, or leave both
as empty strings.
-Tablespace Options
+Tablespace options
------------------
A common paradigm for optimizing performance in Oracle-based systems is the
use of `tablespaces`_ to organize disk layout. The Oracle backend supports
this use case by adding ``db_tablespace`` options to the ``Meta`` and
-``Field`` classes. (When using a backend that lacks support for tablespaces,
-these options are ignored.)
+``Field`` classes. (When you use a backend that lacks support for tablespaces,
+Django ignores these options.)
.. _`tablespaces`: http://en.wikipedia.org/wiki/Tablespace
A tablespace can be specified for the table(s) generated by a model by
-supplying the ``db_tablespace`` option inside the model's ``Meta`` class.
-Additionally, the ``db_tablespace`` option can be passed to a ``Field``
+supplying the ``db_tablespace`` option inside the model's ``class Meta``.
+Additionally, you can pass the ``db_tablespace`` option to a ``Field``
constructor to specify an alternate tablespace for the ``Field``'s column
-index. If no index would be created for the column, the ``db_tablespace``
+index. If no index would be created for the column, the ``db_tablespace``
option is ignored.
::
class TablespaceExample(models.Model):
- name = models.CharField(maxlength=30, db_index=True, db_tablespace="indexes")
- data = models.CharField(maxlength=255, db_index=True)
+ name = models.CharField(max_length=30, db_index=True, db_tablespace="indexes")
+ data = models.CharField(max_length=255, db_index=True)
edges = models.ManyToManyField(to="self", db_tablespace="indexes")
class Meta:
@@ -243,46 +253,46 @@ option is ignored.
In this example, the tables generated by the ``TablespaceExample`` model
(i.e., the model table and the many-to-many table) would be stored in the
-``tables`` tablespace. The index for the name field and the indexes on the
-many-to-many table would be stored in the ``indexes`` tablespace. The ``data``
+``tables`` tablespace. The index for the name field and the indexes on the
+many-to-many table would be stored in the ``indexes`` tablespace. The ``data``
field would also generate an index, but no tablespace for it is specified, so
it would be stored in the model tablespace ``tables`` by default.
-Django does not create the tablespaces for you. Please refer to `Oracle's
+Django does not create the tablespaces for you. Please refer to `Oracle's
documentation`_ for details on creating and managing tablespaces.
.. _`Oracle's documentation`: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7003.htm#SQLRF01403
-Naming Issues
+Naming issues
-------------
-Oracle imposes a name length limit of 30 characters. To accommodate this, the
+Oracle imposes a name length limit of 30 characters. To accommodate this, the
backend truncates database identifiers to fit, replacing the final four
characters of the truncated name with a repeatable MD5 hash value.
-NULL and Empty Strings
+NULL and empty strings
----------------------
Django generally prefers to use the empty string ('') rather than NULL, but
-Oracle treats both identically. To get around this, the Oracle backend
+Oracle treats both identically. To get around this, the Oracle backend
coerces the ``null=True`` option on fields that permit the empty string as a
-value. When fetching from the database, it is assumed that a NULL value in
+value. When fetching from the database, it is assumed that a NULL value in
one of these fields really means the empty string, and the data is silently
converted to reflect this assumption.
-TextField Limitations
----------------------
+``TextField`` limitations
+-------------------------
-The Oracle backend stores ``TextFields`` as ``NCLOB`` columns. Oracle imposes
+The Oracle backend stores ``TextFields`` as ``NCLOB`` columns. Oracle imposes
some limitations on the usage of such LOB columns in general:
* LOB columns may not be used as primary keys.
* LOB columns may not be used in indexes.
- * LOB columns may not be used in a ``SELECT DISTINCT`` list. This means that
+ * LOB columns may not be used in a ``SELECT DISTINCT`` list. This means that
attempting to use the ``QuerySet.distinct`` method on a model that
includes ``TextField`` columns will result in an error when run against
- Oracle. A workaround to this is to keep ``TextField`` columns out of any
- models that you foresee performing ``.distinct`` queries on, and to
+ Oracle. A workaround to this is to keep ``TextField`` columns out of any
+ models that you foresee performing ``distinct()`` queries on, and to
include the ``TextField`` in a related model instead.
diff --git a/docs/django-admin.txt b/docs/django-admin.txt
index e751a7b3d9..2977f9908f 100644
--- a/docs/django-admin.txt
+++ b/docs/django-admin.txt
@@ -184,9 +184,9 @@ is being executed as an unattended, automated script.
Use ``--verbosity`` to specify the amount of notification and debug information
that ``django-admin.py`` should print to the console.
- * ``0`` means no input.
- * ``1`` means normal input (default).
- * ``2`` means verbose input.
+ * ``0`` means no output.
+ * ``1`` means normal output (default).
+ * ``2`` means verbose output.
Example usage::
@@ -651,7 +651,7 @@ To run the test server on port 7000 with ``fixture1`` and ``fixture2``::
that it doesn't matter whether the options come before or after the fixture
arguments.)
-To run on 1.2.3.4:7000 with a `test` fixture::
+To run on 1.2.3.4:7000 with a ``test`` fixture::
django-admin.py testserver --addrport 1.2.3.4:7000 test
diff --git a/docs/flatpages.txt b/docs/flatpages.txt
index d082090689..7c27fe8793 100644
--- a/docs/flatpages.txt
+++ b/docs/flatpages.txt
@@ -113,3 +113,10 @@ Here's a sample ``flatpages/default.html`` template::
{{ flatpage.content }}
</body>
</html>
+
+Since you're already entering raw HTML into the admin page for a flatpage,
+both ``flatpage.title`` and ``flatpage.content`` are marked as **not**
+requiring `automatic HTML escaping`_ in the template.
+
+.. _automatic HTML escaping: ../templates/#automatic-html-escaping
+
diff --git a/docs/i18n.txt b/docs/i18n.txt
index 2c43e7884e..1ae3024157 100644
--- a/docs/i18n.txt
+++ b/docs/i18n.txt
@@ -461,8 +461,8 @@ otherwise, they'll be tacked together without whitespace!
you'll be using to edit the content. Due to the way the ``gettext`` tools
work internally and because we want to allow non-ASCII source strings in
Django's core and your applications, you **must** use UTF-8 as the encoding
- for your PO file (this means that everybody will be using the same
- encoding, which is important when Django processes the PO files).
+ for your PO file. This means that everybody will be using the same
+ encoding, which is important when Django processes the PO files.
To reexamine all source code and templates for new translation strings and
update all message files for **all** languages, run this::
@@ -658,7 +658,7 @@ message file. The choice is yours.
of the settings file to determine this, and a settings file doesn't exist
if you're manually configuring your settings.)
-.. _settings documentation: ../settings/#using-settings-without-the-django-settings-module-environment-variable
+.. _settings documentation: ../settings/#using-settings-without-setting-django-settings-module
All message file repositories are structured the same way. They are:
diff --git a/docs/install.txt b/docs/install.txt
index 519bf2674c..08444d3a1a 100644
--- a/docs/install.txt
+++ b/docs/install.txt
@@ -187,10 +187,10 @@ latest bug fixes and improvements, follow these instructions:
"Where are my ``site-packages`` stored?" section above.)
Alternatively, you can define your ``PYTHONPATH`` environment variable
- so that it includes the ``django`` subdirectory of ``django-trunk``.
- This is perhaps the most convenient solution on Windows systems, which
- don't support symbolic links. (Environment variables can be defined on
- Windows systems `from the Control Panel`_.)
+ so that it includes the ``django-trunk`` directory. This is perhaps the
+ most convenient solution on Windows systems, which don't support symbolic
+ links. (Environment variables can be defined on Windows systems `from the
+ Control Panel`_.)
.. admonition:: What about Apache and mod_python?
@@ -204,11 +204,18 @@ latest bug fixes and improvements, follow these instructions:
.. _How to use Django with mod_python: ../modpython/
-4. Copy the file ``django-trunk/django/bin/django-admin.py`` to somewhere on
- your system path, such as ``/usr/local/bin`` (Unix) or ``C:\Python24\Scripts``
- (Windows). This step simply lets you type ``django-admin.py`` from within
- any directory, rather than having to qualify the command with the full path
- to the file.
+4. On Unix-like systems, create a symbolic link to the file
+ ``django-trunk/django/bin/django-admin.py`` in a directory on your system
+ path, such as ``/usr/local/bin``. For example::
+
+ ln -s `pwd`/django-trunk/django/bin/django-admin.py /usr/local/bin
+
+ This simply lets you type ``django-admin.py`` from within any directory,
+ rather than having to qualify the command with the full path to the file.
+
+ On Windows systems, the same result can be achieved by copying the file
+ ``django-trunk/django/bin/django-admin.py`` to somewhere on your system
+ path, for example ``C:\Python24\Scripts``.
You *don't* have to run ``python setup.py install``, because you've already
carried out the equivalent actions in steps 3 and 4.
diff --git a/docs/middleware.txt b/docs/middleware.txt
index 30a4899a3e..41b1a96b89 100644
--- a/docs/middleware.txt
+++ b/docs/middleware.txt
@@ -104,8 +104,7 @@ Handles conditional GET operations. If the response has a ``ETag`` or
``Last-Modified`` header, and the request has ``If-None-Match`` or
``If-Modified-Since``, the response is replaced by an HttpNotModified.
-Also removes the content from any response to a HEAD request and sets the
-``Date`` and ``Content-Length`` response-headers.
+Also sets the ``Date`` and ``Content-Length`` response-headers.
django.middleware.http.SetRemoteAddrFromForwardedFor
----------------------------------------------------
diff --git a/docs/model-api.txt b/docs/model-api.txt
index ca84c84d09..f39b711e84 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -50,7 +50,7 @@ The above ``Person`` model would create a database table like this::
Some technical notes:
* The name of the table, ``myapp_person``, is automatically derived from
- some model metadata but can be overridden. See _`Table names` below.
+ some model metadata but can be overridden. See `Table names`_ below.
* An ``id`` field is added automatically, but this behavior can be
overriden. See `Automatic primary key fields`_ below.
* The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL
@@ -1664,7 +1664,7 @@ Adding extra Manager methods
Adding extra ``Manager`` methods is the preferred way to add "table-level"
functionality to your models. (For "row-level" functionality -- i.e., functions
-that act on a single instance of a model object -- use _`Model methods`, not
+that act on a single instance of a model object -- use `Model methods`_, not
custom ``Manager`` methods.)
A custom ``Manager`` method can return anything you want. It doesn't have to
diff --git a/docs/modpython.txt b/docs/modpython.txt
index c739997ce4..aa1acf5864 100644
--- a/docs/modpython.txt
+++ b/docs/modpython.txt
@@ -89,18 +89,17 @@ path.
.. note::
- If you're using Windows, it is still recommended that you use forward
- slashes in the pathnames, even though Windows normally uses backslashes
- for its native separator. Apache knows how to convert from the forward
- slash format to the native format, so this approach is portable and easier
- to read (it avoids tricky problems with having to double-escape
- backslashes).
+ If you're using Windows, we still recommended that you use forward
+ slashes in the pathnames, even though Windows normally uses the backslash
+ character as its native separator. Apache knows how to convert from the
+ forward slash format to the native format, so this approach is portable and
+ easier to read. (It avoids tricky problems with having to double-escape
+ backslashes.)
This is valid even on a Windows system::
PythonPath "['c:/path/to/project'] + sys.path"
-
You can also add directives such as ``PythonAutoReload Off`` for performance.
See the `mod_python documentation`_ for a full list of options.
diff --git a/docs/newforms.txt b/docs/newforms.txt
index 593e9216d7..e27514cdba 100644
--- a/docs/newforms.txt
+++ b/docs/newforms.txt
@@ -753,6 +753,30 @@ For example::
</ul>
</form>
+Highlighting required fields in templates
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You may wish to show a visitor which fields are required. Here is the above
+example modified to insert an asterix after the label of each required field::
+
+ <form method="post" action="">
+ <dl>
+ {% for field in form %}
+ <dt>{{ field.label_tag }}{{ field.label }}{% if field.field.required %}*{% endif %}</dt>
+ <dd>{{ field }}</dd>
+ {% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %}
+ {% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %}
+ {% endfor %}
+ </dl>
+ <input type="submit" />
+ </form>
+
+The ``{% if field.field.required %}*{% endif %}`` fragment is the relevant
+addition here. It adds the asterix only if the field is required. Note that we
+check ``field.field.required`` and not ``field.required``. In the template,
+``field`` is a ``newforms.forms.BoundField`` instance, which holds the actual
+``Field`` instance in its ``field`` attribute.
+
Binding uploaded files to a form
--------------------------------
@@ -860,12 +884,11 @@ classes::
<li>Instrument: <input type="text" name="instrument" /></li>
<li>Haircut type: <input type="text" name="haircut_type" /></li>
-
Prefixes for forms
------------------
You can put several Django forms inside one ``<form>`` tag. To give each
-``Form`` its own namespace you need to use the ``prefix`` keyword argument::
+``Form`` its own namespace, use the ``prefix`` keyword argument::
>>> mother = PersonForm(prefix="mother")
>>> father = PersonForm(prefix="father")
@@ -876,7 +899,6 @@ You can put several Django forms inside one ``<form>`` tag. To give each
<li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li>
<li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li>
-
Fields
======
@@ -1849,7 +1871,11 @@ In addition, each generated form field has attributes set as follows:
* If the model field has ``choices`` set, then the form field's ``widget``
will be set to ``Select``, with choices coming from the model field's
- ``choices``.
+ ``choices``. The choices will normally include the blank choice which is
+ selected by default. If the field is required, this forces the user to
+ make a selection. The blank choice will not be included if the model
+ field has ``blank=False`` and an explicit ``default`` value (the
+ ``default`` value will be initially selected instead).
Finally, note that you can override the form field used for a given model
field. See "Overriding the default field types" below.
@@ -2095,10 +2121,14 @@ instance instead of a model class::
# Instantiate the form.
>>> f = AuthorForm()
-When a form created by ``form_for_instance()`` is created, the initial
-data values for the form fields are drawn from the instance. However,
-this data is not bound to the form. You will need to bind data to the
-form before the form can be saved.
+When a form created by ``form_for_instance()`` is created, the initial data
+values for the form fields are drawn from the instance. However, this data is
+not bound to the form. You will need to bind data to the form before the form
+can be saved.
+
+Unlike ``form_for_model()``, a choice field in form created by
+``form_for_instance()`` will not include the blank choice if the respective
+model field has ``blank=False``. The initial choice is drawn from the instance.
When you call ``save()`` on a form created by ``form_for_instance()``,
the database instance will be updated. As in ``form_for_model()``, ``save()``
diff --git a/docs/release_notes_0.96.txt b/docs/release_notes_0.96.txt
index 4227de8155..59931541e1 100644
--- a/docs/release_notes_0.96.txt
+++ b/docs/release_notes_0.96.txt
@@ -44,7 +44,7 @@ to this::
DATABASE_ENGINE = "mysql_old"
However, we strongly encourage MySQL users to upgrade to a more recent
-version of `MySQLdb` as soon as possible, The "mysql_old" backend is
+version of ``MySQLdb`` as soon as possible, The "mysql_old" backend is
provided only to ease this transition, and is considered deprecated;
aside from any necessary security fixes, it will not be actively
maintained, and it will be removed in a future release of Django.
diff --git a/docs/settings.txt b/docs/settings.txt
index 6241749753..1700c248c0 100644
--- a/docs/settings.txt
+++ b/docs/settings.txt
@@ -583,7 +583,7 @@ LOCALE_PATHS
Default: ``()`` (Empty tuple)
-A list of directories where Django looks for translation files.
+A tuple of directories where Django looks for translation files.
See the `internationalization docs section`_ explaining the variable and the
default behavior.
@@ -791,10 +791,12 @@ SESSION_COOKIE_PATH
Default: ``'/'``
-The path set on the session cookie. Should match the URL path of your Django
-installation (or be parent of that path). This is useful if you have multiple
-Django instances running under the same hostname; they can use different
-cookie paths and each instance will only see its own session cookie.
+The path set on the session cookie. This should either match the URL path of your
+Django installation or be parent of that path.
+
+This is useful if you have multiple Django instances running under the same
+hostname. They can use different cookie paths, and each instance will only see
+its own session cookie.
SESSION_COOKIE_SECURE
---------------------
diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt
index 30943591b8..351cead39c 100644
--- a/docs/syndication_feeds.txt
+++ b/docs/syndication_feeds.txt
@@ -201,6 +201,8 @@ the feed.
An example makes this clear. Here's the code for these beat-specific feeds::
+ from django.contrib.syndication import FeedDoesNotExist
+
class BeatFeed(Feed):
def get_object(self, bits):
# In case of "/rss/beats/0613/foo/bar/baz/", or other such clutter,
@@ -213,6 +215,8 @@ An example makes this clear. Here's the code for these beat-specific feeds::
return "Chicagocrime.org: Crimes for beat %s" % obj.beat
def link(self, obj):
+ if not obj:
+ raise FeedDoesNotExist
return obj.get_absolute_url()
def description(self, obj):
@@ -246,11 +250,18 @@ request to the URL ``/rss/beats/0613/``:
each of ``title``, ``link`` and ``description``, Django follows this
algorithm:
- * First, it tries to call a method, passing the ``obj`` argument, where
- ``obj`` is the object returned by ``get_object()``.
+ * First, it tries to call a method, passing the ``obj`` argument,
+ where ``obj`` is the object returned by ``get_object()``.
* Failing that, it tries to call a method with no arguments.
* Failing that, it uses the class attribute.
+ Inside the ``link()`` method, we handle the possibility that ``obj``
+ might be ``None``, which can occur when the URL isn't fully specified. In
+ some cases, you might want to do something else in this case, which would
+ mean you'd need to check for ``obj`` existing in other methods as well
+ (the ``link()`` method is called very early in the feed generation
+ process, so is a good place to bail out early).
+
* Finally, note that ``items()`` in this example also takes the ``obj``
argument. The algorithm for ``items`` is the same as described in the
previous step -- first, it tries ``items(obj)``, then ``items()``, then
@@ -553,15 +564,15 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
def ttl(self, obj):
"""
Takes the object returned by get_object() and returns the feed's
- TTL (Time to live) as a normal Python string.
+ TTL (Time To Live) as a normal Python string.
"""
def ttl(self):
"""
- Returns the feed's ttl as a normal Python string.
+ Returns the feed's TTL as a normal Python string.
"""
- ttl = 600 # Hard-coded Time to live.
+ ttl = 600 # Hard-coded Time To Live.
# ITEMS -- One of the following three is required. The framework looks
# for them in this order.
diff --git a/docs/templates.txt b/docs/templates.txt
index b85f108bbe..1c80f7578a 100644
--- a/docs/templates.txt
+++ b/docs/templates.txt
@@ -2,9 +2,11 @@
The Django template language: For template authors
==================================================
-This document explains the language syntax of the Django template system. If
-you're looking for a more technical perspective on how it works and how to
-extend it, see `The Django template language: For Python programmers`_.
+.. admonition:: About this document
+
+ This document explains the language syntax of the Django template system. If
+ you're looking for a more technical perspective on how it works and how to
+ extend it, see `The Django template language: For Python programmers`_.
Django's template language is designed to strike a balance between power and
ease. It's designed to feel comfortable to those used to working with HTML. If
@@ -280,7 +282,9 @@ Here are some tips for working with inheritance:
* If you need to get the content of the block from the parent template,
the ``{{ block.super }}`` variable will do the trick. This is useful
if you want to add to the contents of a parent block instead of
- completely overriding it.
+ completely overriding it. Data inserted using ``{{ block.super }}`` will
+ not be automatically escaped (see the `next section`_), since it was
+ already escaped, if necessary, in the parent template.
* For extra readability, you can optionally give a *name* to your
``{% endblock %}`` tag. For example::
@@ -299,6 +303,8 @@ it also defines the content that fills the hole in the *parent*. If there were
two similarly-named ``{% block %}`` tags in a template, that template's parent
wouldn't know which one of the blocks' content to use.
+.. _next section: #automatic-html-escaping
+
Automatic HTML escaping
=======================
@@ -397,6 +403,32 @@ auto-escaping is on, these extra filters won't change the output -- any
variables that use the ``escape`` filter do not have further automatic
escaping applied to them.
+String literals and automatic escaping
+--------------------------------------
+
+Sometimes you will pass a string literal as an argument to a filter. For
+example::
+
+ {{ data|default:"This is a string literal." }}
+
+All string literals are inserted **without** any automatic escaping into the
+template, if they are used (it's as if they were all passed through the
+``safe`` filter). The reasoning behind this is that the template author is in
+control of what goes into the string literal, so they can make sure the text
+is correctly escaped when the template is written.
+
+This means you would write ::
+
+ {{ data|default:"3 &gt; 2" }}
+
+...rather than ::
+
+ {{ data|default:"3 > 2" }} <-- Bad! Don't do this.
+
+This doesn't affect what happens to data coming from the variable itself.
+The variable's contents are still automatically escaped, if necessary, since
+they're beyond the control of the template author.
+
Using the built-in reference
============================
diff --git a/docs/templates_python.txt b/docs/templates_python.txt
index e4658f6461..64b67a1333 100644
--- a/docs/templates_python.txt
+++ b/docs/templates_python.txt
@@ -755,61 +755,106 @@ inside the template code:
``EscapeString`` and ``EscapeUnicode``. You will not normally need to worry
about these; they exist for the implementation of the ``escape`` filter.
-Inside your filter, you will need to think about three areas in order to be
-auto-escaping compliant:
+When you are writing a filter, your code will typically fall into one of two
+situations:
- 1. If your filter returns a string that is ready for direct output (it should
- be considered a "safe" string), you should call
- ``django.utils.safestring.mark_safe()`` on the result prior to returning.
- This will turn the result into the appropriate ``SafeData`` type. This is
- often the case when you are returning raw HTML, for example.
+ 1. Your filter does not introduce any HTML-unsafe characters (``<``, ``>``,
+ ``'``, ``"`` or ``&``) into the result that were not already present. In
+ this case, you can let Django take care of all the auto-escaping handling
+ for you. All you need to do is put the ``is_safe`` attribute on your
+ filter function and set it to ``True``. This attribute tells Django that
+ is a "safe" string is passed into your filter, the result will still be
+ "safe" and if a non-safe string is passed in, Django will automatically
+ escape it, if necessary. The reason ``is_safe`` is necessary is because
+ there are plenty of normal string operations that will turn a ``SafeData``
+ object back into a normal ``str`` or ``unicode`` object and, rather than
+ try to catch them all, which would be very difficult, Django repairs the
+ damage after the filter has completed.
- 2. If your filter is given a "safe" string, is it guaranteed to return a
- "safe" string? If so, set the ``is_safe`` attribute on the function to be
- ``True``. For example, a filter that replaced a word consisting only of
- digits with the number spelt out in words is going to be
- safe-string-preserving, since it cannot introduce any of the five dangerous
- characters: <, >, ", ' or &. We can write::
+ For example, suppose you have a filter that adds the string ``xx`` to the
+ end of any input. Since this introduces no dangerous HTML characters into
+ the result (aside from any that were already present), you should mark
+ your filter with ``is_safe``::
@register.filter
- def convert_to_words(value):
- # ... implementation here ...
- return result
+ def add_xx(value):
+ return '%sxx' % value
+ add_xx.is_safe = True
- convert_to_words.is_safe = True
+ When this filter is used in a template where auto-escaping is enabled,
+ Django will escape the output whenever the input is not already marked as
+ "safe".
- Note that this filter does not return a universally safe result (it does
- not return ``mark_safe(result)``) because if it is handed a raw string such
- as '<a>', this will need further escaping in an auto-escape environment.
- The ``is_safe`` attribute only talks about the the result when a safe
- string is passed into the filter.
+ By default, ``is_safe`` defaults to ``False`` and you can omit it from
+ any filters where it isn't required.
- 3. Will your filter behave differently depending upon whether auto-escaping
- is currently in effect or not? This is normally a concern when you are
- returning mixed content (HTML elements mixed with user-supplied content).
- For example, the ``ordered_list`` filter that ships with Django needs to
- know whether to escape its content or not. It will always return a safe
- string. Since it returns raw HTML, we cannot apply escaping to the
- result -- it needs to be done in-situ.
+ Be careful when deciding if your filter really does leave safe strings
+ as safe. Sometimes if you are *removing* characters, you can
+ inadvertently leave unbalanced HTML tags or entities in the result.
+ For example, removing a ``>`` from the input might turn ``<a>`` into
+ ``<a``, which would need to be escaped on output to avoid causing
+ problems. Similarly, removing a semicolon (``;``) can turn ``&amp;``
+ into ``&amp``, which is no longer a valid entity and thus needs
+ further escaping. Most cases won't be nearly this tricky, but keep an
+ eye out for any problems like that when reviewing your code.
- For these cases, the filter function needs to be told what the current
- auto-escaping setting is. Set the ``needs_autoescape`` attribute on the
- filter to ``True`` and have your function take an extra argument called
- ``autoescape`` with a default value of ``None``. When the filter is called,
- the ``autoescape`` keyword argument will be ``True`` if auto-escaping is in
- effect. For example, the ``unordered_list`` filter is written as::
+ 2. Alternatively, your filter code can manually take care of any necessary
+ escaping. This is usually necessary when you are introducing new HTML
+ markup into the result. You want to mark the output as safe from further
+ escaping so that your HTML markup isn't escaped further, so you'll need to
+ handle the input yourself.
- def unordered_list(value, autoescape=None):
- # ... lots of code here ...
+ To mark the output as a safe string, use
+ ``django.utils.safestring.mark_safe()``.
- return mark_safe(...)
+ Be careful, though. You need to do more than just mark the output as
+ safe. You need to ensure it really *is* safe and what you do will often
+ depend upon whether or not auto-escaping is in effect. The idea is to
+ write filters than can operate in templates where auto-escaping is either
+ on or off in order to make things easier for your template authors.
- unordered_list.is_safe = True
- unordered_list.needs_autoescape = True
+ In order for you filter to know the current auto-escaping state, set the
+ ``needs_autoescape`` attribute to ``True`` on your function (if you don't
+ specify this attribute, it defaults to ``False``). This attribute tells
+ Django that your filter function wants to be passed an extra keyword
+ argument, called ``autoescape`` that is ``True`` is auto-escaping is in
+ effect and ``False`` otherwise.
-By default, both the ``is_safe`` and ``needs_autoescape`` attributes are
-``False``. You do not need to specify them if ``False`` is an acceptable
-value.
+ An example might make this clearer. Let's write a filter that emphasizes
+ the first character of a string::
+
+ from django.utils.html import conditional_escape
+ from django.utils.safestring import mark_safe
+
+ def initial_letter_filter(text, autoescape=None):
+ first, other = text[0] ,text[1:]
+ if autoescape:
+ esc = conditional_escape
+ else:
+ esc = lambda x: x
+ result = '<strong>%s</strong>%s' % (esc(first), esc(other))
+ return mark_safe(result)
+ initial_letter_filter.needs_autoescape = True
+
+ The ``needs_autoescape`` attribute on the filter function and the
+ ``autoescape`` keyword argument mean that our function will know whether
+ or not automatic escaping is in effect when the filter is called. We use
+ ``autoescape`` to decide whether the input data needs to be passed through
+ ``django.utils.html.conditional_escape`` or not (in the latter case, we
+ just use the identity function as the "escape" function). The
+ ``conditional_escape()`` function is like ``escape()`` except it only
+ escapes input that is **not** a ``SafeData`` instance. If a ``SafeData``
+ instance is passed to ``conditional_escape()``, the data is returned
+ unchanged.
+
+ Finally, in the above example, we remember to mark the result as safe
+ so that our HTML is inserted directly into the template without further
+ escaping.
+
+ There is no need to worry about the ``is_safe`` attribute in this case
+ (although including it wouldn't hurt anything). Whenever you are manually
+ handling the auto-escaping issues and returning a safe string, the
+ ``is_safe`` attribute won't change anything either way.
Writing custom template tags
----------------------------
@@ -932,7 +977,9 @@ without having to be parsed multiple times.
Auto-escaping considerations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The output from template tags is not automatically run through the
+**New in Django development version**
+
+The output from template tags is **not** automatically run through the
auto-escaping filters. However, there are still a couple of things you should
keep in mind when writing a template tag:
@@ -1136,7 +1183,7 @@ on the object being edited -- so they're a perfect case for using a small
template that is filled with details from the current object. (In the admin's
case, this is the ``submit_row`` tag.)
-These sorts of tags are called `inclusion tags`.
+These sorts of tags are called "inclusion tags".
Writing inclusion tags is probably best demonstrated by example. Let's write a
tag that outputs a list of choices for a given ``Poll`` object, such as was
diff --git a/docs/tutorial01.txt b/docs/tutorial01.txt
index 9e0c287346..b84ecd5f7e 100644
--- a/docs/tutorial01.txt
+++ b/docs/tutorial01.txt
@@ -47,7 +47,7 @@ will create a ``mysite`` directory in your current directory.
denied" when you try to run ``django-admin.py startproject``. This
is because, on Unix-based systems like OS X, a file must be marked
as "executable" before it can be run as a program. To do this, open
- Terminal.app and navigate (using the `cd` command) to the directory
+ Terminal.app and navigate (using the ``cd`` command) to the directory
where ``django-admin.py`` is installed, then run the command
``chmod +x django-admin.py``.
diff --git a/docs/unicode.txt b/docs/unicode.txt
index a0e2648f57..a2c4e7fbe6 100644
--- a/docs/unicode.txt
+++ b/docs/unicode.txt
@@ -136,7 +136,7 @@ for converting back and forth between Unicode and bytestrings.
* ``smart_str(s, encoding='utf-8', strings_only=False, errors='strict')``
is essentially the opposite of ``smart_unicode()``. It forces the first
argument to a bytestring. The ``strings_only`` parameter has the same
- behaviour as for ``smart_unicode()`` and ``force_unicode()``. This is
+ behavior as for ``smart_unicode()`` and ``force_unicode()``. This is
slightly different semantics from Python's builtin ``str()`` function,
but the difference is needed in a few places within Django's internals.
diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt
index 76a4e1b5f0..6ed7043fd5 100644
--- a/docs/url_dispatch.txt
+++ b/docs/url_dispatch.txt
@@ -237,7 +237,7 @@ include
-------
A function that takes a full Python import path to another URLconf that should
-be "included" in this place. See _`Including other URLconfs` below.
+be "included" in this place. See `Including other URLconfs`_ below.
Notes on capturing text in URLs
===============================
diff --git a/tests/modeltests/field_subclassing/models.py b/tests/modeltests/field_subclassing/models.py
index 6182266c22..97804f5cd5 100644
--- a/tests/modeltests/field_subclassing/models.py
+++ b/tests/modeltests/field_subclassing/models.py
@@ -103,4 +103,14 @@ TypeError: Invalid lookup type: 'lt'
>>> obj = list(serializers.deserialize("json", stream))[0]
>>> obj.object == m
True
+
+# Test retrieving custom field data
+>>> m.delete()
+>>> m1 = MyModel(name="1", data=Small(1, 2))
+>>> m1.save()
+>>> m2 = MyModel(name="2", data=Small(2, 3))
+>>> m2.save()
+>>> for m in MyModel.objects.all(): print unicode(m.data)
+12
+23
"""}
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index e4e230c98d..9b0126ff4f 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -30,6 +30,23 @@ ARTICLE_STATUS = (
(3, 'Live'),
)
+STEERING_TYPE = (
+ ('left', 'Left steering wheel'),
+ ('right', 'Right steering wheel'),
+)
+
+FUEL_TYPE = (
+ ('gas', 'Gasoline'),
+ ('diesel', 'Diesel'),
+ ('other', 'Other'),
+)
+
+TRANSMISSION_TYPE = (
+ ('at', 'Automatic'),
+ ('mt', 'Manual'),
+ ('cvt', 'CVT'),
+)
+
class Category(models.Model):
name = models.CharField(max_length=20)
slug = models.SlugField(max_length=20)
@@ -70,6 +87,12 @@ class PhoneNumber(models.Model):
def __unicode__(self):
return self.phone
+class Car(models.Model):
+ name = models.CharField(max_length=50)
+ steering = models.CharField(max_length=5, choices=STEERING_TYPE, default='left')
+ fuel = models.CharField(max_length=10, choices=FUEL_TYPE)
+ transmission = models.CharField(max_length=3, choices=TRANSMISSION_TYPE, blank=True, help_text='Leave empty if not applicable.')
+
__test__ = {'API_TESTS': """
>>> from django.newforms import form_for_model, form_for_instance, save_instance, BaseForm, Form, CharField
>>> import datetime
@@ -592,4 +615,54 @@ ValidationError: [u'Select a valid choice. 4 is not one of the available choices
True
>>> f.cleaned_data
{'phone': u'312-555-1212', 'description': u'Assistance'}
+
+# form_for_* blank choices ####################################################
+
+Show the form for a new Car. Note that steering field doesn't include the blank choice,
+because the field is obligatory and has an explicit default.
+>>> CarForm = form_for_model(Car)
+>>> f = CarForm(auto_id=False)
+>>> print f
+<tr><th>Name:</th><td><input type="text" name="name" maxlength="50" /></td></tr>
+<tr><th>Steering:</th><td><select name="steering">
+<option value="left" selected="selected">Left steering wheel</option>
+<option value="right">Right steering wheel</option>
+</select></td></tr>
+<tr><th>Fuel:</th><td><select name="fuel">
+<option value="" selected="selected">---------</option>
+<option value="gas">Gasoline</option>
+<option value="diesel">Diesel</option>
+<option value="other">Other</option>
+</select></td></tr>
+<tr><th>Transmission:</th><td><select name="transmission">
+<option value="" selected="selected">---------</option>
+<option value="at">Automatic</option>
+<option value="mt">Manual</option>
+<option value="cvt">CVT</option>
+</select><br />Leave empty if not applicable.</td></tr>
+
+Create a Car, and display the form for modifying it. Note that now the fuel
+selector doesn't include the blank choice as well, since the field is
+obligatory and can not be changed to be blank.
+>>> honda = Car(name='Honda Accord Wagon', steering='right', fuel='gas', transmission='at')
+>>> honda.save()
+>>> HondaForm = form_for_instance(honda)
+>>> f = HondaForm(auto_id=False)
+>>> print f
+<tr><th>Name:</th><td><input type="text" name="name" value="Honda Accord Wagon" maxlength="50" /></td></tr>
+<tr><th>Steering:</th><td><select name="steering">
+<option value="left">Left steering wheel</option>
+<option value="right" selected="selected">Right steering wheel</option>
+</select></td></tr>
+<tr><th>Fuel:</th><td><select name="fuel">
+<option value="gas" selected="selected">Gasoline</option>
+<option value="diesel">Diesel</option>
+<option value="other">Other</option>
+</select></td></tr>
+<tr><th>Transmission:</th><td><select name="transmission">
+<option value="">---------</option>
+<option value="at" selected="selected">Automatic</option>
+<option value="mt">Manual</option>
+<option value="cvt">CVT</option>
+</select><br />Leave empty if not applicable.</td></tr>
"""}
diff --git a/tests/modeltests/pagination/models.py b/tests/modeltests/pagination/models.py
index 1dcec00a32..f44c67a139 100644
--- a/tests/modeltests/pagination/models.py
+++ b/tests/modeltests/pagination/models.py
@@ -78,7 +78,8 @@ True
>>> paginator.pages
2
-# The paginator can provide a list of all available pages
+# The paginator can provide a list of all available pages.
+>>> paginator = ObjectPaginator(Article.objects.all(), 10)
>>> paginator.page_range
[1, 2]
"""}
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index 3879da7703..e94ea33139 100644
--- a/tests/regressiontests/cache/tests.py
+++ b/tests/regressiontests/cache/tests.py
@@ -3,9 +3,12 @@
# Unit tests for cache framework
# Uses whatever cache backend is set in the test settings file.
-from django.core.cache import cache
import time, unittest
+from django.core.cache import cache
+from django.utils.cache import patch_vary_headers
+from django.http import HttpResponse
+
# functions/classes for complex data type tests
def f():
return 42
@@ -87,5 +90,30 @@ class Cache(unittest.TestCase):
cache.set(key, value)
self.assertEqual(cache.get(key), value)
+
+class CacheUtils(unittest.TestCase):
+ """TestCase for django.utils.cache functions."""
+
+ def test_patch_vary_headers(self):
+ headers = (
+ # Initial vary, new headers, resulting vary.
+ (None, ('Accept-Encoding',), 'Accept-Encoding'),
+ ('Accept-Encoding', ('accept-encoding',), 'Accept-Encoding'),
+ ('Accept-Encoding', ('ACCEPT-ENCODING',), 'Accept-Encoding'),
+ ('Cookie', ('Accept-Encoding',), 'Cookie, Accept-Encoding'),
+ ('Cookie, Accept-Encoding', ('Accept-Encoding',), 'Cookie, Accept-Encoding'),
+ ('Cookie, Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
+ (None, ('Accept-Encoding', 'COOKIE'), 'Accept-Encoding, COOKIE'),
+ ('Cookie, Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
+ ('Cookie , Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
+ )
+ for initial_vary, newheaders, resulting_vary in headers:
+ response = HttpResponse()
+ if initial_vary is not None:
+ response['Vary'] = initial_vary
+ patch_vary_headers(response, newheaders)
+ self.assertEqual(response['Vary'], resulting_vary)
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py
index d1e21e673c..3b0ccde257 100644
--- a/tests/regressiontests/datastructures/tests.py
+++ b/tests/regressiontests/datastructures/tests.py
@@ -25,11 +25,23 @@
>>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
>>> d['name']
'Simon'
+>>> d.get('name')
+'Simon'
>>> d.getlist('name')
['Adrian', 'Simon']
+>>> d['lastname']
+Traceback (most recent call last):
+...
+MultiValueDictKeyError: "Key 'lastname' not found in <MultiValueDict: {'position': ['Developer'], 'name': ['Adrian', 'Simon']}>"
+>>> d.get('lastname')
+
>>> d.get('lastname', 'nonexistent')
'nonexistent'
+>>> d.getlist('lastname')
+[]
>>> d.setlist('lastname', ['Holovaty', 'Willison'])
+>>> d.getlist('lastname')
+['Holovaty', 'Willison']
### SortedDict #################################################################
diff --git a/tests/regressiontests/dateformat/tests.py b/tests/regressiontests/dateformat/tests.py
index 30c9a4e6dd..481e36a7dd 100644
--- a/tests/regressiontests/dateformat/tests.py
+++ b/tests/regressiontests/dateformat/tests.py
@@ -66,6 +66,9 @@ u'1979 189 CET'
>>> format(my_birthday, r'jS o\f F')
u'8th of July'
+
+>>> format(the_future, r'Y')
+u'2100'
"""
from django.utils import dateformat, translation
@@ -84,3 +87,4 @@ except AttributeError:
my_birthday = datetime.datetime(1979, 7, 8, 22, 00)
summertime = datetime.datetime(2005, 10, 30, 1, 00)
wintertime = datetime.datetime(2005, 10, 30, 4, 00)
+the_future = datetime.datetime(2100, 10, 25, 0, 00)
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 26d448900d..bfa03cd6e1 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -37,6 +37,8 @@ u''
u'13.1031'
>>> floatformat(u'foo', u'bar')
u''
+>>> floatformat(None)
+u''
>>> addslashes(u'"double quotes" and \'single quotes\'')
u'\\"double quotes\\" and \\\'single quotes\\\''
diff --git a/tests/regressiontests/forms/error_messages.py b/tests/regressiontests/forms/error_messages.py
index ff7e110f6f..9f972f5b90 100644
--- a/tests/regressiontests/forms/error_messages.py
+++ b/tests/regressiontests/forms/error_messages.py
@@ -312,4 +312,49 @@ ValidationError: [u'REQUIRED']
Traceback (most recent call last):
...
ValidationError: [u'INVALID IP ADDRESS']
+
+###############################################################################
+
+# Create choices for the model choice field tests below.
+
+>>> from regressiontests.forms.models import ChoiceModel
+>>> ChoiceModel.objects.create(pk=1, name='a')
+<ChoiceModel: ChoiceModel object>
+>>> ChoiceModel.objects.create(pk=2, name='b')
+<ChoiceModel: ChoiceModel object>
+>>> ChoiceModel.objects.create(pk=3, name='c')
+<ChoiceModel: ChoiceModel object>
+
+# ModelChoiceField ############################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid_choice'] = 'INVALID CHOICE'
+>>> f = ModelChoiceField(queryset=ChoiceModel.objects.all(), error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('4')
+Traceback (most recent call last):
+...
+ValidationError: [u'INVALID CHOICE']
+
+# ModelMultipleChoiceField ####################################################
+
+>>> e = {'required': 'REQUIRED'}
+>>> e['invalid_choice'] = '%s IS INVALID CHOICE'
+>>> e['list'] = 'NOT A LIST OF VALUES'
+>>> f = ModelMultipleChoiceField(queryset=ChoiceModel.objects.all(), error_messages=e)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'REQUIRED']
+>>> f.clean('3')
+Traceback (most recent call last):
+...
+ValidationError: [u'NOT A LIST OF VALUES']
+>>> f.clean(['4'])
+Traceback (most recent call last):
+...
+ValidationError: [u'4 IS INVALID CHOICE']
"""
diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py
index 3b93d70338..cff5db6fca 100644
--- a/tests/regressiontests/forms/fields.py
+++ b/tests/regressiontests/forms/fields.py
@@ -323,6 +323,10 @@ Decimal("3.14")
Traceback (most recent call last):
...
ValidationError: [u'Enter a number.']
+>>> f.clean(u'łąść')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a number.']
>>> f.clean('1.0 ')
Decimal("1.0")
>>> f.clean(' 1.0')
@@ -914,6 +918,11 @@ False
>>> f.clean('Django rocks')
True
+>>> f.clean('True')
+True
+>>> f.clean('False')
+False
+
>>> f = BooleanField(required=False)
>>> f.clean('')
False
@@ -930,6 +939,11 @@ False
>>> f.clean('Django rocks')
True
+A form's BooleanField with a hidden widget will output the string 'False', so
+that should clean to the boolean value False:
+>>> f.clean('False')
+False
+
# ChoiceField #################################################################
>>> f = ChoiceField(choices=[('1', '1'), ('2', '2')])
diff --git a/tests/regressiontests/forms/localflavor/ca.py b/tests/regressiontests/forms/localflavor/ca.py
index baeb2ad9a8..a13a6de65f 100644
--- a/tests/regressiontests/forms/localflavor/ca.py
+++ b/tests/regressiontests/forms/localflavor/ca.py
@@ -147,6 +147,10 @@ u'BC'
u'NS'
>>> f.clean(' manitoba ')
u'MB'
+>>> f.clean(' new brunswick ')
+u'NB'
+>>> f.clean('NB')
+u'NB'
>>> f.clean('T2S 2H7')
Traceback (most recent call last):
...
diff --git a/tests/regressiontests/forms/models.py b/tests/regressiontests/forms/models.py
index 1a6f566b6b..c7ce128560 100644
--- a/tests/regressiontests/forms/models.py
+++ b/tests/regressiontests/forms/models.py
@@ -10,6 +10,10 @@ class Defaults(models.Model):
def_date = models.DateField(default = datetime.date(1980, 1, 1))
value = models.IntegerField(default=42)
+class ChoiceModel(models.Model):
+ """For ModelChoiceField and ModelMultipleChoiceField tests."""
+ name = models.CharField(max_length=10)
+
__test__ = {'API_TESTS': """
>>> from django.newforms import form_for_model, form_for_instance
diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py
index cb1d084631..0e69602103 100644
--- a/tests/regressiontests/forms/widgets.py
+++ b/tests/regressiontests/forms/widgets.py
@@ -2,6 +2,7 @@
tests = r"""
>>> from django.newforms import *
>>> from django.newforms.widgets import RadioFieldRenderer
+>>> from django.utils.safestring import mark_safe
>>> import datetime
>>> import time
>>> import re
@@ -128,6 +129,13 @@ u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u
>>> w.render('email', '', attrs={'class': 'special'})
u'<input type="hidden" class="special" name="email" />'
+Boolean values are rendered to their string forms ("True" and "False").
+>>> w = HiddenInput()
+>>> w.render('get_spam', False)
+u'<input type="hidden" name="get_spam" value="False" />'
+>>> w.render('get_spam', True)
+u'<input type="hidden" name="get_spam" value="True" />'
+
# MultipleHiddenInput Widget ##################################################
>>> w = MultipleHiddenInput()
@@ -205,6 +213,8 @@ u'<textarea rows="10" cols="40" name="msg"></textarea>'
u'<textarea rows="10" cols="40" name="msg">value</textarea>'
>>> w.render('msg', 'some "quoted" & ampersanded value')
u'<textarea rows="10" cols="40" name="msg">some &quot;quoted&quot; &amp; ampersanded value</textarea>'
+>>> w.render('msg', mark_safe('pre &quot;quoted&quot; value'))
+u'<textarea rows="10" cols="40" name="msg">pre &quot;quoted&quot; value</textarea>'
>>> w.render('msg', 'value', attrs={'class': 'pretty', 'rows': 20})
u'<textarea class="pretty" rows="20" cols="40" name="msg">value</textarea>'
@@ -375,6 +385,17 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
<option value="5">5</option>
</select>
+# Choices are escaped correctly
+>>> print w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you &gt; me'))))
+<select name="escape">
+<option value="1">1</option>
+<option value="2">2</option>
+<option value="3">3</option>
+<option value="bad">you &amp; me</option>
+<option value="good">you &gt; me</option>
+</select>
+
+# Unicode choices are correctly rendered as HTML
>>> w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
u'<select name="email">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>'
@@ -538,6 +559,17 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
<option value="5">5</option>
</select>
+# Choices are escaped correctly
+>>> print w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you &gt; me'))))
+<select multiple="multiple" name="escape">
+<option value="1">1</option>
+<option value="2">2</option>
+<option value="3">3</option>
+<option value="bad">you &amp; me</option>
+<option value="good">you &gt; me</option>
+</select>
+
+# Unicode choices are correctly rendered as HTML
>>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
u'<select multiple="multiple" name="nums">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>'
@@ -663,6 +695,16 @@ You can create your own custom renderers for RadioSelect to use.
<label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br />
<label><input type="radio" name="beatle" value="R" /> Ringo</label>
+Or you can use custom RadioSelect fields that use your custom renderer.
+>>> class CustomRadioSelect(RadioSelect):
+... renderer = MyRenderer
+>>> w = CustomRadioSelect()
+>>> print w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
+<label><input type="radio" name="beatle" value="J" /> John</label><br />
+<label><input type="radio" name="beatle" value="P" /> Paul</label><br />
+<label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br />
+<label><input type="radio" name="beatle" value="R" /> Ringo</label>
+
A RadioFieldRenderer object also allows index access to individual RadioInput
objects.
>>> w = RadioSelect()
@@ -682,6 +724,14 @@ Traceback (most recent call last):
...
IndexError: list index out of range
+# Choices are escaped correctly
+>>> w = RadioSelect()
+>>> print w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you &gt; me'))))
+<ul>
+<li><label><input type="radio" name="escape" value="bad" /> you &amp; me</label></li>
+<li><label><input type="radio" name="escape" value="good" /> you &gt; me</label></li>
+</ul>
+
# Unicode choices are correctly rendered as HTML
>>> w = RadioSelect()
>>> unicode(w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]))
@@ -811,6 +861,17 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
<li><label><input type="checkbox" name="nums" value="5" /> 5</label></li>
</ul>
+# Choices are escaped correctly
+>>> print w.render('escape', None, choices=(('bad', 'you & me'), ('good', mark_safe('you &gt; me'))))
+<ul>
+<li><label><input type="checkbox" name="escape" value="1" /> 1</label></li>
+<li><label><input type="checkbox" name="escape" value="2" /> 2</label></li>
+<li><label><input type="checkbox" name="escape" value="3" /> 3</label></li>
+<li><label><input type="checkbox" name="escape" value="bad" /> you &amp; me</label></li>
+<li><label><input type="checkbox" name="escape" value="good" /> you &gt; me</label></li>
+</ul>
+
+# Unicode choices are correctly rendered as HTML
>>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
u'<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>'
diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py
index 0a18e8bea5..2ffc62f90d 100644
--- a/tests/regressiontests/i18n/tests.py
+++ b/tests/regressiontests/i18n/tests.py
@@ -4,7 +4,7 @@ import misc
regressions = ur"""
Format string interpolation should work with *_lazy objects.
->>> from django.utils.translation import ugettext_lazy, activate, deactivate, gettext_lazy
+>>> from django.utils.translation import ugettext, ugettext_lazy, activate, deactivate, gettext_lazy
>>> s = ugettext_lazy('Add %(name)s')
>>> d = {'name': 'Ringo'}
>>> s % d
@@ -39,6 +39,18 @@ unicode(string_concat(...)) should not raise a TypeError - #4796
<module 'django.utils.translation' from ...>
>>> unicode(django.utils.translation.string_concat("dja", "ngo"))
u'django'
+
+Translating a string requiring no auto-escaping shouldn't change the "safe"
+status.
+
+>>> from django.utils.safestring import mark_safe
+>>> s = mark_safe('Password')
+>>> type(s)
+<class 'django.utils.safestring.SafeString'>
+>>> activate('de')
+>>> type(ugettext(s))
+<class 'django.utils.safestring.SafeUnicode'>
+>>> deactivate()
"""
__test__ = {
diff --git a/tests/regressiontests/templates/filters.py b/tests/regressiontests/templates/filters.py
index 5d7129480c..4175bdbe5f 100644
--- a/tests/regressiontests/templates/filters.py
+++ b/tests/regressiontests/templates/filters.py
@@ -12,6 +12,15 @@ from datetime import datetime, timedelta
from django.utils.tzinfo import LocalTimezone
from django.utils.safestring import mark_safe
+# These two classes are used to test auto-escaping of __unicode__ output.
+class UnsafeClass:
+ def __unicode__(self):
+ return u'you & me'
+
+class SafeClass:
+ def __unicode__(self):
+ return mark_safe(u'you &gt; me')
+
# RESULT SYNTAX --
# 'template_name': ('template contents', 'context dict',
# 'expected string output' or Exception class)
@@ -94,6 +103,11 @@ def get_filter_tests():
'filter-urlize03': ('{% autoescape off %}{{ a|urlize }}{% endautoescape %}', {"a": mark_safe("a &amp; b")}, 'a &amp; b'),
'filter-urlize04': ('{{ a|urlize }}', {"a": mark_safe("a &amp; b")}, 'a &amp; b'),
+ # This will lead to a nonsense result, but at least it won't be
+ # exploitable for XSS purposes when auto-escaping is on.
+ 'filter-urlize05': ('{% autoescape off %}{{ a|urlize }}{% endautoescape %}', {"a": "<script>alert('foo')</script>"}, "<script>alert('foo')</script>"),
+ 'filter-urlize06': ('{{ a|urlize }}', {"a": "<script>alert('foo')</script>"}, '&lt;script&gt;alert(&#39;foo&#39;)&lt;/script&gt;'),
+
'filter-urlizetrunc01': ('{% autoescape off %}{{ a|urlizetrunc:"8" }} {{ b|urlizetrunc:"8" }}{% endautoescape %}', {"a": "http://example.com/x=&y=", "b": mark_safe("http://example.com?x=&y=")}, u'<a href="http://example.com/x=&y=" rel="nofollow">http:...</a> <a href="http://example.com?x=&y=" rel="nofollow">http:...</a>'),
'filter-urlizetrunc02': ('{{ a|urlizetrunc:"8" }} {{ b|urlizetrunc:"8" }}', {"a": "http://example.com/x=&y=", "b": mark_safe("http://example.com?x=&y=")}, u'<a href="http://example.com/x=&y=" rel="nofollow">http:...</a> <a href="http://example.com?x=&y=" rel="nofollow">http:...</a>'),
@@ -177,23 +191,28 @@ def get_filter_tests():
'filter-unordered_list04': ('{% autoescape off %}{{ a|unordered_list }}{% endautoescape %}', {"a": ["x>", [[mark_safe("<y"), []]]]}, "\t<li>x>\n\t<ul>\n\t\t<li><y</li>\n\t</ul>\n\t</li>"),
'filter-unordered_list05': ('{% autoescape off %}{{ a|unordered_list }}{% endautoescape %}', {"a": ["x>", [["<y", []]]]}, "\t<li>x>\n\t<ul>\n\t\t<li><y</li>\n\t</ul>\n\t</li>"),
- # If the input to "default" filter is marked as safe, then so is the
- # output. However, if the default arg is used, auto-escaping kicks in
- # (if enabled), because we cannot mark the default as safe.
+ # Literal string arguments to the default filter are always treated as
+ # safe strings, regardless of the auto-escaping state.
#
# Note: we have to use {"a": ""} here, otherwise the invalid template
# variable string interferes with the test result.
- 'filter-default01': ('{{ a|default:"x<" }}', {"a": ""}, "x&lt;"),
+ 'filter-default01': ('{{ a|default:"x<" }}', {"a": ""}, "x<"),
'filter-default02': ('{% autoescape off %}{{ a|default:"x<" }}{% endautoescape %}', {"a": ""}, "x<"),
'filter-default03': ('{{ a|default:"x<" }}', {"a": mark_safe("x>")}, "x>"),
'filter-default04': ('{% autoescape off %}{{ a|default:"x<" }}{% endautoescape %}', {"a": mark_safe("x>")}, "x>"),
- 'filter-default_if_none01': ('{{ a|default:"x<" }}', {"a": None}, "x&lt;"),
+ 'filter-default_if_none01': ('{{ a|default:"x<" }}', {"a": None}, "x<"),
'filter-default_if_none02': ('{% autoescape off %}{{ a|default:"x<" }}{% endautoescape %}', {"a": None}, "x<"),
'filter-phone2numeric01': ('{{ a|phone2numeric }} {{ b|phone2numeric }}', {"a": "<1-800-call-me>", "b": mark_safe("<1-800-call-me>") }, "&lt;1-800-2255-63&gt; <1-800-2255-63>"),
'filter-phone2numeric02': ('{% autoescape off %}{{ a|phone2numeric }} {{ b|phone2numeric }}{% endautoescape %}', {"a": "<1-800-call-me>", "b": mark_safe("<1-800-call-me>") }, "<1-800-2255-63> <1-800-2255-63>"),
+ # Ensure iriencode keeps safe strings:
+ 'filter-iriencode01': ('{{ url|iriencode }}', {'url': '?test=1&me=2'}, '?test=1&amp;me=2'),
+ 'filter-iriencode02': ('{% autoescape off %}{{ url|iriencode }}{% endautoescape %}', {'url': '?test=1&me=2'}, '?test=1&me=2'),
+ 'filter-iriencode03': ('{{ url|iriencode }}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'),
+ 'filter-iriencode04': ('{% autoescape off %}{{ url|iriencode }}{% endautoescape %}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'),
+
# Chaining a bunch of safeness-preserving filters should not alter
# the safe status either way.
'chaining01': ('{{ a|capfirst|center:"7" }}.{{ b|capfirst|center:"7" }}', {"a": "a < b", "b": mark_safe("a < b")}, " A &lt; b . A < b "),
@@ -209,12 +228,19 @@ def get_filter_tests():
# Force to safe, then back (also showing why using force_escape too
# early in a chain can lead to unexpected results).
- 'chaining07': ('{{ a|force_escape|cut:"b" }}', {"a": "a < b"}, "a &lt; "),
- 'chaining08': ('{% autoescape off %}{{ a|force_escape|cut:"b" }}{% endautoescape %}', {"a": "a < b"}, "a &lt; "),
- 'chaining09': ('{{ a|cut:"b"|force_escape }}', {"a": "a < b"}, "a &lt; "),
- 'chaining10': ('{% autoescape off %}{{ a|cut:"b"|force_escape }}{% endautoescape %}', {"a": "a < b"}, "a &lt; "),
+ 'chaining07': ('{{ a|force_escape|cut:";" }}', {"a": "a < b"}, "a &amp;lt b"),
+ 'chaining08': ('{% autoescape off %}{{ a|force_escape|cut:";" }}{% endautoescape %}', {"a": "a < b"}, "a &lt b"),
+ 'chaining09': ('{{ a|cut:";"|force_escape }}', {"a": "a < b"}, "a &lt; b"),
+ 'chaining10': ('{% autoescape off %}{{ a|cut:";"|force_escape }}{% endautoescape %}', {"a": "a < b"}, "a &lt; b"),
'chaining11': ('{{ a|cut:"b"|safe }}', {"a": "a < b"}, "a < "),
'chaining12': ('{% autoescape off %}{{ a|cut:"b"|safe }}{% endautoescape %}', {"a": "a < b"}, "a < "),
'chaining13': ('{{ a|safe|force_escape }}', {"a": "a < b"}, "a &lt; b"),
'chaining14': ('{% autoescape off %}{{ a|safe|force_escape }}{% endautoescape %}', {"a": "a < b"}, "a &lt; b"),
+
+ # Filters decorated with stringfilter still respect is_safe.
+ 'autoescape-stringfilter01': (r'{{ unsafe|capfirst }}', {'unsafe': UnsafeClass()}, 'You &amp; me'),
+ 'autoescape-stringfilter02': (r'{% autoescape off %}{{ unsafe|capfirst }}{% endautoescape %}', {'unsafe': UnsafeClass()}, 'You & me'),
+ 'autoescape-stringfilter03': (r'{{ safe|capfirst }}', {'safe': SafeClass()}, 'You &gt; me'),
+ 'autoescape-stringfilter04': (r'{% autoescape off %}{{ safe|capfirst }}{% endautoescape %}', {'safe': SafeClass()}, 'You &gt; me'),
}
+
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index d52e8f0abf..cbbd88b06c 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -268,6 +268,12 @@ class Templates(unittest.TestCase):
# Embedded newlines make it not-a-tag.
'basic-syntax24': ("{{ moo\n }}", {}, "{{ moo\n }}"),
+ # Literal strings are permitted inside variables, mostly for i18n
+ # purposes.
+ 'basic-syntax25': ('{{ "fred" }}', {}, "fred"),
+ 'basic-syntax26': (r'{{ "\"fred\"" }}', {}, "\"fred\""),
+ 'basic-syntax27': (r'{{ _("\"fred\"") }}', {}, "\"fred\""),
+
# List-index syntax allows a template to access a certain item of a subscriptable object.
'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"),
@@ -318,9 +324,9 @@ class Templates(unittest.TestCase):
# Chained filters, with an argument to the first one
'filter-syntax09': ('{{ var|removetags:"b i"|upper|lower }}', {"var": "<b><i>Yes</i></b>"}, "yes"),
- # Escaped string as argument
+ # Literal string as argument is always "safe" from auto-escaping..
'filter-syntax10': (r'{{ var|default_if_none:" endquote\" hah" }}',
- {"var": None}, ' endquote&quot; hah'),
+ {"var": None}, ' endquote" hah'),
# Variable as argument
'filter-syntax11': (r'{{ var|default_if_none:var2 }}', {"var": None, "var2": "happy"}, 'happy'),
@@ -617,7 +623,7 @@ class Templates(unittest.TestCase):
### INHERITANCE ###########################################################
# Standard template with no inheritance
- 'inheritance01': ("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}", {}, '1_3_'),
+ 'inheritance01': ("1{% block first %}&{% endblock %}3{% block second %}_{% endblock %}", {}, '1&3_'),
# Standard two-level inheritance
'inheritance02': ("{% extends 'inheritance01' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
@@ -626,7 +632,7 @@ class Templates(unittest.TestCase):
'inheritance03': ("{% extends 'inheritance02' %}", {}, '1234'),
# Two-level with no redefinitions on second level
- 'inheritance04': ("{% extends 'inheritance01' %}", {}, '1_3_'),
+ 'inheritance04': ("{% extends 'inheritance01' %}", {}, '1&3_'),
# Two-level with double quotes instead of single quotes
'inheritance05': ('{% extends "inheritance02" %}', {}, '1234'),
@@ -635,16 +641,16 @@ class Templates(unittest.TestCase):
'inheritance06': ("{% extends foo %}", {'foo': 'inheritance02'}, '1234'),
# Two-level with one block defined, one block not defined
- 'inheritance07': ("{% extends 'inheritance01' %}{% block second %}5{% endblock %}", {}, '1_35'),
+ 'inheritance07': ("{% extends 'inheritance01' %}{% block second %}5{% endblock %}", {}, '1&35'),
# Three-level with one block defined on this level, two blocks defined next level
'inheritance08': ("{% extends 'inheritance02' %}{% block second %}5{% endblock %}", {}, '1235'),
# Three-level with second and third levels blank
- 'inheritance09': ("{% extends 'inheritance04' %}", {}, '1_3_'),
+ 'inheritance09': ("{% extends 'inheritance04' %}", {}, '1&3_'),
# Three-level with space NOT in a block -- should be ignored
- 'inheritance10': ("{% extends 'inheritance04' %} ", {}, '1_3_'),
+ 'inheritance10': ("{% extends 'inheritance04' %} ", {}, '1&3_'),
# Three-level with both blocks defined on this level, but none on second level
'inheritance11': ("{% extends 'inheritance04' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
@@ -656,7 +662,7 @@ class Templates(unittest.TestCase):
'inheritance13': ("{% extends 'inheritance02' %}{% block first %}a{% endblock %}{% block second %}b{% endblock %}", {}, '1a3b'),
# A block defined only in a child template shouldn't be displayed
- 'inheritance14': ("{% extends 'inheritance01' %}{% block newblock %}NO DISPLAY{% endblock %}", {}, '1_3_'),
+ 'inheritance14': ("{% extends 'inheritance01' %}{% block newblock %}NO DISPLAY{% endblock %}", {}, '1&3_'),
# A block within another block
'inheritance15': ("{% extends 'inheritance01' %}{% block first %}2{% block inner %}inner{% endblock %}{% endblock %}", {}, '12inner3_'),
@@ -674,16 +680,16 @@ class Templates(unittest.TestCase):
'inheritance19': ("{% extends 'inheritance01' %}{% block first %}{% load testtags %}{% echo 400 %}5678{% endblock %}", {}, '140056783_'),
# Two-level inheritance with {{ block.super }}
- 'inheritance20': ("{% extends 'inheritance01' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1_a3_'),
+ 'inheritance20': ("{% extends 'inheritance01' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1&a3_'),
# Three-level inheritance with {{ block.super }} from parent
'inheritance21': ("{% extends 'inheritance02' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '12a34'),
# Three-level inheritance with {{ block.super }} from grandparent
- 'inheritance22': ("{% extends 'inheritance04' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1_a3_'),
+ 'inheritance22': ("{% extends 'inheritance04' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1&a3_'),
# Three-level inheritance with {{ block.super }} from parent and grandparent
- 'inheritance23': ("{% extends 'inheritance20' %}{% block first %}{{ block.super }}b{% endblock %}", {}, '1_ab3_'),
+ 'inheritance23': ("{% extends 'inheritance20' %}{% block first %}{{ block.super }}b{% endblock %}", {}, '1&ab3_'),
# Inheritance from local context without use of template loader
'inheritance24': ("{% extends context_template %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {'context_template': template.Template("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}")}, '1234'),
@@ -705,10 +711,10 @@ class Templates(unittest.TestCase):
'i18n02': ('{% load i18n %}{% trans "xxxyyyxxx" %}', {}, "xxxyyyxxx"),
# simple translation of a variable
- 'i18n03': ('{% load i18n %}{% blocktrans %}{{ anton }}{% endblocktrans %}', {'anton': 'xxxyyyxxx'}, "xxxyyyxxx"),
+ 'i18n03': ('{% load i18n %}{% blocktrans %}{{ anton }}{% endblocktrans %}', {'anton': '\xc3\x85'}, u"Å"),
# simple translation of a variable and filter
- 'i18n04': ('{% load i18n %}{% blocktrans with anton|lower as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'XXXYYYXXX'}, "xxxyyyxxx"),
+ 'i18n04': ('{% load i18n %}{% blocktrans with anton|lower as berta %}{{ berta }}{% endblocktrans %}', {'anton': '\xc3\x85'}, u'å'),
# simple translation of a string with interpolation
'i18n05': ('{% load i18n %}{% blocktrans %}xxx{{ anton }}xxx{% endblocktrans %}', {'anton': 'yyy'}, "xxxyyyxxx"),
@@ -717,10 +723,10 @@ class Templates(unittest.TestCase):
'i18n06': ('{% load i18n %}{% trans "Page not found" %}', {'LANGUAGE_CODE': 'de'}, "Seite nicht gefunden"),
# translation of singular form
- 'i18n07': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 1}, "singular"),
+ 'i18n07': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}{{ counter }} plural{% endblocktrans %}', {'number': 1}, "singular"),
# translation of plural form
- 'i18n08': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 2}, "plural"),
+ 'i18n08': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}{{ counter }} plural{% endblocktrans %}', {'number': 2}, "2 plural"),
# simple non-translation (only marking) of a string to german
'i18n09': ('{% load i18n %}{% trans "Page not found" noop %}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
@@ -734,8 +740,16 @@ class Templates(unittest.TestCase):
# usage of the get_available_languages tag
'i18n12': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'),
- # translation of a constant string
- 'i18n13': ('{{ _("Page not found") }}', {'LANGUAGE_CODE': 'de'}, 'Seite nicht gefunden'),
+ # translation of constant strings
+ 'i18n13': ('{{ _("Password") }}', {'LANGUAGE_CODE': 'de'}, 'Passwort'),
+ 'i18n14': ('{% cycle "foo" _("Password") _(\'Password\') as c %} {% cycle c %} {% cycle c %}', {'LANGUAGE_CODE': 'de'}, 'foo Passwort Passwort'),
+ 'i18n15': ('{{ absent|default:_("Password") }}', {'LANGUAGE_CODE': 'de', 'absent': ""}, 'Passwort'),
+ 'i18n16': ('{{ _("<") }}', {'LANGUAGE_CODE': 'de'}, '<'),
+
+ # Escaping inside blocktrans works as if it was directly in the
+ # template.
+ 'i18n17': ('{% load i18n %}{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
+ 'i18n18': ('{% load i18n %}{% blocktrans with anton|force_escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################
@@ -883,9 +897,14 @@ class Templates(unittest.TestCase):
'autoescape-tag06': ("{{ first }}", {"first": mark_safe("<b>first</b>")}, "<b>first</b>"),
'autoescape-tag07': ("{% autoescape on %}{{ first }}{% endautoescape %}", {"first": mark_safe(u"<b>Apple</b>")}, u"<b>Apple</b>"),
- # String arguments to filters, if used in the result, are escaped,
- # too.
- 'basic-syntax08': (r'{% autoescape on %}{{ var|default_if_none:" endquote\" hah" }}{% endautoescape %}', {"var": None}, ' endquote&quot; hah'),
+ # Literal string arguments to filters, if used in the result, are
+ # safe.
+ 'autoescape-tag08': (r'{% autoescape on %}{{ var|default_if_none:" endquote\" hah" }}{% endautoescape %}', {"var": None}, ' endquote" hah'),
+
+ # Objects which return safe strings as their __unicode__ method
+ # won't get double-escaped.
+ 'autoescape-tag09': (r'{{ unsafe }}', {'unsafe': filters.UnsafeClass()}, 'you &amp; me'),
+ 'autoescape-tag10': (r'{{ safe }}', {'safe': filters.SafeClass()}, 'you &gt; me'),
# The "safe" and "escape" filters cannot work due to internal
# implementation details (fortunately, the (no)autoescape block
diff --git a/tests/regressiontests/templates/unicode.py b/tests/regressiontests/templates/unicode.py
index efda11c2da..e5f308d202 100644
--- a/tests/regressiontests/templates/unicode.py
+++ b/tests/regressiontests/templates/unicode.py
@@ -3,6 +3,7 @@
unicode_tests = ur"""
Templates can be created from unicode strings.
>>> from django.template import *
+>>> from django.utils.safestring import SafeData
>>> t1 = Template(u'ŠĐĆŽćžšđ {{ var }}')
Templates can also be created from bytestrings. These are assumed by encoded
@@ -24,10 +25,13 @@ Contexts can be constructed from unicode or UTF-8 bytestrings.
>>> c4 = Context({u'var': '\xc4\x90\xc4\x91'})
Since both templates and all four contexts represent the same thing, they all
-render the same (and are returned as unicode objects).
+render the same (and are returned as unicode objects and "safe" objects as
+well, for auto-escaping purposes).
>>> t1.render(c3) == t2.render(c3)
True
->>> type(t1.render(c3))
-<type 'unicode'>
+>>> isinstance(t1.render(c3), unicode)
+True
+>>> isinstance(t1.render(c3), SafeData)
+True
"""
diff --git a/tests/regressiontests/utils/datastructures.py b/tests/regressiontests/utils/datastructures.py
new file mode 100644
index 0000000000..52bf81a9e0
--- /dev/null
+++ b/tests/regressiontests/utils/datastructures.py
@@ -0,0 +1,51 @@
+"""
+>>> from django.utils.datastructures import SortedDict
+
+>>> d = SortedDict()
+>>> d[7] = 'seven'
+>>> d[1] = 'one'
+>>> d[9] = 'nine'
+>>> d.keys()
+[7, 1, 9]
+>>> d.values()
+['seven', 'one', 'nine']
+>>> d.items()
+[(7, 'seven'), (1, 'one'), (9, 'nine')]
+
+# Overwriting an item keeps it's place.
+>>> d[1] = 'ONE'
+>>> d.values()
+['seven', 'ONE', 'nine']
+
+# New items go to the end.
+>>> d[0] = 'nil'
+>>> d.keys()
+[7, 1, 9, 0]
+
+# Deleting an item, then inserting the same key again will place it at the end.
+>>> del d[7]
+>>> d.keys()
+[1, 9, 0]
+>>> d[7] = 'lucky number 7'
+>>> d.keys()
+[1, 9, 0, 7]
+
+# Changing the keys won't do anything, it's only a copy of the keys dict.
+>>> k = d.keys()
+>>> k.remove(9)
+>>> d.keys()
+[1, 9, 0, 7]
+
+# Initialising a SortedDict with two keys will just take the first one. A real
+# dict will actually take the second value so we will too, but we'll keep the
+# ordering from the first key found.
+>>> tuples = ((2, 'two'), (1, 'one'), (2, 'second-two'))
+>>> d = SortedDict(tuples)
+>>> d.keys()
+[2, 1]
+>>> real_dict = dict(tuples)
+>>> real_dict.values()
+['one', 'second-two']
+>>> d.values()
+['second-two', 'one']
+""" \ No newline at end of file
diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py
index eb3a722888..abcd7212d8 100644
--- a/tests/regressiontests/utils/tests.py
+++ b/tests/regressiontests/utils/tests.py
@@ -6,7 +6,14 @@ from unittest import TestCase
from django.utils import html, checksums
-from timesince import timesince_tests
+import timesince
+import datastructures
+
+# Extra tests
+__test__ = {
+ 'timesince': timesince,
+ 'datastructures': datastructures,
+}
class TestUtilsHtml(TestCase):
@@ -142,10 +149,6 @@ class TestUtilsChecksums(TestCase):
for value, output in items:
self.check_output(f, value, output)
-__test__ = {
- 'timesince_tests': timesince_tests,
-}
-
if __name__ == "__main__":
import doctest
doctest.testmod()
diff --git a/tests/regressiontests/utils/timesince.py b/tests/regressiontests/utils/timesince.py
index 30200be6e9..4f304ec7f7 100644
--- a/tests/regressiontests/utils/timesince.py
+++ b/tests/regressiontests/utils/timesince.py
@@ -1,4 +1,4 @@
-timesince_tests = """
+"""
>>> from datetime import datetime, timedelta
>>> from django.utils.timesince import timesince
diff --git a/tests/regressiontests/views/tests/static.py b/tests/regressiontests/views/tests/static.py
index 0a67cf543e..c731b249e8 100644
--- a/tests/regressiontests/views/tests/static.py
+++ b/tests/regressiontests/views/tests/static.py
@@ -12,4 +12,12 @@ class StaticTests(TestCase):
for filename in media_files:
response = self.client.get('/views/site_media/%s' % filename)
file = open(path.join(media_dir, filename))
- self.assertEquals(file.read(), response.content) \ No newline at end of file
+ self.assertEquals(file.read(), response.content)
+
+ def test_copes_with_empty_path_component(self):
+ file_name = 'file.txt'
+ response = self.client.get('/views/site_media//%s' % file_name)
+ file = open(path.join(media_dir, file_name))
+ self.assertEquals(file.read(), response.content)
+
+