summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-05-14 19:42:13 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-05-14 19:42:13 +0000
commit57ced2560683f7af0c99971dfaaf9c70fca78506 (patch)
tree1130983c1c23993e82a39466f3905a5642769c0d
parent36c508d1ed64695f864df70cd5d4d37b0c9e7a01 (diff)
unicode: Merged from trunk to [5237].
git-svn-id: http://code.djangoproject.com/svn/django/branches/unicode@5241 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS1
-rw-r--r--django/conf/global_settings.py1
-rw-r--r--django/conf/locale/bg/LC_MESSAGES/django.mobin0 -> 51713 bytes
-rw-r--r--django/conf/locale/bg/LC_MESSAGES/django.po2670
-rw-r--r--django/conf/locale/bg/LC_MESSAGES/djangojs.mobin0 -> 1727 bytes
-rw-r--r--django/conf/locale/bg/LC_MESSAGES/djangojs.po106
-rw-r--r--django/contrib/formtools/preview.py11
-rw-r--r--django/core/management.py16
-rw-r--r--django/core/serializers/python.py7
-rw-r--r--django/core/serializers/xml_serializer.py4
-rw-r--r--django/newforms/forms.py14
-rw-r--r--django/newforms/models.py12
-rw-r--r--django/test/testcases.py4
-rw-r--r--docs/newforms.txt28
-rw-r--r--tests/modeltests/model_forms/models.py14
-rw-r--r--tests/regressiontests/forms/regressions.py14
-rw-r--r--tests/regressiontests/forms/tests.py70
-rw-r--r--tests/regressiontests/serializers_regress/models.py10
-rw-r--r--tests/regressiontests/serializers_regress/tests.py6
-rw-r--r--tests/regressiontests/test_client_regress/models.py28
20 files changed, 2931 insertions, 85 deletions
diff --git a/AUTHORS b/AUTHORS
index 486359cc62..7f8eecb0e7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -86,6 +86,7 @@ answer newbie questions, and generally made Django that much better:
Alex Dedul
deric@monowerks.com
Max Derkachev <mderk@yandex.ru>
+ Jordan Dimov <s3x3y1@gmail.com>
dne@mayonnaise.net
Maximillian Dornseif <md@hudora.de>
Jeremy Dunck <http://dunck.us/>
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index f46189c8f7..2a9fa35a35 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -38,6 +38,7 @@ LANGUAGE_CODE = 'en-us'
LANGUAGES = (
('ar', gettext_noop('Arabic')),
('bn', gettext_noop('Bengali')),
+ ('bg', gettext_noop('Bulgarian')),
('ca', gettext_noop('Catalan')),
('cs', gettext_noop('Czech')),
('cy', gettext_noop('Welsh')),
diff --git a/django/conf/locale/bg/LC_MESSAGES/django.mo b/django/conf/locale/bg/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..bfa09dcc23
--- /dev/null
+++ b/django/conf/locale/bg/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/bg/LC_MESSAGES/django.po b/django/conf/locale/bg/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..9c1030685e
--- /dev/null
+++ b/django/conf/locale/bg/LC_MESSAGES/django.po
@@ -0,0 +1,2670 @@
+# translation of django.po to Bulgarian
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-05 01:32+1000\n"
+"PO-Revision-Date: 2007-05-12 17:45+0300\n"
+"Last-Translator: Jordan Dimov <s3x3y1@gmail.com>\n"
+"MIME-Version: 1.0\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 "%(object)s с този %(type)s вече съществува за зададеното %(field)s.s"
+
+#: 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 "Въведете валиден %s."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Множество ID-та се разделят с запетайки"
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Задръжте натиснат клавиша \"Control\" (или \"Command\" на Mac-а) за да направите повече от един избор. "
+
+#: 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] "Въведете валидни %(self)s ID-та. Стойността %(value)r не е валидна."
+msgstr[1] ""
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s с този %(fieldname)s вече съществува."
+
+#: 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 "Тази стойност трябва да бъде True или False."
+
+#: 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 "Тази стойност трябва да бъде None, True, или False."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "арабски"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "бенгалски"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "каталонски"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "чешки"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "уелски"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "датски"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "немски"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "гръцки"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "английски"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "испански"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "аржентински испански"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "финландски"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "френски"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "галицейски"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "унгарски"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "еврит"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "исландски"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "италиански"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "японски"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "каннада (индийски)"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "латвийски"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "македонски"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "холандски"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "норвежки"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "полски"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "португалски"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "бразилски"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "ромънски"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "руски"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "словашки"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "словенски"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "сръбски"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "шведски"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "тамил (индийски)"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "телугу (индийски)"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "турски"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "украински"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "китайски"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "традиционен китайски"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "година"
+msgstr[1] "години"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "месец"
+msgstr[1] "месеци"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "седмица"
+msgstr[1] "седмици"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ден"
+msgstr[1] "дни"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минути"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "понеделник"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "вторник"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "сряда"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "четвъртък"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "петък"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "събота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "неделя"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Януари"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Февруари"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Март"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Април"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Май"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Юни"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Юли"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Август"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Септември"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Октомври"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Ноември"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Декември"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "яну"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "фев"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "мар"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "апр"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "май"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "юни"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "юли"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "авг"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "сеп"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "окт"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "ное"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "дек"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Яну."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Фев."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Авг."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Септ."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Окт."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Ное."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Дек."
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "полунощ"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "обяд"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "j N, Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "j N, Y, P"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Въведеният текст не трябва да надвишава %s символа."
+msgstr[1] ""
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Тук не се допускат нови редове."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Направете валиден избор; '%(data)s' не е сред %(choices)s."
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "Да"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
+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."
+msgstr "Не е получен файл. Проверете типът кодиране на формата. "
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Каченият файл е празен. "
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Въведете цяло число между -32768 и 32767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Въведете положително число. "
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Въведете цяло число между 0 и 32767."
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Въведете пощенски код в формат XXXX."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+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."
+msgstr "Въведете пощенски код в формат XXXXX."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Въведете пощенски код в формат XXXXXXX или XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Въведете пощенски код в формат XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Телефонните номера трябва да бъдат в формат XX-XXXX-XXXX. "
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "Въведете валиден финландски номер на социалната осигуровка."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Въведете пощенски код. Между двете части на пощенския код трябва да има разстояние. "
+
+#: contrib/localflavor/de/forms.py:63
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format"
+msgstr "Въведете валиден номер на германска лична карта в формат XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Въведете zip код в формат XXXXX или XXXXX-XXXX."
+
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Въведете валиден номер на социалната осигуровка в формат XXX-XX-XXXX."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "ключ на сесията"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "данни от сесията"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "дата на валидност"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "сесия"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+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 "Браузерът, който използвате не поддържа cookies, а те са необходими за да можете да се логнете. "
+
+#: 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."
+msgstr "Въведете правилно потребителско име и парола. И двете полета правят разлика между малки и големи букви!"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Този акаунт е деактивиран."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "С този email адрес няма обвързан потребителски акаунт. Сигурни ли сте, че сте се регистрирали?"
+
+#: 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/views.py:39
+msgid "Logged out"
+msgstr "Извън системата"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "име"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "код"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "право"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "права"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "група"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "групи"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "потребител"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Въведете не-повече от 30 символа (само букви, цифри, и подчертавка)"
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "собствено име"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "фамилно име"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "e-mail адрес"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "парола"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr "Въведете '[algo]$[salt]$[hexdigest]' или използвайте <a href=\"password/\">формата за смяна на парола</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "персонал"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Указва дали този потребител има достъп до административния панел."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Указва дали този потребител може да влезе в административния панел . Премахнете тази маркировка вместо да изтривате акаунти. "
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "статут на супер-потребител"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Указва, че този потребител има всички права (без да има нужда да се указват изрично)."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "последен логин"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+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."
+msgstr "Освен ръчно указаните права, този потребител също ще получи правата на всяка група, към която принадлежи. "
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "потребителски права"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "потребител"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "потребители"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Лична информация"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Важни дати"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "съобщение"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "и"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "ви"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "ри"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "ти"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f милион"
+msgstr[1] "%(value).1f милиона"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f милиард"
+msgstr[1] "%(value).1f милиарда"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f трилион"
+msgstr[1] "%(value).1f трилионаn"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "един"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "два"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "три"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "четири"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "пет"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "шест"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "седем"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "осем"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "девет"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "има на класа на модела в Python"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "тип на съдържанието"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "типове съдържание"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "препратка от"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Това трябва да бъде абсолютен път, без името на домейна. Пример: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "препратка към"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Това може да бъде или абсолютен път (като горното) или пълен URL, започващ с 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "препратка"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "препратки"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Пример: '/about/contact/'. Началната и крайната наклонена чертичка са задължителни. "
+
+#: 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 "Пример: 'flatpages/contact_page.html'. Ако това не е указано, системата ще използва 'flatpages/default.html'. "
+
+#: 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/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID на обекта"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "заглавие"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "коментар"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "рейтинг #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "рейтинг #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "рейтинг #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "рейтинг #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "рейтинг #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "рейтинг #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "рейтинг #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "рейтинг #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "е валиден рейтинг"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "дата и час на подаване"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "е публичен"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP адрес"
+
+#: 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:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Content обект"
+
+#: 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"
+msgstr ""
+"Пуснат от %(user)s на %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "име на човека"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip адрес"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "одобрен от персонала"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "свободен коментар"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "свободни коментари"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "точки"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "дата на точкуване"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "кармична точка"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "кармични точки"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d рейтинг от %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Този коментар бе флагнат от %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "дата на флагване"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "потребителски флаг"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "потребителски флагове"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Флаг от %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "дата на изтриване"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "изтриване от модератор"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "изтривания от модератор"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Изтриване от модератор %r"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Потребител:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "Изход"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Парола:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Забравена парола?"
+
+#: 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/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Анонимните потребители не могат да гласуват"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Невалидно ID на коментар"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Не можете да гласувате за себе си"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+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] ""
+"Този коментар е от потребител, който има по-малко от %(count)s "
+"коментар:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Този коментар е от потребител, който има по-малко от %(count)s "
+"коментара:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Този коментар е от съмнителен потребител:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Само POST заявките са позволени"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Едно или повече от задължителните полета липсва"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+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"
+msgstr "Формата за коментарите има невалиден параметър 'target' -- ID-то на обекта е невалидно"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Формата за коментарите не предоставя нито преглед нито постване. "
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "име на домейна"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "наименование"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "сайт"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "сайтове"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>По %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Всички"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Коя-да-е дата"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Днес"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Последните 7 дни"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Този месец"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Тази година"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "време на действие"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id на обекта"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr на обекта"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "флаг за действие"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "смени съобщение"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "записка"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "записки"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+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"
+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"
+msgstr "Документация"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklet-и"
+
+#: 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"
+msgstr "Промени парола"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklet-и за документация"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">За да инсталирате bookmarklet-и, задърпайте линка в bookmarks\n"
+"toolbar-а, или щракнете с десния бутон и добавете линка в отметките. Сега можете да\n"
+"изберете bookmarklet-а от която и да е страница. Някой от тези\n"
+"bookmarklet-и могат да се разглеждат само от компютър, който е маркиран \n"
+"като \"вътрешен\" (приказвайте с администратора ако не сте сигурни дали\n"
+"компютърът ви е \"вътрешен\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+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."
+msgstr "Препраща от която и да е страница към документацията за изгледа, който я е генерирал. "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "ID на обекта"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Показва типът на съдържанието и ID-то на страници, които представляват единичен обект. "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Редактирай този обект (в този прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Отива в админската страница за страници, които представляват единичен обект. "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Редактирай този обект (в нов прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Като горното, но отваря администраторската страница в нов прозорец."
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+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/500.html:4
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Server Error <em>(500)</em>"
+
+#: 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 "Малък проблем. Администраторът на сайта е уведомен за случилото се. Благодарим за проявеното разбиране. "
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " По %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+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/search_form.html:8
+msgid "Go"
+msgstr "Давай"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 резултат"
+msgstr[1] "%(counter)s резултата"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s общо"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "История"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Дата/час"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Потребител"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Действие"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j N, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Този обект няма исторя на промените. Вероятно не е добавен чрез административния панел. "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "Изтриването на обекта %(object_name)s '%(escaped_object)s' не може да бъде извършено без да се изтрият и някой свързани обекти, върху които обаче нямате права: "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Наистина ли искате да затрием обектите %(object_name)s \"%(escaped_object)s\"? "
+"Следните свързани елементи също ще бъдат изтрити:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Абсолютно"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Покажи всички"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добави %(name)s"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Добави"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+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/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Подреждане"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Подредба:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Добре дошли,"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Няма такава страница"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Сори, ама тая страничка липсва. "
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Вход"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Модели в приложението %(name)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: 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/base_site.html:4
+msgid "Django site admin"
+msgstr "Административен панел"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+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:34
+msgid "Password"
+msgstr "Парола"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+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."
+msgstr "Въведете същата парола още веднъж за проверка. "
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Въведете нова парола за потребител <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Сега:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+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/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим Ви, че използвахте този сайт днес. "
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Влез пак"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Получавате този e-mail, защото сте поръчали да Ви бъде издадена нова парола "
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "за Вашия потребителски акаунт в %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Новата Ви парола е: %(new_password)s"
+
+#: 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 "Готините хора от %(site_name)s"
+
+#: 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_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 "Промяна на парола"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Въведете си старата парола (за сигурност), след което въведете желаната нова парола два пъти за да не стават грешки. "
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Стара парола:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Нова парола:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Потвърдете паролата:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Промяна на парола"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Паролата е сменена успешно"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+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 "Забравена парола? Няма проблеми. Въведете си e-mail адреса по-долу и ще ви изпратим нова!"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail адрес:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Нова парола"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Администрация на сайта"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно добавен. "
+
+#: 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 "Може да го редактирате пак по-долу. "
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Може да добавите още един обект %s по-долу. "
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Добави %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Добавен %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Променен %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Изтрит %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Няма променени полета."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно актуализиран. "
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно добавен. Може да го редактирате по-долу. "
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Промени %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Едно или повече %(fieldname)s в %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Едно или повече %(fieldname)s в %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно изтрит. "
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Сериозно?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "История на промените: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Изберете %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за промяна"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+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."
+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."
+msgstr "Браузерът ви май не е настроен да приема cookies. Пуснете ги и заредете страницата на ново. "
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Потребителските имена не могат да съдържат символа '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "E-mail адресът ти не ти е потребителско име. Пробвай '%s'."
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "таг:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "филтър:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "изглед:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Приложението %r липсва"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Моделът %(name)r го няма в приложение %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "свързаният обект `%(label)s.%(type)s` "
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "модел:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "свързани `%(label)s.%(name)s` обекти"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "всички %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "брой %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Полета на %s обекти"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Цяло число"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True или False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Стринг (до %(maxlength)s символа)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Цели числа, разделени с запетая"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Дата (без час)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Дата (и час)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-mail адрес"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Път към файл"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Десетична дроб"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Възможните стойности са True, False или None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Връзка с родителския обект"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Телефонен номер"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "американски щат (две главни букви)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML текст"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s не прилича на обект от тип urlpattern"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Добави потребител"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Паролата бе успешно сменена. "
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Смени парола: %s"
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Тази стойност трябва да има не повече от %d символа. "
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Тази стойност трябва да има поне %d символа. "
+
+#: newforms/fields.py:128 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "Въведете цяло число. "
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Тази стойност трябва да е по-малка или равна на %s. "
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Тази стойност трябва да е по-голяма или равна на %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Въведете валидна дата. "
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Въведете валиден час."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Въведете валидна дата / час. "
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Въведете валидна стойност. "
+
+#: newforms/fields.py:271 core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "Въведете валиден e-mail адрес. "
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Въведете валиден URL. "
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Този URL май е счупен линк. "
+
+#: newforms/fields.py:362 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Направете валиден избор. Този не е един от възможните избори. "
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "Въведете списък от стойности"
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Направете валиден избор. %s не е един от възможните избори. "
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "да,не,може-би"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Обектът %(verbose_name)s бе успешно създаден. "
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Обектът %(verbose_name)s бе успешно актуализиран."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Обектът %(verbose_name)s бе затрит."
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Тази стойност може да съдържа само букви, цифри и подчертавки. "
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Тази стойност може да съдържа само букви, цифри, подчертавки, тиренца и наклонени чертички. "
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Тази стойност трябва да съдържа само букви, цифри, подчертавки или тиренца. "
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Тук не се допускат главни букви. "
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Тук не се допускат малки букви. "
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Въведете само цифри, разделени със запетая. "
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Въведете валидни e-mail адреси разделени със запетая. "
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Въведете валиден IP адрес. "
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Тук не се допускат празни стойности. "
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Тук не се допускат символи, които не са цифри. "
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Тази стойност не може да бъде само цифри. "
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Само букви и цифри се допускат тук. "
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Годината трябва да бъде от 1900 нагоре."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Невалидна дата: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Въведете валиден час във формат ЧЧ:ММ. "
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Качете валидна картинка. Файлът, който сте качили или не е картинка или е развалена. "
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не сочи към валидна картинка. "
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Телефонните номера трябва да бъдат във формат XXX-XXX-XXXX. \"%s\" не е валиден. "
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не сочи към валиден QuickTime видео клип."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Изисква се валиден URL."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Изисква се валиден HTML. Конкретните грешки са:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неправилно форматиран XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Невалиден URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Този URL %s е счупен линк. "
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+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] "Ей-шш! Думичката %s не е позволена тук. "
+msgstr[1] "Ей-шш! Думичките %s не са позволени тук. "
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Това поле трябва да съвпада с полето '%s' ."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Въведете нещичко поне за едното поле. "
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Или въведете и двете полета или ги оставете празни."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Това поле трябва да е зададено ако %(field)s е %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Това поле трябва да е зададено ако %(field)s не е %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Не са позволени стойности, които се повтарят. "
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Тази стойност трябва да бъде между %(lower)s и %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Тази стойност трябва да бъде поне %s. "
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Тази стойност не трябва да надвишава %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Тази стойност трябва да е точна степен на %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+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."
+msgstr[0] "Въведете валидна десетична дроб с не-повече от %s цифра."
+msgstr[1] "Въведете валидна десетична дроб с не-повече от %s цифри. "
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Въведете валидна десетична дроб, цялата част на която да не надхвърля %s цифра."
+msgstr[1] "Въведете валидна десетична дроб, цялата част на която да не надхвърля %s цифри. "
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Въведете валидна десетична дроб с не-повече от %s цифра след десетичната точка."
+msgstr[1] "Въведете валидна десетична дроб с не-повече от %s цифри след десетичната точка. "
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Файлът, който сте качили трябва да бъде поне %s байта."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Размерът на файла, който сте качили не трябва да надхвърля %s байта. "
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Форматът на това поле е грешен."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Това поле не е валидно"
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Не получихме нищо от %s."
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s върна невалиден Content-Type хедър '%(contenttype)s'."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Затворете тага %(tag)s , който е отворен на ред %(line)s. (Редът започва с "
+"\"%(start)s\".)"
+
+#: 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 "Некъв текст на ред %(line)s не е позволен в този контекст. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" на ред %(line)s е невалиден атрибут. (Редът започва с \"%"
+"(start)s\".)"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" на ред %(line)s е невалиден таг. (Редът започва с \"%"
+"(start)s\".)"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "На някой от таговете на ред %(line)s му липсват един или повече задължителни атрибута. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Атрибутът \"%(attr)s\" на ред %(line)s има невалидна стойност. (Редът започва с \"%(start)s\".)"
+
diff --git a/django/conf/locale/bg/LC_MESSAGES/djangojs.mo b/django/conf/locale/bg/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..e912789236
--- /dev/null
+++ b/django/conf/locale/bg/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/bg/LC_MESSAGES/djangojs.po b/django/conf/locale/bg/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..2caffdca53
--- /dev/null
+++ b/django/conf/locale/bg/LC_MESSAGES/djangojs.po
@@ -0,0 +1,106 @@
+# translation of djangojs.po to Bulgarian
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-05-12 17:51+0300\n"
+"Last-Translator: Jordan Dimov <s3x3y1@gmail.com>\n"
+"Language-Team: Bulgarian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Налични %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Избери всички"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Добави"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Премахни"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Избрахме %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Направете своя избор и щракнете "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Изчисти всички"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Януари Февруари Март Април Май Юни Юли Август Септември Октомври Ноември Декември"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Неделя Понеделник Вторник Сряда Четвъртък Петък Събота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Н П В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Сега"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Часовник"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Избери време"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Полунощ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "По обяд"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Отказ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Днес"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Календар"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Утре"
+
diff --git a/django/contrib/formtools/preview.py b/django/contrib/formtools/preview.py
index daecba7928..351d991762 100644
--- a/django/contrib/formtools/preview.py
+++ b/django/contrib/formtools/preview.py
@@ -24,7 +24,7 @@ Usage
Subclass FormPreview and define a done() method:
- def done(self, request, clean_data):
+ def done(self, request, cleaned_data):
# ...
This method takes an HttpRequest object and a dictionary of the form data after
@@ -113,7 +113,7 @@ class FormPreview(object):
if f.is_valid():
if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')):
return self.failed_hash(request) # Security hash failed.
- return self.done(request, f.clean_data)
+ return self.done(request, f.cleaned_data)
else:
return render_to_response(self.form_template,
{'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
@@ -160,6 +160,9 @@ class FormPreview(object):
# METHODS SUBCLASSES MUST OVERRIDE ########################################
- def done(self, request, clean_data):
- "Does something with the clean_data and returns an HttpResponseRedirect."
+ def done(self, request, cleaned_data):
+ """
+ Does something with the cleaned_data and returns an
+ HttpResponseRedirect.
+ """
raise NotImplementedError('You must define a done() method on your %s subclass.' % self.__class__.__name__)
diff --git a/django/core/management.py b/django/core/management.py
index c775b10b36..172aaa8b6e 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -1404,20 +1404,24 @@ def load_data(fixture_labels, verbosity=1):
if verbosity > 1:
print "No %s fixture '%s' in %s." % \
(format, fixture_name, humanize(fixture_dir))
- if count[0] == 0:
- if verbosity > 0:
- print "No fixtures found."
- else:
- if verbosity > 0:
- print "Installed %d object(s) from %d fixture(s)" % tuple(count)
+
+ if count[0] > 0:
sequence_sql = backend.get_sql_sequence_reset(style, models)
if sequence_sql:
if verbosity > 1:
print "Resetting sequences"
for line in sequence_sql:
cursor.execute(line)
+
transaction.commit()
transaction.leave_transaction_management()
+
+ if count[0] == 0:
+ if verbosity > 0:
+ print "No fixtures found."
+ else:
+ if verbosity > 0:
+ print "Installed %d object(s) from %d fixture(s)" % tuple(count)
load_data.help_doc = 'Installs the named fixture(s) in the database'
load_data.args = "[--verbosity] fixture, fixture, ..."
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 29ce6bf9bd..66dbbff335 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -37,7 +37,7 @@ class Serializer(base.Serializer):
def handle_fk_field(self, obj, field):
related = getattr(obj, field.name)
if related is not None:
- related = related._get_pk_val()
+ related = getattr(related, field.rel.field_name)
self._current[field.name] = related
def handle_m2m_field(self, obj, field):
@@ -80,7 +80,10 @@ def Deserializer(object_list, **options):
# Handle FK fields
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.attname] = field.rel.to._meta.pk.to_python(field_value)
+ if field_value:
+ data[field.attname] = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
+ else:
+ data[field.attname] = None
# Handle all other fields
else:
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 3a0fdb5395..633001f5f0 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -82,7 +82,7 @@ class Serializer(base.Serializer):
self._start_relational_field(field)
related = getattr(obj, field.name)
if related is not None:
- self.xml.characters(str(related._get_pk_val()))
+ self.xml.characters(str(getattr(related, field.rel.field_name)))
else:
self.xml.addQuickElement("None")
self.xml.endElement("field")
@@ -181,7 +181,7 @@ class Deserializer(base.Deserializer):
if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
return None
else:
- return field.rel.to._meta.pk.to_python(
+ return field.rel.to._meta.get_field(field.rel.field_name).to_python(
getInnerText(node).strip().encode(self.encoding))
def _handle_m2m_field_node(self, node, field):
diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index 2230057c1d..f76e1f4462 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -169,13 +169,13 @@ class BaseForm(StrAndUnicode):
def full_clean(self):
"""
- Cleans all of self.data and populates self.__errors and self.clean_data.
+ Cleans all of self.data and populates self.__errors and self.cleaned_data.
"""
errors = ErrorDict()
if not self.is_bound: # Stop further processing.
self.__errors = errors
return
- self.clean_data = {}
+ self.cleaned_data = {}
for name, field in self.fields.items():
# value_from_datadict() gets the data from the dictionary.
# Each widget type knows how to retrieve its own data, because some
@@ -183,18 +183,18 @@ class BaseForm(StrAndUnicode):
value = field.widget.value_from_datadict(self.data, self.add_prefix(name))
try:
value = field.clean(value)
- self.clean_data[name] = value
+ self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
- self.clean_data[name] = value
+ self.cleaned_data[name] = value
except ValidationError, e:
errors[name] = e.messages
try:
- self.clean_data = self.clean()
+ self.cleaned_data = self.clean()
except ValidationError, e:
errors[NON_FIELD_ERRORS] = e.messages
if errors:
- delattr(self, 'clean_data')
+ delattr(self, 'cleaned_data')
self.__errors = errors
def clean(self):
@@ -204,7 +204,7 @@ class BaseForm(StrAndUnicode):
not be associated with a particular field; it will have a special-case
association with the field named '__all__'.
"""
- return self.clean_data
+ return self.cleaned_data
class Form(BaseForm):
"A collection of Fields, plus their associated data."
diff --git a/django/newforms/models.py b/django/newforms/models.py
index c89cb9cadd..2fe0e62022 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -15,7 +15,7 @@ __all__ = ('save_instance', 'form_for_model', 'form_for_instance', 'form_for_fie
def save_instance(form, instance, fields=None, fail_message='saved', commit=True):
"""
- Saves bound Form ``form``'s clean_data into model instance ``instance``.
+ Saves bound Form ``form``'s cleaned_data into model instance ``instance``.
Assumes ``form`` has a field for every non-AutoField database field in
``instance``. If commit=True, then the changes to ``instance`` will be
@@ -25,20 +25,20 @@ def save_instance(form, instance, fields=None, fail_message='saved', commit=True
opts = instance.__class__._meta
if form.errors:
raise ValueError("The %s could not be %s because the data didn't validate." % (opts.object_name, fail_message))
- clean_data = form.clean_data
+ cleaned_data = form.cleaned_data
for f in opts.fields:
- if not f.editable or isinstance(f, models.AutoField) or not f.name in clean_data:
+ if not f.editable or isinstance(f, models.AutoField) or not f.name in cleaned_data:
continue
if fields and f.name not in fields:
continue
- setattr(instance, f.name, clean_data[f.name])
+ setattr(instance, f.name, cleaned_data[f.name])
if commit:
instance.save()
for f in opts.many_to_many:
if fields and f.name not in fields:
continue
- if f.name in clean_data:
- setattr(instance, f.attname, clean_data[f.name])
+ if f.name in cleaned_data:
+ setattr(instance, f.attname, cleaned_data[f.name])
# GOTCHA: If many-to-many data is given and commit=False, the many-to-many
# data will be lost. This happens because a many-to-many options cannot be
# set on an object until after it's saved. Maybe we should raise an
diff --git a/django/test/testcases.py b/django/test/testcases.py
index a7aafb1c3f..439dc8ba9e 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -62,7 +62,7 @@ class TestCase(unittest.TestCase):
"""
self.assertEqual(response.status_code, status_code,
- "Response didn't redirect: Reponse code was %d (expected %d)" %
+ "Response didn't redirect as expected: Reponse code was %d (expected %d)" %
(response.status_code, status_code))
scheme, netloc, path, params, query, fragment = urlparse(response['Location'])
self.assertEqual(path, expected_path,
@@ -70,7 +70,7 @@ class TestCase(unittest.TestCase):
redirect_response = self.client.get(path)
self.assertEqual(redirect_response.status_code, target_status_code,
"Couldn't retrieve redirection page '%s': response code was %d (expected %d)" %
- (path, response.status_code, status_code))
+ (path, redirect_response.status_code, target_status_code))
def assertContains(self, response, text, count=1, status_code=200):
"""Assert that a response indicates that a page was retreived successfully,
diff --git a/docs/newforms.txt b/docs/newforms.txt
index 7c861ed405..ed43670960 100644
--- a/docs/newforms.txt
+++ b/docs/newforms.txt
@@ -230,7 +230,7 @@ object. Regardless of whether you pass it a string in the format
it's valid.
Once you've created a ``Form`` instance with a set of data and validated it,
-you can access the clean data via the ``clean_data`` attribute of the ``Form``
+you can access the clean data via the ``cleaned_data`` attribute of the ``Form``
object::
>>> data = {'subject': 'hello',
@@ -240,7 +240,7 @@ object::
>>> f = ContactForm(data)
>>> f.is_valid()
True
- >>> f.clean_data
+ >>> f.cleaned_data
{'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'}
Note that any text-based field -- such as ``CharField`` or ``EmailField`` --
@@ -248,7 +248,7 @@ always cleans the input into a Unicode string. We'll cover the encoding
implications later in this document.
If your data does *not* validate, your ``Form`` instance will not have a
-``clean_data`` attribute::
+``cleaned_data`` attribute::
>>> data = {'subject': '',
... 'message': 'Hi there',
@@ -257,15 +257,15 @@ If your data does *not* validate, your ``Form`` instance will not have a
>>> f = ContactForm(data)
>>> f.is_valid()
False
- >>> f.clean_data
+ >>> f.cleaned_data
Traceback (most recent call last):
...
- AttributeError: 'ContactForm' object has no attribute 'clean_data'
+ AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
-``clean_data`` will always *only* contain a key for fields defined in the
+``cleaned_data`` will always *only* contain a key for fields defined in the
``Form``, even if you pass extra data when you define the ``Form``. In this
example, we pass a bunch of extra fields to the ``ContactForm`` constructor,
-but ``clean_data`` contains only the form's fields::
+but ``cleaned_data`` contains only the form's fields::
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
@@ -277,13 +277,13 @@ but ``clean_data`` contains only the form's fields::
>>> f = ContactForm(data)
>>> f.is_valid()
True
- >>> f.clean_data # Doesn't contain extra_field_1, etc.
+ >>> f.cleaned_data # Doesn't contain extra_field_1, etc.
{'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'}
-``clean_data`` will include a key and value for *all* fields defined in the
+``cleaned_data`` will include a key and value for *all* fields defined in the
``Form``, even if the data didn't include a value for fields that are not
required. In this example, the data dictionary doesn't include a value for the
-``nick_name`` field, but ``clean_data`` includes it, with an empty value::
+``nick_name`` field, but ``cleaned_data`` includes it, with an empty value::
>>> class OptionalPersonForm(Form):
... first_name = CharField()
@@ -293,10 +293,10 @@ required. In this example, the data dictionary doesn't include a value for the
>>> f = OptionalPersonForm(data)
>>> f.is_valid()
True
- >>> f.clean_data
+ >>> f.cleaned_data
{'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'}
-In this above example, the ``clean_data`` value for ``nick_name`` is set to an
+In this above example, the ``cleaned_data`` value for ``nick_name`` is set to an
empty string, because ``nick_name`` is ``CharField``, and ``CharField``\s treat
empty values as an empty string. Each field type knows what its "blank" value
is -- e.g., for ``DateField``, it's ``None`` instead of the empty string.
@@ -308,10 +308,10 @@ It's meaningless to request "clean" data in a form with no data, but, for the
record, here's what happens with unbound forms::
>>> f = ContactForm()
- >>> f.clean_data
+ >>> f.cleaned_data
Traceback (most recent call last):
...
- AttributeError: 'ContactForm' object has no attribute 'clean_data'
+ AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
Outputting forms as HTML
------------------------
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index 409cf83fcb..f60aa0ac1d 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -18,7 +18,7 @@ other Form, with one additional method: save(). The save()
method updates the model instance. It also takes a commit=True parameter.
The function django.newforms.save_instance() takes a bound form instance and a
-model instance and saves the form's clean_data into the instance. It also takes
+model instance and saves the form's cleaned_data into the instance. It also takes
a commit=True parameter.
"""
@@ -94,7 +94,7 @@ __test__ = {'API_TESTS': """
>>> f = CategoryForm({'name': 'Entertainment', 'url': 'entertainment'})
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'url': u'entertainment', 'name': u'Entertainment'}
>>> obj = f.save()
>>> obj
@@ -105,7 +105,7 @@ True
>>> f = CategoryForm({'name': "It's a test", 'url': 'test'})
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'url': u'test', 'name': u"It's a test"}
>>> obj = f.save()
>>> obj
@@ -119,7 +119,7 @@ save() on the resulting model instance.
>>> f = CategoryForm({'name': 'Third test', 'url': 'third'})
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'url': u'third', 'name': u'Third test'}
>>> obj = f.save(commit=False)
>>> obj
@@ -134,10 +134,10 @@ If you call save() with invalid data, you'll get a ValueError.
>>> f = CategoryForm({'name': '', 'url': 'foo'})
>>> f.errors
{'name': [u'This field is required.']}
->>> f.clean_data
+>>> f.cleaned_data
Traceback (most recent call last):
...
-AttributeError: 'CategoryForm' object has no attribute 'clean_data'
+AttributeError: 'CategoryForm' object has no attribute 'cleaned_data'
>>> f.save()
Traceback (most recent call last):
...
@@ -524,6 +524,6 @@ ValidationError: [u'Select a valid choice. 10 is not one of the available choice
>>> f = PhoneNumberForm({'phone': '(312) 555-1212', 'description': 'Assistance'})
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'phone': u'312-555-1212', 'description': u'Assistance'}
"""}
diff --git a/tests/regressiontests/forms/regressions.py b/tests/regressiontests/forms/regressions.py
index 8cf699da33..c160ccbd01 100644
--- a/tests/regressiontests/forms/regressions.py
+++ b/tests/regressiontests/forms/regressions.py
@@ -52,4 +52,18 @@ Russian abbreviations "мес." and "шт.".
u'\u0448\u0442.'
>>> f.clean('\xd1\x88\xd1\x82.')
u'\u0448\u0442.'
+
+#######################
+# Miscellaneous Tests #
+#######################
+
+There once was a problem with Form fields called "data". Let's make sure that
+doesn't come back.
+>>> class DataForm(Form):
+... data = CharField(max_length=10)
+>>> f = DataForm({'data': 'xyzzy'})
+>>> f.is_valid()
+True
+>>> f.cleaned_data
+{'data': u'xyzzy'}
"""
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index 615cb2247b..5afa3d198d 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -1774,7 +1774,7 @@ True
u''
>>> p.errors.as_text()
u''
->>> p.clean_data
+>>> p.cleaned_data
{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
>>> print p['first_name']
<input type="text" name="first_name" value="John" id="id_first_name" />
@@ -1810,10 +1810,10 @@ True
{'first_name': [u'This field is required.'], 'last_name': [u'This field is required.'], 'birthday': [u'This field is required.']}
>>> p.is_valid()
False
->>> p.clean_data
+>>> p.cleaned_data
Traceback (most recent call last):
...
-AttributeError: 'Person' object has no attribute 'clean_data'
+AttributeError: 'Person' object has no attribute 'cleaned_data'
>>> print p
<tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr>
<tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr>
@@ -1844,10 +1844,10 @@ False
{}
>>> p.is_valid()
False
->>> p.clean_data
+>>> p.cleaned_data
Traceback (most recent call last):
...
-AttributeError: 'Person' object has no attribute 'clean_data'
+AttributeError: 'Person' object has no attribute 'cleaned_data'
>>> print p
<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" id="id_first_name" /></td></tr>
<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
@@ -1886,10 +1886,10 @@ u'<ul class="errorlist"><li>first_name<ul class="errorlist"><li>This field is re
* This field is required.
* birthday
* This field is required.
->>> p.clean_data
+>>> p.cleaned_data
Traceback (most recent call last):
...
-AttributeError: 'Person' object has no attribute 'clean_data'
+AttributeError: 'Person' object has no attribute 'cleaned_data'
>>> p['first_name'].errors
[u'This field is required.']
>>> p['first_name'].errors.as_ul()
@@ -1905,21 +1905,21 @@ u'* This field is required.'
>>> print p['birthday']
<input type="text" name="birthday" id="id_birthday" />
-clean_data will always *only* contain a key for fields defined in the
+cleaned_data will always *only* contain a key for fields defined in the
Form, even if you pass extra data when you define the Form. In this
example, we pass a bunch of extra fields to the form constructor,
-but clean_data contains only the form's fields.
+but cleaned_data contains only the form's fields.
>>> data = {'first_name': u'John', 'last_name': u'Lennon', 'birthday': u'1940-10-9', 'extra1': 'hello', 'extra2': 'hello'}
>>> p = Person(data)
>>> p.is_valid()
True
->>> p.clean_data
+>>> p.cleaned_data
{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
-clean_data will include a key and value for *all* fields defined in the Form,
+cleaned_data will include a key and value for *all* fields defined in the Form,
even if the Form's data didn't include a value for fields that are not
required. In this example, the data dictionary doesn't include a value for the
-"nick_name" field, but clean_data includes it. For CharFields, it's set to the
+"nick_name" field, but cleaned_data includes it. For CharFields, it's set to the
empty string.
>>> class OptionalPersonForm(Form):
... first_name = CharField()
@@ -1929,7 +1929,7 @@ empty string.
>>> f = OptionalPersonForm(data)
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'}
For DateFields, it's set to None.
@@ -1941,7 +1941,7 @@ For DateFields, it's set to None.
>>> f = OptionalPersonForm(data)
>>> f.is_valid()
True
->>> f.clean_data
+>>> f.cleaned_data
{'birth_date': None, 'first_name': u'John', 'last_name': u'Lennon'}
"auto_id" tells the Form to add an "id" attribute to each form element.
@@ -2292,19 +2292,19 @@ returns a list of input.
>>> f = SongForm({'name': 'Yesterday', 'composers': ['J']}, auto_id=False)
>>> f.errors
{}
->>> f.clean_data
+>>> f.cleaned_data
{'composers': [u'J'], 'name': u'Yesterday'}
>>> f = SongForm({'name': 'Yesterday', 'composers': ['J', 'P']}, auto_id=False)
>>> f.errors
{}
->>> f.clean_data
+>>> f.cleaned_data
{'composers': [u'J', u'P'], 'name': u'Yesterday'}
Validation errors are HTML-escaped when output as HTML.
>>> class EscapingForm(Form):
... special_name = CharField()
... def clean_special_name(self):
-... raise ValidationError("Something's wrong with '%s'" % self.clean_data['special_name'])
+... raise ValidationError("Something's wrong with '%s'" % self.cleaned_data['special_name'])
>>> f = EscapingForm({'special_name': "Nothing to escape"}, auto_id=False)
>>> print f
@@ -2319,7 +2319,7 @@ There are a couple of ways to do multiple-field validation. If you want the
validation message to be associated with a particular field, implement the
clean_XXX() method on the Form, where XXX is the field name. As in
Field.clean(), the clean_XXX() method should return the cleaned value. In the
-clean_XXX() method, you have access to self.clean_data, which is a dictionary
+clean_XXX() method, you have access to self.cleaned_data, which is a dictionary
of all the data that has been cleaned *so far*, in order by the fields,
including the current field (e.g., the field XXX if you're in clean_XXX()).
>>> class UserRegistration(Form):
@@ -2327,9 +2327,9 @@ including the current field (e.g., the field XXX if you're in clean_XXX()).
... password1 = CharField(widget=PasswordInput)
... password2 = CharField(widget=PasswordInput)
... def clean_password2(self):
-... if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
+... if self.cleaned_data.get('password1') and self.cleaned_data.get('password2') and self.cleaned_data['password1'] != self.cleaned_data['password2']:
... raise ValidationError(u'Please make sure your passwords match.')
-... return self.clean_data['password2']
+... return self.cleaned_data['password2']
>>> f = UserRegistration(auto_id=False)
>>> f.errors
{}
@@ -2342,14 +2342,14 @@ including the current field (e.g., the field XXX if you're in clean_XXX()).
>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False)
>>> f.errors
{}
->>> f.clean_data
+>>> f.cleaned_data
{'username': u'adrian', 'password1': u'foo', 'password2': u'foo'}
Another way of doing multiple-field validation is by implementing the
Form's clean() method. If you do this, any ValidationError raised by that
method will not be associated with a particular field; it will have a
special-case association with the field named '__all__'.
-Note that in Form.clean(), you have access to self.clean_data, a dictionary of
+Note that in Form.clean(), you have access to self.cleaned_data, a dictionary of
all the fields/values that have *not* raised a ValidationError. Also note
Form.clean() is required to return a dictionary of all clean data.
>>> class UserRegistration(Form):
@@ -2357,9 +2357,9 @@ Form.clean() is required to return a dictionary of all clean data.
... password1 = CharField(widget=PasswordInput)
... password2 = CharField(widget=PasswordInput)
... def clean(self):
-... if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
+... if self.cleaned_data.get('password1') and self.cleaned_data.get('password2') and self.cleaned_data['password1'] != self.cleaned_data['password2']:
... raise ValidationError(u'Please make sure your passwords match.')
-... return self.clean_data
+... return self.cleaned_data
>>> f = UserRegistration(auto_id=False)
>>> f.errors
{}
@@ -2386,7 +2386,7 @@ Form.clean() is required to return a dictionary of all clean data.
>>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False)
>>> f.errors
{}
->>> f.clean_data
+>>> f.cleaned_data
{'username': u'adrian', 'password1': u'foo', 'password2': u'foo'}
# Dynamic construction ########################################################
@@ -2954,7 +2954,7 @@ actual field name.
{}
>>> p.is_valid()
True
->>> p.clean_data
+>>> p.cleaned_data
{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
Let's try submitting some bad data to make sure form.errors and field.errors
@@ -2998,12 +2998,12 @@ of the same form.
>>> p1 = Person(data, prefix='person1')
>>> p1.is_valid()
True
->>> p1.clean_data
+>>> p1.cleaned_data
{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
>>> p2 = Person(data, prefix='person2')
>>> p2.is_valid()
True
->>> p2.clean_data
+>>> p2.cleaned_data
{'first_name': u'Jim', 'last_name': u'Morrison', 'birthday': datetime.date(1943, 12, 8)}
By default, forms append a hyphen between the prefix and the field name, but a
@@ -3029,7 +3029,7 @@ self.prefix.
>>> p = Person(data, prefix='foo')
>>> p.is_valid()
True
->>> p.clean_data
+>>> p.cleaned_data
{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
# Forms with NullBooleanFields ################################################
@@ -3091,16 +3091,16 @@ is different than its data. This is handled transparently, though.
... password1 = CharField(widget=PasswordInput)
... password2 = CharField(widget=PasswordInput)
... def clean(self):
-... if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
+... if self.cleaned_data.get('password1') and self.cleaned_data.get('password2') and self.cleaned_data['password1'] != self.cleaned_data['password2']:
... raise ValidationError(u'Please make sure your passwords match.')
-... return self.clean_data
+... return self.cleaned_data
>>> def my_function(method, post_data):
... if method == 'POST':
... form = UserRegistration(post_data, auto_id=False)
... else:
... form = UserRegistration(auto_id=False)
... if form.is_valid():
-... return 'VALID: %r' % form.clean_data
+... return 'VALID: %r' % form.cleaned_data
... t = Template('<form action="" method="post">\n<table>\n{{ form }}\n</table>\n<input type="submit" />\n</form>')
... return t.render(Context({'form': form}))
@@ -3138,9 +3138,9 @@ VALID: {'username': u'adrian', 'password1': u'secret', 'password2': u'secret'}
... password1 = CharField(widget=PasswordInput)
... password2 = CharField(widget=PasswordInput)
... def clean(self):
-... if self.clean_data.get('password1') and self.clean_data.get('password2') and self.clean_data['password1'] != self.clean_data['password2']:
+... if self.cleaned_data.get('password1') and self.cleaned_data.get('password2') and self.cleaned_data['password1'] != self.cleaned_data['password2']:
... raise ValidationError(u'Please make sure your passwords match.')
-... return self.clean_data
+... return self.cleaned_data
You have full flexibility in displaying form fields in a template. Just pass a
Form instance to the template, and use "dot" access to refer to individual
@@ -3490,7 +3490,7 @@ ValidationError: [u'This field is required.']
</select>
<input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" /><input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" /></td></tr>
->>> f.clean_data
+>>> f.cleaned_data
{'field1': u'some text,JP,2007-04-25 06:24:00'}
#################################
diff --git a/tests/regressiontests/serializers_regress/models.py b/tests/regressiontests/serializers_regress/models.py
index c287b6e0d6..fea5c94cab 100644
--- a/tests/regressiontests/serializers_regress/models.py
+++ b/tests/regressiontests/serializers_regress/models.py
@@ -100,6 +100,12 @@ class Anchor(models.Model):
something for other models to point at"""
data = models.CharField(maxlength=30)
+
+class UniqueAnchor(models.Model):
+ """This is a model that can be used as
+ something for other models to point at"""
+
+ data = models.CharField(unique=True, maxlength=30)
class FKData(models.Model):
data = models.ForeignKey(Anchor, null=True)
@@ -116,6 +122,10 @@ class FKSelfData(models.Model):
class M2MSelfData(models.Model):
data = models.ManyToManyField('self', null=True, symmetrical=False)
+
+class FKDataToField(models.Model):
+ data = models.ForeignKey(UniqueAnchor, null=True, to_field='data')
+
# The following test classes are for validating the
# deserialization of objects that use a user-defined
# field as the primary key.
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
index 97b3fbacbe..317739dac4 100644
--- a/tests/regressiontests/serializers_regress/tests.py
+++ b/tests/regressiontests/serializers_regress/tests.py
@@ -159,6 +159,7 @@ The end."""),
(data_obj, 300, Anchor, "Anchor 1"),
(data_obj, 301, Anchor, "Anchor 2"),
+ (data_obj, 302, UniqueAnchor, "UAnchor 1"),
(fk_obj, 400, FKData, 300), # Post reference
(fk_obj, 401, FKData, 500), # Pre reference
@@ -184,8 +185,13 @@ The end."""),
(m2m_obj, 445, M2MSelfData, []),
(m2m_obj, 446, M2MSelfData, []),
+ (fk_obj, 450, FKDataToField, "UAnchor 1"),
+ (fk_obj, 451, FKDataToField, "UAnchor 2"),
+ (fk_obj, 452, FKDataToField, None),
+
(data_obj, 500, Anchor, "Anchor 3"),
(data_obj, 501, Anchor, "Anchor 4"),
+ (data_obj, 502, UniqueAnchor, "UAnchor 2"),
(pk_obj, 601, BooleanPKData, True),
(pk_obj, 602, BooleanPKData, False),
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index 53699f3140..096682ad39 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -60,7 +60,35 @@ class AssertTemplateUsedTests(TestCase):
self.assertTemplateUsed(response, "Valid POST Template")
except AssertionError, e:
self.assertEquals(str(e), "Template 'Valid POST Template' was not one of the templates used to render the response. Templates used: form_view.html, base.html")
+
+class AssertRedirectsTests(TestCase):
+ def test_redirect_page(self):
+ "An assertion is raised if the original page couldn't be retrieved as expected"
+ # This page will redirect with code 301, not 302
+ response = self.client.get('/test_client/permanent_redirect_view/')
+ try:
+ self.assertRedirects(response, '/test_client/get_view/')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Response didn't redirect as expected: Reponse code was 301 (expected 302)")
+
+ def test_incorrect_target(self):
+ "An assertion is raised if the response redirects to another target"
+ response = self.client.get('/test_client/permanent_redirect_view/')
+ try:
+ # Should redirect to get_view
+ self.assertRedirects(response, '/test_client/some_view/')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Response didn't redirect as expected: Reponse code was 301 (expected 302)")
+ def test_target_page(self):
+ "An assertion is raised if the reponse redirect target cannot be retrieved as expected"
+ response = self.client.get('/test_client/double_redirect_view/')
+ try:
+ # The redirect target responds with a 301 code, not 200
+ self.assertRedirects(response, '/test_client/permanent_redirect_view/')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Couldn't retrieve redirection page '/test_client/permanent_redirect_view/': response code was 301 (expected 200)")
+
class AssertFormErrorTests(TestCase):
def test_unknown_form(self):
"An assertion is raised if the form name is unknown"