From dfe05d94b853073e2762250e1b4cd64ce9ef1df0 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Thu, 29 Nov 2007 20:38:41 +0000 Subject: queryset-refactor: Merged from trunk up to [6752]. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@6753 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 4 + django/conf/locale/en/LC_MESSAGES/django.po | 4069 +++++++++++++------- django/conf/locale/en/LC_MESSAGES/djangojs.po | 49 +- .../templates/admin_doc/template_filter_index.html | 2 +- .../templates/admin_doc/template_tag_index.html | 2 +- .../admin/templates/admin_doc/view_index.html | 4 +- django/contrib/comments/models.py | 10 +- django/contrib/comments/tests.py | 13 + django/contrib/formtools/models.py | 1 + django/contrib/formtools/test_urls.py | 12 + django/contrib/formtools/tests.py | 93 + django/contrib/localflavor/ca/ca_provinces.py | 2 + django/db/models/base.py | 4 +- django/db/models/fields/__init__.py | 2 +- django/db/models/fields/subclassing.py | 4 +- django/middleware/cache.py | 23 +- django/newforms/fields.py | 13 +- django/template/defaultfilters.py | 6 +- django/utils/cache.py | 22 + django/utils/datastructures.py | 5 +- django/utils/tzinfo.py | 8 +- django/views/i18n.py | 8 +- django/views/static.py | 1 + docs/authentication.txt | 2 +- docs/cache.txt | 14 +- docs/django-admin.txt | 8 +- docs/install.txt | 25 +- docs/model-api.txt | 4 +- docs/newforms.txt | 42 +- docs/release_notes_0.96.txt | 2 +- docs/syndication_feeds.txt | 15 +- docs/templates_python.txt | 2 +- docs/tutorial01.txt | 2 +- docs/url_dispatch.txt | 2 +- tests/modeltests/field_subclassing/models.py | 10 + tests/modeltests/model_forms/models.py | 73 + tests/regressiontests/dateformat/tests.py | 4 + tests/regressiontests/defaultfilters/tests.py | 2 + tests/regressiontests/forms/fields.py | 14 + tests/regressiontests/forms/localflavor/ca.py | 4 + tests/regressiontests/forms/widgets.py | 7 + tests/regressiontests/templates/filters.py | 16 + tests/regressiontests/templates/tests.py | 7 +- tests/regressiontests/utils/datastructures.py | 51 + tests/regressiontests/utils/tests.py | 13 +- tests/regressiontests/utils/timesince.py | 2 +- tests/regressiontests/views/tests/static.py | 10 +- 47 files changed, 3127 insertions(+), 1561 deletions(-) create mode 100644 django/contrib/comments/tests.py create mode 100644 django/contrib/formtools/models.py create mode 100644 django/contrib/formtools/test_urls.py create mode 100644 django/contrib/formtools/tests.py create mode 100644 tests/regressiontests/utils/datastructures.py diff --git a/AUTHORS b/AUTHORS index 326d8e3de8..f8511e1707 100644 --- a/AUTHORS +++ b/AUTHORS @@ -71,6 +71,7 @@ answer newbie questions, and generally made Django that much better: Jonathan Buchanan Trevor Caira Ricardo Javier Cárdenes Medina + Graham Carlyle Antonio Cavedoni 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 + Rajesh Dhawan Sander Dijkhuis Jordan Dimov 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 kurtiss@meetro.com lakin.wecker@gmail.com Nick Lane @@ -273,6 +276,7 @@ answer newbie questions, and generally made Django that much better: Vinay Sajip David Schein scott@staplefish.com + Ilya Semenov serbaut@gmail.com John Shaffer Pete Shinners 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 \n" "Language-Team: LANGUAGE \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,2550 +24,3745 @@ 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] "" +#: conf/global_settings.py:78 +msgid "Tamil" +msgstr "" -#: utils/timesince.py:15 -msgid "day" -msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +#: conf/global_settings.py:79 +msgid "Telugu" +msgstr "" -#: utils/timesince.py:16 -msgid "hour" -msgid_plural "hours" -msgstr[0] "" -msgstr[1] "" +#: conf/global_settings.py:80 +msgid "Turkish" +msgstr "" -#: utils/timesince.py:17 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "" -msgstr[1] "" +#: conf/global_settings.py:81 +msgid "Ukrainian" +msgstr "" -#: utils/dates.py:6 -msgid "Monday" +#: conf/global_settings.py:82 +msgid "Simplified Chinese" msgstr "" -#: utils/dates.py:6 -msgid "Tuesday" +#: conf/global_settings.py:83 +msgid "Traditional Chinese" msgstr "" -#: utils/dates.py:6 -msgid "Wednesday" +#: contrib/admin/filterspecs.py:44 +#, python-format +msgid "" +"

By %s:

\n" +"
    \n" msgstr "" -#: utils/dates.py:6 -msgid "Thursday" +#: 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:6 -msgid "Friday" +#: contrib/admin/filterspecs.py:113 +msgid "Any date" msgstr "" -#: utils/dates.py:7 -msgid "Saturday" +#: contrib/admin/filterspecs.py:114 +msgid "Today" msgstr "" -#: utils/dates.py:7 -msgid "Sunday" +#: contrib/admin/filterspecs.py:117 +msgid "Past 7 days" msgstr "" -#: utils/dates.py:14 -msgid "January" +#: contrib/admin/filterspecs.py:119 +msgid "This month" msgstr "" -#: utils/dates.py:14 -msgid "February" +#: contrib/admin/filterspecs.py:121 +msgid "This year" msgstr "" -#: utils/dates.py:14 utils/dates.py:27 -msgid "March" +#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231 +#: oldforms/__init__.py:592 +msgid "Yes" msgstr "" -#: utils/dates.py:14 utils/dates.py:27 -msgid "April" +#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231 +#: oldforms/__init__.py:592 +msgid "No" msgstr "" -#: utils/dates.py:14 utils/dates.py:27 -msgid "May" +#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231 +#: oldforms/__init__.py:592 +msgid "Unknown" msgstr "" -#: utils/dates.py:14 utils/dates.py:27 -msgid "June" +#: contrib/admin/models.py:18 +msgid "action time" msgstr "" -#: utils/dates.py:15 utils/dates.py:27 -msgid "July" +#: contrib/admin/models.py:21 +msgid "object id" msgstr "" -#: utils/dates.py:15 -msgid "August" +#: contrib/admin/models.py:22 +msgid "object repr" msgstr "" -#: utils/dates.py:15 -msgid "September" +#: contrib/admin/models.py:23 +msgid "action flag" msgstr "" -#: utils/dates.py:15 -msgid "October" +#: contrib/admin/models.py:24 +msgid "change message" msgstr "" -#: utils/dates.py:15 -msgid "November" +#: contrib/admin/models.py:27 +msgid "log entry" msgstr "" -#: utils/dates.py:16 -msgid "December" +#: contrib/admin/models.py:28 +msgid "log entries" msgstr "" -#: utils/dates.py:19 -msgid "jan" +#: contrib/admin/templates/admin/404.html:4 +#: contrib/admin/templates/admin/404.html:8 +msgid "Page not found" msgstr "" -#: utils/dates.py:19 -msgid "feb" +#: contrib/admin/templates/admin/404.html:10 +msgid "We're sorry, but the requested page could not be found." msgstr "" -#: utils/dates.py:19 -msgid "mar" +#: 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:19 -msgid "apr" +#: contrib/admin/templates/admin/500.html:4 +msgid "Server error" msgstr "" -#: utils/dates.py:19 -msgid "may" +#: contrib/admin/templates/admin/500.html:6 +msgid "Server error (500)" msgstr "" -#: utils/dates.py:19 -msgid "jun" +#: contrib/admin/templates/admin/500.html:9 +msgid "Server Error (500)" msgstr "" -#: utils/dates.py:20 -msgid "jul" +#: 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 "aug" +#: contrib/admin/templates/admin/base.html:26 +msgid "Welcome," msgstr "" -#: utils/dates.py:20 -msgid "sep" +#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +msgid "Documentation" msgstr "" -#: utils/dates.py:20 -msgid "oct" +#: 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:20 -msgid "nov" +#: contrib/admin/templates/admin/base.html:30 +#: contrib/comments/templates/comments/form.html:6 +msgid "Log out" msgstr "" -#: utils/dates.py:20 -msgid "dec" +#: contrib/admin/templates/admin/base_site.html:4 +msgid "Django site admin" msgstr "" -#: utils/dates.py:27 -msgid "Jan." +#: contrib/admin/templates/admin/base_site.html:7 +msgid "Django administration" msgstr "" -#: utils/dates.py:27 -msgid "Feb." +#: contrib/admin/templates/admin/change_form.html:14 +#: contrib/admin/templates/admin/index.html:28 +msgid "Add" msgstr "" -#: utils/dates.py:28 -msgid "Aug." +#: contrib/admin/templates/admin/change_form.html:20 +#: contrib/admin/templates/admin/object_history.html:4 +msgid "History" msgstr "" -#: utils/dates.py:28 -msgid "Sept." +#: contrib/admin/templates/admin/change_form.html:21 +msgid "View on site" msgstr "" -#: utils/dates.py:28 -msgid "Oct." +#: 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] "" + +#: contrib/admin/templates/admin/change_form.html:49 +msgid "Ordering" msgstr "" -#: utils/dates.py:28 -msgid "Nov." +#: contrib/admin/templates/admin/change_form.html:52 +msgid "Order:" msgstr "" -#: utils/dates.py:28 -msgid "Dec." +#: contrib/admin/templates/admin/change_list.html:11 +#, python-format +msgid "Add %(name)s" msgstr "" -#: utils/dateformat.py:40 -msgid "p.m." +#: contrib/admin/templates/admin/delete_confirmation.html:8 +#: contrib/admin/templates/admin/submit_line.html:3 +msgid "Delete" msgstr "" -#: utils/dateformat.py:41 -msgid "a.m." +#: 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/dateformat.py:46 -msgid "PM" +#: 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/dateformat.py:47 -msgid "AM" +#: contrib/admin/templates/admin/delete_confirmation.html:25 +msgid "Yes, I'm sure" msgstr "" -#: utils/dateformat.py:95 -msgid "midnight" +#: contrib/admin/templates/admin/filter.html:2 +#, python-format +msgid " By %(filter_title)s " msgstr "" -#: utils/dateformat.py:97 -msgid "noon" +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" msgstr "" -#: utils/translation/trans_real.py:358 -msgid "DATE_FORMAT" -msgstr "N j, Y" +#: contrib/admin/templates/admin/index.html:17 +#, python-format +msgid "Models available in the %(name)s application." +msgstr "" -#: utils/translation/trans_real.py:359 -msgid "DATETIME_FORMAT" +#: contrib/admin/templates/admin/index.html:18 +#, python-format +msgid "%(name)s" +msgstr "" + +#: contrib/admin/templates/admin/index.html:34 +msgid "Change" +msgstr "" + +#: contrib/admin/templates/admin/index.html:44 +msgid "You don't have permission to edit anything." +msgstr "" + +#: contrib/admin/templates/admin/index.html:52 +msgid "Recent Actions" +msgstr "" + +#: contrib/admin/templates/admin/index.html:53 +msgid "My Actions" +msgstr "" + +#: contrib/admin/templates/admin/index.html:57 +msgid "None available" +msgstr "" + +#: 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 "" + +#: 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/admin/templates/admin/login.html:20 +#: contrib/comments/templates/comments/form.html:8 +msgid "Password:" +msgstr "" + +#: contrib/admin/templates/admin/login.html:25 +#: contrib/admin/views/decorators.py:25 +msgid "Log in" +msgstr "" + +#: contrib/admin/templates/admin/object_history.html:17 +msgid "Date/time" +msgstr "" + +#: contrib/admin/templates/admin/object_history.html:18 +msgid "User" +msgstr "" + +#: contrib/admin/templates/admin/object_history.html:19 +msgid "Action" +msgstr "" + +#: contrib/admin/templates/admin/object_history.html:25 +msgid "DATE_WITH_TIME_FULL" msgstr "N j, Y, P" -#: utils/translation/trans_real.py:360 -msgid "TIME_FORMAT" -msgstr "P" +#: 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 "" -#: utils/translation/trans_real.py:376 -msgid "YEAR_MONTH_FORMAT" -msgstr "F Y" +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "" -#: utils/translation/trans_real.py:377 -msgid "MONTH_DAY_FORMAT" -msgstr "F j" +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Go" +msgstr "" -#: oldforms/__init__.py:392 +#: contrib/admin/templates/admin/search_form.html:10 #, python-format -msgid "Ensure your text is less than %s character." -msgid_plural "Ensure your text is less than %s characters." +msgid "1 result" +msgid_plural "%(counter)s results" msgstr[0] "" msgstr[1] "" -#: oldforms/__init__.py:397 -msgid "Line breaks are not allowed here." +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "%(full_result_count)s total" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:4 +msgid "Save as new" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:5 +msgid "Save and add another" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:6 +msgid "Save and continue editing" +msgstr "" + +#: contrib/admin/templates/admin/submit_line.html:7 +msgid "Save" +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." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/add_form.html:12 +msgid "Username" +msgstr "" + +#: contrib/admin/templates/admin/auth/user/add_form.html:18 +#: contrib/admin/templates/admin/auth/user/change_password.html:33 +msgid "Password" +msgstr "" + +#: 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/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 "" -#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610 +#: contrib/admin/templates/admin/auth/user/change_password.html:27 #, python-format -msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgid "Enter a new password for the user %(username)s." msgstr "" -#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150 -#: newforms/widgets.py:174 -msgid "Unknown" +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +msgid "Bookmarklets" msgstr "" -#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143 -#: newforms/widgets.py:174 -msgid "Yes" +#: contrib/admin/templates/admin_doc/bookmarklets.html:4 +msgid "Documentation bookmarklets" msgstr "" -#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143 -#: newforms/widgets.py:174 -msgid "No" +#: contrib/admin/templates/admin_doc/bookmarklets.html:8 +msgid "" +"\n" +"

    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\").

    \n" 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_doc/bookmarklets.html:18 +msgid "Documentation for this page" msgstr "" -#: oldforms/__init__.py:674 -msgid "The submitted file is empty." +#: 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 "" -#: oldforms/__init__.py:730 -msgid "Enter a whole number between -32,768 and 32,767." +#: contrib/admin/templates/admin_doc/bookmarklets.html:21 +msgid "Show object ID" msgstr "" -#: oldforms/__init__.py:740 -msgid "Enter a positive number." +#: contrib/admin/templates/admin_doc/bookmarklets.html:22 +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." msgstr "" -#: oldforms/__init__.py:750 -msgid "Enter a whole number between 0 and 32,767." +#: contrib/admin/templates/admin_doc/bookmarklets.html:24 +msgid "Edit this object (current window)" msgstr "" -#: contrib/localflavor/no/forms.py:15 -msgid "Enter a zip code in the format XXXX." +#: contrib/admin/templates/admin_doc/bookmarklets.html:25 +msgid "Jumps to the admin page for pages that represent a single object." msgstr "" -#: contrib/localflavor/no/forms.py:36 -msgid "Enter a valid Norwegian social security number." +#: contrib/admin/templates/admin_doc/bookmarklets.html:27 +msgid "Edit this object (new window)" 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_doc/bookmarklets.html:28 +msgid "As above, but opens the admin page in a new window." msgstr "" -#: contrib/localflavor/jp/forms.py:21 -msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." +#: 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:4 -msgid "Hokkaido" +#: contrib/admin/templates/registration/logged_out.html:10 +msgid "Log in again" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:5 -msgid "Aomori" +#: 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/admin/templates/registration/password_change_done.html:5 +#: contrib/admin/templates/registration/password_change_done.html:9 +msgid "Password change successful" +msgstr "" + +#: contrib/admin/templates/registration/password_change_done.html:11 +msgid "Your password was changed." +msgstr "" + +#: 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/admin/templates/registration/password_change_form.html:16 +msgid "Old password:" +msgstr "" + +#: contrib/admin/templates/registration/password_change_form.html:18 +msgid "New password:" +msgstr "" + +#: contrib/admin/templates/registration/password_change_form.html:20 +msgid "Confirm password:" +msgstr "" + +#: contrib/admin/templates/registration/password_change_form.html:22 +msgid "Change my password" +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" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_done.html:10 +msgid "Password reset successful" +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." +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:3 +#, python-format +msgid "for your user account at %(site_name)s" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:5 +#, python-format +msgid "Your new password is: %(new_password)s" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:7 +msgid "Feel free to change this password by going to this page:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:13 +msgid "Thanks for using our site!" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:15 +#, python-format +msgid "The %(site_name)s team" +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." +msgstr "" + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "E-mail address:" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "Reset my password" +msgstr "" + +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "" + +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "" + +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "" + +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "" + +#: contrib/admin/templatetags/admin_list.py:257 +msgid "All dates" +msgstr "" + +#: 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/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/admin/views/auth.py:31 +msgid "Add user" +msgstr "" + +#: contrib/admin/views/auth.py:58 +msgid "Password changed successfully." +msgstr "" + +#: contrib/admin/views/auth.py:65 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: 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/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/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/admin/views/decorators.py:84 +msgid "Usernames cannot contain the '@' character." +msgstr "" + +#: contrib/admin/views/decorators.py:86 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50 +#: contrib/admin/views/doc.py:52 +msgid "tag:" +msgstr "" + +#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81 +#: contrib/admin/views/doc.py:83 +msgid "filter:" +msgstr "" + +#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139 +#: contrib/admin/views/doc.py:141 +msgid "view:" +msgstr "" + +#: contrib/admin/views/doc.py:166 +#, python-format +msgid "App %r not found" +msgstr "" + +#: contrib/admin/views/doc.py:173 +#, python-format +msgid "Model %(name)r not found in app %(label)r" +msgstr "" + +#: contrib/admin/views/doc.py:185 +#, python-format +msgid "the related `%(label)s.%(type)s` object" +msgstr "" + +#: 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/admin/views/doc.py:216 +#, python-format +msgid "related `%(label)s.%(name)s` objects" +msgstr "" + +#: contrib/admin/views/doc.py:221 +#, python-format +msgid "all %s" +msgstr "" + +#: contrib/admin/views/doc.py:226 +#, python-format +msgid "number of %s" +msgstr "" + +#: contrib/admin/views/doc.py:231 +#, python-format +msgid "Fields on %s objects" +msgstr "" + +#: 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/admin/views/doc.py:294 +msgid "Boolean (Either True or False)" +msgstr "" + +#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: contrib/admin/views/doc.py:296 +msgid "Comma-separated integers" +msgstr "" + +#: contrib/admin/views/doc.py:297 +msgid "Date (without time)" +msgstr "" + +#: contrib/admin/views/doc.py:298 +msgid "Date (with time)" +msgstr "" + +#: contrib/admin/views/doc.py:299 +msgid "Decimal number" +msgstr "" + +#: contrib/admin/views/doc.py:300 +msgid "E-mail address" +msgstr "" + +#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:305 +msgid "File path" +msgstr "" + +#: contrib/admin/views/doc.py:303 +msgid "Floating point number" +msgstr "" + +#: contrib/admin/views/doc.py:307 contrib/comments/models.py:85 +msgid "IP address" +msgstr "" + +#: contrib/admin/views/doc.py:309 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: contrib/admin/views/doc.py:310 +msgid "Relation to parent model" +msgstr "" + +#: contrib/admin/views/doc.py:311 +msgid "Phone number" +msgstr "" + +#: contrib/admin/views/doc.py:316 +msgid "Text" +msgstr "" + +#: contrib/admin/views/doc.py:317 +msgid "Time" +msgstr "" + +#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7 +msgid "URL" +msgstr "" + +#: contrib/admin/views/doc.py:319 +msgid "U.S. state (two uppercase letters)" +msgstr "" + +#: contrib/admin/views/doc.py:320 +msgid "XML text" +msgstr "" + +#: contrib/admin/views/doc.py:346 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" + +#: contrib/admin/views/main.py:233 +msgid "Site administration" +msgstr "" + +#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: contrib/admin/views/main.py:298 +#, python-format +msgid "Add %s" +msgstr "" + +#: contrib/admin/views/main.py:344 +#, python-format +msgid "Added %s." +msgstr "" + +#: 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/admin/views/main.py:346 +#, python-format +msgid "Changed %s." +msgstr "" + +#: contrib/admin/views/main.py:348 +#, python-format +msgid "Deleted %s." +msgstr "" + +#: contrib/admin/views/main.py:351 +msgid "No fields changed." +msgstr "" + +#: contrib/admin/views/main.py:354 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: contrib/admin/views/main.py:362 +#, python-format +msgid "" +"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "" + +#: contrib/admin/views/main.py:400 +#, python-format +msgid "Change %s" +msgstr "" + +#: contrib/admin/views/main.py:487 +#, python-format +msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgstr "" + +#: contrib/admin/views/main.py:492 +#, python-format +msgid "One or more %(fieldname)s in %(name)s:" +msgstr "" + +#: contrib/admin/views/main.py:524 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: contrib/admin/views/main.py:527 +msgid "Are you sure?" +msgstr "" + +#: contrib/admin/views/main.py:549 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: contrib/admin/views/main.py:583 +#, python-format +msgid "Select %s" +msgstr "" + +#: contrib/admin/views/main.py:583 +#, python-format +msgid "Select %s to change" +msgstr "" + +#: contrib/admin/views/main.py:784 +msgid "Database error" +msgstr "" + +#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 +msgid "The two password fields didn't match." +msgstr "" + +#: contrib/auth/forms.py:25 +msgid "A user with that username already exists." +msgstr "" + +#: contrib/auth/forms.py:53 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "" + +#: contrib/auth/forms.py:62 +msgid "This account is inactive." +msgstr "" + +#: 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/auth/forms.py:107 +#, python-format +msgid "Password reset on %s" +msgstr "" + +#: contrib/auth/forms.py:117 +msgid "The two 'new password' fields didn't match." +msgstr "" + +#: contrib/auth/forms.py:124 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +#: contrib/auth/models.py:73 contrib/auth/models.py:93 +msgid "name" +msgstr "" + +#: contrib/auth/models.py:75 +msgid "codename" +msgstr "" + +#: contrib/auth/models.py:78 +msgid "permission" +msgstr "" + +#: contrib/auth/models.py:79 contrib/auth/models.py:94 +msgid "permissions" +msgstr "" + +#: contrib/auth/models.py:97 +msgid "group" +msgstr "" + +#: contrib/auth/models.py:98 contrib/auth/models.py:141 +msgid "groups" +msgstr "" + +#: contrib/auth/models.py:131 +msgid "username" +msgstr "" + +#: contrib/auth/models.py:131 +msgid "" +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." +msgstr "" + +#: contrib/auth/models.py:132 +msgid "first name" +msgstr "" + +#: contrib/auth/models.py:133 +msgid "last name" +msgstr "" + +#: contrib/auth/models.py:134 +msgid "e-mail address" +msgstr "" + +#: contrib/auth/models.py:135 +msgid "password" +msgstr "" + +#: contrib/auth/models.py:135 +msgid "" +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." +msgstr "" + +#: contrib/auth/models.py:136 +msgid "staff status" +msgstr "" + +#: 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 "" +"Designates whether this user can log into the Django admin. Unselect this " +"instead of deleting accounts." +msgstr "" + +#: contrib/auth/models.py:138 +msgid "superuser status" +msgstr "" + +#: contrib/auth/models.py:138 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +#: contrib/auth/models.py:139 +msgid "last login" +msgstr "" + +#: contrib/auth/models.py:140 +msgid "date joined" +msgstr "" + +#: 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 "" + +#: contrib/auth/models.py:143 +msgid "user permissions" +msgstr "" + +#: contrib/auth/models.py:147 +msgid "user" +msgstr "" + +#: contrib/auth/models.py:148 +msgid "users" +msgstr "" + +#: contrib/auth/models.py:154 +msgid "Personal info" +msgstr "" + +#: contrib/auth/models.py:155 +msgid "Permissions" +msgstr "" + +#: contrib/auth/models.py:156 +msgid "Important dates" +msgstr "" + +#: contrib/auth/models.py:157 +msgid "Groups" +msgstr "" + +#: contrib/auth/models.py:316 +msgid "message" +msgstr "" + +#: contrib/auth/views.py:47 +msgid "Logged out" +msgstr "" + +#: contrib/comments/models.py:67 contrib/comments/models.py:169 +msgid "object ID" +msgstr "" + +#: contrib/comments/models.py:68 +msgid "headline" +msgstr "" + +#: contrib/comments/models.py:69 contrib/comments/models.py:90 +#: contrib/comments/models.py:170 +msgid "comment" +msgstr "" + +#: contrib/comments/models.py:70 +msgid "rating #1" +msgstr "" + +#: contrib/comments/models.py:71 +msgid "rating #2" +msgstr "" + +#: contrib/comments/models.py:72 +msgid "rating #3" +msgstr "" + +#: contrib/comments/models.py:73 +msgid "rating #4" +msgstr "" + +#: contrib/comments/models.py:74 +msgid "rating #5" +msgstr "" + +#: contrib/comments/models.py:75 +msgid "rating #6" +msgstr "" + +#: contrib/comments/models.py:76 +msgid "rating #7" +msgstr "" + +#: contrib/comments/models.py:77 +msgid "rating #8" +msgstr "" + +#: contrib/comments/models.py:82 +msgid "is valid rating" +msgstr "" + +#: contrib/comments/models.py:83 contrib/comments/models.py:172 +msgid "date/time submitted" +msgstr "" + +#: contrib/comments/models.py:84 contrib/comments/models.py:173 +msgid "is public" +msgstr "" + +#: contrib/comments/models.py:86 +msgid "is removed" +msgstr "" + +#: contrib/comments/models.py:86 +msgid "" +"Check this box if the comment is inappropriate. A \"This comment has been " +"removed\" message will be displayed instead." +msgstr "" + +#: contrib/comments/models.py:91 +msgid "comments" +msgstr "" + +#: contrib/comments/models.py:134 contrib/comments/models.py:213 +msgid "Content object" +msgstr "" + +#: 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 "" + +#: contrib/comments/models.py:171 +msgid "person's name" +msgstr "" + +#: contrib/comments/models.py:174 +msgid "ip address" +msgstr "" + +#: contrib/comments/models.py:176 +msgid "approved by staff" +msgstr "" + +#: contrib/comments/models.py:179 +msgid "free comment" +msgstr "" + +#: contrib/comments/models.py:180 +msgid "free comments" +msgstr "" + +#: contrib/comments/models.py:239 +msgid "score" +msgstr "" + +#: contrib/comments/models.py:240 +msgid "score date" +msgstr "" + +#: contrib/comments/models.py:243 +msgid "karma score" +msgstr "" + +#: contrib/comments/models.py:244 +msgid "karma scores" +msgstr "" + +#: contrib/comments/models.py:248 +#, python-format +msgid "%(score)d rating by %(user)s" +msgstr "" + +#: contrib/comments/models.py:264 +#, python-format +msgid "" +"This comment was flagged by %(user)s:\n" +"\n" +"%(text)s" +msgstr "" + +#: contrib/comments/models.py:271 +msgid "flag date" +msgstr "" + +#: contrib/comments/models.py:274 +msgid "user flag" +msgstr "" + +#: contrib/comments/models.py:275 +msgid "user flags" +msgstr "" + +#: contrib/comments/models.py:279 +#, python-format +msgid "Flag by %r" +msgstr "" + +#: contrib/comments/models.py:284 +msgid "deletion date" +msgstr "" + +#: contrib/comments/models.py:286 +msgid "moderator deletion" +msgstr "" + +#: contrib/comments/models.py:287 +msgid "moderator deletions" +msgstr "" + +#: contrib/comments/models.py:291 +#, python-format +msgid "Moderator deletion by %r" +msgstr "" + +#: contrib/comments/templates/comments/form.html:8 +msgid "Forgotten your password?" +msgstr "" + +#: contrib/comments/templates/comments/form.html:12 +msgid "Ratings" +msgstr "" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Required" +msgstr "" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Optional" +msgstr "" + +#: contrib/comments/templates/comments/form.html:23 +msgid "Post a photo" +msgstr "" + +#: contrib/comments/templates/comments/form.html:28 +#: contrib/comments/templates/comments/freeform.html:5 +msgid "Comment:" +msgstr "" + +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 +msgid "Preview comment" +msgstr "" + +#: contrib/comments/templates/comments/freeform.html:4 +msgid "Your name:" +msgstr "" + +#: 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:112 +#, 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] "" +msgstr[1] "" + +#: contrib/comments/views/comments.py:117 +#, python-format +msgid "" +"This comment was posted by a sketchy user:\n" +"\n" +"%(text)s" +msgstr "" + +#: contrib/comments/views/comments.py:190 +#: contrib/comments/views/comments.py:283 +msgid "Only POSTs are allowed" +msgstr "" + +#: 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:198 +#: contrib/comments/views/comments.py:289 +msgid "Somebody tampered with the comment form (security violation)" +msgstr "" + +#: 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:259 +#: contrib/comments/views/comments.py:324 +msgid "The comment form didn't provide either 'preview' or 'post'" +msgstr "" + +#: contrib/comments/views/karma.py:21 +msgid "Anonymous users cannot vote" +msgstr "" + +#: contrib/comments/views/karma.py:25 +msgid "Invalid comment ID" +msgstr "" + +#: contrib/comments/views/karma.py:27 +msgid "No voting for yourself" +msgstr "" + +#: contrib/contenttypes/models.py:37 +msgid "python model class name" +msgstr "" + +#: contrib/contenttypes/models.py:40 +msgid "content type" +msgstr "" + +#: contrib/contenttypes/models.py:41 +msgid "content types" +msgstr "" + +#: contrib/flatpages/models.py:8 +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" + +#: contrib/flatpages/models.py:9 +msgid "title" +msgstr "" + +#: contrib/flatpages/models.py:10 +msgid "content" +msgstr "" + +#: contrib/flatpages/models.py:11 +msgid "enable comments" +msgstr "" + +#: contrib/flatpages/models.py:12 +msgid "template name" +msgstr "" + +#: 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/flatpages/models.py:14 +msgid "registration required" +msgstr "" + +#: contrib/flatpages/models.py:14 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" + +#: contrib/flatpages/models.py:18 +msgid "flat page" +msgstr "" + +#: contrib/flatpages/models.py:19 +msgid "flat pages" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:20 +msgid "th" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:20 +msgid "st" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:20 +msgid "nd" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:20 +msgid "rd" +msgstr "" + +#: 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/humanize/templatetags/humanize.py:74 +msgid "two" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "three" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "four" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "five" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "six" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "seven" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "eight" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:74 +msgid "nine" +msgstr "" + +#: 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/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 "" +"Select a valid brazilian state. That state is not one of the available " +"states." +msgstr "" + +#: contrib/localflavor/br/forms.py:105 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "" + +#: contrib/localflavor/br/forms.py:115 +msgid "Invalid CPF number." +msgstr "" + +#: contrib/localflavor/br/forms.py:137 +msgid "This field requires at least 14 digits" +msgstr "" + +#: contrib/localflavor/br/forms.py:147 +msgid "Invalid CNPJ number." +msgstr "" + +#: contrib/localflavor/ca/forms.py:19 +msgid "Enter a postal code in the format XXX XXX." +msgstr "" + +#: contrib/localflavor/ca/forms.py:81 +msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format." +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "" + +#: 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 "" + +#: contrib/localflavor/ch/forms.py:90 +msgid "" +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "" + +#: contrib/localflavor/cl/forms.py:32 +msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "" + +#: contrib/localflavor/cl/forms.py:37 +msgid "Enter valid a Chilean RUT" +msgstr "" + +#: 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/jp/jp_prefectures.py:6 -msgid "Iwate" +#: contrib/localflavor/de/de_states.py:20 +msgid "Thuringia" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:7 -msgid "Miyagi" +#: 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/jp/jp_prefectures.py:8 -msgid "Akita" +#: contrib/localflavor/de/forms.py:60 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:9 -msgid "Yamagata" +#: contrib/localflavor/es/es_provinces.py:5 +msgid "Arava" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:10 -msgid "Fukushima" +#: contrib/localflavor/es/es_provinces.py:6 +msgid "Albacete" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:11 -msgid "Ibaraki" +#: contrib/localflavor/es/es_provinces.py:7 +msgid "Alacant" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:12 -msgid "Tochigi" +#: contrib/localflavor/es/es_provinces.py:8 +msgid "Almeria" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:13 -msgid "Gunma" +#: contrib/localflavor/es/es_provinces.py:9 +msgid "Avila" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:14 -msgid "Saitama" +#: contrib/localflavor/es/es_provinces.py:10 +msgid "Badajoz" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:15 -msgid "Chiba" +#: contrib/localflavor/es/es_provinces.py:11 +msgid "Illes Balears" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:16 -msgid "Tokyo" +#: contrib/localflavor/es/es_provinces.py:12 +msgid "Barcelona" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:17 -msgid "Kanagawa" +#: contrib/localflavor/es/es_provinces.py:13 +msgid "Burgos" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:18 -msgid "Yamanashi" +#: contrib/localflavor/es/es_provinces.py:14 +msgid "Caceres" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:19 -msgid "Nagano" +#: contrib/localflavor/es/es_provinces.py:15 +msgid "Cadiz" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:20 -msgid "Niigata" +#: contrib/localflavor/es/es_provinces.py:16 +msgid "Castello" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:21 -msgid "Toyama" +#: contrib/localflavor/es/es_provinces.py:17 +msgid "Ciudad Real" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:22 -msgid "Ishikawa" +#: contrib/localflavor/es/es_provinces.py:18 +msgid "Cordoba" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:23 -msgid "Fukui" +#: contrib/localflavor/es/es_provinces.py:19 +msgid "A Coruna" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:24 -msgid "Gifu" +#: contrib/localflavor/es/es_provinces.py:20 +msgid "Cuenca" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:25 -msgid "Shizuoka" +#: contrib/localflavor/es/es_provinces.py:21 +msgid "Girona" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:26 -msgid "Aichi" +#: contrib/localflavor/es/es_provinces.py:22 +msgid "Granada" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:27 -msgid "Mie" +#: contrib/localflavor/es/es_provinces.py:23 +msgid "Guadalajara" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:28 -msgid "Shiga" +#: contrib/localflavor/es/es_provinces.py:24 +msgid "Guipuzkoa" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:29 -msgid "Kyoto" +#: contrib/localflavor/es/es_provinces.py:25 +msgid "Huelva" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:30 -msgid "Osaka" +#: contrib/localflavor/es/es_provinces.py:26 +msgid "Huesca" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:31 -msgid "Hyogo" +#: contrib/localflavor/es/es_provinces.py:27 +msgid "Jaen" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:32 -msgid "Nara" +#: contrib/localflavor/es/es_provinces.py:28 +msgid "Leon" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:33 -msgid "Wakayama" +#: contrib/localflavor/es/es_provinces.py:29 +msgid "Lleida" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:34 -msgid "Tottori" +#: contrib/localflavor/es/es_provinces.py:30 +#: contrib/localflavor/es/es_regions.py:17 +msgid "La Rioja" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:35 -msgid "Shimane" +#: contrib/localflavor/es/es_provinces.py:31 +msgid "Lugo" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:36 -msgid "Okayama" +#: contrib/localflavor/es/es_provinces.py:32 +#: contrib/localflavor/es/es_regions.py:18 +msgid "Madrid" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:37 -msgid "Hiroshima" +#: contrib/localflavor/es/es_provinces.py:33 +msgid "Malaga" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:38 -msgid "Yamaguchi" +#: contrib/localflavor/es/es_provinces.py:34 +msgid "Murcia" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:39 -msgid "Tokushima" +#: contrib/localflavor/es/es_provinces.py:35 +msgid "Navarre" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:40 -msgid "Kagawa" +#: contrib/localflavor/es/es_provinces.py:36 +msgid "Ourense" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:41 -msgid "Ehime" +#: contrib/localflavor/es/es_provinces.py:37 +msgid "Asturias" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:42 -msgid "Kochi" +#: contrib/localflavor/es/es_provinces.py:38 +msgid "Palencia" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:43 -msgid "Fukuoka" +#: contrib/localflavor/es/es_provinces.py:39 +msgid "Las Palmas" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:44 -msgid "Saga" +#: contrib/localflavor/es/es_provinces.py:40 +msgid "Pontevedra" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:45 -msgid "Nagasaki" +#: contrib/localflavor/es/es_provinces.py:41 +msgid "Salamanca" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:46 -msgid "Kumamoto" +#: contrib/localflavor/es/es_provinces.py:42 +msgid "Santa Cruz de Tenerife" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:47 -msgid "Oita" +#: contrib/localflavor/es/es_provinces.py:43 +#: contrib/localflavor/es/es_regions.py:11 +msgid "Cantabria" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:48 -msgid "Miyazaki" +#: contrib/localflavor/es/es_provinces.py:44 +msgid "Segovia" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:49 -msgid "Kagoshima" +#: contrib/localflavor/es/es_provinces.py:45 +msgid "Seville" msgstr "" -#: contrib/localflavor/jp/jp_prefectures.py:50 -msgid "Okinawa" +#: contrib/localflavor/es/es_provinces.py:46 +msgid "Soria" msgstr "" -#: contrib/localflavor/br/forms.py:18 -msgid "Enter a zip code in the format XXXXX-XXX." +#: contrib/localflavor/es/es_provinces.py:47 +msgid "Tarragona" msgstr "" -#: contrib/localflavor/br/forms.py:30 -msgid "Phone numbers must be in XX-XXXX-XXXX format." +#: contrib/localflavor/es/es_provinces.py:48 +msgid "Teruel" msgstr "" -#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46 -msgid "Enter a valid Finnish social security number." +#: contrib/localflavor/es/es_provinces.py:49 +msgid "Toledo" msgstr "" -#: contrib/localflavor/uk/forms.py:18 -msgid "Enter a postcode. A space is required between the two postcode parts." +#: contrib/localflavor/es/es_provinces.py:50 +msgid "Valencia" msgstr "" -#: contrib/localflavor/de/forms.py:63 -msgid "" -"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " -"format" +#: contrib/localflavor/es/es_provinces.py:51 +msgid "Valladolid" msgstr "" -#: contrib/localflavor/de/de_states.py:5 -msgid "Baden-Wuerttemberg" +#: contrib/localflavor/es/es_provinces.py:52 +msgid "Bizkaia" msgstr "" -#: contrib/localflavor/de/de_states.py:6 -msgid "Bavaria" +#: contrib/localflavor/es/es_provinces.py:53 +msgid "Zamora" msgstr "" -#: contrib/localflavor/de/de_states.py:7 -msgid "Berlin" +#: contrib/localflavor/es/es_provinces.py:54 +msgid "Zaragoza" msgstr "" -#: contrib/localflavor/de/de_states.py:8 -msgid "Brandenburg" +#: contrib/localflavor/es/es_provinces.py:55 +msgid "Ceuta" msgstr "" -#: contrib/localflavor/de/de_states.py:9 -msgid "Bremen" +#: contrib/localflavor/es/es_provinces.py:56 +msgid "Melilla" msgstr "" -#: contrib/localflavor/de/de_states.py:10 -msgid "Hamburg" +#: contrib/localflavor/es/es_regions.py:5 +msgid "Andalusia" msgstr "" -#: contrib/localflavor/de/de_states.py:11 -msgid "Hessen" +#: contrib/localflavor/es/es_regions.py:6 +msgid "Aragon" msgstr "" -#: contrib/localflavor/de/de_states.py:12 -msgid "Mecklenburg-Western Pomerania" +#: contrib/localflavor/es/es_regions.py:7 +msgid "Principality of Asturias" msgstr "" -#: contrib/localflavor/de/de_states.py:13 -msgid "Lower Saxony" +#: contrib/localflavor/es/es_regions.py:8 +msgid "Balearic Islands" msgstr "" -#: contrib/localflavor/de/de_states.py:14 -msgid "North Rhine-Westphalia" +#: contrib/localflavor/es/es_regions.py:9 +msgid "Basque Country" msgstr "" -#: contrib/localflavor/de/de_states.py:15 -msgid "Rhineland-Palatinate" +#: contrib/localflavor/es/es_regions.py:10 +msgid "Canary Islands" msgstr "" -#: contrib/localflavor/de/de_states.py:16 -msgid "Saarland" +#: contrib/localflavor/es/es_regions.py:12 +msgid "Castile-La Mancha" msgstr "" -#: contrib/localflavor/de/de_states.py:17 -msgid "Saxony" +#: contrib/localflavor/es/es_regions.py:13 +msgid "Castile and Leon" msgstr "" -#: contrib/localflavor/de/de_states.py:18 -msgid "Saxony-Anhalt" +#: contrib/localflavor/es/es_regions.py:14 +msgid "Catalonia" msgstr "" -#: contrib/localflavor/de/de_states.py:19 -msgid "Schleswig-Holstein" +#: contrib/localflavor/es/es_regions.py:15 +msgid "Extremadura" msgstr "" -#: contrib/localflavor/de/de_states.py:20 -msgid "Thuringia" +#: contrib/localflavor/es/es_regions.py:16 +msgid "Galicia" msgstr "" -#: contrib/localflavor/usa/forms.py:18 -msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." +#: contrib/localflavor/es/es_regions.py:19 +msgid "Region of Murcia" msgstr "" -#: contrib/localflavor/usa/forms.py:51 -msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." +#: contrib/localflavor/es/es_regions.py:20 +msgid "Foral Community of Navarre" msgstr "" -#: contrib/sessions/models.py:68 -msgid "session key" +#: contrib/localflavor/es/es_regions.py:21 +msgid "Valencian Community" msgstr "" -#: contrib/sessions/models.py:69 -msgid "session data" +#: contrib/localflavor/es/forms.py:22 +msgid "Enter a valid postal code in the range and format 01XXX - 52XXX." msgstr "" -#: contrib/sessions/models.py:70 -msgid "expire date" +#: contrib/localflavor/es/forms.py:39 +msgid "" +"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or " +"9XXXXXXXX." msgstr "" -#: contrib/sessions/models.py:74 -msgid "session" +#: 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/sessions/models.py:75 -msgid "sessions" +#: contrib/localflavor/es/forms.py:91 +msgid "Invalid checksum for NIF." msgstr "" -#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 -msgid "The two password fields didn't match." +#: contrib/localflavor/es/forms.py:97 +msgid "Invalid checksum for NIE." msgstr "" -#: contrib/auth/forms.py:25 -msgid "A user with that username already exists." +#: contrib/localflavor/es/forms.py:106 +msgid "Invalid checksum for CIF." msgstr "" -#: contrib/auth/forms.py:53 +#: contrib/localflavor/es/forms.py:136 msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." +"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX." 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/localflavor/es/forms.py:150 +msgid "Invalid checksum for bank account number." msgstr "" -#: contrib/auth/forms.py:62 -msgid "This account is inactive." +#: 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/auth/forms.py:85 +#: contrib/localflavor/is_/forms.py:17 msgid "" -"That e-mail address doesn't have an associated user account. Are you sure " -"you've registered?" +"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." msgstr "" -#: contrib/auth/forms.py:117 -msgid "The two 'new password' fields didn't match." +#: contrib/localflavor/is_/forms.py:31 +msgid "The Icelandic identification number is not valid." msgstr "" -#: contrib/auth/forms.py:124 -msgid "Your old password was entered incorrectly. Please enter it again." +#: contrib/localflavor/it/forms.py:16 +msgid "Enter a valid zip code." msgstr "" -#: contrib/auth/views.py:39 -msgid "Logged out" +#: contrib/localflavor/it/forms.py:41 +msgid "Enter a valid Social Security number." msgstr "" -#: contrib/auth/models.py:38 contrib/auth/models.py:57 -msgid "name" +#: contrib/localflavor/it/forms.py:68 +msgid "Enter a valid VAT number." msgstr "" -#: contrib/auth/models.py:40 -msgid "codename" +#: contrib/localflavor/jp/forms.py:21 +msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." msgstr "" -#: contrib/auth/models.py:42 -msgid "permission" +#: contrib/localflavor/jp/jp_prefectures.py:4 +msgid "Hokkaido" msgstr "" -#: contrib/auth/models.py:43 contrib/auth/models.py:58 -msgid "permissions" +#: contrib/localflavor/jp/jp_prefectures.py:5 +msgid "Aomori" msgstr "" -#: contrib/auth/models.py:60 -msgid "group" +#: contrib/localflavor/jp/jp_prefectures.py:6 +msgid "Iwate" msgstr "" -#: contrib/auth/models.py:61 contrib/auth/models.py:100 -msgid "groups" +#: contrib/localflavor/jp/jp_prefectures.py:7 +msgid "Miyagi" msgstr "" -#: contrib/auth/models.py:90 -msgid "username" +#: contrib/localflavor/jp/jp_prefectures.py:8 +msgid "Akita" msgstr "" -#: contrib/auth/models.py:90 -msgid "" -"Required. 30 characters or fewer. Alphanumeric characters only (letters, " -"digits and underscores)." +#: contrib/localflavor/jp/jp_prefectures.py:9 +msgid "Yamagata" msgstr "" -#: contrib/auth/models.py:91 -msgid "first name" +#: contrib/localflavor/jp/jp_prefectures.py:10 +msgid "Fukushima" msgstr "" -#: contrib/auth/models.py:92 -msgid "last name" +#: contrib/localflavor/jp/jp_prefectures.py:11 +msgid "Ibaraki" msgstr "" -#: contrib/auth/models.py:93 -msgid "e-mail address" +#: contrib/localflavor/jp/jp_prefectures.py:12 +msgid "Tochigi" msgstr "" -#: contrib/auth/models.py:94 -msgid "password" +#: contrib/localflavor/jp/jp_prefectures.py:13 +msgid "Gunma" msgstr "" -#: contrib/auth/models.py:94 -msgid "" -"Use '[algo]$[salt]$[hexdigest]' or use the change " -"password form." +#: contrib/localflavor/jp/jp_prefectures.py:14 +msgid "Saitama" msgstr "" -#: contrib/auth/models.py:95 -msgid "staff status" +#: contrib/localflavor/jp/jp_prefectures.py:15 +msgid "Chiba" msgstr "" -#: contrib/auth/models.py:95 -msgid "Designates whether the user can log into this admin site." +#: contrib/localflavor/jp/jp_prefectures.py:16 +msgid "Tokyo" msgstr "" -#: contrib/auth/models.py:96 -msgid "active" +#: contrib/localflavor/jp/jp_prefectures.py:17 +msgid "Kanagawa" msgstr "" -#: contrib/auth/models.py:96 -msgid "" -"Designates whether this user can log into the Django admin. Unselect this " -"instead of deleting accounts." +#: contrib/localflavor/jp/jp_prefectures.py:18 +msgid "Yamanashi" msgstr "" -#: contrib/auth/models.py:97 -msgid "superuser status" +#: contrib/localflavor/jp/jp_prefectures.py:19 +msgid "Nagano" msgstr "" -#: contrib/auth/models.py:97 -msgid "" -"Designates that this user has all permissions without explicitly assigning " -"them." +#: contrib/localflavor/jp/jp_prefectures.py:20 +msgid "Niigata" msgstr "" -#: contrib/auth/models.py:98 -msgid "last login" +#: contrib/localflavor/jp/jp_prefectures.py:21 +msgid "Toyama" msgstr "" -#: contrib/auth/models.py:99 -msgid "date joined" +#: contrib/localflavor/jp/jp_prefectures.py:22 +msgid "Ishikawa" msgstr "" -#: contrib/auth/models.py:101 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." +#: contrib/localflavor/jp/jp_prefectures.py:23 +msgid "Fukui" msgstr "" -#: contrib/auth/models.py:102 -msgid "user permissions" +#: contrib/localflavor/jp/jp_prefectures.py:24 +msgid "Gifu" msgstr "" -#: contrib/auth/models.py:105 -msgid "user" +#: contrib/localflavor/jp/jp_prefectures.py:25 +msgid "Shizuoka" msgstr "" -#: contrib/auth/models.py:106 -msgid "users" +#: contrib/localflavor/jp/jp_prefectures.py:26 +msgid "Aichi" +msgstr "" + +#: contrib/localflavor/jp/jp_prefectures.py:27 +msgid "Mie" msgstr "" -#: contrib/auth/models.py:111 -msgid "Personal info" +#: contrib/localflavor/jp/jp_prefectures.py:28 +msgid "Shiga" msgstr "" -#: contrib/auth/models.py:112 -msgid "Permissions" +#: contrib/localflavor/jp/jp_prefectures.py:29 +msgid "Kyoto" msgstr "" -#: contrib/auth/models.py:113 -msgid "Important dates" +#: contrib/localflavor/jp/jp_prefectures.py:30 +msgid "Osaka" msgstr "" -#: contrib/auth/models.py:114 -msgid "Groups" +#: contrib/localflavor/jp/jp_prefectures.py:31 +msgid "Hyogo" msgstr "" -#: contrib/auth/models.py:258 -msgid "message" +#: contrib/localflavor/jp/jp_prefectures.py:32 +msgid "Nara" msgstr "" -#: contrib/humanize/templatetags/humanize.py:17 -msgid "th" +#: contrib/localflavor/jp/jp_prefectures.py:33 +msgid "Wakayama" msgstr "" -#: contrib/humanize/templatetags/humanize.py:17 -msgid "st" +#: contrib/localflavor/jp/jp_prefectures.py:34 +msgid "Tottori" msgstr "" -#: contrib/humanize/templatetags/humanize.py:17 -msgid "nd" +#: contrib/localflavor/jp/jp_prefectures.py:35 +msgid "Shimane" msgstr "" -#: contrib/humanize/templatetags/humanize.py:17 -msgid "rd" +#: contrib/localflavor/jp/jp_prefectures.py:36 +msgid "Okayama" msgstr "" -#: contrib/humanize/templatetags/humanize.py:47 -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:50 -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:53 -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - -#: contrib/humanize/templatetags/humanize.py:68 -msgid "one" +#: contrib/localflavor/jp/jp_prefectures.py:37 +msgid "Hiroshima" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "two" +#: contrib/localflavor/jp/jp_prefectures.py:38 +msgid "Yamaguchi" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "three" +#: contrib/localflavor/jp/jp_prefectures.py:39 +msgid "Tokushima" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "four" +#: contrib/localflavor/jp/jp_prefectures.py:40 +msgid "Kagawa" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "five" +#: contrib/localflavor/jp/jp_prefectures.py:41 +msgid "Ehime" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "six" +#: contrib/localflavor/jp/jp_prefectures.py:42 +msgid "Kochi" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "seven" +#: contrib/localflavor/jp/jp_prefectures.py:43 +msgid "Fukuoka" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "eight" +#: contrib/localflavor/jp/jp_prefectures.py:44 +msgid "Saga" msgstr "" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "nine" +#: contrib/localflavor/jp/jp_prefectures.py:45 +msgid "Nagasaki" msgstr "" -#: contrib/contenttypes/models.py:36 -msgid "python model class name" +#: contrib/localflavor/jp/jp_prefectures.py:46 +msgid "Kumamoto" msgstr "" -#: contrib/contenttypes/models.py:39 -msgid "content type" +#: contrib/localflavor/jp/jp_prefectures.py:47 +msgid "Oita" msgstr "" -#: contrib/contenttypes/models.py:40 -msgid "content types" +#: contrib/localflavor/jp/jp_prefectures.py:48 +msgid "Miyazaki" msgstr "" -#: contrib/redirects/models.py:7 -msgid "redirect from" +#: contrib/localflavor/jp/jp_prefectures.py:49 +msgid "Kagoshima" msgstr "" -#: contrib/redirects/models.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." +#: contrib/localflavor/jp/jp_prefectures.py:50 +msgid "Okinawa" msgstr "" -#: contrib/redirects/models.py:9 -msgid "redirect to" +#: contrib/localflavor/nl/forms.py:25 +msgid "Enter a valid postal code" msgstr "" -#: contrib/redirects/models.py:10 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +#: contrib/localflavor/nl/forms.py:53 +msgid "Enter a valid phone number" msgstr "" -#: contrib/redirects/models.py:13 -msgid "redirect" +#: contrib/localflavor/nl/forms.py:76 +msgid "Enter a valid SoFi number" msgstr "" -#: contrib/redirects/models.py:14 -msgid "redirects" +#: contrib/localflavor/nl/nl_provinces.py:4 +msgid "Drente" msgstr "" -#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315 -msgid "URL" +#: contrib/localflavor/nl/nl_provinces.py:5 +msgid "Flevoland" msgstr "" -#: contrib/flatpages/models.py:8 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +#: contrib/localflavor/nl/nl_provinces.py:6 +msgid "Friesland" msgstr "" -#: contrib/flatpages/models.py:9 -msgid "title" +#: contrib/localflavor/nl/nl_provinces.py:7 +msgid "Gelderland" msgstr "" -#: contrib/flatpages/models.py:10 -msgid "content" +#: contrib/localflavor/nl/nl_provinces.py:8 +msgid "Groningen" msgstr "" -#: contrib/flatpages/models.py:11 -msgid "enable comments" +#: contrib/localflavor/nl/nl_provinces.py:9 +msgid "Limburg" msgstr "" -#: contrib/flatpages/models.py:12 -msgid "template name" +#: contrib/localflavor/nl/nl_provinces.py:10 +msgid "Noord-Brabant" 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/localflavor/nl/nl_provinces.py:11 +msgid "Noord-Holland" msgstr "" -#: contrib/flatpages/models.py:14 -msgid "registration required" +#: contrib/localflavor/nl/nl_provinces.py:12 +msgid "Overijssel" msgstr "" -#: contrib/flatpages/models.py:14 -msgid "If this is checked, only logged-in users will be able to view the page." +#: contrib/localflavor/nl/nl_provinces.py:13 +msgid "Utrecht" msgstr "" -#: contrib/flatpages/models.py:18 -msgid "flat page" +#: contrib/localflavor/nl/nl_provinces.py:14 +msgid "Zeeland" msgstr "" -#: contrib/flatpages/models.py:19 -msgid "flat pages" +#: contrib/localflavor/nl/nl_provinces.py:15 +msgid "Zuid-Holland" msgstr "" -#: contrib/comments/models.py:67 contrib/comments/models.py:166 -msgid "object ID" +#: contrib/localflavor/no/forms.py:35 +msgid "Enter a valid Norwegian social security number." msgstr "" -#: contrib/comments/models.py:68 -msgid "headline" +#: contrib/localflavor/pe/forms.py:36 +msgid "This field requires 8 digits." msgstr "" -#: contrib/comments/models.py:69 contrib/comments/models.py:90 -#: contrib/comments/models.py:167 -msgid "comment" +#: contrib/localflavor/pe/forms.py:59 +msgid "This field requires 11 digits." msgstr "" -#: contrib/comments/models.py:70 -msgid "rating #1" +#: contrib/localflavor/pl/forms.py:41 +msgid "National Identification Number consists of 11 digits." msgstr "" -#: contrib/comments/models.py:71 -msgid "rating #2" +#: contrib/localflavor/pl/forms.py:47 +msgid "Wrong checksum for the National Identification Number." msgstr "" -#: contrib/comments/models.py:72 -msgid "rating #3" +#: 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 "" -#: contrib/comments/models.py:73 -msgid "rating #4" +#: contrib/localflavor/pl/forms.py:78 +msgid "Wrong checksum for the Tax Number (NIP)." msgstr "" -#: contrib/comments/models.py:74 -msgid "rating #5" +#: contrib/localflavor/pl/forms.py:107 +msgid "National Business Register Number (REGON) consists of 7 or 9 digits." msgstr "" -#: contrib/comments/models.py:75 -msgid "rating #6" +#: contrib/localflavor/pl/forms.py:113 +msgid "Wrong checksum for the National Business Register Number (REGON)." msgstr "" -#: contrib/comments/models.py:76 -msgid "rating #7" +#: contrib/localflavor/pl/forms.py:148 +msgid "Enter a postal code in the format XX-XXX." msgstr "" -#: contrib/comments/models.py:77 -msgid "rating #8" +#: contrib/localflavor/pl/pl_voivodeships.py:8 +msgid "Lower Silesia" msgstr "" -#: contrib/comments/models.py:82 -msgid "is valid rating" +#: contrib/localflavor/pl/pl_voivodeships.py:9 +msgid "Kuyavia-Pomerania" msgstr "" -#: contrib/comments/models.py:83 contrib/comments/models.py:169 -msgid "date/time submitted" +#: contrib/localflavor/pl/pl_voivodeships.py:10 +msgid "Lublin" msgstr "" -#: contrib/comments/models.py:84 contrib/comments/models.py:170 -msgid "is public" +#: contrib/localflavor/pl/pl_voivodeships.py:11 +msgid "Lubusz" msgstr "" -#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304 -msgid "IP address" +#: contrib/localflavor/pl/pl_voivodeships.py:12 +msgid "Lodz" msgstr "" -#: contrib/comments/models.py:86 -msgid "is removed" +#: contrib/localflavor/pl/pl_voivodeships.py:13 +msgid "Lesser Poland" msgstr "" -#: 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/localflavor/pl/pl_voivodeships.py:14 +msgid "Masovia" msgstr "" -#: contrib/comments/models.py:91 -msgid "comments" +#: contrib/localflavor/pl/pl_voivodeships.py:15 +msgid "Opole" msgstr "" -#: contrib/comments/models.py:131 contrib/comments/models.py:207 -msgid "Content object" +#: contrib/localflavor/pl/pl_voivodeships.py:16 +msgid "Subcarpatia" msgstr "" -#: contrib/comments/models.py:159 -#, python-format -msgid "" -"Posted by %(user)s at %(date)s\n" -"\n" -"%(comment)s\n" -"\n" -"http://%(domain)s%(url)s" +#: contrib/localflavor/pl/pl_voivodeships.py:17 +msgid "Podlasie" msgstr "" -#: contrib/comments/models.py:168 -msgid "person's name" +#: contrib/localflavor/pl/pl_voivodeships.py:18 +msgid "Pomerania" msgstr "" -#: contrib/comments/models.py:171 -msgid "ip address" +#: contrib/localflavor/pl/pl_voivodeships.py:19 +msgid "Silesia" msgstr "" -#: contrib/comments/models.py:173 -msgid "approved by staff" +#: contrib/localflavor/pl/pl_voivodeships.py:20 +msgid "Swietokrzyskie" msgstr "" -#: contrib/comments/models.py:176 -msgid "free comment" +#: contrib/localflavor/pl/pl_voivodeships.py:21 +msgid "Warmia-Masuria" msgstr "" -#: contrib/comments/models.py:177 -msgid "free comments" +#: contrib/localflavor/pl/pl_voivodeships.py:22 +msgid "Greater Poland" msgstr "" -#: contrib/comments/models.py:233 -msgid "score" +#: contrib/localflavor/pl/pl_voivodeships.py:23 +msgid "West Pomerania" msgstr "" -#: contrib/comments/models.py:234 -msgid "score date" +#: contrib/localflavor/sk/forms.py:32 +msgid "Enter a postal code in the format XXXXX or XXX XX." msgstr "" -#: contrib/comments/models.py:237 -msgid "karma score" +#: contrib/localflavor/sk/sk_districts.py:8 +msgid "Banska Bystrica" msgstr "" -#: contrib/comments/models.py:238 -msgid "karma scores" +#: contrib/localflavor/sk/sk_districts.py:9 +msgid "Banska Stiavnica" msgstr "" -#: contrib/comments/models.py:242 -#, python-format -msgid "%(score)d rating by %(user)s" +#: contrib/localflavor/sk/sk_districts.py:10 +msgid "Bardejov" msgstr "" -#: contrib/comments/models.py:258 -#, python-format -msgid "" -"This comment was flagged by %(user)s:\n" -"\n" -"%(text)s" +#: contrib/localflavor/sk/sk_districts.py:11 +msgid "Banovce nad Bebravou" msgstr "" -#: contrib/comments/models.py:265 -msgid "flag date" +#: contrib/localflavor/sk/sk_districts.py:12 +msgid "Brezno" msgstr "" -#: contrib/comments/models.py:268 -msgid "user flag" +#: contrib/localflavor/sk/sk_districts.py:13 +msgid "Bratislava I" msgstr "" -#: contrib/comments/models.py:269 -msgid "user flags" +#: contrib/localflavor/sk/sk_districts.py:14 +msgid "Bratislava II" msgstr "" -#: contrib/comments/models.py:273 -#, python-format -msgid "Flag by %r" +#: contrib/localflavor/sk/sk_districts.py:15 +msgid "Bratislava III" msgstr "" -#: contrib/comments/models.py:278 -msgid "deletion date" +#: contrib/localflavor/sk/sk_districts.py:16 +msgid "Bratislava IV" msgstr "" -#: contrib/comments/models.py:280 -msgid "moderator deletion" +#: contrib/localflavor/sk/sk_districts.py:17 +msgid "Bratislava V" msgstr "" -#: contrib/comments/models.py:281 -msgid "moderator deletions" +#: contrib/localflavor/sk/sk_districts.py:18 +msgid "Bytca" msgstr "" -#: contrib/comments/models.py:285 -#, python-format -msgid "Moderator deletion by %r" +#: contrib/localflavor/sk/sk_districts.py:19 +msgid "Cadca" msgstr "" -#: contrib/comments/templates/comments/form.html:6 -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/login.html:17 -msgid "Username:" +#: contrib/localflavor/sk/sk_districts.py:20 +msgid "Detva" 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" +#: contrib/localflavor/sk/sk_districts.py:21 +msgid "Dolny Kubin" msgstr "" -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/login.html:20 -msgid "Password:" +#: contrib/localflavor/sk/sk_districts.py:22 +msgid "Dunajska Streda" msgstr "" -#: contrib/comments/templates/comments/form.html:8 -msgid "Forgotten your password?" +#: contrib/localflavor/sk/sk_districts.py:23 +msgid "Galanta" msgstr "" -#: contrib/comments/templates/comments/form.html:12 -msgid "Ratings" +#: contrib/localflavor/sk/sk_districts.py:24 +msgid "Gelnica" msgstr "" -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Required" +#: contrib/localflavor/sk/sk_districts.py:25 +msgid "Hlohovec" msgstr "" -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Optional" +#: contrib/localflavor/sk/sk_districts.py:26 +msgid "Humenne" msgstr "" -#: contrib/comments/templates/comments/form.html:23 -msgid "Post a photo" +#: contrib/localflavor/sk/sk_districts.py:27 +msgid "Ilava" msgstr "" -#: contrib/comments/templates/comments/form.html:28 -#: contrib/comments/templates/comments/freeform.html:5 -msgid "Comment:" +#: contrib/localflavor/sk/sk_districts.py:28 +msgid "Kezmarok" msgstr "" -#: contrib/comments/templates/comments/form.html:35 -#: contrib/comments/templates/comments/freeform.html:10 -msgid "Preview comment" +#: contrib/localflavor/sk/sk_districts.py:29 +msgid "Komarno" msgstr "" -#: contrib/comments/templates/comments/freeform.html:4 -msgid "Your name:" +#: contrib/localflavor/sk/sk_districts.py:30 +msgid "Kosice I" msgstr "" -#: contrib/comments/views/karma.py:19 -msgid "Anonymous users cannot vote" +#: contrib/localflavor/sk/sk_districts.py:31 +msgid "Kosice II" msgstr "" -#: contrib/comments/views/karma.py:23 -msgid "Invalid comment ID" +#: contrib/localflavor/sk/sk_districts.py:32 +msgid "Kosice III" msgstr "" -#: contrib/comments/views/karma.py:25 -msgid "No voting for yourself" +#: contrib/localflavor/sk/sk_districts.py:33 +msgid "Kosice IV" msgstr "" -#: contrib/comments/views/comments.py:27 -msgid "" -"This rating is required because you've entered at least one other rating." +#: contrib/localflavor/sk/sk_districts.py:34 +msgid "Kosice - okolie" msgstr "" -#: 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] "" -msgstr[1] "" +#: contrib/localflavor/sk/sk_districts.py:35 +msgid "Krupina" +msgstr "" -#: contrib/comments/views/comments.py:116 -#, python-format -msgid "" -"This comment was posted by a sketchy user:\n" -"\n" -"%(text)s" +#: contrib/localflavor/sk/sk_districts.py:36 +msgid "Kysucke Nove Mesto" msgstr "" -#: contrib/comments/views/comments.py:188 -#: contrib/comments/views/comments.py:280 -msgid "Only POSTs are allowed" +#: contrib/localflavor/sk/sk_districts.py:37 +msgid "Levice" msgstr "" -#: contrib/comments/views/comments.py:192 -#: contrib/comments/views/comments.py:284 -msgid "One or more of the required fields wasn't submitted" +#: contrib/localflavor/sk/sk_districts.py:38 +msgid "Levoca" msgstr "" -#: contrib/comments/views/comments.py:196 -#: contrib/comments/views/comments.py:286 -msgid "Somebody tampered with the comment form (security violation)" +#: contrib/localflavor/sk/sk_districts.py:39 +msgid "Liptovsky Mikulas" msgstr "" -#: contrib/comments/views/comments.py:206 -#: contrib/comments/views/comments.py:292 -msgid "" -"The comment form had an invalid 'target' parameter -- the object ID was " -"invalid" +#: contrib/localflavor/sk/sk_districts.py:40 +msgid "Lucenec" msgstr "" -#: contrib/comments/views/comments.py:257 -#: contrib/comments/views/comments.py:321 -msgid "The comment form didn't provide either 'preview' or 'post'" +#: contrib/localflavor/sk/sk_districts.py:41 +msgid "Malacky" msgstr "" -#: contrib/sites/models.py:10 -msgid "domain name" +#: contrib/localflavor/sk/sk_districts.py:42 +msgid "Martin" msgstr "" -#: contrib/sites/models.py:11 -msgid "display name" +#: contrib/localflavor/sk/sk_districts.py:43 +msgid "Medzilaborce" msgstr "" -#: contrib/sites/models.py:15 -msgid "site" +#: contrib/localflavor/sk/sk_districts.py:44 +msgid "Michalovce" msgstr "" -#: contrib/sites/models.py:16 -msgid "sites" +#: contrib/localflavor/sk/sk_districts.py:45 +msgid "Myjava" msgstr "" -#: contrib/admin/filterspecs.py:40 -#, python-format -msgid "" -"

    By %s:

    \n" -"
      \n" +#: contrib/localflavor/sk/sk_districts.py:46 +msgid "Namestovo" msgstr "" -#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 -#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169 -msgid "All" +#: contrib/localflavor/sk/sk_districts.py:47 +msgid "Nitra" msgstr "" -#: contrib/admin/filterspecs.py:109 -msgid "Any date" +#: contrib/localflavor/sk/sk_districts.py:48 +msgid "Nove Mesto nad Vahom" msgstr "" -#: contrib/admin/filterspecs.py:110 -msgid "Today" +#: contrib/localflavor/sk/sk_districts.py:49 +msgid "Nove Zamky" msgstr "" -#: contrib/admin/filterspecs.py:113 -msgid "Past 7 days" +#: contrib/localflavor/sk/sk_districts.py:50 +msgid "Partizanske" msgstr "" -#: contrib/admin/filterspecs.py:115 -msgid "This month" +#: contrib/localflavor/sk/sk_districts.py:51 +msgid "Pezinok" msgstr "" -#: contrib/admin/filterspecs.py:117 -msgid "This year" +#: contrib/localflavor/sk/sk_districts.py:52 +msgid "Piestany" msgstr "" -#: contrib/admin/models.py:16 -msgid "action time" +#: contrib/localflavor/sk/sk_districts.py:53 +msgid "Poltar" msgstr "" -#: contrib/admin/models.py:19 -msgid "object id" +#: contrib/localflavor/sk/sk_districts.py:54 +msgid "Poprad" msgstr "" -#: contrib/admin/models.py:20 -msgid "object repr" +#: contrib/localflavor/sk/sk_districts.py:55 +msgid "Povazska Bystrica" msgstr "" -#: contrib/admin/models.py:21 -msgid "action flag" +#: contrib/localflavor/sk/sk_districts.py:56 +msgid "Presov" msgstr "" -#: contrib/admin/models.py:22 -msgid "change message" +#: contrib/localflavor/sk/sk_districts.py:57 +msgid "Prievidza" msgstr "" -#: contrib/admin/models.py:25 -msgid "log entry" +#: contrib/localflavor/sk/sk_districts.py:58 +msgid "Puchov" msgstr "" -#: contrib/admin/models.py:26 -msgid "log entries" +#: contrib/localflavor/sk/sk_districts.py:59 +msgid "Revuca" msgstr "" -#: contrib/admin/templatetags/admin_list.py:247 -msgid "All dates" +#: contrib/localflavor/sk/sk_districts.py:60 +msgid "Rimavska Sobota" 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/localflavor/sk/sk_districts.py:61 +msgid "Roznava" 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/localflavor/sk/sk_districts.py:62 +msgid "Ruzomberok" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -msgid "Bookmarklets" +#: contrib/localflavor/sk/sk_districts.py:63 +msgid "Sabinov" 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/localflavor/sk/sk_districts.py:64 +msgid "Senec" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:5 -msgid "Documentation bookmarklets" +#: contrib/localflavor/sk/sk_districts.py:65 +msgid "Senica" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:9 -msgid "" -"\n" -"

      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\").

      \n" +#: contrib/localflavor/sk/sk_districts.py:66 +msgid "Skalica" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:19 -msgid "Documentation for this page" +#: contrib/localflavor/sk/sk_districts.py:67 +msgid "Snina" 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/localflavor/sk/sk_districts.py:68 +msgid "Sobrance" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:22 -msgid "Show object ID" +#: contrib/localflavor/sk/sk_districts.py:69 +msgid "Spisska Nova Ves" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:23 -msgid "" -"Shows the content-type and unique ID for pages that represent a single " -"object." +#: contrib/localflavor/sk/sk_districts.py:70 +msgid "Stara Lubovna" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:25 -msgid "Edit this object (current window)" +#: contrib/localflavor/sk/sk_districts.py:71 +msgid "Stropkov" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:26 -msgid "Jumps to the admin page for pages that represent a single object." +#: contrib/localflavor/sk/sk_districts.py:72 +msgid "Svidnik" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:28 -msgid "Edit this object (new window)" +#: contrib/localflavor/sk/sk_districts.py:73 +msgid "Sala" msgstr "" -#: contrib/admin/templates/admin_doc/bookmarklets.html:29 -msgid "As above, but opens the admin page in a new window." +#: contrib/localflavor/sk/sk_districts.py:74 +msgid "Topolcany" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:3 -#: contrib/admin/templates/admin/delete_confirmation.html:9 -msgid "Delete" +#: contrib/localflavor/sk/sk_districts.py:75 +msgid "Trebisov" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save as new" +#: contrib/localflavor/sk/sk_districts.py:76 +msgid "Trencin" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save and add another" +#: contrib/localflavor/sk/sk_districts.py:77 +msgid "Trnava" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and continue editing" +#: contrib/localflavor/sk/sk_districts.py:78 +msgid "Turcianske Teplice" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save" +#: contrib/localflavor/sk/sk_districts.py:79 +msgid "Tvrdosin" msgstr "" -#: contrib/admin/templates/admin/500.html:4 -msgid "Server error" +#: contrib/localflavor/sk/sk_districts.py:80 +msgid "Velky Krtis" msgstr "" -#: contrib/admin/templates/admin/500.html:6 -msgid "Server error (500)" +#: contrib/localflavor/sk/sk_districts.py:81 +msgid "Vranov nad Toplou" msgstr "" -#: contrib/admin/templates/admin/500.html:9 -msgid "Server Error (500)" +#: contrib/localflavor/sk/sk_districts.py:82 +msgid "Zlate Moravce" msgstr "" -#: 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." +#: contrib/localflavor/sk/sk_districts.py:83 +msgid "Zvolen" msgstr "" -#: contrib/admin/templates/admin/filter.html:2 -#, python-format -msgid " By %(filter_title)s " +#: contrib/localflavor/sk/sk_districts.py:84 +msgid "Zarnovica" msgstr "" -#: contrib/admin/templates/admin/filters.html:4 -msgid "Filter" +#: contrib/localflavor/sk/sk_districts.py:85 +msgid "Ziar nad Hronom" msgstr "" -#: 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." +#: contrib/localflavor/sk/sk_districts.py:86 +msgid "Zilina" msgstr "" -#: contrib/admin/templates/admin/search_form.html:8 -msgid "Go" +#: contrib/localflavor/sk/sk_regions.py:8 +msgid "Banska Bystrica region" 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/sk/sk_regions.py:9 +msgid "Bratislava region" +msgstr "" -#: contrib/admin/templates/admin/search_form.html:10 -#, python-format -msgid "%(full_result_count)s total" +#: contrib/localflavor/sk/sk_regions.py:10 +msgid "Kosice region" msgstr "" -#: contrib/admin/templates/admin/object_history.html:5 -#: contrib/admin/templates/admin/change_form.html:21 -msgid "History" +#: contrib/localflavor/sk/sk_regions.py:11 +msgid "Nitra region" msgstr "" -#: contrib/admin/templates/admin/object_history.html:18 -msgid "Date/time" +#: contrib/localflavor/sk/sk_regions.py:12 +msgid "Presov region" msgstr "" -#: contrib/admin/templates/admin/object_history.html:19 -msgid "User" +#: contrib/localflavor/sk/sk_regions.py:13 +msgid "Trencin region" msgstr "" -#: contrib/admin/templates/admin/object_history.html:20 -msgid "Action" +#: contrib/localflavor/sk/sk_regions.py:14 +msgid "Trnava region" msgstr "" -#: contrib/admin/templates/admin/object_history.html:26 -msgid "DATE_WITH_TIME_FULL" -msgstr "N j, Y, P" +#: contrib/localflavor/sk/sk_regions.py:15 +msgid "Zilina region" +msgstr "" -#: contrib/admin/templates/admin/object_history.html:36 -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." +#: contrib/localflavor/uk/forms.py:18 +msgid "Enter a postcode. A space is required between the two postcode parts." msgstr "" -#: 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:" +#: contrib/localflavor/us/forms.py:18 +msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:21 -#, python-format +#: 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 "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:26 -msgid "Yes, I'm sure" +#: contrib/redirects/models.py:9 +msgid "redirect to" msgstr "" -#: contrib/admin/templates/admin/pagination.html:10 -msgid "Show all" +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." msgstr "" -#: contrib/admin/templates/admin/change_list.html:12 -#, python-format -msgid "Add %(name)s" +#: contrib/redirects/models.py:13 +msgid "redirect" msgstr "" -#: contrib/admin/templates/admin/change_form.html:15 -#: contrib/admin/templates/admin/index.html:28 -msgid "Add" +#: contrib/redirects/models.py:14 +msgid "redirects" msgstr "" -#: contrib/admin/templates/admin/change_form.html:22 -msgid "View on site" +#: contrib/sessions/models.py:80 +msgid "session key" 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/sessions/models.py:81 +msgid "session data" +msgstr "" -#: contrib/admin/templates/admin/change_form.html:50 -msgid "Ordering" +#: contrib/sessions/models.py:82 +msgid "expire date" msgstr "" -#: contrib/admin/templates/admin/change_form.html:53 -msgid "Order:" +#: contrib/sessions/models.py:87 +msgid "session" msgstr "" -#: contrib/admin/templates/admin/base.html:25 -msgid "Welcome," +#: contrib/sessions/models.py:88 +msgid "sessions" msgstr "" -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" +#: contrib/sites/models.py:32 +msgid "domain name" msgstr "" -#: contrib/admin/templates/admin/404.html:10 -msgid "We're sorry, but the requested page could not be found." +#: contrib/sites/models.py:33 +msgid "display name" msgstr "" -#: contrib/admin/templates/admin/login.html:25 -#: contrib/admin/views/decorators.py:24 -msgid "Log in" +#: contrib/sites/models.py:37 +msgid "site" msgstr "" -#: contrib/admin/templates/admin/index.html:17 -#, python-format -msgid "Models available in the %(name)s application." +#: contrib/sites/models.py:38 +msgid "sites" msgstr "" -#: contrib/admin/templates/admin/index.html:18 -#, python-format -msgid "%(name)s" +#: core/validators.py:72 +msgid "This value must contain only letters, numbers and underscores." msgstr "" -#: contrib/admin/templates/admin/index.html:34 -msgid "Change" +#: core/validators.py:76 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." msgstr "" -#: contrib/admin/templates/admin/index.html:44 -msgid "You don't have permission to edit anything." +#: core/validators.py:80 +msgid "This value must contain only letters, numbers, underscores or hyphens." msgstr "" -#: contrib/admin/templates/admin/index.html:52 -msgid "Recent Actions" +#: core/validators.py:84 +msgid "Uppercase letters are not allowed here." msgstr "" -#: contrib/admin/templates/admin/index.html:53 -msgid "My Actions" +#: core/validators.py:88 +msgid "Lowercase letters are not allowed here." msgstr "" -#: contrib/admin/templates/admin/index.html:57 -msgid "None available" +#: core/validators.py:95 +msgid "Enter only digits separated by commas." msgstr "" -#: contrib/admin/templates/admin/base_site.html:4 -msgid "Django site admin" +#: core/validators.py:107 +msgid "Enter valid e-mail addresses separated by commas." msgstr "" -#: contrib/admin/templates/admin/base_site.html:7 -msgid "Django administration" +#: core/validators.py:111 +msgid "Please enter a valid IP address." 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." +#: core/validators.py:115 +msgid "Empty values are not allowed here." msgstr "" -#: contrib/admin/templates/admin/auth/user/add_form.html:12 -msgid "Username" +#: core/validators.py:119 +msgid "Non-numeric characters aren't allowed here." msgstr "" -#: contrib/admin/templates/admin/auth/user/add_form.html:18 -#: contrib/admin/templates/admin/auth/user/change_password.html:34 -msgid "Password" +#: core/validators.py:123 +msgid "This value can't be comprised solely of digits." msgstr "" -#: contrib/admin/templates/admin/auth/user/add_form.html:23 -#: contrib/admin/templates/admin/auth/user/change_password.html:39 -msgid "Password (again)" +#: core/validators.py:128 newforms/fields.py:157 +msgid "Enter a whole number." 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." +#: core/validators.py:132 +msgid "Only alphabetical characters are allowed here." msgstr "" -#: contrib/admin/templates/admin/auth/user/change_password.html:28 -#, python-format -msgid "Enter a new password for the user %(username)s." +#: core/validators.py:147 +msgid "Year must be 1900 or later." msgstr "" -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" +#: core/validators.py:151 +#, python-format +msgid "Invalid date: %s" msgstr "" -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" +#: core/validators.py:156 db/models/fields/__init__.py:509 +msgid "Enter a valid date in YYYY-MM-DD format." msgstr "" -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" +#: core/validators.py:161 +msgid "Enter a valid time in HH:MM format." msgstr "" -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" +#: core/validators.py:165 db/models/fields/__init__.py:583 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "" -#: contrib/admin/templates/registration/logged_out.html:8 -msgid "Thanks for spending some quality time with the Web site today." +#: core/validators.py:170 newforms/fields.py:408 +msgid "Enter a valid e-mail address." msgstr "" -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Log in again" +#: 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 "" -#: contrib/admin/templates/registration/password_reset_email.html:2 -msgid "You're receiving this e-mail because you requested a password reset" +#: 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 "" -#: contrib/admin/templates/registration/password_reset_email.html:3 +#: core/validators.py:200 #, python-format -msgid "for your user account at %(site_name)s" +msgid "The URL %s does not point to a valid image." msgstr "" -#: contrib/admin/templates/registration/password_reset_email.html:5 +#: core/validators.py:204 #, python-format -msgid "Your new password is: %(new_password)s" +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "" -#: contrib/admin/templates/registration/password_reset_email.html:7 -msgid "Feel free to change this password by going to this page:" +#: core/validators.py:212 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." msgstr "" -#: contrib/admin/templates/registration/password_reset_email.html:11 -msgid "Your username, in case you've forgotten:" +#: core/validators.py:216 +msgid "A valid URL is required." msgstr "" -#: contrib/admin/templates/registration/password_reset_email.html:13 -msgid "Thanks for using our site!" +#: core/validators.py:230 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" msgstr "" -#: contrib/admin/templates/registration/password_reset_email.html:15 +#: core/validators.py:237 #, python-format -msgid "The %(site_name)s team" +msgid "Badly formed XML: %s" 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" +#: core/validators.py:254 +#, python-format +msgid "Invalid URL: %s" msgstr "" -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_done.html:10 -msgid "Password reset successful" +#: core/validators.py:259 core/validators.py:261 +#, python-format +msgid "The URL %s is a broken link." 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." +#: core/validators.py:267 +msgid "Enter a valid U.S. state abbreviation." 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" -msgstr "" +#: 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] "" -#: 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." +#: core/validators.py:288 +#, python-format +msgid "This field must match the '%s' field." msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Old password:" +#: core/validators.py:307 +msgid "Please enter something for at least one field." msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:19 -msgid "New password:" +#: core/validators.py:316 core/validators.py:327 +msgid "Please enter both fields or leave them both empty." msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:21 -msgid "Confirm password:" +#: core/validators.py:335 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:23 -msgid "Change my password" +#: core/validators.py:348 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" msgstr "" -#: contrib/admin/templates/registration/password_change_done.html:6 -#: contrib/admin/templates/registration/password_change_done.html:10 -msgid "Password change successful" +#: core/validators.py:367 +msgid "Duplicate values are not allowed." msgstr "" -#: contrib/admin/templates/registration/password_change_done.html:12 -msgid "Your password was changed." +#: core/validators.py:382 +#, python-format +msgid "This value must be between %(lower)s and %(upper)s." 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." +#: core/validators.py:384 +#, python-format +msgid "This value must be at least %s." msgstr "" -#: contrib/admin/templates/registration/password_reset_form.html:16 -msgid "E-mail address:" +#: core/validators.py:386 +#, python-format +msgid "This value must be no more than %s." msgstr "" -#: contrib/admin/templates/registration/password_reset_form.html:16 -msgid "Reset my password" +#: core/validators.py:427 +#, python-format +msgid "This value must be a power of %s." msgstr "" -#: contrib/admin/views/main.py:223 -msgid "Site administration" +#: core/validators.py:437 +msgid "Please enter a valid decimal number." msgstr "" -#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19 +#: core/validators.py:444 #, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -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." -msgstr "" +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] "" +msgstr[1] "" -#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 +#: core/validators.py:447 #, python-format -msgid "You may add another %s below." -msgstr "" +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] "" +msgstr[1] "" -#: contrib/admin/views/main.py:289 +#: core/validators.py:450 #, python-format -msgid "Add %s" +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] "" +msgstr[1] "" + +#: core/validators.py:458 +msgid "Please enter a valid floating point number." msgstr "" -#: contrib/admin/views/main.py:335 +#: core/validators.py:467 #, python-format -msgid "Added %s." +msgid "Make sure your uploaded file is at least %s bytes big." msgstr "" -#: contrib/admin/views/main.py:337 +#: core/validators.py:468 #, python-format -msgid "Changed %s." +msgid "Make sure your uploaded file is at most %s bytes big." msgstr "" -#: contrib/admin/views/main.py:339 -#, python-format -msgid "Deleted %s." +#: core/validators.py:485 +msgid "The format for this field is wrong." msgstr "" -#: contrib/admin/views/main.py:342 -msgid "No fields changed." +#: core/validators.py:500 +msgid "This field is invalid." msgstr "" -#: contrib/admin/views/main.py:345 +#: core/validators.py:536 #, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgid "Could not retrieve anything from %s." msgstr "" -#: contrib/admin/views/main.py:353 +#: core/validators.py:539 #, python-format msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "" -#: contrib/admin/views/main.py:391 +#: core/validators.py:572 #, python-format -msgid "Change %s" +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" msgstr "" -#: contrib/admin/views/main.py:476 +#: core/validators.py:576 #, python-format -msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" msgstr "" -#: contrib/admin/views/main.py:481 +#: core/validators.py:581 #, python-format -msgid "One or more %(fieldname)s in %(name)s:" +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" msgstr "" -#: contrib/admin/views/main.py:514 +#: core/validators.py:586 #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" msgstr "" -#: contrib/admin/views/main.py:517 -msgid "Are you sure?" +#: 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 "" -#: contrib/admin/views/main.py:539 +#: core/validators.py:595 #, python-format -msgid "Change history: %s" +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" msgstr "" -#: contrib/admin/views/main.py:573 +#: db/models/manipulators.py:308 #, python-format -msgid "Select %s" +msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "" -#: contrib/admin/views/main.py:573 +#: db/models/fields/__init__.py:52 #, python-format -msgid "Select %s to change" +msgid "%(optname)s with this %(fieldname)s already exists." msgstr "" -#: contrib/admin/views/main.py:768 -msgid "Database error" +#: 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 "" -#: contrib/admin/views/decorators.py:62 -msgid "" -"Please log in again, because your session has expired. Don't worry: Your " -"submission has been saved." +#: db/models/fields/__init__.py:418 +msgid "This value must be an integer." 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." +#: db/models/fields/__init__.py:454 +msgid "This value must be either True or False." msgstr "" -#: contrib/admin/views/decorators.py:83 -msgid "Usernames cannot contain the '@' character." +#: db/models/fields/__init__.py:475 +msgid "This field cannot be null." msgstr "" -#: contrib/admin/views/decorators.py:85 -#, python-format -msgid "Your e-mail address is not your username. Try '%s' instead." +#: db/models/fields/__init__.py:644 +msgid "This value must be a decimal number." msgstr "" -#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 -#: contrib/admin/views/doc.py:50 -msgid "tag:" +#: db/models/fields/__init__.py:755 +msgid "Enter a valid filename." msgstr "" -#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 -#: contrib/admin/views/doc.py:81 -msgid "filter:" +#: db/models/fields/__init__.py:904 +msgid "This value must be either None, True or False." msgstr "" -#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 -#: contrib/admin/views/doc.py:139 -msgid "view:" +#: db/models/fields/related.py:658 +msgid "Separate multiple IDs with commas." msgstr "" -#: contrib/admin/views/doc.py:164 -#, python-format -msgid "App %r not found" +#: db/models/fields/related.py:660 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" -#: contrib/admin/views/doc.py:171 +#: db/models/fields/related.py:707 #, python-format -msgid "Model %(name)r not found in app %(label)r" -msgstr "" +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] "" -#: contrib/admin/views/doc.py:183 -#, python-format -msgid "the related `%(label)s.%(type)s` object" +#: newforms/fields.py:46 +msgid "Enter a valid value." 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:" +#: newforms/fields.py:129 +#, python-format +msgid "Ensure this value has at most %(max)d characters (it has %(length)d)." msgstr "" -#: contrib/admin/views/doc.py:214 +#: newforms/fields.py:130 #, python-format -msgid "related `%(label)s.%(name)s` objects" +msgid "Ensure this value has at least %(min)d characters (it has %(length)d)." msgstr "" -#: contrib/admin/views/doc.py:219 +#: newforms/fields.py:158 newforms/fields.py:187 newforms/fields.py:216 #, python-format -msgid "all %s" +msgid "Ensure this value is less than or equal to %s." msgstr "" -#: contrib/admin/views/doc.py:224 +#: newforms/fields.py:159 newforms/fields.py:188 newforms/fields.py:217 #, python-format -msgid "number of %s" +msgid "Ensure this value is greater than or equal to %s." msgstr "" -#: contrib/admin/views/doc.py:229 -#, python-format -msgid "Fields on %s objects" +#: newforms/fields.py:186 newforms/fields.py:215 +msgid "Enter a number." 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" +#: newforms/fields.py:218 +#, python-format +msgid "Ensure that there are no more than %s digits in total." msgstr "" -#: contrib/admin/views/doc.py:292 -msgid "Boolean (Either True or False)" +#: newforms/fields.py:219 +#, python-format +msgid "Ensure that there are no more than %s decimal places." msgstr "" -#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311 +#: newforms/fields.py:220 #, python-format -msgid "String (up to %(maxlength)s)" +msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "" -#: contrib/admin/views/doc.py:294 -msgid "Comma-separated integers" +#: newforms/fields.py:268 newforms/fields.py:724 +msgid "Enter a valid date." msgstr "" -#: contrib/admin/views/doc.py:295 -msgid "Date (without time)" +#: newforms/fields.py:301 newforms/fields.py:725 +msgid "Enter a valid time." msgstr "" -#: contrib/admin/views/doc.py:296 -msgid "Date (with time)" +#: newforms/fields.py:340 +msgid "Enter a valid date/time." msgstr "" -#: contrib/admin/views/doc.py:297 -msgid "E-mail address" +#: newforms/fields.py:439 +msgid "No file was submitted." msgstr "" -#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299 -#: contrib/admin/views/doc.py:302 -msgid "File path" +#: newforms/fields.py:440 oldforms/__init__.py:689 +msgid "The submitted file is empty." msgstr "" -#: contrib/admin/views/doc.py:300 -msgid "Decimal number" +#: newforms/fields.py:498 +msgid "Enter a valid URL." msgstr "" -#: contrib/admin/views/doc.py:306 -msgid "Boolean (Either True, False or None)" +#: newforms/fields.py:499 +msgid "This URL appears to be a broken link." msgstr "" -#: contrib/admin/views/doc.py:307 -msgid "Relation to parent model" +#: newforms/fields.py:560 newforms/models.py:155 +msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" -#: contrib/admin/views/doc.py:308 -msgid "Phone number" +#: newforms/fields.py:599 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" -#: contrib/admin/views/doc.py:313 -msgid "Text" +#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:215 +msgid "Enter a list of values." msgstr "" -#: contrib/admin/views/doc.py:314 -msgid "Time" +#: newforms/fields.py:753 +msgid "Enter a valid IPv4 address." msgstr "" -#: contrib/admin/views/doc.py:316 -msgid "U.S. state (two uppercase letters)" +#: newforms/models.py:216 +#, python-format +msgid "Select a valid choice. %s is not one of the available choices." msgstr "" -#: contrib/admin/views/doc.py:317 -msgid "XML text" +#: 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 "" -#: contrib/admin/views/doc.py:343 +#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625 #, python-format -msgid "%s does not appear to be a urlpattern object" +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "" -#: contrib/admin/views/auth.py:30 -msgid "Add user" +#: oldforms/__init__.py:745 +msgid "Enter a whole number between -32,768 and 32,767." msgstr "" -#: contrib/admin/views/auth.py:57 -msgid "Password changed successfully." +#: oldforms/__init__.py:755 +msgid "Enter a positive number." msgstr "" -#: contrib/admin/views/auth.py:64 -#, python-format -msgid "Change password: %s" +#: oldforms/__init__.py:765 +msgid "Enter a whole number between 0 and 32,767." msgstr "" -#: newforms/fields.py:103 newforms/fields.py:256 -#, python-format -msgid "Ensure this value has at most %d characters." +#: template/defaultfilters.py:658 +msgid "yes,no,maybe" msgstr "" -#: newforms/fields.py:105 newforms/fields.py:258 +#: template/defaultfilters.py:689 #, python-format -msgid "Ensure this value has at least %d characters." -msgstr "" +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" -#: newforms/fields.py:128 core/validators.py:120 -msgid "Enter a whole number." +#: template/defaultfilters.py:691 +#, python-format +msgid "%.1f KB" msgstr "" -#: newforms/fields.py:130 +#: template/defaultfilters.py:693 #, python-format -msgid "Ensure this value is less than or equal to %s." +msgid "%.1f MB" msgstr "" -#: newforms/fields.py:132 +#: template/defaultfilters.py:694 #, python-format -msgid "Ensure this value is greater than or equal to %s." +msgid "%.1f GB" msgstr "" -#: newforms/fields.py:165 -msgid "Enter a valid date." +#: utils/dateformat.py:41 +msgid "p.m." msgstr "" -#: newforms/fields.py:192 -msgid "Enter a valid time." +#: utils/dateformat.py:42 +msgid "a.m." msgstr "" -#: newforms/fields.py:228 -msgid "Enter a valid date/time." +#: utils/dateformat.py:47 +msgid "PM" msgstr "" -#: newforms/fields.py:242 -msgid "Enter a valid value." +#: utils/dateformat.py:48 +msgid "AM" msgstr "" -#: newforms/fields.py:271 core/validators.py:162 -msgid "Enter a valid e-mail address." +#: utils/dateformat.py:97 +msgid "midnight" msgstr "" -#: newforms/fields.py:289 newforms/fields.py:311 -msgid "Enter a valid URL." +#: utils/dateformat.py:99 +msgid "noon" msgstr "" -#: newforms/fields.py:313 -msgid "This URL appears to be a broken link." +#: utils/dates.py:6 +msgid "Monday" msgstr "" -#: newforms/fields.py:362 newforms/models.py:165 -msgid "Select a valid choice. That choice is not one of the available choices." +#: utils/dates.py:6 +msgid "Tuesday" msgstr "" -#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182 -msgid "Enter a list of values." +#: utils/dates.py:6 +msgid "Wednesday" msgstr "" -#: newforms/fields.py:389 newforms/models.py:188 -#, python-format -msgid "Select a valid choice. %s is not one of the available choices." +#: utils/dates.py:6 +msgid "Thursday" msgstr "" -#: template/defaultfilters.py:491 -msgid "yes,no,maybe" +#: utils/dates.py:6 +msgid "Friday" msgstr "" -#: views/generic/create_update.py:43 -#, python-format -msgid "The %(verbose_name)s was created successfully." +#: utils/dates.py:7 +msgid "Saturday" msgstr "" -#: views/generic/create_update.py:117 -#, python-format -msgid "The %(verbose_name)s was updated successfully." +#: utils/dates.py:7 +msgid "Sunday" msgstr "" -#: views/generic/create_update.py:184 -#, python-format -msgid "The %(verbose_name)s was deleted." +#: utils/dates.py:10 +msgid "Mon" msgstr "" -#: core/validators.py:64 -msgid "This value must contain only letters, numbers and underscores." +#: utils/dates.py:10 +msgid "Tue" msgstr "" -#: core/validators.py:68 -msgid "" -"This value must contain only letters, numbers, underscores, dashes or " -"slashes." +#: utils/dates.py:10 +msgid "Wed" msgstr "" -#: core/validators.py:72 -msgid "This value must contain only letters, numbers, underscores or hyphens." +#: utils/dates.py:10 +msgid "Thu" msgstr "" -#: core/validators.py:76 -msgid "Uppercase letters are not allowed here." +#: utils/dates.py:10 +msgid "Fri" msgstr "" -#: core/validators.py:80 -msgid "Lowercase letters are not allowed here." +#: utils/dates.py:11 +msgid "Sat" msgstr "" -#: core/validators.py:87 -msgid "Enter only digits separated by commas." +#: utils/dates.py:11 +msgid "Sun" msgstr "" -#: core/validators.py:99 -msgid "Enter valid e-mail addresses separated by commas." +#: utils/dates.py:18 +msgid "January" msgstr "" -#: core/validators.py:103 -msgid "Please enter a valid IP address." +#: utils/dates.py:18 +msgid "February" msgstr "" -#: core/validators.py:107 -msgid "Empty values are not allowed here." +#: utils/dates.py:18 utils/dates.py:31 +msgid "March" msgstr "" -#: core/validators.py:111 -msgid "Non-numeric characters aren't allowed here." +#: utils/dates.py:18 utils/dates.py:31 +msgid "April" msgstr "" -#: core/validators.py:115 -msgid "This value can't be comprised solely of digits." +#: utils/dates.py:18 utils/dates.py:31 +msgid "May" msgstr "" -#: core/validators.py:124 -msgid "Only alphabetical characters are allowed here." +#: utils/dates.py:18 utils/dates.py:31 +msgid "June" msgstr "" -#: core/validators.py:139 -msgid "Year must be 1900 or later." +#: utils/dates.py:19 utils/dates.py:31 +msgid "July" msgstr "" -#: core/validators.py:143 -#, python-format -msgid "Invalid date: %s" +#: utils/dates.py:19 +msgid "August" msgstr "" -#: core/validators.py:153 -msgid "Enter a valid time in HH:MM format." +#: utils/dates.py:19 +msgid "September" msgstr "" -#: core/validators.py:178 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." +#: utils/dates.py:19 +msgid "October" msgstr "" -#: core/validators.py:185 -#, python-format -msgid "The URL %s does not point to a valid image." +#: utils/dates.py:19 +msgid "November" msgstr "" -#: core/validators.py:189 -#, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +#: utils/dates.py:20 +msgid "December" msgstr "" -#: core/validators.py:197 -#, python-format -msgid "The URL %s does not point to a valid QuickTime video." +#: utils/dates.py:23 +msgid "jan" msgstr "" -#: core/validators.py:201 -msgid "A valid URL is required." +#: utils/dates.py:23 +msgid "feb" msgstr "" -#: core/validators.py:215 -#, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" +#: utils/dates.py:23 +msgid "mar" msgstr "" -#: core/validators.py:222 -#, python-format -msgid "Badly formed XML: %s" +#: utils/dates.py:23 +msgid "apr" msgstr "" -#: core/validators.py:239 -#, python-format -msgid "Invalid URL: %s" +#: utils/dates.py:23 +msgid "may" msgstr "" -#: core/validators.py:244 core/validators.py:246 -#, python-format -msgid "The URL %s is a broken link." +#: utils/dates.py:23 +msgid "jun" msgstr "" -#: core/validators.py:252 -msgid "Enter a valid U.S. state abbreviation." +#: utils/dates.py:24 +msgid "jul" msgstr "" -#: 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] "" -msgstr[1] "" +#: utils/dates.py:24 +msgid "aug" +msgstr "" -#: core/validators.py:273 -#, python-format -msgid "This field must match the '%s' field." +#: utils/dates.py:24 +msgid "sep" msgstr "" -#: core/validators.py:292 -msgid "Please enter something for at least one field." +#: utils/dates.py:24 +msgid "oct" msgstr "" -#: core/validators.py:301 core/validators.py:312 -msgid "Please enter both fields or leave them both empty." +#: utils/dates.py:24 +msgid "nov" msgstr "" -#: core/validators.py:320 -#, python-format -msgid "This field must be given if %(field)s is %(value)s" +#: utils/dates.py:24 +msgid "dec" msgstr "" -#: core/validators.py:333 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" +#: utils/dates.py:31 +msgid "Jan." msgstr "" -#: core/validators.py:352 -msgid "Duplicate values are not allowed." +#: utils/dates.py:31 +msgid "Feb." msgstr "" -#: core/validators.py:367 -#, python-format -msgid "This value must be between %(lower)s and %(upper)s." +#: utils/dates.py:32 +msgid "Aug." msgstr "" -#: core/validators.py:369 -#, python-format -msgid "This value must be at least %s." +#: utils/dates.py:32 +msgid "Sept." msgstr "" -#: core/validators.py:371 -#, python-format -msgid "This value must be no more than %s." +#: utils/dates.py:32 +msgid "Oct." msgstr "" -#: core/validators.py:407 -#, python-format -msgid "This value must be a power of %s." +#: utils/dates.py:32 +msgid "Nov." msgstr "" -#: core/validators.py:418 -msgid "Please enter a valid decimal number." +#: utils/dates.py:32 +msgid "Dec." msgstr "" -#: 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." +#: utils/text.py:127 +msgid "or" +msgstr "" + +#: utils/timesince.py:21 +msgid "year" +msgid_plural "years" msgstr[0] "" msgstr[1] "" -#: 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." +#: utils/timesince.py:22 +msgid "month" +msgid_plural "months" msgstr[0] "" msgstr[1] "" -#: 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." +#: utils/timesince.py:23 +msgid "week" +msgid_plural "weeks" msgstr[0] "" msgstr[1] "" -#: core/validators.py:438 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "" +#: utils/timesince.py:24 +msgid "day" +msgid_plural "days" +msgstr[0] "" +msgstr[1] "" -#: core/validators.py:439 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "" +#: utils/timesince.py:25 +msgid "hour" +msgid_plural "hours" +msgstr[0] "" +msgstr[1] "" -#: core/validators.py:456 -msgid "The format for this field is wrong." -msgstr "" +#: utils/timesince.py:26 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "" +msgstr[1] "" -#: core/validators.py:471 -msgid "This field is invalid." +#: utils/timesince.py:46 +msgid "minutes" msgstr "" -#: core/validators.py:507 +#: utils/timesince.py:51 #, python-format -msgid "Could not retrieve anything from %s." +msgid "%(number)d %(type)s" msgstr "" -#: core/validators.py:510 +#: utils/timesince.py:57 #, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgid ", %(number)d %(type)s" msgstr "" -#: core/validators.py:543 -#, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" +#: utils/translation/trans_real.py:399 +msgid "DATE_FORMAT" +msgstr "N j, Y" -#: 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 "" +#: utils/translation/trans_real.py:400 +msgid "DATETIME_FORMAT" +msgstr "N j, Y, P" -#: core/validators.py:552 -#, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" +#: 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" -#: core/validators.py:557 +#: views/generic/create_update.py:43 #, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" +msgid "The %(verbose_name)s was created successfully." msgstr "" -#: core/validators.py:561 +#: views/generic/create_update.py:117 #, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" +msgid "The %(verbose_name)s was updated successfully." msgstr "" -#: core/validators.py:566 +#: views/generic/create_update.py:184 #, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" +msgid "The %(verbose_name)s was deleted." msgstr "" 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 \n" "Language-Team: LANGUAGE \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/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 %}

      {% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}

      - {% if library.grouper %}

      To use these filters, put {% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %} in your template before using the filter.


      {% endif %} + {% if library.grouper %}

      To use these filters, put {% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %} in your template before using the filter.


      {% endif %} {% for filter in library.list|dictsort:"name" %}

      {{ filter.name }}

      {{ filter.title }}

      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 %}

      {% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}

      - {% if library.grouper %}

      To use these tags, put {% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %} in your template before using the tag.


      {% endif %} + {% if library.grouper %}

      To use these tags, put {% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %} in your template before using the tag.


      {% endif %} {% for tag in library.list|dictsort:"name" %}

      {{ tag.name }}

      {{ tag.title }}

      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 %} -

      {{ view.url|escape }}

      +

      {{ view.url|escape }}

      View function: {{ view.module }}.{{ view.name }}

      {{ view.title }}

      -
      +
      {% endifchanged %} {% endfor %}
      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 + +>>> 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/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 = '' + 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/db/models/base.py b/django/db/models/base.py index 379ed898f6..6b8e8369b0 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 af122b33d9..ddff9bde29 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -399,7 +399,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/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/template/defaultfilters.py b/django/template/defaultfilters.py index e62e2e3eaf..f2be64ef1d 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -25,8 +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)) + 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 @@ -91,7 +91,7 @@ def floatformat(text, arg=-1): """ try: f = float(text) - except ValueError: + except (ValueError, TypeError): return u'' try: d = int(arg) diff --git a/django/utils/cache.py b/django/utils/cache.py index 5654bed7aa..4fcf493944 100644 --- a/django/utils/cache.py +++ b/django/utils/cache.py @@ -74,6 +74,21 @@ def patch_cache_control(response, **kwargs): cc = ', '.join([dictvalue(el) for el in cc.items()]) response['Cache-Control'] = cc +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): """ Adds some useful headers to the given HttpResponse object: @@ -180,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 ffdc73f922..ee156b11d0 100644 --- a/django/utils/datastructures.py +++ b/django/utils/datastructures.py @@ -60,7 +60,10 @@ class SortedDict(dict): 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 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/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..f0e43ffe4e 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -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..6dfe2bf5ee 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 ================== @@ -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/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/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/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/newforms.txt b/docs/newforms.txt index 593e9216d7..810982d788 100644 --- a/docs/newforms.txt +++ b/docs/newforms.txt @@ -753,6 +753,30 @@ For example::
    +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:: + +
    +
    + {% for field in form %} +
    {{ field.label_tag }}{{ field.label }}{% if field.field.required %}*{% endif %}
    +
    {{ field }}
    + {% if field.help_text %}
    {{ field.help_text }}
    {% endif %} + {% if field.errors %}
    {{ field.errors }}
    {% endif %} + {% endfor %} +
    + +
    + +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 -------------------------------- @@ -1849,7 +1873,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 +2123,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/syndication_feeds.txt b/docs/syndication_feeds.txt index 30943591b8..2eb188a737 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 diff --git a/docs/templates_python.txt b/docs/templates_python.txt index 5ac93f5a58..64b67a1333 100644 --- a/docs/templates_python.txt +++ b/docs/templates_python.txt @@ -1183,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/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 +Name: +Steering: +Fuel: +Transmission:
    Leave empty if not applicable. + +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 +Name: +Steering: +Fuel: +Transmission:
    Leave empty if not applicable. """} 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/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/widgets.py b/tests/regressiontests/forms/widgets.py index ea8cf135aa..0e69602103 100644 --- a/tests/regressiontests/forms/widgets.py +++ b/tests/regressiontests/forms/widgets.py @@ -129,6 +129,13 @@ u'' +Boolean values are rendered to their string forms ("True" and "False"). +>>> w = HiddenInput() +>>> w.render('get_spam', False) +u'' +>>> w.render('get_spam', True) +u'' + # MultipleHiddenInput Widget ################################################## >>> w = MultipleHiddenInput() diff --git a/tests/regressiontests/templates/filters.py b/tests/regressiontests/templates/filters.py index 2a06703948..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 > me') + # RESULT SYNTAX -- # 'template_name': ('template contents', 'context dict', # 'expected string output' or Exception class) @@ -227,4 +236,11 @@ def get_filter_tests(): 'chaining12': ('{% autoescape off %}{{ a|cut:"b"|safe }}{% endautoescape %}', {"a": "a < b"}, "a < "), 'chaining13': ('{{ a|safe|force_escape }}', {"a": "a < b"}, "a < b"), 'chaining14': ('{% autoescape off %}{{ a|safe|force_escape }}{% endautoescape %}', {"a": "a < b"}, "a < b"), + + # Filters decorated with stringfilter still respect is_safe. + 'autoescape-stringfilter01': (r'{{ unsafe|capfirst }}', {'unsafe': UnsafeClass()}, 'You & me'), + 'autoescape-stringfilter02': (r'{% autoescape off %}{{ unsafe|capfirst }}{% endautoescape %}', {'unsafe': UnsafeClass()}, 'You & me'), + 'autoescape-stringfilter03': (r'{{ safe|capfirst }}', {'safe': SafeClass()}, 'You > me'), + 'autoescape-stringfilter04': (r'{% autoescape off %}{{ safe|capfirst }}{% endautoescape %}', {'safe': SafeClass()}, 'You > me'), } + diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index f3c131dd91..cbbd88b06c 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -899,7 +899,12 @@ class Templates(unittest.TestCase): # Literal string arguments to filters, if used in the result, are # safe. - 'basic-syntax08': (r'{% autoescape on %}{{ var|default_if_none:" endquote\" hah" }}{% endautoescape %}', {"var": None}, ' endquote" hah'), + '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 & me'), + 'autoescape-tag10': (r'{{ safe }}', {'safe': filters.SafeClass()}, 'you > me'), # The "safe" and "escape" filters cannot work due to internal # implementation details (fortunately, the (no)autoescape block 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) + + -- cgit v1.3