summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Long <indirecthit@gmail.com>2007-06-17 22:18:54 +0000
committerChristopher Long <indirecthit@gmail.com>2007-06-17 22:18:54 +0000
commitae22b6d403dcf25098c77f0dfcf59ae58b186461 (patch)
treec37fc631e99a7e4d909d6b6d236f495003731ea7
parent0cf7bc439129c66df8d64601e885f83b256b4f25 (diff)
downloaddjango-ae22b6d403dcf25098c77f0dfcf59ae58b186461.tar.gz
per-object-permissions: Merged to trunk [5486] NOTE: Not fully tested, will be working on this over the next few weeks.
git-svn-id: http://code.djangoproject.com/svn/django/branches/per-object-permissions@5488 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS96
-rw-r--r--MANIFEST.in15
-rw-r--r--django/__init__.py9
-rwxr-xr-xdjango/bin/compile-messages.py21
-rw-r--r--django/bin/daily_cleanup.py12
-rwxr-xr-xdjango/bin/make-messages.py4
-rw-r--r--django/bin/profiling/gather_profile_stats.py2
-rw-r--r--django/conf/__init__.py7
-rw-r--r--django/conf/global_settings.py35
-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/conf/locale/ca/LC_MESSAGES/django.mobin0 -> 49408 bytes
-rw-r--r--django/conf/locale/ca/LC_MESSAGES/django.po3034
-rw-r--r--django/conf/locale/ca/LC_MESSAGES/djangojs.mobin0 -> 1646 bytes
-rw-r--r--django/conf/locale/ca/LC_MESSAGES/djangojs.po120
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.mobin38123 -> 44039 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.po3373
-rw-r--r--django/conf/locale/de/LC_MESSAGES/djangojs.mobin1460 -> 1569 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/djangojs.po20
-rw-r--r--django/conf/locale/el/LC_MESSAGES/django.mobin15668 -> 15638 bytes
-rw-r--r--django/conf/locale/el/LC_MESSAGES/django.po6
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.mobin627 -> 627 bytes
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.po2742
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.mobin28941 -> 40333 bytes
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.po3200
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.mobin37293 -> 44251 bytes
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.po3111
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/djangojs.mobin1576 -> 1576 bytes
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/djangojs.po9
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/django.mobin33598 -> 34867 bytes
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/django.po67
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.mobin32919 -> 46214 bytes
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.po2699
-rw-r--r--django/conf/locale/he/LC_MESSAGES/django.mobin36826 -> 48281 bytes
-rw-r--r--django/conf/locale/he/LC_MESSAGES/django.po2660
-rw-r--r--django/conf/locale/he/LC_MESSAGES/djangojs.mobin1626 -> 1716 bytes
-rw-r--r--django/conf/locale/he/LC_MESSAGES/djangojs.po65
-rw-r--r--django/conf/locale/it/LC_MESSAGES/django.mobin32320 -> 40774 bytes
-rw-r--r--django/conf/locale/it/LC_MESSAGES/django.po3338
-rw-r--r--django/conf/locale/it/LC_MESSAGES/djangojs.mobin1613 -> 1643 bytes
-rw-r--r--django/conf/locale/it/LC_MESSAGES/djangojs.po96
-rw-r--r--django/conf/locale/ja/LC_MESSAGES/django.mobin41208 -> 47042 bytes
-rw-r--r--django/conf/locale/ja/LC_MESSAGES/django.po768
-rw-r--r--django/conf/locale/ja/LC_MESSAGES/djangojs.mobin1604 -> 1601 bytes
-rw-r--r--django/conf/locale/ja/LC_MESSAGES/djangojs.po14
-rw-r--r--django/conf/locale/kn/LC_MESSAGES/django.mobin0 -> 57878 bytes
-rw-r--r--django/conf/locale/kn/LC_MESSAGES/django.po2533
-rw-r--r--django/conf/locale/kn/LC_MESSAGES/djangojs.mobin0 -> 2205 bytes
-rw-r--r--django/conf/locale/kn/LC_MESSAGES/djangojs.po116
-rw-r--r--django/conf/locale/ko/LC_MESSAGES/django.mobin0 -> 42603 bytes
-rw-r--r--django/conf/locale/ko/LC_MESSAGES/django.po2797
-rw-r--r--django/conf/locale/ko/LC_MESSAGES/djangojs.mobin0 -> 1577 bytes
-rw-r--r--django/conf/locale/ko/LC_MESSAGES/djangojs.po118
-rw-r--r--django/conf/locale/lv/LC_MESSAGES/django.mobin0 -> 38363 bytes
-rw-r--r--django/conf/locale/lv/LC_MESSAGES/django.po2865
-rw-r--r--django/conf/locale/lv/LC_MESSAGES/djangojs.mobin0 -> 1587 bytes
-rw-r--r--django/conf/locale/lv/LC_MESSAGES/djangojs.po119
-rw-r--r--django/conf/locale/mk/LC_MESSAGES/django.mobin0 -> 57210 bytes
-rw-r--r--django/conf/locale/mk/LC_MESSAGES/django.po2755
-rw-r--r--django/conf/locale/mk/LC_MESSAGES/djangojs.mobin0 -> 1921 bytes
-rw-r--r--django/conf/locale/mk/LC_MESSAGES/djangojs.po119
-rw-r--r--django/conf/locale/nl/LC_MESSAGES/django.mobin32146 -> 38003 bytes
-rw-r--r--django/conf/locale/nl/LC_MESSAGES/django.po783
-rw-r--r--django/conf/locale/no/LC_MESSAGES/django.mobin27469 -> 31943 bytes
-rw-r--r--django/conf/locale/no/LC_MESSAGES/django.po231
-rw-r--r--django/conf/locale/no/LC_MESSAGES/djangojs.mobin1492 -> 1540 bytes
-rw-r--r--django/conf/locale/no/LC_MESSAGES/djangojs.po15
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.mobin28373 -> 43442 bytes
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.po2696
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/djangojs.mobin0 -> 1564 bytes
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/djangojs.po112
-rw-r--r--django/conf/locale/pt/LC_MESSAGES/django.mobin0 -> 37681 bytes
-rw-r--r--django/conf/locale/pt/LC_MESSAGES/django.po2125
-rw-r--r--django/conf/locale/pt/LC_MESSAGES/djangojs.mobin0 -> 1514 bytes
-rw-r--r--django/conf/locale/pt/LC_MESSAGES/djangojs.po108
-rw-r--r--django/conf/locale/pt_BR/LC_MESSAGES/django.mobin28462 -> 30723 bytes
-rw-r--r--django/conf/locale/pt_BR/LC_MESSAGES/django.po2321
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.mobin42820 -> 56778 bytes
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.po2715
-rw-r--r--django/conf/locale/sk/LC_MESSAGES/django.mobin32375 -> 41205 bytes
-rw-r--r--django/conf/locale/sk/LC_MESSAGES/django.po2563
-rw-r--r--django/conf/locale/sk/LC_MESSAGES/djangojs.mobin1492 -> 1539 bytes
-rw-r--r--django/conf/locale/sk/LC_MESSAGES/djangojs.po77
-rw-r--r--django/conf/locale/sl/LC_MESSAGES/django.mobin33224 -> 32469 bytes
-rw-r--r--django/conf/locale/sl/LC_MESSAGES/django.po265
-rw-r--r--django/conf/locale/sl/LC_MESSAGES/djangojs.mobin0 -> 1523 bytes
-rw-r--r--django/conf/locale/sl/LC_MESSAGES/djangojs.po107
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/django.mobin29583 -> 32246 bytes
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/django.po695
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/djangojs.mobin1699 -> 1669 bytes
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/djangojs.po13
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/django.mobin29118 -> 45632 bytes
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/django.po2912
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/djangojs.mobin905 -> 1680 bytes
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/djangojs.po86
-rw-r--r--django/conf/locale/ta/LC_MESSAGES/django.mobin52050 -> 60022 bytes
-rw-r--r--django/conf/locale/ta/LC_MESSAGES/django.po1187
-rw-r--r--django/conf/locale/ta/LC_MESSAGES/djangojs.mobin0 -> 2336 bytes
-rw-r--r--django/conf/locale/ta/LC_MESSAGES/djangojs.po112
-rw-r--r--django/conf/locale/te/LC_MESSAGES/django.mobin0 -> 35163 bytes
-rw-r--r--django/conf/locale/te/LC_MESSAGES/django.po2109
-rw-r--r--django/conf/locale/te/LC_MESSAGES/djangojs.mobin0 -> 2206 bytes
-rw-r--r--django/conf/locale/te/LC_MESSAGES/djangojs.po110
-rw-r--r--django/conf/locale/tr/LC_MESSAGES/django.mobin37149 -> 38712 bytes
-rw-r--r--django/conf/locale/tr/LC_MESSAGES/django.po1581
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.mobin30798 -> 30798 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.po2
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mobin1505 -> 1498 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po2
-rw-r--r--django/conf/project_template/settings.py12
-rw-r--r--django/conf/urls/admin_password_reset.py6
-rw-r--r--django/conf/urls/defaults.py31
-rw-r--r--django/conf/urls/registration.py19
-rw-r--r--django/contrib/admin/media/css/forms.css5
-rw-r--r--django/contrib/admin/media/js/urlify.js2
-rw-r--r--django/contrib/admin/row_level_perm_manipulator.py2
-rw-r--r--django/contrib/admin/templates/admin/auth/user/change_password.html52
-rw-r--r--django/contrib/admin/templatetags/admin_list.py51
-rw-r--r--django/contrib/admin/templatetags/admin_modify.py25
-rw-r--r--django/contrib/admin/templatetags/adminapplist.py4
-rw-r--r--django/contrib/admin/templatetags/log.py13
-rw-r--r--django/contrib/admin/urls.py2
-rw-r--r--django/contrib/admin/views/auth.py41
-rw-r--r--django/contrib/admin/views/decorators.py12
-rw-r--r--django/contrib/admin/views/doc.py9
-rw-r--r--django/contrib/admin/views/main.py62
-rw-r--r--django/contrib/admin/views/row_level_permissions.py3
-rw-r--r--django/contrib/auth/__init__.py9
-rw-r--r--django/contrib/auth/decorators.py9
-rw-r--r--django/contrib/auth/forms.py16
-rw-r--r--django/contrib/auth/models.py29
-rw-r--r--django/contrib/auth/views.py15
-rw-r--r--django/contrib/comments/feeds.py9
-rw-r--r--django/contrib/comments/models.py2
-rw-r--r--django/contrib/comments/templates/comments/form.html2
-rw-r--r--django/contrib/comments/templatetags/comments.py22
-rw-r--r--django/contrib/comments/views/comments.py12
-rw-r--r--django/contrib/contenttypes/generic.py (renamed from django/db/models/fields/generic.py)3
-rw-r--r--django/contrib/contenttypes/management.py1
-rw-r--r--django/contrib/contenttypes/models.py24
-rw-r--r--django/contrib/databrowse/__init__.py1
-rw-r--r--django/contrib/databrowse/datastructures.py192
-rw-r--r--django/contrib/databrowse/plugins/__init__.py (renamed from tests/regressiontests/markup/__init__.py)0
-rw-r--r--django/contrib/databrowse/plugins/calendars.py84
-rw-r--r--django/contrib/databrowse/plugins/fieldchoices.py72
-rw-r--r--django/contrib/databrowse/plugins/objects.py14
-rw-r--r--django/contrib/databrowse/sites.py148
-rw-r--r--django/contrib/databrowse/templates/databrowse/base.html58
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_day.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_homepage.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_main.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_month.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_year.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/choice_detail.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/choice_list.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/fieldchoice_list.html17
-rw-r--r--django/contrib/databrowse/templates/databrowse/homepage.html21
-rw-r--r--django/contrib/databrowse/templates/databrowse/model_detail.html19
-rw-r--r--django/contrib/databrowse/templates/databrowse/object_detail.html41
-rw-r--r--django/contrib/databrowse/urls.py20
-rw-r--r--django/contrib/databrowse/views.py23
-rw-r--r--django/contrib/flatpages/models.py2
-rw-r--r--django/contrib/formtools/preview.py26
-rw-r--r--django/contrib/formtools/templates/formtools/form.html2
-rw-r--r--django/contrib/formtools/templates/formtools/preview.html4
-rw-r--r--django/contrib/humanize/templatetags/humanize.py17
-rw-r--r--django/contrib/localflavor/__init__.py (renamed from tests/regressiontests/markup/models.py)0
-rw-r--r--django/contrib/localflavor/au/__init__.py0
-rw-r--r--django/contrib/localflavor/au/au_states.py17
-rw-r--r--django/contrib/localflavor/au/forms.py43
-rw-r--r--django/contrib/localflavor/br/__init__.py0
-rw-r--r--django/contrib/localflavor/br/br_states.py37
-rw-r--r--django/contrib/localflavor/br/forms.py119
-rw-r--r--django/contrib/localflavor/ch/__init__.py0
-rw-r--r--django/contrib/localflavor/ch/ch_states.py31
-rw-r--r--django/contrib/localflavor/ch/forms.py109
-rw-r--r--django/contrib/localflavor/cl/__init__.py0
-rw-r--r--django/contrib/localflavor/cl/forms.py78
-rw-r--r--django/contrib/localflavor/de/__init__.py0
-rw-r--r--django/contrib/localflavor/de/de_states.py21
-rw-r--r--django/contrib/localflavor/de/forms.py79
-rw-r--r--django/contrib/localflavor/fi/__init__.py0
-rw-r--r--django/contrib/localflavor/fi/fi_municipalities.py427
-rw-r--r--django/contrib/localflavor/fi/forms.py45
-rw-r--r--django/contrib/localflavor/fr/__init__.py0
-rw-r--r--django/contrib/localflavor/fr/forms.py44
-rw-r--r--django/contrib/localflavor/fr/fr_department.py112
-rw-r--r--django/contrib/localflavor/is_/__init__.py0
-rw-r--r--django/contrib/localflavor/is_/forms.py77
-rw-r--r--django/contrib/localflavor/is_/is_postalcodes.py151
-rw-r--r--django/contrib/localflavor/it/__init__.py0
-rw-r--r--django/contrib/localflavor/it/forms.py77
-rw-r--r--django/contrib/localflavor/it/it_province.py114
-rw-r--r--django/contrib/localflavor/it/it_region.py24
-rw-r--r--django/contrib/localflavor/it/util.py40
-rw-r--r--django/contrib/localflavor/jp/__init__.py0
-rw-r--r--django/contrib/localflavor/jp/forms.py38
-rw-r--r--django/contrib/localflavor/jp/jp_prefectures.py51
-rw-r--r--django/contrib/localflavor/no/__init__.py0
-rw-r--r--django/contrib/localflavor/no/forms.py77
-rw-r--r--django/contrib/localflavor/no/no_municipalities.py32
-rw-r--r--django/contrib/localflavor/uk/__init__.py0
-rw-r--r--django/contrib/localflavor/uk/forms.py19
-rw-r--r--django/contrib/localflavor/us/__init__.py0
-rw-r--r--django/contrib/localflavor/us/forms.py99
-rw-r--r--django/contrib/localflavor/us/us_states.py240
-rw-r--r--django/contrib/markup/models.py0
-rw-r--r--django/contrib/markup/tests.py (renamed from tests/regressiontests/markup/tests.py)0
-rw-r--r--django/contrib/sessions/middleware.py19
-rw-r--r--django/contrib/sessions/models.py23
-rw-r--r--django/contrib/sessions/tests.py19
-rw-r--r--django/contrib/sitemaps/__init__.py4
-rw-r--r--django/contrib/sitemaps/views.py2
-rw-r--r--django/contrib/syndication/feeds.py3
-rw-r--r--django/contrib/webdesign/__init__.py0
-rw-r--r--django/contrib/webdesign/lorem_ipsum.py69
-rw-r--r--django/contrib/webdesign/models.py0
-rw-r--r--django/contrib/webdesign/templatetags/__init__.py0
-rw-r--r--django/contrib/webdesign/templatetags/webdesign.py67
-rw-r--r--django/contrib/webdesign/tests.py17
-rw-r--r--django/core/cache/backends/base.py3
-rw-r--r--django/core/cache/backends/dummy.py6
-rw-r--r--django/core/cache/backends/memcached.py7
-rw-r--r--django/core/cache/backends/simple.py2
-rw-r--r--django/core/context_processors.py7
-rw-r--r--django/core/handlers/modpython.py4
-rw-r--r--django/core/handlers/wsgi.py2
-rw-r--r--django/core/mail.py241
-rw-r--r--django/core/management.py460
-rw-r--r--django/core/serializers/__init__.py12
-rw-r--r--django/core/serializers/base.py34
-rw-r--r--django/core/serializers/json.py34
-rw-r--r--django/core/serializers/python.py28
-rw-r--r--django/core/serializers/pyyaml.py38
-rw-r--r--django/core/serializers/xml_serializer.py58
-rw-r--r--django/core/servers/basehttp.py21
-rw-r--r--django/core/servers/fastcgi.py25
-rw-r--r--django/core/urlresolvers.py20
-rw-r--r--django/core/validators.py49
-rw-r--r--django/db/__init__.py3
-rw-r--r--django/db/backends/ado_mssql/base.py27
-rw-r--r--django/db/backends/ado_mssql/creation.py4
-rw-r--r--django/db/backends/dummy/base.py12
-rw-r--r--django/db/backends/mysql/base.py120
-rw-r--r--django/db/backends/mysql/client.py29
-rw-r--r--django/db/backends/mysql/creation.py4
-rw-r--r--django/db/backends/mysql/introspection.py4
-rw-r--r--django/db/backends/mysql_old/__init__.py0
-rw-r--r--django/db/backends/mysql_old/base.py240
-rw-r--r--django/db/backends/mysql_old/client.py14
-rw-r--r--django/db/backends/mysql_old/creation.py30
-rw-r--r--django/db/backends/mysql_old/introspection.py95
-rw-r--r--django/db/backends/oracle/base.py27
-rw-r--r--django/db/backends/oracle/creation.py4
-rw-r--r--django/db/backends/oracle/introspection.py2
-rw-r--r--django/db/backends/postgresql/base.py139
-rw-r--r--django/db/backends/postgresql/creation.py4
-rw-r--r--django/db/backends/postgresql/introspection.py3
-rw-r--r--django/db/backends/postgresql_psycopg2/base.py102
-rw-r--r--django/db/backends/postgresql_psycopg2/introspection.py3
-rw-r--r--django/db/backends/sqlite3/base.py39
-rw-r--r--django/db/backends/sqlite3/creation.py4
-rw-r--r--django/db/backends/util.py17
-rw-r--r--django/db/models/__init__.py25
-rw-r--r--django/db/models/base.py114
-rw-r--r--django/db/models/fields/__init__.py205
-rw-r--r--django/db/models/fields/related.py55
-rw-r--r--django/db/models/loading.py2
-rw-r--r--django/db/models/manager.py8
-rw-r--r--django/db/models/manipulators.py10
-rw-r--r--django/db/models/options.py5
-rw-r--r--django/db/models/query.py229
-rw-r--r--django/db/models/related.py17
-rw-r--r--django/db/transaction.py12
-rw-r--r--django/dispatch/dispatcher.py118
-rw-r--r--django/http/__init__.py72
-rw-r--r--django/middleware/cache.py2
-rw-r--r--django/middleware/common.py16
-rw-r--r--django/newforms/extras/widgets.py3
-rw-r--r--django/newforms/fields.py298
-rw-r--r--django/newforms/forms.py137
-rw-r--r--django/newforms/models.py196
-rw-r--r--django/newforms/util.py23
-rw-r--r--django/newforms/widgets.py187
-rw-r--r--django/oldforms/__init__.py52
-rw-r--r--django/shortcuts/__init__.py21
-rw-r--r--django/template/__init__.py191
-rw-r--r--django/template/context.py9
-rw-r--r--django/template/defaultfilters.py139
-rw-r--r--django/template/defaulttags.py347
-rw-r--r--django/template/loader.py33
-rw-r--r--django/template/loader_tags.py27
-rw-r--r--django/test/__init__.py6
-rw-r--r--django/test/_doctest.py (renamed from django/test/doctest.py)5
-rw-r--r--django/test/client.py137
-rw-r--r--django/test/simple.py21
-rw-r--r--django/test/testcases.py123
-rw-r--r--django/test/utils.py77
-rw-r--r--django/utils/_decimal.py3079
-rw-r--r--django/utils/cache.py2
-rw-r--r--django/utils/datastructures.py33
-rw-r--r--django/utils/dateformat.py19
-rw-r--r--django/utils/encoding.py32
-rw-r--r--django/utils/feedgenerator.py19
-rw-r--r--django/utils/functional.py2
-rw-r--r--django/utils/html.py5
-rw-r--r--django/utils/itercompat.py24
-rw-r--r--django/utils/simplejson/LICENSE.txt2
-rw-r--r--django/utils/simplejson/__init__.py47
-rw-r--r--django/utils/simplejson/decoder.py6
-rw-r--r--django/utils/simplejson/encoder.py98
-rw-r--r--django/utils/simplejson/jsonfilter.py40
-rw-r--r--django/utils/simplejson/scanner.py3
-rw-r--r--django/utils/synch.py15
-rw-r--r--django/utils/text.py67
-rw-r--r--django/utils/timesince.py8
-rw-r--r--django/utils/translation/__init__.py101
-rw-r--r--django/utils/translation/trans_null.py15
-rw-r--r--django/utils/translation/trans_real.py7
-rw-r--r--django/views/debug.py69
-rw-r--r--django/views/defaults.py8
-rw-r--r--django/views/generic/create_update.py6
-rw-r--r--django/views/generic/date_based.py12
-rw-r--r--django/views/generic/list_detail.py12
-rw-r--r--django/views/generic/simple.py8
-rw-r--r--django/views/i18n.py12
-rw-r--r--django/views/static.py2
-rw-r--r--docs/add_ons.txt68
-rw-r--r--docs/apache_auth.txt4
-rw-r--r--docs/api_stability.txt46
-rw-r--r--docs/authentication.txt217
-rw-r--r--docs/cache.txt19
-rw-r--r--docs/contributing.txt227
-rw-r--r--docs/databases.txt165
-rw-r--r--docs/databrowse.txt60
-rw-r--r--docs/db-api.txt135
-rw-r--r--docs/design_philosophies.txt2
-rw-r--r--docs/distributions.txt78
-rw-r--r--docs/django-admin.txt192
-rw-r--r--docs/documentation.txt42
-rw-r--r--docs/email.txt101
-rw-r--r--docs/faq.txt33
-rw-r--r--docs/fastcgi.txt55
-rw-r--r--docs/flatpages.txt14
-rw-r--r--docs/forms.txt74
-rw-r--r--docs/generic_views.txt70
-rw-r--r--docs/i18n.txt39
-rw-r--r--docs/install.txt82
-rw-r--r--docs/legacy_databases.txt26
-rw-r--r--docs/man/django-admin.1162
-rw-r--r--docs/middleware.txt17
-rw-r--r--docs/model-api.txt282
-rw-r--r--docs/modpython.txt73
-rw-r--r--docs/newforms.txt1415
-rw-r--r--docs/outputting_csv.txt6
-rw-r--r--docs/outputting_pdf.txt4
-rw-r--r--docs/overview.txt4
-rw-r--r--docs/redirects.txt12
-rw-r--r--docs/release_notes_0.96.txt264
-rw-r--r--docs/request_response.txt125
-rw-r--r--docs/serialization.txt30
-rw-r--r--docs/sessions.txt27
-rw-r--r--docs/settings.txt283
-rw-r--r--docs/sitemaps.txt22
-rw-r--r--docs/sites.txt12
-rw-r--r--docs/static_files.txt6
-rw-r--r--docs/syndication_feeds.txt79
-rw-r--r--docs/templates.txt161
-rw-r--r--docs/templates_python.txt198
-rw-r--r--docs/testing.txt438
-rw-r--r--docs/tutorial01.txt44
-rw-r--r--docs/tutorial02.txt16
-rw-r--r--docs/tutorial03.txt20
-rw-r--r--docs/tutorial04.txt49
-rw-r--r--docs/url_dispatch.txt134
-rw-r--r--docs/webdesign.txt53
-rw-r--r--extras/django_bash_completion68
-rw-r--r--scripts/rpm-install.sh28
-rw-r--r--setup.cfg3
-rw-r--r--setup.py34
-rw-r--r--tests/modeltests/basic/models.py10
-rw-r--r--tests/modeltests/custom_columns/models.py94
-rw-r--r--tests/modeltests/empty/models.py2
-rw-r--r--tests/modeltests/field_defaults/models.py2
-rw-r--r--tests/modeltests/fixtures/__init__.py2
-rw-r--r--tests/modeltests/fixtures/fixtures/fixture1.json18
-rw-r--r--tests/modeltests/fixtures/fixtures/fixture2.json18
-rw-r--r--tests/modeltests/fixtures/fixtures/fixture2.xml11
-rw-r--r--tests/modeltests/fixtures/fixtures/fixture3.xml11
-rw-r--r--tests/modeltests/fixtures/fixtures/initial_data.json10
-rw-r--r--tests/modeltests/fixtures/models.py88
-rw-r--r--tests/modeltests/generic_relations/models.py43
-rw-r--r--tests/modeltests/get_object_or_404/__init__.py0
-rw-r--r--tests/modeltests/get_object_or_404/models.py86
-rw-r--r--tests/modeltests/get_or_create/models.py2
-rw-r--r--tests/modeltests/invalid_models/models.py20
-rw-r--r--tests/modeltests/lookup/models.py60
-rw-r--r--tests/modeltests/m2m_and_m2o/models.py2
-rw-r--r--tests/modeltests/m2m_recursive/models.py2
-rw-r--r--tests/modeltests/manipulators/models.py2
-rw-r--r--tests/modeltests/many_to_many/models.py14
-rw-r--r--tests/modeltests/many_to_one/models.py4
-rw-r--r--tests/modeltests/model_forms/models.py464
-rw-r--r--tests/modeltests/or_lookups/models.py15
-rw-r--r--tests/modeltests/pagination/models.py2
-rw-r--r--tests/modeltests/reverse_lookup/models.py2
-rw-r--r--tests/modeltests/select_related/__init__.py0
-rw-r--r--tests/modeltests/select_related/models.py152
-rw-r--r--tests/modeltests/serializers/models.py47
-rw-r--r--tests/modeltests/test_client/fixtures/testdata.json20
-rw-r--r--tests/modeltests/test_client/management.py10
-rw-r--r--tests/modeltests/test_client/models.py223
-rw-r--r--tests/modeltests/test_client/urls.py11
-rw-r--r--tests/modeltests/test_client/views.py135
-rw-r--r--tests/modeltests/validation/models.py6
-rw-r--r--tests/regressiontests/bug639/__init__.py0
-rw-r--r--tests/regressiontests/bug639/models.py16
-rw-r--r--tests/regressiontests/bug639/test.jpgbin0 -> 1780 bytes
-rw-r--r--tests/regressiontests/bug639/tests.py42
-rw-r--r--tests/regressiontests/cache/tests.py5
-rw-r--r--tests/regressiontests/datastructures/__init__.py0
-rw-r--r--tests/regressiontests/datastructures/models.py0
-rw-r--r--tests/regressiontests/datastructures/tests.py67
-rw-r--r--tests/regressiontests/dateformat/tests.py2
-rw-r--r--tests/regressiontests/defaultfilters/tests.py95
-rw-r--r--tests/regressiontests/dispatch/__init__.py2
-rw-r--r--tests/regressiontests/dispatch/models.py0
-rw-r--r--tests/regressiontests/dispatch/tests/__init__.py7
-rw-r--r--tests/regressiontests/dispatch/tests/test_dispatcher.py144
-rw-r--r--tests/regressiontests/dispatch/tests/test_robustapply.py34
-rw-r--r--tests/regressiontests/dispatch/tests/test_saferef.py79
-rw-r--r--tests/regressiontests/fixtures_regress/__init__.py0
-rw-r--r--tests/regressiontests/fixtures_regress/fixtures/sequence.json10
-rw-r--r--tests/regressiontests/fixtures_regress/models.py29
-rw-r--r--tests/regressiontests/forms/localflavor.py1359
-rw-r--r--tests/regressiontests/forms/regressions.py51
-rw-r--r--tests/regressiontests/forms/tests.py1230
-rw-r--r--tests/regressiontests/httpwrappers/tests.py32
-rw-r--r--tests/regressiontests/humanize/__init__.py0
-rw-r--r--tests/regressiontests/humanize/models.py0
-rw-r--r--tests/regressiontests/humanize/tests.py54
-rw-r--r--tests/regressiontests/invalid_admin_options/__init__.py0
-rw-r--r--tests/regressiontests/invalid_admin_options/models.py337
-rw-r--r--tests/regressiontests/many_to_one_regress/models.py29
-rw-r--r--tests/regressiontests/null_queries/models.py2
-rw-r--r--tests/regressiontests/serializers_regress/__init__.py0
-rw-r--r--tests/regressiontests/serializers_regress/models.py211
-rw-r--r--tests/regressiontests/serializers_regress/tests.py320
-rw-r--r--tests/regressiontests/templates/tests.py162
-rw-r--r--tests/regressiontests/templates/urls.py11
-rw-r--r--tests/regressiontests/templates/views.py10
-rw-r--r--tests/regressiontests/test_client_regress/__init__.py0
-rw-r--r--tests/regressiontests/test_client_regress/models.py164
-rw-r--r--tests/regressiontests/test_client_regress/urls.py7
-rw-r--r--tests/regressiontests/test_client_regress/views.py8
-rw-r--r--tests/regressiontests/text/__init__.py0
-rw-r--r--tests/regressiontests/text/models.py0
-rw-r--r--tests/regressiontests/text/tests.py17
-rwxr-xr-xtests/runtests.py37
-rw-r--r--tests/templates/base.html8
-rw-r--r--tests/templates/form_view.html15
-rw-r--r--tests/templates/login.html10
-rw-r--r--tests/urls.py6
467 files changed, 69519 insertions, 17641 deletions
diff --git a/AUTHORS b/AUTHORS
index 645913e7c4..cd136fe06c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,7 +1,6 @@
Django was originally created in late 2003 at World Online, the Web division
of the Lawrence Journal-World newspaper in Lawrence, Kansas.
-
The PRIMARY AUTHORS are (and/or have been):
Adrian Holovaty <http://www.holovaty.com/>, who originally created Django with
@@ -42,132 +41,205 @@ And here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
people who have submitted patches, reported bugs, added translations, helped
answer newbie questions, and generally made Django that much better:
- adurdin@gmail.com
- akaihola
+ alang@bright-green.com
+ Marty Alchin <gulopine@gamemusic.org>
+ Daniel Alves Barbosa de Oliveira Vaz <danielvaz@gmail.com>
Andreas
+ andy@jadedplanet.net
+ Fabrice Aneche <akh@nobugware.com>
ant9000@netwise.it
David Ascher <http://ascher.ca/>
+ david@kazserve.org
Arthur <avandorp@gmail.com>
+ axiak@mit.edu
Jiri Barton
Ned Batchelder <http://www.nedbatchelder.com/>
Shannon -jj Behrens <http://jjinux.blogspot.com/>
Esdras Beleza <linux@esdrasbeleza.com>
James Bennett
+ Ben <afternoon@uk2.net>
Paul Bissex <http://e-scribe.com/>
Simon Blanchard
Andrew Brehaut <http://brehaut.net/blog>
- andy@jadedplanet.net
+ brut.alll@gmail.com
+ Jonathan Buchanan <jonathan.buchanan@gmail.com>
Antonio Cavedoni <http://cavedoni.com/>
C8E
Chris Chamberlin <dja@cdc.msbx.net>
Amit Chakradeo <http://amit.chakradeo.net/>
ChaosKCW
+ ivan.chelubeev@gmail.com
+ Bryan Chow <bryan at verdjn dot com>
+ Michal Chruszcz <troll@pld-linux.org>
Ian Clelland <clelland@gmail.com>
crankycoder@gmail.com
+ Pete Crosier <pete.crosier@gmail.com>
Matt Croydon <http://www.postneo.com/>
+ flavio.curella@gmail.com
+ Jure Cuhalev <gandalf@owca.info>
dackze+django@gmail.com
+ David Danier <goliath.mailinglist@gmx.de>
+ Dirk Datzert <dummy@habmalnefrage.de>
Jonathan Daugherty (cygnus) <http://www.cprogrammer.org/>
+ dave@thebarproject.com
Jason Davies (Esaj) <http://www.jasondavies.com/>
Alex Dedul
deric@monowerks.com
+ Max Derkachev <mderk@yandex.ru>
+ Jordan Dimov <s3x3y1@gmail.com>
dne@mayonnaise.net
Maximillian Dornseif <md@hudora.de>
- dummy@habmalnefrage.de
Jeremy Dunck <http://dunck.us/>
+ Andrew Durdin <adurdin@gmail.com>
Andy Dustman <farcepest@gmail.com>
Clint Ecker
+ enlight
Enrico <rico.bl@gmail.com>
+ Ludvig Ericson <ludvig.ericson@gmail.com>
+ Dirk Eschler <dirk.eschler@gmx.net>
+ Marc Fargas <telenieko@telenieko.com>
favo@exoweb.net
+ Bill Fenner <fenner@gmail.com>
+ Matthew Flanagan <http://wadofstuff.blogspot.com>
+ Eric Floehr <eric@intellovations.com>
+ Jorge Gajon <gajon@gajon.org>
gandalf@owca.info
Baishampayan Ghose
martin.glueck@gmail.com
+ GomoX <gomo@datafull.com>
Simon Greenhill <dev@simon.net.nz>
+ Owen Griffiths
Espen Grindhaug <http://grindhaug.org/>
+ Brian Harring <ferringb@gmail.com>
Brant Harris
Hawkeye
- heckj@mac.com
+ Joe Heck <http://www.rhonabwy.com/wp/>
Joel Heenan <joelh-django@planetjoel.com>
hipertracker@gmail.com
Ian Holsman <http://feh.holsman.net/>
Kieran Holland <http://www.kieranholland.com>
+ Sung-Jin Hong <serialx.net@gmail.com>
Robert Rock Howard <http://djangomojo.com/>
Jason Huggins <http://www.jrandolph.com/blog/>
- Baurzhan Ismagulov <ibr@radix50.net>
+ Hyun Mi Ae
+ Tom Insam
+ Baurzhan Ismagulov <ibr@radix50.net>
jcrasta@gmail.com
+ Zak Johnson <zakj@nox.cx>
Michael Josephson <http://www.sdjournal.com/>
jpellerin@gmail.com
junzhang.jn@gmail.com
+ Antti Kaihola <http://akaihola.blogspot.com/>
+ Ben Dean Kawamura <ben.dean.kawamura@gmail.com>
+ ian.g.kelly@gmail.com
Garth Kidd <http://www.deadlybloodyserious.com/>
kilian <kilian.cavalotti@lip6.fr>
Sune Kirkeby <http://ibofobi.dk/>
+ Bastian Kleineidam <calvin@debian.org>
Cameron Knight (ckknight)
+ Gasper Koren
+ Martin Kosír <martin@martinkosir.net>
Meir Kriheli <http://mksoft.co.il/>
Bruce Kroeze <http://coderseye.com/>
Joseph Kocherhans
konrad@gwu.edu
lakin.wecker@gmail.com
+ Nick Lane <nick.lane.au@gmail.com>
Stuart Langridge <http://www.kryogenix.org/>
+ Nicola Larosa <nico@teknico.net>
Eugene Lazutkin <http://lazutkin.com/blog/>
Jeong-Min Lee <falsetru@gmail.com>
+ Jannis Leidel <jl@websushi.org>
Christopher Lenz <http://www.cmlenz.net/>
lerouxb@gmail.com
+ Waylan Limberg <waylan@gmail.com>
limodou
- mattmcc
+ Matt McClanahan <http://mmcc.cx/>
Martin Maney <http://www.chipy.org/Martin_Maney>
masonsimon+django@gmail.com
Manuzhai
- Petar Marić
+ Petar Marić <http://www.petarmaric.com/>
+ Nuno Mariz <nmariz@gmail.com>
+ marijn@metronomo.cl
mark@junklight.com
Yasushi Masuda <whosaysni@gmail.com>
mattycakes@gmail.com
Jason McBrayer <http://www.carcosa.net/jason/>
mccutchen@gmail.com
michael.mcewan@gmail.com
+ mikko@sorl.net
mitakummaa@gmail.com
mmarshall
Eric Moritz <http://eric.themoritzfamily.com/>
+ mrmachine <real.human@mrmachine.net>
Robin Munn <http://www.geekforgod.com/>
+ Robert Myers <myer0052@gmail.com>
Nebojša Dorđević
+ Gopal Narayanan <gopastro@gmail.com>
Fraser Nevett <mail@nevett.org>
Sam Newman <http://www.magpiebrain.com/>
Neal Norwitz <nnorwitz@google.com>
oggie rob <oz.robharvey@gmail.com>
Jay Parlar <parlar@gmail.com>
+ pavithran s <pavithran.s@gmail.com>
+ Barry Pederson <bp@barryp.org>
pgross@thoughtworks.com
phaedo <http://phaedo.cx/>
phil@produxion.net
+ phil.h.smith@gmail.com
Gustavo Picon
Luke Plant <http://lukeplant.me.uk/>
plisk
Daniel Poelzleithner <http://poelzi.org/>
+ polpak@yahoo.com
J. Rademaker
Michael Radziej <mir@noris.de>
- ramiro
+ Ramiro Morales <rm0@gmx.net>
+ Massimiliano Ravelli <massimiliano.ravelli@gmail.com>
Brian Ray <http://brianray.chipy.org/>
+ remco@diji.biz
rhettg@gmail.com
+ Henrique Romano <onaiort@gmail.com>
+ Armin Ronacher
Oliver Rutherfurd <http://rutherfurd.net/>
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
+ Vinay Sajip <vinay_sajip@yahoo.co.uk>
David Schein
+ scott@staplefish.com
serbaut@gmail.com
Pete Shinners <pete@shinners.org>
SmileyChris <smileychris@gmail.com>
+ smurf@smurf.noris.de
sopel
- Thomas Steinacher <tom@eggdrop.ch>
+ Wiliam Alves de Souza <wiliamsouza83@gmail.com>
+ Georgi Stanojevski <glisha@gmail.com>
+ Vasiliy Stavenko <stavenko@gmail.com>
+ Thomas Steinacher <http://www.eggdrop.ch/>
nowell strite
Radek Å varz <http://www.svarz.cz/translate/>
Swaroop C H <http://www.swaroopch.info>
Aaron Swartz <http://www.aaronsw.com/>
+ Ville Säävuori <http://www.unessa.net/>
Tyson Tate <tyson@fallingbullets.com>
+ Frank Tegtmeyer <fte@fte.to>
+ thebjorn <bp@datakortet.no>
+ Zach Thompson <zthompson47@gmail.com>
Tom Tobin
- Tom Insam
Joe Topjian <http://joe.terrarum.net/geek/code/python/django/>
+ torne-django@wolfpuppy.org.uk
Karen Tracey <graybark@bellsouth.net>
Makoto Tsuyuki <mtsuyuki@gmail.com>
+ tt@gurgle.no
Amit Upadhyay
Geert Vanderkelen
+ viestards.lists@gmail.com
Milton Waddams
wam-djangobug@wamber.net
+ wangchun <yaohua2000@gmail.com>
Dan Watson <http://theidioteque.net/>
+ Chris Wesseling <Chris.Wesseling@cwi.nl>
+ James Wheare <django@sparemint.com>
+ charly.wilhelm@gmail.com
Rachel Willmer <http://www.willmer.com/kb/>
Gary Wilson <gary.wilson@gmail.com>
wojtek
diff --git a/MANIFEST.in b/MANIFEST.in
index b5fbb3cb90..06a6021a95 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,8 +1,15 @@
+include README
include AUTHORS
include INSTALL
include LICENSE
+include MANIFEST.in
+recursive-include docs *
+recursive-include scripts *
+recursive-include examples *
+recursive-include extras *
recursive-include django/conf/locale *
-recursive-include django/contrib/admin/templates
-recursive-include django/contrib/admin/media
-recursive-include django/contrib/comments/templates
-recursive-include django/contrib/sitemaps/templates
+recursive-include django/contrib/admin/templates *
+recursive-include django/contrib/admin/media *
+recursive-include django/contrib/comments/templates *
+recursive-include django/contrib/databrowse/templates *
+recursive-include django/contrib/sitemaps/templates *
diff --git a/django/__init__.py b/django/__init__.py
index 5d5461c867..17d8c519cc 100644
--- a/django/__init__.py
+++ b/django/__init__.py
@@ -1 +1,8 @@
-VERSION = (0, 96, 'pre')
+VERSION = (0, 97, 'pre')
+
+def get_version():
+ "Returns the version as a human-format string."
+ v = '.'.join([str(i) for i in VERSION[:-1]])
+ if VERSION[-1]:
+ v += '-' + VERSION[-1]
+ return v
diff --git a/django/bin/compile-messages.py b/django/bin/compile-messages.py
index 0137ec8dd4..2e1e908bbf 100755
--- a/django/bin/compile-messages.py
+++ b/django/bin/compile-messages.py
@@ -1,9 +1,10 @@
#!/usr/bin/env python
+import optparse
import os
import sys
-def compile_messages():
+def compile_messages(locale=None):
basedir = None
if os.path.isdir(os.path.join('conf', 'locale')):
@@ -14,6 +15,9 @@ def compile_messages():
print "This script should be run from the Django SVN tree or your project or app tree."
sys.exit(1)
+ if locale is not None:
+ basedir = os.path.join(basedir, locale, 'LC_MESSAGES')
+
for dirpath, dirnames, filenames in os.walk(basedir):
for f in filenames:
if f.endswith('.po'):
@@ -27,10 +31,19 @@ def compile_messages():
os.environ['djangocompilemo'] = pf + '.mo'
os.environ['djangocompilepo'] = pf + '.po'
if sys.platform == 'win32': # Different shell-variable syntax
- cmd = 'msgfmt -o "%djangocompilemo%" "%djangocompilepo%"'
+ cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
else:
- cmd = 'msgfmt -o "$djangocompilemo" "$djangocompilepo"'
+ cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
os.system(cmd)
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('-l', '--locale', dest='locale',
+ help="The locale to process. Default is to process all.")
+ options, args = parser.parse_args()
+ if len(args):
+ parser.error("This program takes no arguments")
+ compile_messages(options.locale)
+
if __name__ == "__main__":
- compile_messages()
+ main()
diff --git a/django/bin/daily_cleanup.py b/django/bin/daily_cleanup.py
index 667e0f16c6..c87be1e4c3 100644
--- a/django/bin/daily_cleanup.py
+++ b/django/bin/daily_cleanup.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+
"""
Daily cleanup job.
@@ -5,13 +7,13 @@ Can be run as a cronjob to clean out old data from the database (only expired
sessions at the moment).
"""
-from django.db import backend, connection, transaction
+import datetime
+from django.db import transaction
+from django.contrib.sessions.models import Session
def clean_up():
- # Clean up old database records
- cursor = connection.cursor()
- cursor.execute("DELETE FROM %s WHERE %s < NOW()" % \
- (backend.quote_name('django_session'), backend.quote_name('expire_date')))
+ """Clean up expired sessions."""
+ Session.objects.filter(expire_date__lt=datetime.datetime.now()).delete()
transaction.commit_unless_managed()
if __name__ == "__main__":
diff --git a/django/bin/make-messages.py b/django/bin/make-messages.py
index 557cb5eeec..bf9e7a1962 100755
--- a/django/bin/make-messages.py
+++ b/django/bin/make-messages.py
@@ -81,7 +81,7 @@ def make_messages():
src = pythonize_re.sub('\n#', src)
open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
thefile = '%s.py' % file
- cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+ cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
(stdin, stdout, stderr) = os.popen3(cmd, 'b')
msgs = stdout.read()
@@ -103,7 +103,7 @@ def make_messages():
open(os.path.join(dirpath, '%s.py' % file), "wb").write(templatize(src))
thefile = '%s.py' % file
if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
- cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+ cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
(stdin, stdout, stderr) = os.popen3(cmd, 'b')
msgs = stdout.read()
diff --git a/django/bin/profiling/gather_profile_stats.py b/django/bin/profiling/gather_profile_stats.py
index 852f16229d..c0844930e9 100644
--- a/django/bin/profiling/gather_profile_stats.py
+++ b/django/bin/profiling/gather_profile_stats.py
@@ -22,7 +22,7 @@ def gather_stats(p):
else:
continue
print "Processing %s" % f
- if profiles.has_key(path):
+ if path in profiles:
profiles[path].add(prof)
else:
profiles[path] = prof
diff --git a/django/conf/__init__.py b/django/conf/__init__.py
index daf5ad766a..021ecc8131 100644
--- a/django/conf/__init__.py
+++ b/django/conf/__init__.py
@@ -7,6 +7,7 @@ a list of all possible variables.
"""
import os
+import time # Needed for Windows
from django.conf import global_settings
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
@@ -105,8 +106,10 @@ class Settings(object):
new_installed_apps.append(app)
self.INSTALLED_APPS = new_installed_apps
- # move the time zone info into os.environ
- os.environ['TZ'] = self.TIME_ZONE
+ if hasattr(time, 'tzset'):
+ # Move the time zone info into os.environ. See ticket #2315 for why
+ # we don't do this unconditionally (breaks Windows).
+ os.environ['TZ'] = self.TIME_ZONE
def get_all_members(self):
return dir(self)
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 245096590d..8bdeb64efc 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -38,6 +38,8 @@ 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')),
('da', gettext_noop('Danish')),
@@ -54,9 +56,14 @@ LANGUAGES = (
('is', gettext_noop('Icelandic')),
('it', gettext_noop('Italian')),
('ja', gettext_noop('Japanese')),
+ ('ko', gettext_noop('Korean')),
+ ('kn', gettext_noop('Kannada')),
+ ('lv', gettext_noop('Latvian')),
+ ('mk', gettext_noop('Macedonian')),
('nl', gettext_noop('Dutch')),
('no', gettext_noop('Norwegian')),
('pl', gettext_noop('Polish')),
+ ('pt', gettext_noop('Portugese')),
('pt-br', gettext_noop('Brazilian')),
('ro', gettext_noop('Romanian')),
('ru', gettext_noop('Russian')),
@@ -65,6 +72,7 @@ LANGUAGES = (
('sr', gettext_noop('Serbian')),
('sv', gettext_noop('Swedish')),
('ta', gettext_noop('Tamil')),
+ ('te', gettext_noop('Telugu')),
('tr', gettext_noop('Turkish')),
('uk', gettext_noop('Ukrainian')),
('zh-cn', gettext_noop('Simplified Chinese')),
@@ -95,7 +103,7 @@ SERVER_EMAIL = 'root@localhost'
SEND_BROKEN_LINK_EMAILS = False
# Database connection info.
-DATABASE_ENGINE = '' # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = '' # Or path to database file if using sqlite3.
DATABASE_USER = '' # Not used with sqlite3.
DATABASE_PASSWORD = '' # Not used with sqlite3.
@@ -112,6 +120,7 @@ EMAIL_PORT = 25
# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
+EMAIL_USE_TLS = False
# List of strings representing installed apps.
INSTALLED_APPS = ()
@@ -135,6 +144,7 @@ TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
+ 'django.core.context_processors.media',
# 'django.core.context_processors.request',
)
@@ -231,7 +241,8 @@ TRANSACTIONS_MANAGED = False
# The User-Agent string to use when checking for URL validity through the
# isExistingURL validator.
-URL_VALIDATOR_USER_AGENT = "Django/0.96pre (http://www.djangoproject.com)"
+from django import get_version
+URL_VALIDATOR_USER_AGENT = "Django/%s (http://www.djangoproject.com)" % get_version()
##############
# MIDDLEWARE #
@@ -305,6 +316,12 @@ BANNED_IPS = ()
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
+LOGIN_URL = '/accounts/login/'
+
+LOGOUT_URL = '/accounts/logout/'
+
+LOGIN_REDIRECT_URL = '/accounts/profile/'
+
###########
# TESTING #
###########
@@ -315,3 +332,17 @@ TEST_RUNNER = 'django.test.simple.run_tests'
# The name of the database to use for testing purposes.
# If None, a name of 'test_' + DATABASE_NAME will be assumed
TEST_DATABASE_NAME = None
+
+# Strings used to set the character set and collation order for the test
+# database. These values are passed literally to the server, so they are
+# backend-dependent. If None, no special settings are sent (system defaults are
+# used).
+TEST_DATABASE_CHARSET = None
+TEST_DATABASE_COLLATION = None
+
+############
+# FIXTURES #
+############
+
+# The list of directories to search for fixtures
+FIXTURE_DIRS = ()
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/conf/locale/ca/LC_MESSAGES/django.mo b/django/conf/locale/ca/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..665d7d41a9
--- /dev/null
+++ b/django/conf/locale/ca/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ca/LC_MESSAGES/django.po b/django/conf/locale/ca/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..30a8797a91
--- /dev/null
+++ b/django/conf/locale/ca/LC_MESSAGES/django.po
@@ -0,0 +1,3034 @@
+# translation of django.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-25 13:04+0200\n"
+"PO-Revision-Date: 2007-05-25 13:04+0200\n"
+"Last-Translator: Marc Fargas <marc@fargas.com>\n"
+"Language-Team: <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: VIM 7.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "si,no,potser"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: newforms/models.py:173 newforms/fields.py:432
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Esculli una opció vàlida; Aquesta opció no és una de les opcions disponibles."
+
+#: newforms/models.py:186 newforms/fields.py:87 newforms/fields.py:444
+#: newforms/fields.py:520 newforms/fields.py:531 oldforms/__init__.py:357
+#: db/models/fields/__init__.py:121 db/models/fields/__init__.py:278
+#: db/models/fields/__init__.py:675 db/models/fields/__init__.py:686
+msgid "This field is required."
+msgstr "Aquest camp és obligatori."
+
+#: newforms/models.py:190 newforms/fields.py:448 newforms/fields.py:524
+msgid "Enter a list of values."
+msgstr "Introdueixi una llista de valors."
+
+#: newforms/models.py:196 newforms/fields.py:457
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Esculli una opció vàlida; %s' no és una de les opcions vàlides."
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:577
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "Yes"
+msgstr "Si"
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "No"
+msgstr "No"
+
+#: newforms/fields.py:110 newforms/fields.py:324
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Asseguris de que el seu texte té com a màxim %d caracters."
+
+#: newforms/fields.py:112 newforms/fields.py:326
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Asseguris de que el seu texte té almenys %d caracters."
+
+#: newforms/fields.py:135 core/validators.py:121
+msgid "Enter a whole number."
+msgstr "Introdueixi un número sencer."
+
+#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Aquest valor ha de ser menor o igual a %s."
+
+#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asseguris de que aquest valor sigui superior o igual a %s."
+
+#: newforms/fields.py:158 newforms/fields.py:186
+msgid "Enter a number."
+msgstr "Introdueixi un número."
+
+#: newforms/fields.py:196
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asseguris de que no hi ha més de %s dígits en total."
+
+#: newforms/fields.py:198
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asseguris de que no hi ha més de %s decimals."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asseguris de que no hia ha més de %s dígits decimals."
+
+#: newforms/fields.py:233
+msgid "Enter a valid date."
+msgstr "Introdueixi una data vàlida."
+
+#: newforms/fields.py:260
+msgid "Enter a valid time."
+msgstr "Introdueixi una hora vàlida."
+
+#: newforms/fields.py:296
+msgid "Enter a valid date/time."
+msgstr "Introdueixi una data/hora vàlides."
+
+#: newforms/fields.py:310
+msgid "Enter a valid value."
+msgstr "Introdueixi un valor vàlid."
+
+#: newforms/fields.py:339 core/validators.py:163
+msgid "Enter a valid e-mail address."
+msgstr "Introdueixi una adreça de correu vàlida."
+
+#: newforms/fields.py:357 newforms/fields.py:379
+msgid "Enter a valid URL."
+msgstr "Introdueixi una URL vàlida."
+
+#: newforms/fields.py:381
+msgid "This URL appears to be a broken link."
+msgstr "Aquesta URL sembla ser un enllaç trencat."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabic"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bulgar"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Català"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Txec"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Galès"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Danès"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Alemany"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grec"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Anglès"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Espanyol"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Castellà Argentí"
+
+#: conf/global_settings.py:51
+msgid "Finnish"
+msgstr "Finlandès"
+
+#: conf/global_settings.py:52
+msgid "French"
+msgstr "Francès"
+
+#: conf/global_settings.py:53
+msgid "Galician"
+msgstr "Galleg"
+
+#: conf/global_settings.py:54
+msgid "Hungarian"
+msgstr "Húngar"
+
+#: conf/global_settings.py:55
+msgid "Hebrew"
+msgstr "Hebreu"
+
+#: conf/global_settings.py:56
+msgid "Icelandic"
+msgstr "Islandès"
+
+#: conf/global_settings.py:57
+msgid "Italian"
+msgstr "Italià"
+
+#: conf/global_settings.py:58
+msgid "Japanese"
+msgstr "Japonès"
+
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "Coreà"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "Macedoni"
+
+#: conf/global_settings.py:63
+msgid "Dutch"
+msgstr "Holandès"
+
+#: conf/global_settings.py:64
+msgid "Norwegian"
+msgstr "Norueg"
+
+#: conf/global_settings.py:65
+msgid "Polish"
+msgstr "Polac"
+
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "Portuguès"
+
+#: conf/global_settings.py:67
+msgid "Brazilian"
+msgstr "Brasileny"
+
+#: conf/global_settings.py:68
+msgid "Romanian"
+msgstr "Rumanès"
+
+#: conf/global_settings.py:69
+msgid "Russian"
+msgstr "Rús"
+
+#: conf/global_settings.py:70
+msgid "Slovak"
+msgstr "Eslovac"
+
+#: conf/global_settings.py:71
+msgid "Slovenian"
+msgstr "Esloveni"
+
+#: conf/global_settings.py:72
+msgid "Serbian"
+msgstr "Serbi"
+
+#: conf/global_settings.py:73
+msgid "Swedish"
+msgstr "Suec"
+
+#: conf/global_settings.py:74
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:76
+msgid "Turkish"
+msgstr "Turc"
+
+#: conf/global_settings.py:77
+msgid "Ukrainian"
+msgstr "Ucranià"
+
+#: conf/global_settings.py:78
+msgid "Simplified Chinese"
+msgstr "Xinés simplificat"
+
+#: conf/global_settings.py:79
+msgid "Traditional Chinese"
+msgstr "Xinés tradicional"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de l'objecte"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encapçalament"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentari"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "qualificació #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "qualificació #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "qualificació #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "qualificació #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "qualificació #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "qualificació #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "qualificació #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "qualificació #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "és qualificació vàlida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora d'enviament"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "és públic"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:305
+msgid "IP address"
+msgstr "Adreça IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "està eliminat"
+
+#: 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 ""
+"Marqui aquesta caixa si el comentari no és apropiat. En lloc seu es mostrarà "
+"\"Aquest comentari ha estat eliminat\" "
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentaris"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objecte Contingut"
+
+#: 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 ""
+"Enviat per %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nom de la persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "adreça ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprovat per el \"staff\""
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentari lliure"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentaris lliures"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuació"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data de la puntuació"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "puntuació de karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "punts de karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d punt/s per %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Aquest comentari va ser marcat per %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data de la marca"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca d'usuari"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marques d'usuari"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data d'eliminació"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "eliminació del moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminacions del moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "eliminació del moderador per %r"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "El seu nom:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Comentari:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Previsualitzar comentari"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuari:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: 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
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+msgid "Log out"
+msgstr "Finalitzar sessió"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Contrasenya:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Contrasenya oblidada?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Qualificacions"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerit"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una fotografia"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Es precisa aquesta puntuació perquè has introduït almenys un altre."
+
+#: 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] ""
+"Aquest comentari el va enviar un usuari que ha enviat menys de %(count)s "
+"comentari:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Aquest comentari el va enviar un usuari que ha enviat menys de %(count)s "
+"comentaris:\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 ""
+"Aquest comentari va ser publicat per un usuari incomplet\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Només s'admed 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 "Un o més dels caps requerits no ha estat sotmès"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Algú està jugant amb el formulari de comentaris (violació de seguretat)"
+
+#: 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 ""
+"El formulari de comentaris tenia un paràmetre 'target' invàlid -- el ID del "
+"objecte era invàlid"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"El formulari del comentari no ha proveït ni 'previsualitzar' ni 'enviar'"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Els usuaris anònims no poden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID del comentari invàlid"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "No pots votar-te a tu mateix"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "moment de l'acció"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id del objecte"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "'repr' de l'objecte"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "marca de l'acció"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "missatge del canvi"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada del registre"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entrades del registre"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Per %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 "Tots"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualsevol data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Avui"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últims 7 dies"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Aquest mes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Aquest any"
+
+#: contrib/admin/templatetags/admin_list.py:249
+msgid "All dates"
+msgstr "Totes les dates"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: 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
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentació"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: 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
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+msgid "Change password"
+msgstr "Canviar clau"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: 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_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inici"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Històric"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuari"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acció"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "F j, Y, H:i "
+
+#: 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 ""
+"Aquest objecte no te historial de canvis. Probablement no va ser afegit "
+"utilitzant aquest lloc administratiu."
+
+#: 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 ""
+"Alguna cosa està malament en la instal·lació de la teva base de dades. "
+"Assegurat de que s'han creat les taules, i de que la base de dades és "
+"llegible per l'usuari apropiat."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Cercar"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultat"
+msgstr[1] "%(counter)s resultats"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s en total"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: 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 ""
+"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació "
+"d'objectes relacionats, però el seu compte no te permisos per a esborrar els "
+"tipus d'objecte següents:"
+
+#: 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 ""
+"Està segur de voler esborrar els/les %(object_name)s \"%(escaped_object)s\"? "
+"S'esborraran els següents elements relacionats:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Si, estic segur"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar tots"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Iniciar sessió"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Afegir"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Veure en el lloc"
+
+#: 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] "Si us plau, corregeixi l'error mostrat abaix."
+msgstr[1] "Si us plau, corregeixi els errors mostrats abaix."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Ordre"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Ordre:"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models disponibles en la aplicació %(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 "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No té permís per editar res."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Accions recents"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Les meves accions"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Cap disponible"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error del servidor <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 ""
+"Hi ha hagut un error. S'ha informat als administradors del lloc per correu "
+"electrònic y hauria d'arreglar-se en breu. Gràcies per la seva paciència."
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Afegir %(name)s"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Benvingut,"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Lloc administratiu de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Adminsitració de Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtre"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Desar com a nou"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Desar i afegir-ne un de nou"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Desar i continuar editant"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Desar"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "No s'ha pogut trobar la pàgina"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ho sentim, però no s'ha pogut trobar la pàgina solicitada"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Per %(filter_title)s "
+
+#: 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 ""
+"Primer, entri un usuari i una contrasenya. Després podrà editar més opcions "
+"del usuari."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Usuari"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Contrasenya"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Contrasenya (de nou)"
+
+#: 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 "Introdueixi la mateixa contrasenya que a sobre, per a verificació."
+
+#: 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 "Introdueixi una contrasenya per l'usuari <strong>%(username)s</strong>"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualment:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gràcies per emprar algun temps de cualitat amb el lloc web avui."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Iniciar sessió de nou"
+
+#: 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 "Canvi de clau"
+
+#: 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 ""
+"Si us plau, introdueixi la seva contrasenya antiga, per seguretat, i tot "
+"seguit introdueixi la seva nova contrasenya dues vegades per verificar que "
+"l'ha escrit correctament."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contrasenya antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contrasenya nova:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmar contrasenya:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Canviar la meva clau:"
+
+#: 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 "Restablir contrasenya"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Contrasenya restaber-ta amb èxit"
+
+#: 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 ""
+"Li hem enviat una contrasenya nova a l'adreça de correu electrònic que ens "
+"ha indicat. L'hauria de rebre en breu."
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Canvi de clau exitò"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "La seva clau ha estat canviada."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Està rebent aquest missatge degut a que va solicitar un restabliment de "
+"contrasenya."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "del seu compte d'usuari a %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "La seva nova contrasenya és: %(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 "Sentis lliure de canviar-la en aquesta pàgina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "El seu nom d'usuari, en cas d'haver-lo oblidat:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Gràcies per fer us del nostre lloc!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'equip de %(site_name)s"
+
+#: 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 ""
+"Ha oblidat la seva contrasenya? Introdueixi la seva adreça de correu "
+"electrònic i crearem una nova que li enviarem per correu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adreça de correu electrònic:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Restablir la meva contrasenya"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "'Bookmarklets'"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "'Bookmarklets' de documentació"
+
+#: 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\">Per a instalar 'bookmarklets', arrosegui l'enllaç a la "
+"seva barra de\n"
+"marcadors, o faci click amb el botò dret en l'enllaç i afegeixi'l als "
+"marcadors.\n"
+"Ara pot escollir el 'bookmarklet' des de qualsevol pàgina del lloc.\n"
+"Observi que alguns d'aquests 'bookmarklets' precisen que estigui veient\n"
+"el lloc des de un ordinador senyalat com a \"intern\" (parli\n"
+"amb el seu administrador de sistemes si no està segur de la condició del "
+"seu).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentació d'aquesta pàgina"
+
+#: 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 ""
+"El porta des de qualsevol pàgina de la documentació a la vista que la genera."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostra el ID de l'objecte"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra el 'content-type' (tipus de contingut) i el ID inequívoc de les "
+"pàgines que representen un únic objecte."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar aquest objecte (finestra actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"El porta a la pàgina d'administració de pàgines que representen un únic "
+"objecte."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar aquest objecte (nova finestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Com abans, però obre la pàgina d'administració en una nova finestra."
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "El/la %(name)s \"%(obj)s\".ha estat agregat/da amb èxit."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Pot editar-lo de nou abaix."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Agregar usuari"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Canvi de clau exitós"
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Canviar clau: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Lloc administratiu"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pot agregar un altre %s abaix."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Agregat %s."
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Modificat %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Eliminat %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Cap camp canviat."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "S'ha modificat amb èxist el/la %(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 ""
+"S'ha agregat amb èxit el/la %(name)s \"%(obj)s\". Pot editar-lo de nou abaix."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un o més %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un o més %(fieldname)s en %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "El/la %(name)s \"%(obj)s\".ha estat eliminat amb èxit."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Està segur?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Modificar històric: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Seleccioni %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccioni %s per modificar"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Error de/en la base de dades"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtre:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vista:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "La aplicació %r no s'ha pogut trobar"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "El model %(name)r no s'ha trobat en la aplicació %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "el objecte relacionat `%(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 "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "objectes relacionats `%(label)s.%(name)s`"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "tots %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "nombre de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Camps en objectes %s"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313
+msgid "Integer"
+msgstr "Enter"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Booleà (Verdader o Fals)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadena (fins a %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Enters separats per comes"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (sense hora)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (amb hora)"
+
+#: contrib/admin/views/doc.py:297
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:298
+msgid "E-mail address"
+msgstr "Adreça de correu electrònic"
+
+#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300
+#: contrib/admin/views/doc.py:303
+msgid "File path"
+msgstr "Ruta del fitxer"
+
+#: contrib/admin/views/doc.py:301
+msgid "Floating point number"
+msgstr "Número amb punt de coma flotant"
+
+#: contrib/admin/views/doc.py:307
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleà (Verdader, Fals o 'None' (cap))"
+
+#: contrib/admin/views/doc.py:308
+msgid "Relation to parent model"
+msgstr "Relació amb el model pare"
+
+#: contrib/admin/views/doc.py:309
+msgid "Phone number"
+msgstr "Número de telèfon"
+
+#: contrib/admin/views/doc.py:314
+msgid "Text"
+msgstr "Texte"
+
+#: contrib/admin/views/doc.py:315
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:317
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estat dels E.U.A. (dos lletres majúscules)"
+
+#: contrib/admin/views/doc.py:318
+msgid "XML text"
+msgstr "Texte XML"
+
+#: contrib/admin/views/doc.py:344
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no sembla ser un objecte 'urlpattern'"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Si us plau, introdueixi un nom d'usuari i contrasenya vàlids. Tingui en "
+"compte que tots dos camps son sensibles a majúscules i minúscules."
+
+#: 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 ""
+"Si us plau, identifiquis de nou doncs la seva sessió ha expirat. No es "
+"preocupi, el seu enviament està emmagatzemat."
+
+#: 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 ""
+"Sembla ser que el seu navegador no està configurat per acceptar "
+"'cookies' (galetes). Si us plau, habiliti les 'cookies', recarregui aquesta "
+"pàgina i provi-ho de nou. "
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Els noms d'usuari no poden contenir el caracter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"La seva adreça de correu no és el seu nom d'usuari. Provi '%s' en tot cas."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "clau de la sessió"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "dades de la sessió"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "data de caducitat"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sessió"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "rt"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "r"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "n"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "r"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milió"
+msgstr[1] "%(value).1f milions"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilió"
+msgstr[1] "%(value).1f bilions"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilió"
+msgstr[1] "%(value).1f trilions"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dos"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "cuatre"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinc"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sis"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "set"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "vuit"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nou"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redreçar des de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Aquesta ruta hauria de ser el camí absolut, excloent-ne el nom del domini. "
+"Exemple '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redreçar a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Això pot ser bé una ruta absoluta (com abans) o una URL completa que comenci "
+"per http:// ."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redreçament"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redreçaments"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exemple: '/about/contact/'. Asseguri's de posar les barres al principi i al "
+"final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tìtol"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contingut"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "habilitar comentaris"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nom de la plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exemple: 'flatpages/contact_page.html'. Si no el proporciona, el sistema "
+"utilitzarà 'flatpages/defaula.htmlt'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "s'ha de estar registrat"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si està marcat, només els usuaris registrats podran veure la pàgina."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "pàgina estàtica"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pàgines estàtiques"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nom del domini"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nom per mostrar"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "lloc"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "llocs"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Sessió finalitzada"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
+msgid "name"
+msgstr "nom"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "nom en clau"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "permís"
+
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
+msgid "permissions"
+msgstr "permissos"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "grup"
+
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
+msgid "groups"
+msgstr "grups"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "nom d'usuari"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requerit. 30 o menys caracters. Només caracters alfanumèrics (lletres, "
+"dígits i guions baixos)."
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "nom propi"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "cognoms"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "adreça de correu electrònic"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "contrasenya"
+
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Utilitzi '[algo]$[salt]$[hexdigest]' o el <a href=\"password/\">formulari de "
+"canvi de contrasenya</a>."
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "és membre del personal"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si l'usuari pot entrar en el lloc administratiu."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "actiu"
+
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Designa si aquest usuari pot iniciar sessió a la interfície administrativa "
+"Djano. Deselecciona-ho enlloc de esborrar comptes d'usuari."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "estat de superusuari"
+
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Designa que aquest usuari té tots els permisos sense assignar-los "
+"explícitament."
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "últim inici de sessió"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "data de creació"
+
+#: contrib/auth/models.py:110
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Junt amb els permissos asignats manualment, aquest usuari tindrà, també, els "
+"permissos dels grups dels que sigui membre."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "permissos de l'usuari"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "usuari"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "usuaris"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "Informaciò personal"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "permissos"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Dates importants"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Grups"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "missatge"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "AnonymousUser"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Els dos camps de contrasenya no coincideixen."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ja existeix un usuari amb aquest nom."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"El seu navegador no sembla tenir les 'cookies' (galetes) activades. Aquestes "
+"són necessàries per iniciar la sessió."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Aquest compte està inactiu"
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Aquesta adreça de correu no té associada cap compte d'usuari. Està segur de "
+"que s'ha registrat?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Els dos camps de nova contrasenya no coincideixen."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La seva antiga contrasenya no és correcte. Si el plau, introdueixi-la de nou."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "nom de la classe del model en python"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "tipus de contingut"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "tipus de continguts"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introdueixi un codi zip en el format XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Introdueixi un número de identificació o de passaport Suïssos en els formats "
+"1234567890 o X1234567<0."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Introdueixi un codi zip vàlid."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Introdueixi un número valid de la Seguretat Social."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introdueixi un número de IVA (VAT) vàlid."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Introdueixi un codi postal. És necessari un espai entre les dues parts del "
+"codi postal."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introdueixi un codi zip en el format XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Introdueixi un número vàlid de la Seguretat Social dels E.U.A. en el format "
+"XXX-XX-XXXX."
+
+#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introdueixi un codi zip en el format XXXXX."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Introdueixi un número vàlid de la seguretat social finlandesa."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introdueixi un número de la seguretat social Noruega vàlid."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introdueixi un RUT Xilè vàlid. El format és XX.XXX.XXX-X"
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Introdueixi un RUT Xilè vàlid."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Introdueixi un número de tarjeta d'identificació alemany vàlid en el format "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Introdueixi un codi postal de 4 dígits."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introdueixi un codi postal en el format XXXXXXX o XX-XXXX."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introdueixi un codi zip en el format XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "El número de telèfon ha de ser en el format XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Aquest camps requereix només números."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Aquest camp requereix com a màxim 11 dígits o 14 caracters."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Número CPF invàlid."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Aquest camp requereix almenys 14 dígits."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ invàlid."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Introdueixi un número de identificació d'Islàndia. El format és XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificació d'Islàndia no és vàlid."
+
+#: core/validators.py:65
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Aquest valor ha de contenir només números, guions, i guions baixos."
+
+#: core/validators.py:69
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Aquest valor ha de contenir només lletres, números, guions, guions baixos, i "
+"barres (/)."
+
+#: core/validators.py:73
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Aquest valor ha de contenir només lletres, números, guions o guions baixos"
+
+#: core/validators.py:77
+msgid "Uppercase letters are not allowed here."
+msgstr "No es permeten majúscules aquí."
+
+#: core/validators.py:81
+msgid "Lowercase letters are not allowed here."
+msgstr "No es permeten minúscules aquí."
+
+#: core/validators.py:88
+msgid "Enter only digits separated by commas."
+msgstr "Introdueixi només dígits separats per comes."
+
+#: core/validators.py:100
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introdueixi adreces de correu electrònic vàlides separades per comes."
+
+#: core/validators.py:104
+msgid "Please enter a valid IP address."
+msgstr "Per favor introdueixi una adreça IP vàlida."
+
+#: core/validators.py:108
+msgid "Empty values are not allowed here."
+msgstr "No s'admeten valor buits."
+
+#: core/validators.py:112
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No s'admeten caracters no numèrics."
+
+#: core/validators.py:116
+msgid "This value can't be comprised solely of digits."
+msgstr "Aquest valor no pot contenir només dígits."
+
+#: core/validators.py:125
+msgid "Only alphabetical characters are allowed here."
+msgstr "Només s'admeted caracters alfabètics aquí."
+
+#: core/validators.py:140
+msgid "Year must be 1900 or later."
+msgstr "L'any ha de ser posterior al 1900"
+
+#: core/validators.py:144
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data invàlida: %s"
+
+#: core/validators.py:149 db/models/fields/__init__.py:463
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introdueixi una data vàlida en el forma AAAA-MM-DD."
+
+#: core/validators.py:154
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introdueixi una hora vàlida en el format HH:MM."
+
+#: core/validators.py:158 db/models/fields/__init__.py:532
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introdueixi un data/hora vàlida en format YYYY-MM-DD HH:MM."
+
+#: core/validators.py:175 core/validators.py:453 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No s'ha enviat cap fitxer. Comprovi el tipus de codificació del formulari."
+
+#: core/validators.py:179
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envii una imatge vàilda. El fitxer que ha enviat no era una imatge o estaba "
+"corrupte."
+
+#: core/validators.py:186
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta una imatge vàlida."
+
+#: core/validators.py:190
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"El números de telèfon han de guardar-se en el format XXX-XXX-XXXX. \"%s\" no "
+"és vàlid."
+
+#: core/validators.py:198
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un video QuickTime vàlid."
+
+#: core/validators.py:202
+msgid "A valid URL is required."
+msgstr "Es precisa d'una URL vàlida."
+
+#: core/validators.py:216
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Es precisa HTML vàlid. Els errors específics sòn:\n"
+"%s"
+
+#: core/validators.py:223
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML incorrectament formatejat: %s"
+
+#: core/validators.py:240
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalida: %s"
+
+#: core/validators.py:245 core/validators.py:247
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %sés un enllaç trencat."
+
+#: core/validators.py:253
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introdueixi una abreviatura vàlida d'estat d'els E.U.A.."
+
+#: core/validators.py:267
+#, 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] "Vigili la seva boca! Aquí no admetem la paraula: %s."
+msgstr[1] "Vigili la seva boca! Aquí no admetem les paraules: %s."
+
+#: core/validators.py:274
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Aquest camp ha de concordar amb el camp '%s'."
+
+#: core/validators.py:293
+msgid "Please enter something for at least one field."
+msgstr "Si us plau, introdueixi alguna cosa alemnys en un camp."
+
+#: core/validators.py:302 core/validators.py:313
+msgid "Please enter both fields or leave them both empty."
+msgstr "Si us plau, ompli els dos camps o deixi'ls tots dos en blanc."
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "S'ha de proporcionar aquest camps si %(field)s és %(value)s"
+
+#: core/validators.py:334
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "S'ha de proporcionar aquest camps si %(field)s no és %(value)s"
+
+#: core/validators.py:353
+msgid "Duplicate values are not allowed."
+msgstr "No s'admeten valors duplicats."
+
+#: core/validators.py:368
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Aquest valor ha de estar comprés entre %(lower)s i %(upper)s."
+
+#: core/validators.py:370
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Aquest valor ha de ser com a mínim %s."
+
+#: core/validators.py:372
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Aquest valor ha de ser com a màxim %s."
+
+#: core/validators.py:408
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Aquest valor ha de ser una potència de %s."
+
+#: core/validators.py:417
+msgid "Please enter a valid decimal number."
+msgstr "Si us plau, introdueixi un número decimal vàlid."
+
+#: core/validators.py:423
+#, 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] ""
+"Si us plau, introdueixi un número decimal vàlid amb no més de %s digit."
+msgstr[1] ""
+"Si us plau, introdueixi un número decimal vàlid amb no més de %s digits."
+
+#: core/validators.py:426
+#, 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] ""
+"Si us plau, introdueixi un número decimal vàlid amb la part entera amb com a "
+"màxim %s dígit."
+msgstr[1] ""
+"Si us plau, introdueixi un número decimal vàlid amb la part entera amb com a "
+"màxim %s dígits."
+
+#: core/validators.py:429
+#, 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] ""
+"Si us plau, introdueixi un número decimal vàlid amb no més de %s dígit en la "
+"part decimal."
+msgstr[1] ""
+"Si us plau, introdueixi un número decimal vàlid amb no més de %s dígits en "
+"la part decimal."
+
+#: core/validators.py:437
+msgid "Please enter a valid floating point number."
+msgstr "Si us plau, introdueixi un número amb punt de coma flotant vàlid."
+
+#: core/validators.py:446
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asseguris de que el fitxer que ha enviat té, com a mínim, %s bytes."
+
+#: core/validators.py:447
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asseguris de que el fitxer que ha enviat té, com a màxim %s bytes."
+
+#: core/validators.py:464
+msgid "The format for this field is wrong."
+msgstr "El format per aquest camp és incorrecte."
+
+#: core/validators.py:479
+msgid "This field is invalid."
+msgstr "El camp no és vàlid."
+
+#: core/validators.py:515
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No s'ha pogut obtenir res de %s."
+
+#: core/validators.py:518
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s ha va tornar la capcelera Content-Type '%(contenttype)s', que "
+"no és vàlida."
+
+#: core/validators.py:551
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Si us plau, tanqui l'etiqueta %(tag)s des de la línia %(line)s. (La línia "
+"comença amb \"%(start)s\".)"
+
+#: core/validators.py:555
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Part del text que comença en la línia %(line)s no està permès en aquest "
+"context. (La línia comença per \"%(start)s\".)"
+
+#: core/validators.py:560
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línia %(line)s no és un atribut vàlid. (La línia "
+"comença per \"%(start)s\".)"
+
+#: core/validators.py:565
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línia %(line)s no és una etiqueta vàlida. (La línia "
+"comença per \"%(start)s\".)"
+
+#: core/validators.py:569
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Una etiqueta de la línia %(line)s li falta un o més atributs requerits.(La "
+"línia comença per \"%(start)s\".)"
+
+#: core/validators.py:574
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"L'atribut \"%(attr)s\" de la línia %(line)s té un valor que no és vàlid. (La "
+"línia comença per \"%(start)s\".)"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Dilluns"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dimarts"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Dimecres"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Dijous"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Divendres"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Dissabte"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Diumenge"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Gener"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febrer"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Març"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maig"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juny"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juliol"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agost"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Desembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "gen"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "des"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Gen."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Des."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "any"
+msgstr[1] "anys"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "mesos"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "setmana"
+msgstr[1] "setmanes"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dies"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "hores"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuts"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d milisegons"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: 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 "mitja nit"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "mig dia"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "F j, Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "F j, Y, H:i"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "j de/d' F del Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "j de/d' F del Y"
+
+#: 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] "Asseguris de que el seu texte té menys de %s caracter."
+msgstr[1] "Asseguris de que el seu texte té menys de %s caracters."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "No es permeten salts de línia."
+
+#: 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 "Esculli una opció vàlida; %(data)s' no està dintre de %(choices)s."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "El fitxer enviat està buit."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introdueixi un número enter entre -32,768 i 32,767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Introdueixi un número positiu."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introdueixi un número entre 0 i 32,767."
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "El/La %(verbose_name)s s'ha creat amb èxit."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "El/La %(verbose_name)s s'ha actualtzat amb èxit."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "El %(verbose_name)s s'ha eliminat."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ja existeix un %(object)s del tipus %(type)s amb aquest %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ja existeix %(optname)s amb auqest %(fieldname)s."
+
+#: db/models/fields/__init__.py:373
+msgid "This value must be an integer."
+msgstr "Aquest valor ha de ser un enter."
+
+#: db/models/fields/__init__.py:408
+msgid "This value must be either True or False."
+msgstr "Aquest valor ha de ser True (Veritat) o False (Fals)"
+
+#: db/models/fields/__init__.py:429
+msgid "This field cannot be null."
+msgstr "Aquest camp no pot ser null (estar buit)."
+
+#: db/models/fields/__init__.py:592
+msgid "This value must be a decimal number."
+msgstr "Aquest valor ha de ser un número decimal."
+
+#: db/models/fields/__init__.py:695
+msgid "Enter a valid filename."
+msgstr "Introdueixi un nom de fitxer vàlid."
+
+#: db/models/fields/__init__.py:818
+msgid "This value must be either None, True or False."
+msgstr "Aquest valor ha de ser None (Cap), True (Veritat) o False (Fals)"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Si us plau, introdueixi un %s vàlid."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Separi múltiples IDs amb comes."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Premi \"Control\" o \"Command\" en un Mac per escollir més d'un."
+
+#: 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] ""
+"Si us plau, introdueixi IDs de %(self)s vàlids. El valor %(value)r és "
+"invàlid."
+msgstr[1] ""
+"Si us plau, introdueixi IDs de %(self)s vàlids. Els valors %(value)r són "
+"invàlids."
diff --git a/django/conf/locale/ca/LC_MESSAGES/djangojs.mo b/django/conf/locale/ca/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..a5b908df1f
--- /dev/null
+++ b/django/conf/locale/ca/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/ca/LC_MESSAGES/djangojs.po b/django/conf/locale/ca/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..8167253005
--- /dev/null
+++ b/django/conf/locale/ca/LC_MESSAGES/djangojs.po
@@ -0,0 +1,120 @@
+# translation of djangojs.po to
+# Spanish translation for the django-admin JS files.
+# Copyright (C)
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-20 18:25+0200\n"
+"PO-Revision-Date: 2007-05-20 18:24+0200\n"
+"Last-Translator: Marc Fargas <marc@fargas.com>\n"
+"Language-Team: <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: VIM 7.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Seleccionar tots"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Afegir"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eliminar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s Escollits"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Faci les seves seleccions i faci click a"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Deseleccionar tots"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre Desembre"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M X J V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Ara"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Rellotje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Esculli una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Mitja nit"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Migdia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Avui"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendari"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ahir"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Demà"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ocultar"
diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo
index 0dd2b26dff..d1981a679d 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.mo
+++ b/django/conf/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po
index c5e3f4282a..3ccbefe249 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.po
+++ b/django/conf/locale/de/LC_MESSAGES/django.po
@@ -1,4 +1,3 @@
-# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
@@ -7,346 +6,178 @@ msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-11-15 18:35+0100\n"
-"PO-Revision-Date: 2005-10-08 00:03+0200\n"
-"Last-Translator: Georg Bauer <gb@bofh.ms>\n"
+"POT-Creation-Date: 2007-04-09 22:42+0200\n"
+"PO-Revision-Date: 2007-02-05 03:19+0100\n"
+"Last-Translator: Jannis Leidel <jl@websushi.org>\n"
+"Language-Team: \n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+"X-Poedit-Country: GERMANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: KBabel 1.11.4\n"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "Objekt ID"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "Überschrift"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "Kommentar"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "Bewertung #1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "Bewertung #2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "Bewertung #3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "Bewertung #4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "Bewertung #5"
-
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "Bewertung #6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "Bewertung #7"
-
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "Bewertung #8"
-
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "ist eine Bewertung"
-
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "Datum/Zeit Erstellung"
-
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "ist öffentlich"
-
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
-msgid "IP address"
-msgstr "IP-Adresse"
-
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "ist gelöscht"
-
-#: contrib/comments/models.py:86
-msgid ""
-"Check this box if the comment is inappropriate. A \"This comment has been "
-"removed\" message will be displayed instead."
-msgstr ""
-"Hier einen Haken setzen, wenn der Kommentar unpassend ist. Es wird dann eine "
-"\"Dieser Kommentar wurde entfernt\" Meldung statt dessen angezeigt."
-
-#: contrib/comments/models.py:91
-msgid "comments"
-msgstr "Kommentare"
-
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Inhaltsobjekt"
-
-#: 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 ""
-"Geschrieben von %(user)s am %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
-
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "Autorname"
-
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "IP-Adresse"
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabisch"
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "Bestätigt vom Betreiber"
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengali"
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "Freier Kommentar"
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalanisch"
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "Freie Kommentare"
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Tschechisch"
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "Bewertung"
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Walisisch"
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "Bewertungsdatum"
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dänisch"
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "Karma Bewertung"
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Deutsch"
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "Karma Bewertungen"
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Griechisch"
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "%(score)d Bewertung von %(user)s"
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Englisch"
-#: contrib/comments/models.py:258
-#, python-format
-msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Dieser Kommentar ist von %(user)s markiert:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Spanisch"
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "Kennzeichnungsdatum"
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Argentinisches Spanisch"
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "Benutzerkennzeichnung"
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Finnisch"
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "Benutzerkennzeichnungen"
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Französisch"
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Gekennzeichnet von %r"
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galicisch"
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "Löschdatum"
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Ungarisch"
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "Löschung vom Moderator"
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebräisch"
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "Löschungen vom Moderator"
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Isländisch"
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Vom Moderator %r gelöscht"
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italienisch"
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Anonyme Benutzer können nicht abstimmen"
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japanisch"
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "Ungültige Kommentar-ID"
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Koreanisch"
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "Keine Abstimmung bei Dir selber"
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Kannada"
-#: contrib/comments/views/comments.py:27
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr ""
-"Die Abstimmung ist zwangsweise, weil Du an mindestens einer anderen "
-"Abstimmung teilnimmst."
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Lettisch"
-#: 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] ""
-"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
-"Kommentar:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
-"Kommentaren:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Mazedonisch"
-#: contrib/comments/views/comments.py:116
-#, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Dieser Kommentar ist von einem nicht einschätzbaren Benutzer:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Holländisch"
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Nur POST ist erlaubt"
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norwegisch"
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "Eines oder mehrere der erforderlichen Felder fehlt"
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Polnisch"
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr ""
-"Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portugiesisch"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
-msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
-msgstr ""
-"Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-"
-"ID ist ungültig."
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brasilianisches Portugiesisch"
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr ""
-"Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Rumänisch"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Benutzername:"
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Russisch"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
-msgstr "Abmelden"
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Slowakisch"
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Passwort:"
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Slowenisch"
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
-msgstr "Kennwort vergessen?"
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbisch"
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Bewertungen"
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Schwedisch"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Erforderlich"
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamilisch"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Optional"
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugisch"
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Ein Bild veröffentlichen"
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Türkisch"
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Kommentar:"
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ukrainisch"
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
-msgstr "Kommentarvorschau"
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Vereinfachtes Chinesisch"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Ihr Name:"
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Traditionelles Chinesisch"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -382,25 +213,28 @@ msgstr "Diesen Monat"
msgid "This year"
msgstr "Dieses Jahr"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Yes"
msgstr "Ja"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "No"
msgstr "Nein"
-#: contrib/admin/filterspecs.py:150
+#: contrib/admin/filterspecs.py:150 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Unknown"
msgstr "Unbekannt"
#: contrib/admin/models.py:16
msgid "action time"
-msgstr "Zeit der Aktion"
+msgstr "Zeitpunkt der Aktion"
#: contrib/admin/models.py:19
msgid "object id"
-msgstr "Objekt ID"
+msgstr "Objekt-ID"
#: contrib/admin/models.py:20
msgid "object repr"
@@ -412,7 +246,7 @@ msgstr "Aktionskennzeichen"
#: contrib/admin/models.py:22
msgid "change message"
-msgstr "Änderungsmeldung"
+msgstr "Änderungsmeldung"
#: contrib/admin/models.py:25
msgid "log entry"
@@ -420,406 +254,196 @@ msgstr "Logeintrag"
#: contrib/admin/models.py:26
msgid "log entries"
-msgstr "Logeinträge"
-
-#: contrib/admin/templatetags/admin_list.py:230
-msgid "All dates"
-msgstr "Alle Tage"
+msgstr "Logeinträge"
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Bitte einen Benutzernamen und ein Kennwort eingeben. Beide Felder "
-"berücksichtigen die Groß-/Kleinschreibung."
-
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Anmelden"
-
-#: contrib/admin/views/decorators.py:62
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst: die "
-"Beiträge wurden gesichert."
-
-#: contrib/admin/views/decorators.py:69
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Es sieht danach aus, dass der Browser keine Cookies akzeptiert. Bitte im "
-"Browser Cookies aktivieren und diese Seite neu laden."
-
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Benutzernamen können das Zeichen '@' nicht enthalten."
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
msgstr ""
-"Die eMail-Adresse ist nicht der Benutzername. Bitte '%s' stattdessen "
-"versuchen."
+"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden."
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
-msgstr "Website Verwaltung"
-
-#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:18
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
-
-#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:23
-msgid "You may edit it again below."
-msgstr "Das Element kann jetzt weiter geändert werden."
-
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
-#, python-format
-msgid "You may add another %s below."
-msgstr "Jetzt kann ein weiteres Element vom Typ %s angelegt werden."
-
-#: contrib/admin/views/main.py:289
-#, python-format
-msgid "Add %s"
-msgstr "%s zufügen"
-
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
-msgstr "%s hinzugefügt."
-
-#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339 db/models/manipulators.py:306
-msgid "and"
-msgstr "und"
-
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
-msgstr "%s geändert"
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Start"
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
-msgstr "%s gelöscht."
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfehler"
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
-msgstr "Keine Felder geändert."
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfehler (500)"
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfehler <em>(500)</em>"
-#: contrib/admin/views/main.py:353
-#, python-format
+#: contrib/admin/templates/admin/500.html:10
msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+"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 ""
-"%(name)s \"%(obj)s\" wurde erfolgreich zugefügt. Das Element kann jetzt "
-"geändert werden."
-
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
-msgstr "%s ändern"
-
-#: contrib/admin/views/main.py:473
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Ein oder mehrere %(fieldname)s in %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:478
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Ein oder mehrere %(fieldname)s in %(name)s:"
-
-#: contrib/admin/views/main.py:511
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
-
-#: contrib/admin/views/main.py:514
-msgid "Are you sure?"
-msgstr "Sicher? Ganz sicher?"
-
-#: contrib/admin/views/main.py:536
-#, python-format
-msgid "Change history: %s"
-msgstr "Änderungsgeschichte: %s"
-
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s"
-msgstr "%s auswählen"
-
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s to change"
-msgstr "%s zur Änderung auswählen"
-
-#: contrib/admin/views/main.py:758
-msgid "Database error"
-msgstr "Datenbankfehler"
-
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
-msgid "tag:"
-msgstr "Schlagwort:"
-
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
-msgid "filter:"
-msgstr "Filter:"
-
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
-msgid "view:"
-msgstr "Ansicht:"
-
-#: contrib/admin/views/doc.py:164
-#, python-format
-msgid "App %r not found"
-msgstr "Anwendung %r nicht gefunden"
-
-#: contrib/admin/views/doc.py:171
-#, python-format
-msgid "Model %r not found in app %r"
-msgstr "Modell %r wurde nicht in Anwendung %r gefunden"
-
-#: contrib/admin/views/doc.py:183
-#, python-format
-msgid "the related `%s.%s` object"
-msgstr "Das verknüpfte `%s.%s` Objekt"
-
-#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
-msgid "model:"
-msgstr "Modell:"
-
-#: contrib/admin/views/doc.py:214
-#, python-format
-msgid "related `%s.%s` objects"
-msgstr "verknüpftes `%s.%s` Objekt"
-
-#: contrib/admin/views/doc.py:219
-#, python-format
-msgid "all %s"
-msgstr "Alle %s"
-
-#: contrib/admin/views/doc.py:224
-#, python-format
-msgid "number of %s"
-msgstr "Anzahl von %s"
-
-#: contrib/admin/views/doc.py:229
-#, python-format
-msgid "Fields on %s objects"
-msgstr "Felder am %s Objekt"
-
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
-#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
-#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
-msgid "Integer"
-msgstr "Ganzzahl"
-
-#: contrib/admin/views/doc.py:292
-msgid "Boolean (Either True or False)"
-msgstr "Wahrheitswert (Wahr oder Falsch)"
-
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Zeichenkette (bis zu %(maxlength)s Zeichen)"
-
-#: contrib/admin/views/doc.py:294
-msgid "Comma-separated integers"
-msgstr "Kommaseparierte Liste von Zahlen"
-
-#: contrib/admin/views/doc.py:295
-msgid "Date (without time)"
-msgstr "Datum (ohne Zeit)"
-
-#: contrib/admin/views/doc.py:296
-msgid "Date (with time)"
-msgstr "Datum (mit Zeit)"
-
-#: contrib/admin/views/doc.py:297
-msgid "E-mail address"
-msgstr "E-mail-Adresse"
-
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
-msgid "File path"
-msgstr "Dateipfad"
-
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
-msgstr "Dezimalzahl"
-
-#: contrib/admin/views/doc.py:306
-msgid "Boolean (Either True, False or None)"
-msgstr "Wahrheitswert (Wahr, Falsch oder Nichts)"
-
-#: contrib/admin/views/doc.py:307
-msgid "Relation to parent model"
-msgstr "Beziehung zum Übermodell"
-
-#: contrib/admin/views/doc.py:308
-msgid "Phone number"
-msgstr "Telefonnummer"
-
-#: contrib/admin/views/doc.py:313
-msgid "Text"
-msgstr "Text"
+"Ein Fehler ist aufgetreten. Dieser Fehler wurde an die Serververwalter per E-"
+"Mail weitergegeben und sollte bald behoben sein. Vielen Dank für Ihr "
+"Verständnis."
-#: contrib/admin/views/doc.py:314
-msgid "Time"
-msgstr "Zeit"
-
-#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:316
-msgid "U.S. state (two uppercase letters)"
-msgstr "U.S. Bundesstaat (zwei Grossbuchstaben)"
-
-#: contrib/admin/views/doc.py:317
-msgid "XML text"
-msgstr "XML Text"
-
-#: contrib/admin/views/doc.py:343
-#, python-format
-msgid "%s does not appear to be a urlpattern object"
-msgstr "%s ist scheinbar kein urlpattern Objekt"
-
-#: contrib/admin/views/auth.py:29
-msgid "Add user"
-msgstr "Benutzer zufügen"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Willkommen,"
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Dokumentation"
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
#: contrib/admin/templates/admin_doc/template_detail.html:4
#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
-msgstr "Passwort ändern"
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Abmelden"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Start"
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django-Systemverwaltung"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-Verwaltung"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Hinzufügen"
+#: contrib/admin/templates/admin/change_form.html:21
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
msgid "History"
msgstr "Geschichte"
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Datum/Zeit"
-
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Benutzer"
-
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Aktion"
-
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "j. N Y, H:i"
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Im Web anzeigen"
-#: contrib/admin/templates/admin/object_history.html:36
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
-msgstr ""
-"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
-"über diese Verwaltungsseiten angelegt."
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Bitte den aufgeführten Fehler korrigieren."
+msgstr[1] "Bitte die aufgeführten Fehler korrigieren."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Django Systemverwaltung"
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Sortierung"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Django Verwaltung"
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Reihenfolge:"
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Serverfehler"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s hinzufügen"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Serverfehler (500)"
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Löschen"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Serverfehler <em>(500)</em>"
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Die Löschung des %(object_name)s '%(escaped_object)s' hätte die Löschung von "
+"abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die "
+"folgenden abhängigen Daten zu löschen:"
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
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."
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Es hat einen Fehler gegeben. Dieser Fehler wurde an die Serververwalter per "
-"eMail weitergegeben und sollte bald behoben sein. Vielen Dank für Ihr "
-"Verständnis."
+"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen "
+"wollen? Es werden zusätzlich die folgenden abhängigen Daten mit gelöscht:"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Seite nicht gefunden"
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, ich bin sicher"
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr ""
-"Es tut uns leid, aber die angeforderte Seite kann nicht gefunden werden."
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Nach %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
#: contrib/admin/templates/admin/index.html:17
#, python-format
@@ -831,22 +455,17 @@ msgstr "Modelle, die in der Anwendung %(name)s vorhanden sind."
msgid "%(name)s"
msgstr "%(name)s"
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
-msgid "Add"
-msgstr "Zufügen"
-
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
-msgstr "Ändern"
+msgstr "Ändern"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
-msgstr "Sie haben keine Berechtigung irgendwas zu ändern."
+msgstr "Sie haben keine Berechtigung irgendwas zu ändern."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
-msgstr "Kürzliche Aktionen"
+msgstr "Kürzliche Aktionen"
#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
@@ -856,48 +475,59 @@ msgstr "Meine Aktionen"
msgid "None available"
msgstr "Keine vorhanden"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "%(name)s zufügen"
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, dass "
+"die richtigen Datenbanktabellen angelegt wurden und "
+"die Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
-msgstr "Willkommen,"
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Benutzername:"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Löschen"
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Passwort:"
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
-"related objects, but your account doesn't have permission to delete the "
-"following types of objects:"
-msgstr ""
-"Die Löschung des %(object_name)s '%(escaped_object)s' hätte die Löschung von "
-"abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die "
-"folgenden abhängigen Daten zu löschen:"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Anmelden"
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/Zeit"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Benutzer"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Aktion"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
-"All of the following related items will be deleted:"
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
msgstr ""
-"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen "
-"wollen? Es werden zusätzlich die folgenden abhängigen Daten mit gelöscht:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "Ja, ich bin sicher"
+"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
+"über diese Verwaltungsseiten angelegt."
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
-msgstr " Nach %(filter_title)s "
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zeige alle"
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
@@ -907,47 +537,21 @@ msgstr "Los"
#, python-format
msgid "1 result"
msgid_plural "%(counter)s results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Ein Ergebnis"
+msgstr[1] "%(counter)s Ergebnisse"
#: contrib/admin/templates/admin/search_form.html:10
#, python-format
msgid "%(full_result_count)s total"
msgstr "%(full_result_count)s gesamt"
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Zeige alle"
-
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Filter"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Im Web Anzeigen"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Bitte den Fehler korrigieren."
-msgstr[1] "Bitte die Fehler korrigieren."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Sortierung"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Reihenfolge:"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
-msgstr "Als Neu sichern"
+msgstr "Als neu sichern"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "Sichern und neu hinzufügen"
+msgstr "Sichern und neu hinzufügen"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
@@ -957,142 +561,197 @@ msgstr "Sichern und weiter bearbeiten"
msgid "Save"
msgstr "Sichern"
-#: 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 ""
-"Irgendetwas ist falsch mit der Datenbankkonfiguration. Bitte sicherstellen, "
-"das die richtigen Datenbanktabellen angelegt wurden und bitte sicherstellen, "
-"das die Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
-
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
msgstr ""
-"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
-"Optionen für den Benutzer geändert werden."
+"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
+"Optionen für den Benutzer geändert werden."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
msgid "Username"
msgstr "Benutzername"
#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
msgid "Password"
msgstr "Passwort"
#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
msgid "Password (again)"
-msgstr "Kennwort (wiederholen)"
+msgstr "Passwort (wiederholen)"
#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
msgid "Enter the same password as above, for verification."
-msgstr "Bitte das gleiche Passwort zur Prüfung nochmal eingeben."
+msgstr "Bitte das gleiche Passwort zur Überprüfung nochmal eingeben."
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_form.html:6
-#: contrib/admin/templates/registration/password_change_form.html:10
-msgid "Password change"
-msgstr "Kennwort ändern"
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Bitte geben Sie ein neues Passwort für den Benutzer <strong>%(username)s</"
+"strong> ein."
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Kennwortänderung erfolgreich"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Ihr Kennwort wurde geändert."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentations-Bookmarklets"
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
-msgstr "Kennwort zurücksetzen"
+#: 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\">Um Bookmarklets zu installieren, müssen diese Links in die\n"
+"Browser-Werkzeugleiste gezogen werden, oder mittels rechter Maustaste in "
+"die\n"
+"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder "
+"Seite\n"
+"aufgerufen werden. Einige Bookmarklets sind für den Zugriff von 'internen'\n"
+"Rechnern eingeschränkt. Falls nicht klar ist, ob ein Rechner als 'intern'\n"
+"bewertet wird, bitte den Administrator fragen.</p>\n"
-#: contrib/admin/templates/registration/password_reset_form.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentation für diese Seite"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
msgid ""
-"Forgotten your password? Enter your e-mail address below, and we'll reset "
-"your password and e-mail the new one to you."
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
msgstr ""
-"Passwort vergessen? Einfach die E-Mail-Adresse eingeben und wir setzen das "
-"Passwort auf ein neues und senden das per E-Mail zu."
+"Springt von jeder Seite zu der Dokumentation für den View der diese Seite "
+"erzeugt."
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "E-Mail-Adresse:"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Objekt-ID anzeigen"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Mein Kennwort zurücksetzen"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Zeigt den Content-Type und die eindeutige ID für Seiten die ein einzelnes "
+"Objekt repräsentieren."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Dieses Objekt im aktuellen Fenster ändern."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein "
+"Objekt repräsentiert."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Dieses Objekt in einem neuen Fenster ändern."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Wie zuvor, aber öffnet die Administrationsseite in einem neuen Fenster."
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Vielen Dank, daß Sie hier ein paar nette Minuten verbracht haben."
+msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten verbracht haben."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
-msgstr "Erneut Anmelden"
+msgstr "Erneut anmelden"
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Erfolgreich Kennwort zurückgesetzt"
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Passwort ändern"
-#: contrib/admin/templates/registration/password_reset_done.html:12
-msgid ""
-"We've e-mailed a new password to the e-mail address you submitted. You "
-"should be receiving it shortly."
-msgstr ""
-"Wir haben Ihnen ein neues Kennwort per eMail zugeschickt an die Adresse, die "
-"Sie uns gegeben haben. Es sollte in Kürze ankommen."
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Passwort erfolgreich geändert"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ihr Passwort wurde geändert."
#: contrib/admin/templates/registration/password_change_form.html:12
msgid ""
"Please enter your old password, for security's sake, and then enter your new "
"password twice so we can verify you typed it in correctly."
msgstr ""
-"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Kennwort und darunter "
+"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Passwort und darunter "
"dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das "
"neue Kennwort ein."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "altes Kennwort:"
+msgstr "Altes Passwort:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
-msgstr "neues Kennwort:"
+msgstr "Neues Passwort:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "Kennwortwiederholung:"
+msgstr "Passwort wiederholen:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Mein Kennwort ändern"
+msgstr "Mein Passwort ändern"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Passwort zurücksetzen"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Passwort wurde erfolgreich zurückgesetzt"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Wir haben ein neues Passwort an die von Ihnen angegebene E-Mail-Adresse "
+"geschickt. Sie sollten es in Kürze erhalten."
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Sie erhalten diese Mail, weil Sie ein neues Kennwort"
+msgstr "Sie erhalten diese E-Mail, weil Sie ein neues Passwort"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
msgid "for your user account at %(site_name)s"
-msgstr "für Ihren Benutzer bei %(site_name)s angefordert haben."
+msgstr "für Ihren Benutzer bei %(site_name)s angefordert haben."
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "Ihr neues Kennwort ist: %(new_password)s"
+msgstr "Ihr neues Passwort lautet: %(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 "Sie können das Kennwort auf folgender Seite ändern:"
+msgstr "Sie können das Passwort auf folgender Seite ändern:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
@@ -1107,76 +766,21 @@ msgstr "Vielen Dank, dass Sie unsere Seiten benutzen!"
msgid "The %(site_name)s team"
msgstr "Das Team von %(site_name)s"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "Bookmarklets"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "Dokumentations-Bookmarklets"
-
-#: 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\">Um Bookmarklets zu installieren müssen diese Links in die\n"
-"Browser-Werkzeugleiste gehzogen werden, oder mittels rechter Maustaste in "
-"die\n"
-"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder "
-"Seite\n"
-"aufgerufen werden. Einige Bookmarklets sind für den Zugriff von 'internen'\n"
-"Rechnern eingeschränkt. Falls nicht klar ist, ob ein Rechner als 'intern'\n"
-"bewertet wird, bitte den Administrator fragen.</p>\n"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "Dokumentation für diese Seite"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
-msgid ""
-"Jumps you from any page to the documentation for the view that generates "
-"that page."
-msgstr ""
-"Springt von jeder Seite zu der Dokumentation für den View der diese Seite "
-"erzeugt."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "Objekt ID anzeigen"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/admin/templates/registration/password_reset_form.html:12
msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
-msgstr ""
-"Zeigt den Content-Type und die eindeutige ID für Seiten die ein einzelnes "
-"Objekt repräsentieren."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "Dieses Objekt im aktuellen Fenster ändern."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
msgstr ""
-"Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein "
-"Objekt repräsentiert."
+"Passwort vergessen? Einfach die E-Mail-Adresse eingeben und wir setzen das "
+"Passwort zurück und lassen es Ihnen per E-Mail zukommen."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "Dieses Objekt in einem neuen Fenster ändern."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-Mail-Adresse:"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
-msgstr ""
-"Wie zuvor, aber öffnent die Administrationsseite in einem neuen Fenster."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Mein Passwort zurücksetzen"
#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
@@ -1192,92 +796,337 @@ msgstr "Derzeit:"
#: contrib/admin/templates/widget/file.html:3
msgid "Change:"
-msgstr "Ändern:"
+msgstr "Ändern:"
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "Umleitung von"
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Alle Tage"
-#: contrib/redirects/models.py:8
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Das Element kann jetzt weiter bearbeitet werden."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Benutzer hinzufügen"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Passwort erfolgreich geändert."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Passwort ändern: %s"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
msgstr ""
-"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
-"events/search/'."
+"Bitte einen Benutzernamen und ein Passwort eingeben. Beide Felder "
+"berücksichtigen die Groß-/Kleinschreibung."
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "Umleitung zu"
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst, die "
+"Beiträge wurden gesichert."
-#: contrib/redirects/models.py:10
+#: contrib/admin/views/decorators.py:69
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
msgstr ""
-"Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
-"Anfang stehen."
+"Es sieht danach aus, dass der Browser keine Cookies akzeptiert. Bitte im "
+"Browser Cookies aktivieren und diese Seite neu laden."
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "Umleitung"
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Benutzernamen dürfen das Zeichen '@' nicht enthalten."
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "Umleitungen"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Die E-Mail-Adresse entspricht nicht Ihrem Benutzernamen. Bitte stattdessen '%"
+"s' versuchen."
-#: contrib/flatpages/models.py:8
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "Schlagwort:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "Filter:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "Ansicht:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Anwendung %r nicht gefunden"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modell %(name)r wurde nicht in Anwendung %(label)r gefunden"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "Das verknüpfte `%(label)s.%(type)s` Objekt"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "Modell:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "verknüpftes `%(label)s.%(name)s` Objekt"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "Alle %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "Anzahl von %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Felder am %s Objekt"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Ganzzahl"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolscher Wert (True oder False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Zeichenkette (bis zu %(maxlength)s Zeichen)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Kommaseparierte Liste von Ganzzahlen"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Datum (ohne Uhrzeit)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Datum (mit Uhrzeit)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-Mail-Adresse"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Dateipfad"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Dezimalzahl"
+
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP-Adresse"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolscher Wert (True, False oder None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Beziehung zum Eltern-Modell"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Zeit"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "Adresse (URL)"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. Bundesstaat (zwei Großbuchstaben)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML-Text"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ist scheinbar kein urlpattern Objekt"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Website-Verwaltung"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Jetzt kann ein weiteres Element vom Typ %s angelegt werden."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s hinzufügen"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s hinzugefügt."
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
+msgid "and"
+msgstr "und"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s geändert."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s gelöscht."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Keine Felder geändert."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
+
+#: contrib/admin/views/main.py:353
+#, python-format
msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
+"%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt. Das Element kann jetzt "
+"geändert werden."
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "Titel"
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s ändern"
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "Inhalt"
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s: %(obj)s"
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "Kommentare aktivieren"
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s:"
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "Name der Vorlage"
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
-#: contrib/flatpages/models.py:13
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Sind Sie ganz sicher?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Änderungsgeschichte: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "%s auswählen"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "%s zur Änderung auswählen"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Datenbankfehler"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Die beiden Passwörter sind nicht identisch."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ein Benutzer mit diesem Namen existiert bereits."
+
+#: contrib/auth/forms.py:53
msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefüllt ist, "
-"wird 'flatpages/default.html' als Standard gewählt."
+"Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für "
+"die Anmeldung zwingend erforderlich."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "Registrierung erforderlich"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Dieser Benutzer ist inaktiv."
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
msgstr ""
-"Wenn hier ein Haken ist, können nur angemeldete Benutzer diese Seite sehen."
+"Zu dieser E-Mail-Adresse existiert kein Benutzer. Sicher, dass Sie sich mit "
+"dieser Adresse angemeldet haben?"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "Webseite"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "Webseiten"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Die beiden neuen Passwörter sind nicht identisch."
-#: contrib/auth/views.py:39
-msgid "Logged out"
-msgstr "Abgemeldet"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Das alte Passwort war falsch. Bitte neu eingeben."
-#: contrib/auth/models.py:38 contrib/auth/models.py:57
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
msgid "name"
msgstr "Name"
@@ -1285,27 +1134,27 @@ msgstr "Name"
msgid "codename"
msgstr "Codename"
-#: contrib/auth/models.py:42
+#: contrib/auth/models.py:43
msgid "permission"
msgstr "Berechtigung"
-#: contrib/auth/models.py:43 contrib/auth/models.py:58
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
msgid "permissions"
msgstr "Berechtigungen"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:62
msgid "group"
msgstr "Gruppe"
-#: contrib/auth/models.py:61 contrib/auth/models.py:100
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
msgid "groups"
msgstr "Gruppen"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:93
msgid "username"
msgstr "Benutzername"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:93
msgid ""
"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
"digits and underscores)."
@@ -1313,530 +1162,923 @@ msgstr ""
"Erforderlich. 30 Zeichen oder weniger. Alphanumerische Zeichen (Buchstaben, "
"Ziffern und Unterstriche sind erlaubt)."
-#: contrib/auth/models.py:91
+#: contrib/auth/models.py:94
msgid "first name"
msgstr "Vorname"
-#: contrib/auth/models.py:92
+#: contrib/auth/models.py:95
msgid "last name"
msgstr "Nachname"
-#: contrib/auth/models.py:93
+#: contrib/auth/models.py:96
msgid "e-mail address"
-msgstr "eMail-Adresse"
+msgstr "E-Mail-Adresse"
-#: contrib/auth/models.py:94
+#: contrib/auth/models.py:97
msgid "password"
-msgstr "Kennwort"
+msgstr "Passwort"
-#: contrib/auth/models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Im Format '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:97
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Die Form '[algo]$[salt]$[hexdigest]' verwenden, oder das <a href=\"password/"
+"\">Passwort ändern Formular</a> benutzen."
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:98
msgid "staff status"
msgstr "Administrator"
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:98
msgid "Designates whether the user can log into this admin site."
msgstr ""
-"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann."
+"Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann."
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:99
msgid "active"
msgstr "Aktiv"
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:99
msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
msgstr ""
-"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann. "
-"Anstelle Benutzer zu löschen, kann das hier auch einfach abgeschaltet werden."
+"Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann. "
+"Anstatt einen Benutzer zu löschen, kann er hier auch einfach deaktiviert "
+"werden."
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:100
msgid "superuser status"
msgstr "Hauptadmin."
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:100
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
-"Bestimmt, dass dieser Benutzer alle Berechtigungen hat, ohne diese einzeln "
-"zuweisen zu müssen."
+"Legt fest, dass der Benutzer alle Berechtigungen hat, ohne diese einzeln "
+"zuweisen zu müssen."
-#: contrib/auth/models.py:98
+#: contrib/auth/models.py:101
msgid "last login"
-msgstr "letzte Anmeldung"
+msgstr "Letzte Anmeldung"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:102
msgid "date joined"
msgstr "Mitglied seit"
-#: contrib/auth/models.py:101
+#: contrib/auth/models.py:104
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
msgstr ""
-"Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch "
+"Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch "
"alle Rechte, die seine zugewiesenen Gruppen haben."
-#: contrib/auth/models.py:102
+#: contrib/auth/models.py:105
msgid "user permissions"
msgstr "Berechtigungen"
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:109
msgid "user"
msgstr "Benutzer"
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:110
msgid "users"
msgstr "Benutzer"
-#: contrib/auth/models.py:111
+#: contrib/auth/models.py:116
msgid "Personal info"
-msgstr "Persönliche Infos"
+msgstr "Persönliche Infos"
-#: contrib/auth/models.py:112
+#: contrib/auth/models.py:117
msgid "Permissions"
msgstr "Berechtigungen"
-#: contrib/auth/models.py:113
+#: contrib/auth/models.py:118
msgid "Important dates"
msgstr "Wichtige Daten"
-#: contrib/auth/models.py:114
+#: contrib/auth/models.py:119
msgid "Groups"
msgstr "Gruppen"
-#: contrib/auth/models.py:258
+#: contrib/auth/models.py:263
msgid "message"
msgstr "Mitteilung"
-#: contrib/auth/forms.py:16
-msgid "The two password fields didn't match."
-msgstr "Die zwei Passwörter sind nicht gleich."
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Abgemeldet"
-#: contrib/auth/forms.py:24
-msgid "A user with that username already exists."
-msgstr "Ein Benutzer mit diesem Namen existiert bereits."
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "Objekt-ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "Ãœberschrift"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "Kommentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "Bewertung #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "Bewertung #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "Bewertung #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "Bewertung #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "Bewertung #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "Bewertung #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "Bewertung #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "Bewertung #8"
-#: contrib/auth/forms.py:52
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "ist eine Bewertung"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "Datum/Zeit Erstellung"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "ist öffentlich"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "ist gelöscht"
+
+#: contrib/comments/models.py:86
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
msgstr ""
-"Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für "
-"die Anmeldung zwingend notwendig."
+"Hier einen Haken setzen, wenn der Kommentar unpassend ist. Stattdessen wird "
+"dann \"Dieser Kommentar wurde entfernt\" Meldung angezeigt."
-#: contrib/auth/forms.py:61
-msgid "This account is inactive."
-msgstr "Dieser Benutzer ist inaktiv."
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "Kommentare"
-#: contrib/auth/forms.py:84
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Inhaltsobjekt"
+
+#: contrib/comments/models.py:159
+#, python-format
msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
msgstr ""
-"Die Email-Adresse hat keinen Benutzer zugeordnet. Sicher, dass die Adresse "
-"hier angemeldet ist?"
+"Geschrieben von %(user)s am %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
-#: contrib/auth/forms.py:116
-msgid "The two 'new password' fields didn't match."
-msgstr "Die zwei Passwörter sind nicht gleich."
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Autorname"
-#: contrib/auth/forms.py:123
-msgid "Your old password was entered incorrectly. Please enter it again."
-msgstr "Das alte Passwort war falsch. Bitte neu eingeben."
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP-Adresse"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "Bestätigt vom Betreiber"
-#: contrib/contenttypes/models.py:20
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "Freier Kommentar"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "Freie Kommentare"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "Bewertung"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "Bewertungsdatum"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Karma Bewertung"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Karma Bewertungen"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d Bewertung von %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Dieser Kommentar ist von %(user)s markiert:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "Kennzeichnungsdatum"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "Benutzerkennzeichnung"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "Benutzerkennzeichnungen"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Gekennzeichnet von %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "Löschdatum"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Löschung vom Moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Löschungen vom Moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Vom Moderator %r gelöscht"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Passwort vergessen?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Bewertungen"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Erforderlich"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Ein Bild veröffentlichen"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Kommentarvorschau"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ihr Name:"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Diese Abstimmung ist zwingend erforderlich, da Sie an mindestens einer "
+"weiteren Abstimmung teilnehmen."
+
+#: 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] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentaren:\n"
+"\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 ""
+"Dieser Kommentar ist von einem nicht einschätzbaren Benutzer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Nur POST ist erlaubt"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eines oder mehrere der erforderlichen Felder fehlen"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-"
+"ID ist ungültig."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme Benutzer dürfen nicht abstimmen"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ungültige Kommentar-ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Keine Abstimmung für dich selbst"
+
+#: contrib/contenttypes/models.py:36
msgid "python model class name"
msgstr "Python Model-Klassenname"
-#: contrib/contenttypes/models.py:23
+#: contrib/contenttypes/models.py:39
msgid "content type"
msgstr "Inhaltstyp"
-#: contrib/contenttypes/models.py:24
+#: contrib/contenttypes/models.py:40
msgid "content types"
msgstr "Inhaltstypen"
-#: contrib/sessions/models.py:51
-msgid "session key"
-msgstr "Sitzungs-ID"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
-#: contrib/sessions/models.py:52
-msgid "session data"
-msgstr "Sitzungsdaten"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "Titel"
-#: contrib/sessions/models.py:53
-msgid "expire date"
-msgstr "Verfallsdatum"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "Inhalt"
-#: contrib/sessions/models.py:57
-msgid "session"
-msgstr "Sitzung"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Kommentare aktivieren"
-#: contrib/sessions/models.py:58
-msgid "sessions"
-msgstr "Sitzungen"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Name der Vorlage"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "Domainname"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefüllt ist, "
+"wird 'flatpages/default.html' als Standard gewählt."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "Anzeigename"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "Registrierung erforderlich"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "Website"
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Wenn hier ein Haken gesetzt ist, können nur angemeldete Benutzer diese Seite "
+"sehen."
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "Websites"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "Webseite"
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "Montag"
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "Webseiten"
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "Dienstag"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr ""
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "Donnerstag"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr ""
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "Freitag"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "Samstag"
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "Sonntag"
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
-#: utils/dates.py:14
-msgid "January"
-msgstr "Januar"
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
-#: utils/dates.py:14
-msgid "February"
-msgstr "Februar"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "ein"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
-msgstr "März"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "zwei"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
-msgstr "April"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "drei"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
-msgstr "Mai"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "vier"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
-msgstr "Juni"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "fünf"
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
-msgstr "Juli"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sechs"
-#: utils/dates.py:15
-msgid "August"
-msgstr "August"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sieben"
-#: utils/dates.py:15
-msgid "September"
-msgstr "September"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "acht"
-#: utils/dates.py:15
-msgid "October"
-msgstr "Oktober"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "neun"
-#: utils/dates.py:15
-msgid "November"
-msgstr "November"
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Bitte eine gültige vierstellige Postleitzahl eingeben."
-#: utils/dates.py:16
-msgid "December"
-msgstr "Dezember"
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX-XXX eingeben."
-#: utils/dates.py:19
-msgid "jan"
-msgstr "Jan"
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummern müssen das Format XXX-XXX-XXXX haben."
-#: utils/dates.py:19
-msgid "feb"
-msgstr "Feb"
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
-#: utils/dates.py:19
-msgid "mar"
-msgstr "Mär"
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bayern"
-#: utils/dates.py:19
-msgid "apr"
-msgstr "Apr"
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
-#: utils/dates.py:19
-msgid "may"
-msgstr "Mai"
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
-#: utils/dates.py:19
-msgid "jun"
-msgstr "Jun"
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
-#: utils/dates.py:20
-msgid "jul"
-msgstr "Jul"
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
-#: utils/dates.py:20
-msgid "aug"
-msgstr "Aug"
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
-#: utils/dates.py:20
-msgid "sep"
-msgstr "Sep"
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
-#: utils/dates.py:20
-msgid "oct"
-msgstr "Okt"
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Niedersachsen"
-#: utils/dates.py:20
-msgid "nov"
-msgstr "Nov"
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nordrhein-Westfalen"
-#: utils/dates.py:20
-msgid "dec"
-msgstr "Dez"
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rheinland-Pfalz"
-#: utils/dates.py:27
-msgid "Jan."
-msgstr "Jan."
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
-#: utils/dates.py:27
-msgid "Feb."
-msgstr "Feb."
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sachsen"
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "Aug."
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Sachsen-Anhalt"
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "Sept."
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
-#: utils/dates.py:28
-msgid "Oct."
-msgstr "Okt."
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thüringen"
-#: utils/dates.py:28
-msgid "Nov."
-msgstr "Nov."
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX eingeben."
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "Dez."
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Bitte eine gültige deutsche Personalausweisnummer im Format "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X eingeben."
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "Jahr"
-msgstr[1] "Jahre"
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Bitte eine gültige finnische Sozialversicherungsnummer eingeben."
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "Monat"
-msgstr[1] "Monate"
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+"Bitte eine gültige Postleitzahl im Format XXXXXXX oder XXX-XXXX "
+"eingeben."
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "Woche"
-msgstr[1] "Wochen"
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "Tag"
-msgstr[1] "Tage"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "Stunde"
-msgstr[1] "Stunden"
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "Minute"
-msgstr[1] "Minuten"
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
-#: utils/translation/trans_real.py:362
-msgid "DATE_FORMAT"
-msgstr "j. N Y"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
-#: utils/translation/trans_real.py:363
-msgid "DATETIME_FORMAT"
-msgstr "j. N Y, H:i"
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
-#: utils/translation/trans_real.py:364
-msgid "TIME_FORMAT"
-msgstr "H:i"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
-#: utils/translation/trans_real.py:380
-msgid "YEAR_MONTH_FORMAT"
-msgstr "F Y"
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
-#: utils/translation/trans_real.py:381
-msgid "MONTH_DAY_FORMAT"
-msgstr "j. F"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
-#: conf/global_settings.py:39
-msgid "Arabic"
-msgstr "Arabisch"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
-#: conf/global_settings.py:40
-msgid "Bengali"
-msgstr "Bengali"
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
-#: conf/global_settings.py:41
-msgid "Czech"
-msgstr "Tschechisch"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
-#: conf/global_settings.py:42
-msgid "Welsh"
-msgstr "Walisisch"
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
-#: conf/global_settings.py:43
-msgid "Danish"
-msgstr "Dänisch"
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
-#: conf/global_settings.py:44
-msgid "German"
-msgstr "Deutsch"
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
-#: conf/global_settings.py:45
-msgid "Greek"
-msgstr "Griechisch"
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
-#: conf/global_settings.py:46
-msgid "English"
-msgstr "Englisch"
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
-#: conf/global_settings.py:47
-msgid "Spanish"
-msgstr "Spanisch"
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
-#: conf/global_settings.py:48
-msgid "Argentinean Spanish"
-msgstr "Argentinisches Spanisch"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
-#: conf/global_settings.py:49
-msgid "Finnish"
-msgstr "Finnisch"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
-#: conf/global_settings.py:50
-msgid "French"
-msgstr "Französisch"
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
-#: conf/global_settings.py:51
-msgid "Galician"
-msgstr "Galicisch"
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
-#: conf/global_settings.py:52
-msgid "Hungarian"
-msgstr "Ungarisch"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
-#: conf/global_settings.py:53
-msgid "Hebrew"
-msgstr "Hebräisch"
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
-#: conf/global_settings.py:54
-msgid "Icelandic"
-msgstr "Isländisch"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
-#: conf/global_settings.py:55
-msgid "Italian"
-msgstr "Italienisch"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
-#: conf/global_settings.py:56
-msgid "Japanese"
-msgstr "Japanisch"
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
-#: conf/global_settings.py:57
-msgid "Dutch"
-msgstr "Holländisch"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
-#: conf/global_settings.py:58
-msgid "Norwegian"
-msgstr "Norwegisch"
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
-#: conf/global_settings.py:59
-msgid "Polish"
-msgstr "Polnisch"
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
-#: conf/global_settings.py:60
-msgid "Brazilian"
-msgstr "Brasilianisch"
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
-#: conf/global_settings.py:61
-msgid "Romanian"
-msgstr "Rumänisch"
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
-#: conf/global_settings.py:62
-msgid "Russian"
-msgstr "Russisch"
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
-#: conf/global_settings.py:63
-msgid "Slovak"
-msgstr "Slowakisch"
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
-#: conf/global_settings.py:64
-msgid "Slovenian"
-msgstr "Slowenisch"
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
-#: conf/global_settings.py:65
-msgid "Serbian"
-msgstr "Serbisch"
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
-#: conf/global_settings.py:66
-msgid "Swedish"
-msgstr "Schwedisch"
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
-#: conf/global_settings.py:67
-msgid "Tamil"
-msgstr "Tamilisch"
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Zeit"
-#: conf/global_settings.py:68
-msgid "Turkish"
-msgstr "Türkisch"
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
-#: conf/global_settings.py:69
-msgid "Ukrainian"
-msgstr "Ukrainisch"
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
-#: conf/global_settings.py:70
-msgid "Simplified Chinese"
-msgstr "Vereinfachtes Chinesisch"
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
-#: conf/global_settings.py:71
-msgid "Traditional Chinese"
-msgstr "Traditionelles Chinesisch"
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXX eingeben."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Bitte eine gültige norwegische Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Bitte eine gültige Postleitzahl eingeben. Ein Leerzeichen trennt die zwei Teile."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX oder XXXXX-XXXX eingeben."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Bitte eine gültige US-amerikanische Sozialversicherungsnummer im Format "
+"XXX-XX-XXXX eingeben."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "Umleitung von"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "Umleitung zu"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
+"Anfang stehen."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "Umleitung"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "Umleitungen"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "Sitzungs-ID"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "Sitzungsdaten"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "Verfallsdatum"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "Sitzung"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "Sitzungen"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "Domainname"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "Anzeigename"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "Website"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "Websites"
#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
@@ -1847,7 +2089,7 @@ msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche "
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche "
"enthalten."
#: core/validators.py:72
@@ -1858,7 +2100,7 @@ msgstr ""
#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
-msgstr "Großbuchstaben sind hier nicht erlaubt."
+msgstr "Großbuchstaben sind hier nicht erlaubt."
#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
@@ -1870,11 +2112,11 @@ msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt."
#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Bitte mit Komma getrennte, gültige eMail-Adressen eingeben."
+msgstr "Bitte mit Komma getrennte, gültige E-Mail-Adressen eingeben."
#: core/validators.py:103
msgid "Please enter a valid IP address."
-msgstr "Bitte eine gültige IP-Adresse eingeben."
+msgstr "Bitte eine gültige IP-Adresse eingeben."
#: core/validators.py:107
msgid "Empty values are not allowed here."
@@ -1888,7 +2130,7 @@ msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt."
msgid "This value can't be comprised solely of digits."
msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen."
-#: core/validators.py:120
+#: core/validators.py:120 newforms/fields.py:128
msgid "Enter a whole number."
msgstr "Bitte eine ganze Zahl eingeben."
@@ -1898,218 +2140,225 @@ msgstr "Nur alphabetische Zeichen sind hier erlaubt."
#: core/validators.py:139
msgid "Year must be 1900 or later."
-msgstr "Das Jahr muss 1900 oder später sein."
+msgstr "Das Jahr muss 1900 oder später sein."
#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
-msgstr "Ungültiges Datum: %s"
+msgid "Invalid date: %s"
+msgstr "Ungültiges Datum: %s"
-#: core/validators.py:147 db/models/fields/__init__.py:424
+#: core/validators.py:148 db/models/fields/__init__.py:457
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Bitte ein gültiges Datum im Format JJJJ-MM-TT eingeben."
+msgstr "Bitte ein gültiges Datum im Format JJJJ-MM-TT eingeben."
-#: core/validators.py:152
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
-msgstr "Bitte eine gültige Zeit im Format SS:MM eingeben."
+msgstr "Bitte eine gültige Zeit im Format SS:MM eingeben."
-#: core/validators.py:156 db/models/fields/__init__.py:488
+#: core/validators.py:157 db/models/fields/__init__.py:526
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr ""
-"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM "
+"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM "
"eingeben."
-#: core/validators.py:161
+#: core/validators.py:162 newforms/fields.py:271
msgid "Enter a valid e-mail address."
-msgstr "Bitte eine gültige eMail-Adresse eingeben"
+msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
-#: core/validators.py:173 core/validators.py:442 forms/__init__.py:667
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
-"Es wurde keine Datei geschickt. Eventuell ist das Formular-Encoding falsch."
+"Es wurde keine Datei übermittelt. Eventuell ist das Formular-Encoding falsch."
-#: core/validators.py:177
+#: core/validators.py:178
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-"Bitte ein Bild hochladen. Die Datei, die hochgeladen wurde, ist kein Bild "
-"oder ist defekt."
+"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild, oder ist "
+"defekt."
-#: core/validators.py:184
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "Die URL %s zeigt nicht auf ein gültiges Bild."
+msgstr "Die URL %s zeigt nicht auf ein gültiges Bild."
-#: core/validators.py:188
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-"Telefonnummern müssen im Format XXX-XXX-XXXX sein. \"%s\" ist ungültig."
+"Telefonnummern müssen das Format XXX-XXX-XXXX haben. \"%s\" ist ungültig."
-#: core/validators.py:196
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Die URL %s zeigt nicht auf ein gültiges QuickTime video."
+msgstr "Die URL %s zeigt nicht auf ein gültiges QuickTime-Video."
-#: core/validators.py:200
+#: core/validators.py:201
msgid "A valid URL is required."
-msgstr "Eine gültige URL ist hier verlangt."
+msgstr "Eine gültige URL wird hier verlangt."
-#: core/validators.py:214
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Bitte gültiges HTML eingeben. Fehler sind:\n"
+"Bitte gültiges HTML eingeben. Fehler sind:\n"
"%s"
-#: core/validators.py:221
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
-msgstr "Ungültiges XML: %s"
+msgstr "Ungültiges XML: %s"
-#: core/validators.py:238
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
-msgstr "Ungültige URL: %s"
+msgstr "Ungültige URL: %s"
-#: core/validators.py:243 core/validators.py:245
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "Die URL %s funktioniert nicht."
-#: core/validators.py:251
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Bitte eine gültige Abkürzung für einen US-Staat eingeben."
+msgstr "Bitte eine gültige Abkürzung für einen US-Staat eingeben."
-#: core/validators.py:265
+#: core/validators.py:266
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
msgstr[0] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!"
-msgstr[1] "Keine Schimpfworte! Die Wörter %s sind hier nicht gern gesehen!"
+msgstr[1] "Keine Schimpfworte! Die Wörter %s sind hier nicht gern gesehen!"
-#: core/validators.py:272
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "Dieses Feld muss zum Feld '%s' passen."
-#: core/validators.py:291
+#: core/validators.py:292
msgid "Please enter something for at least one field."
-msgstr "Bitte mindestens eines der Felder ausfüllen."
+msgstr "Bitte mindestens eines der Felder ausfüllen."
-#: core/validators.py:300 core/validators.py:311
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
-msgstr "Bitte entweder beide Felder ausfüllen, oder beide leer lassen."
+msgstr "Bitte entweder beide Felder ausfüllen, oder beide leer lassen."
-#: core/validators.py:318
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr ""
-"Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
-#: core/validators.py:330
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr ""
-"Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
-#: core/validators.py:349
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "Doppelte Werte sind hier nicht erlaubt."
-#: core/validators.py:364
-msgid "This value must be between %s and %s."
-msgstr "Dieser Wert muss zwischen %s und %s sein."
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Dieser Wert muss zwischen %(lower)s und %(upper)s sein."
-#: core/validators.py:366
+#: core/validators.py:369
+#, python-format
msgid "This value must be at least %s."
msgstr "Dieser Wert muss mindestens %s sein."
-#: core/validators.py:368
+#: core/validators.py:371
+#, python-format
msgid "This value must be no more than %s."
msgstr "Dieser Wert darf maximal %s sein."
-#: core/validators.py:404
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr "Dieser Wert muss eine Potenz von %s sein."
-#: core/validators.py:415
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
-msgstr "Bitte eine gültige Dezimalzahl eingeben."
+msgstr "Bitte eine gültige Dezimalzahl eingeben."
-#: core/validators.py:419
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
"Please enter a valid decimal number with at most %s total digits."
-msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
-msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
+msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
+msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
-#: core/validators.py:422
+#: core/validators.py:425
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
msgid_plural ""
"Please enter a valid decimal number with a whole part of at most %s digits."
-msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
-msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffer "
+"eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffern "
+"eingeben."
-#: core/validators.py:425
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
"Please enter a valid decimal number with at most %s decimal places."
msgstr[0] ""
-"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
msgstr[1] ""
-"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
-#: core/validators.py:435
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-"Bitte sicherstellen, daß die hochgeladene Datei mindestens %s Bytes gross "
+"Bitte sicherstellen, dass die hochgeladene Datei mindestens %s Bytes groß "
"ist."
-#: core/validators.py:436
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-"Bitte sicherstellen, daß die hochgeladene Datei maximal %s Bytes gross ist."
+"Bitte sicherstellen, dass die hochgeladene Datei maximal %s Bytes groß ist."
-#: core/validators.py:453
+#: core/validators.py:456
msgid "The format for this field is wrong."
-msgstr "Das Format für dieses Feld ist falsch."
+msgstr "Das Format für dieses Feld ist falsch."
-#: core/validators.py:468
+#: core/validators.py:471
msgid "This field is invalid."
-msgstr "Dieses Feld ist ungültig."
+msgstr "Dieses Feld ist ungültig."
-#: core/validators.py:504
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Konnte nichts von %s empfangen."
-#: core/validators.py:507
+#: core/validators.py:510
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'."
-#: core/validators.py:540
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile "
+"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile "
"beginnt mit \"%(start)s\"."
-#: core/validators.py:544
+#: core/validators.py:547
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -2118,25 +2367,25 @@ msgstr ""
"In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile "
"beginnt mit \"%(start)s\"."
-#: core/validators.py:549
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit "
+"Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit "
"\"%(start)s\"."
-#: core/validators.py:554
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s"
+"<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s"
"\"."
-#: core/validators.py:558
+#: core/validators.py:561
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@@ -2145,123 +2394,417 @@ msgstr ""
"Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die "
"Zeile beginnt mit \"%(start)s\"."
-#: core/validators.py:563
+#: core/validators.py:566
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile "
+"Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile "
"beginnt mit \"%(start)s\"."
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "%(verbose_name)s wurde erfolgreich angelegt."
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "%(verbose_name)s wurde erfolgreich aktualisiert."
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "%(verbose_name)s wurde gelöscht"
-
-#: db/models/manipulators.py:305
+#: db/models/manipulators.py:307
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr ""
-"Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)"
+"Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)"
"s'."
-#: db/models/fields/__init__.py:41
+#: db/models/fields/__init__.py:42
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "Ein '%(optname)s' mit diesem '%(fieldname)s' existiert bereits."
-#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266
-#: db/models/fields/__init__.py:569 db/models/fields/__init__.py:580
-#: forms/__init__.py:352
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463 newforms/models.py:178 oldforms/__init__.py:357
msgid "This field is required."
-msgstr "Dieses Feld ist zwingend."
+msgstr "Dieses Feld ist zwingend erforderlich."
-#: db/models/fields/__init__.py:349
+#: db/models/fields/__init__.py:367
msgid "This value must be an integer."
msgstr "Dieser Wert muss eine Ganzzahl sein."
-#: db/models/fields/__init__.py:381
+#: db/models/fields/__init__.py:402
msgid "This value must be either True or False."
msgstr "Dieser Wert muss wahr oder falsch sein."
-#: db/models/fields/__init__.py:397
+#: db/models/fields/__init__.py:423
msgid "This field cannot be null."
msgstr "Dieses Feld darf nicht leer sein."
-#: db/models/fields/__init__.py:589
+#: db/models/fields/__init__.py:630
msgid "Enter a valid filename."
-msgstr "Bitte einen gültigen Dateinamen eingeben"
+msgstr "Bitte einen gültigen Dateinamen eingeben."
-#: db/models/fields/related.py:51
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "Dieser Wert muss None, True oder False sein."
+
+#: db/models/fields/related.py:53
#, python-format
msgid "Please enter a valid %s."
-msgstr "Bitte ein gültiges '%s' eingeben."
+msgstr "Bitte ein gültiges '%s' eingeben."
-#: db/models/fields/related.py:618
+#: db/models/fields/related.py:642
msgid "Separate multiple IDs with commas."
-msgstr "Mehrere IDs können mit Komma getrennt werden."
+msgstr "Mehrere IDs können mit Komma getrennt werden."
-#: db/models/fields/related.py:620
+#: db/models/fields/related.py:644
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
-" Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command"
-"\", beim Klicken gedrückt halten."
+"Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command"
+"\", beim Klicken gedrückt halten."
-#: db/models/fields/related.py:664
+#: db/models/fields/related.py:691
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
"Please enter valid %(self)s IDs. The values %(value)r are invalid."
msgstr[0] ""
-"Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
+"Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
msgstr[1] ""
-"Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+"Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Bitte sicherstellen, dass der Text maximal %d Zeichen hat."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Bitte sicherstellen, dass der Text wenigstens %d Zeichen hat."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Dieser Wert darf maximal %s sein."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Dieser Wert muss größer oder gleich %s sein."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Bitte ein gültiges Datum eingeben."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Bitte eine gültige Uhrzeit eingeben."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Bitte gültiges Datum und Uhrzeit eingeben."
-#: forms/__init__.py:387
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Bitte einen gültigen Wert eingeben."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Bitte eine gültige Adresse eingeben."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Diese Adresse scheint nicht gültig zu sein."
+
+#: newforms/fields.py:362 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen."
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "Eine Liste mit Werten eingeben."
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen. %s ist keine gültige Auswahl."
+
+#: oldforms/__init__.py:392
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
msgstr[1] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
-#: forms/__init__.py:392
+#: oldforms/__init__.py:397
msgid "Line breaks are not allowed here."
-msgstr "Zeilenumbrüche sind hier nicht erlaubt."
+msgstr "Zeilenumbrüche sind hier nicht erlaubt."
-#: forms/__init__.py:493 forms/__init__.py:566 forms/__init__.py:605
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr ""
-"Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
+"Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
-#: forms/__init__.py:669
+#: oldforms/__init__.py:674
msgid "The submitted file is empty."
-msgstr "Die ausgewählte Datei ist leer."
+msgstr "Die ausgewählte Datei ist leer."
-#: forms/__init__.py:725
+#: oldforms/__init__.py:730
msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Bitte eine ganze Zahl zwischen -32.768 und 32.767 eingeben."
+msgstr "Bitte eine Ganzzahl zwischen -32.768 und 32.767 eingeben."
-#: forms/__init__.py:735
+#: oldforms/__init__.py:740
msgid "Enter a positive number."
msgstr "Bitte eine ganze, positive Zahl eingeben."
-#: forms/__init__.py:745
+#: oldforms/__init__.py:750
msgid "Enter a whole number between 0 and 32,767."
msgstr "Bitte eine ganze Zahl zwischen 0 und 32.767 eingeben."
-#: template/defaultfilters.py:401
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
msgstr "Ja,Nein,Vielleicht"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "nachm."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "vorm."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "nachm."
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "vorm."
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "Mitternacht"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "Mittag"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Montag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Freitag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samstag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "März"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezember"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "Jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "Feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "Mär"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "Apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "Mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "Jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "Jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "Aug"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "Sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "Okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "Nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "Dez"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Jahr"
+msgstr[1] "Jahre"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "Monat"
+msgstr[1] "Monate"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "Woche"
+msgstr[1] "Wochen"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
+
+#: 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, H:i"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: 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"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s wurde erfolgreich angelegt."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s wurde erfolgreich aktualisiert."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s wurde gelöscht"
diff --git a/django/conf/locale/de/LC_MESSAGES/djangojs.mo b/django/conf/locale/de/LC_MESSAGES/djangojs.mo
index dc92386f0b..9f39c16444 100644
--- a/django/conf/locale/de/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/de/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/djangojs.po b/django/conf/locale/de/LC_MESSAGES/djangojs.po
index c39bcd067f..3c0852ebac 100644
--- a/django/conf/locale/de/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/de/LC_MESSAGES/djangojs.po
@@ -9,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-12-09 11:51+0100\n"
"PO-Revision-Date: 2005-12-04 13:21+0100\n"
-"Last-Translator: Georg Bauer <gb@bofh.ms>\n"
+"Last-Translator: Dirk Eschler <dirk.eschler@gmx.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -21,11 +21,11 @@ msgstr "Verfügbare %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
-msgstr "alles auswählen"
+msgstr "Alles auswählen"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
-msgstr "Zufügen"
+msgstr "Hinzufügen"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
@@ -42,7 +42,7 @@ msgstr "Gewünschte Auswahl treffen und "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
-msgstr "alles abwählen"
+msgstr "Alles abwählen"
#: contrib/admin/media/js/dateparse.js:26
#: contrib/admin/media/js/calendar.js:24
@@ -89,7 +89,7 @@ msgstr "Mittag"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
msgid "Cancel"
-msgstr "Abbruch"
+msgstr "Abbrechen"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
@@ -107,3 +107,13 @@ msgstr "Gestern"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
msgid "Tomorrow"
msgstr "Morgen"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Anzeigen"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Verbergen"
+
diff --git a/django/conf/locale/el/LC_MESSAGES/django.mo b/django/conf/locale/el/LC_MESSAGES/django.mo
index 4a7d8e41f0..a048d87976 100644
--- a/django/conf/locale/el/LC_MESSAGES/django.mo
+++ b/django/conf/locale/el/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/el/LC_MESSAGES/django.po b/django/conf/locale/el/LC_MESSAGES/django.po
index 06099eb9da..d041a275e5 100644
--- a/django/conf/locale/el/LC_MESSAGES/django.po
+++ b/django/conf/locale/el/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:13+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: panos laganakos <panos.laganakos@gmail.com>\n"
+"Last-Translator: Orestis Markou <orestis@orestis.gr>\n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
@@ -164,9 +164,9 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"Αυτο το σχόλιο σημειώθηκε απο %(χÏήστη)ες\n"
+"Αυτο το σχόλιο σημειώθηκε απο %(user)s\n"
"\n"
-"%(κείμενο)α"
+"%(text)s"
#: contrib/comments/models.py:265
msgid "flag date"
diff --git a/django/conf/locale/en/LC_MESSAGES/django.mo b/django/conf/locale/en/LC_MESSAGES/django.mo
index 6c4dbe4b4e..038e794a83 100644
--- a/django/conf/locale/en/LC_MESSAGES/django.mo
+++ b/django/conf/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/en/LC_MESSAGES/django.po b/django/conf/locale/en/LC_MESSAGES/django.po
index feba39f7cd..7e36c6358c 100644
--- a/django/conf/locale/en/LC_MESSAGES/django.po
+++ b/django/conf/locale/en/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"POT-Creation-Date: 2007-04-05 01:32+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,1110 +15,1091 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr ""
-#: contrib/comments/models.py:68
-msgid "headline"
+#: 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 ""
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
msgstr ""
-#: contrib/comments/models.py:70
-msgid "rating #1"
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
msgstr ""
-#: contrib/comments/models.py:71
-msgid "rating #2"
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
-#: contrib/comments/models.py:72
-msgid "rating #3"
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
msgstr ""
-#: contrib/comments/models.py:73
-msgid "rating #4"
+#: 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 ""
-#: contrib/comments/models.py:74
-msgid "rating #5"
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
msgstr ""
-#: contrib/comments/models.py:75
-msgid "rating #6"
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
msgstr ""
-#: contrib/comments/models.py:76
-msgid "rating #7"
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
msgstr ""
-#: contrib/comments/models.py:77
-msgid "rating #8"
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
msgstr ""
-#: contrib/comments/models.py:82
-msgid "is valid rating"
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr ""
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
msgstr ""
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
msgstr ""
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
-msgid "IP address"
+#: conf/global_settings.py:39
+msgid "Arabic"
msgstr ""
-#: contrib/comments/models.py:86
-msgid "is removed"
+#: conf/global_settings.py:40
+msgid "Bengali"
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."
+#: conf/global_settings.py:41
+msgid "Catalan"
msgstr ""
-#: contrib/comments/models.py:91
-msgid "comments"
+#: conf/global_settings.py:42
+msgid "Czech"
msgstr ""
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
+#: conf/global_settings.py:43
+msgid "Welsh"
msgstr ""
-#: contrib/comments/models.py:159
-#, python-format
-msgid ""
-"Posted by %(user)s at %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
+#: conf/global_settings.py:44
+msgid "Danish"
msgstr ""
-#: contrib/comments/models.py:168
-msgid "person's name"
+#: conf/global_settings.py:45
+msgid "German"
msgstr ""
-#: contrib/comments/models.py:171
-msgid "ip address"
+#: conf/global_settings.py:46
+msgid "Greek"
msgstr ""
-#: contrib/comments/models.py:173
-msgid "approved by staff"
+#: conf/global_settings.py:47
+msgid "English"
msgstr ""
-#: contrib/comments/models.py:176
-msgid "free comment"
+#: conf/global_settings.py:48
+msgid "Spanish"
msgstr ""
-#: contrib/comments/models.py:177
-msgid "free comments"
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
msgstr ""
-#: contrib/comments/models.py:233
-msgid "score"
+#: conf/global_settings.py:50
+msgid "Finnish"
msgstr ""
-#: contrib/comments/models.py:234
-msgid "score date"
+#: conf/global_settings.py:51
+msgid "French"
msgstr ""
-#: contrib/comments/models.py:237
-msgid "karma score"
+#: conf/global_settings.py:52
+msgid "Galician"
msgstr ""
-#: contrib/comments/models.py:238
-msgid "karma scores"
+#: conf/global_settings.py:53
+msgid "Hungarian"
msgstr ""
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
+#: conf/global_settings.py:54
+msgid "Hebrew"
msgstr ""
-#: contrib/comments/models.py:258
-#, python-format
-msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:55
+msgid "Icelandic"
msgstr ""
-#: contrib/comments/models.py:265
-msgid "flag date"
+#: conf/global_settings.py:56
+msgid "Italian"
msgstr ""
-#: contrib/comments/models.py:268
-msgid "user flag"
+#: conf/global_settings.py:57
+msgid "Japanese"
msgstr ""
-#: contrib/comments/models.py:269
-msgid "user flags"
+#: conf/global_settings.py:58
+msgid "Kannada"
msgstr ""
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
+#: conf/global_settings.py:59
+msgid "Latvian"
msgstr ""
-#: contrib/comments/models.py:278
-msgid "deletion date"
+#: conf/global_settings.py:60
+msgid "Macedonian"
msgstr ""
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
+#: conf/global_settings.py:61
+msgid "Dutch"
msgstr ""
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
+#: conf/global_settings.py:62
+msgid "Norwegian"
msgstr ""
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
+#: conf/global_settings.py:63
+msgid "Polish"
msgstr ""
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
+#: conf/global_settings.py:64
+msgid "Portugese"
msgstr ""
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
+#: conf/global_settings.py:65
+msgid "Brazilian"
msgstr ""
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
+#: conf/global_settings.py:66
+msgid "Romanian"
msgstr ""
-#: contrib/comments/views/comments.py:27
-msgid ""
-"This rating is required because you've entered at least one other rating."
+#: conf/global_settings.py:67
+msgid "Russian"
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"
+#: 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] ""
-#: contrib/comments/views/comments.py:116
-#, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
+#: 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 ""
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
+#: utils/dates.py:6
+msgid "Tuesday"
msgstr ""
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
+#: utils/dates.py:6
+msgid "Wednesday"
msgstr ""
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
+#: utils/dates.py:6
+msgid "Thursday"
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"
+#: utils/dates.py:6
+msgid "Friday"
msgstr ""
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
+#: utils/dates.py:7
+msgid "Saturday"
msgstr ""
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
+#: utils/dates.py:7
+msgid "Sunday"
msgstr ""
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
+#: utils/dates.py:14
+msgid "January"
msgstr ""
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
+#: utils/dates.py:14
+msgid "February"
msgstr ""
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
msgstr ""
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
msgstr ""
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
msgstr ""
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
msgstr ""
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
msgstr ""
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
+#: utils/dates.py:15
+msgid "August"
msgstr ""
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
+#: utils/dates.py:15
+msgid "September"
msgstr ""
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
+#: utils/dates.py:15
+msgid "October"
msgstr ""
-#: contrib/admin/filterspecs.py:40
-#, python-format
-msgid ""
-"<h3>By %s:</h3>\n"
-"<ul>\n"
+#: utils/dates.py:15
+msgid "November"
msgstr ""
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
-msgid "All"
+#: utils/dates.py:16
+msgid "December"
msgstr ""
-#: contrib/admin/filterspecs.py:109
-msgid "Any date"
+#: utils/dates.py:19
+msgid "jan"
msgstr ""
-#: contrib/admin/filterspecs.py:110
-msgid "Today"
+#: utils/dates.py:19
+msgid "feb"
msgstr ""
-#: contrib/admin/filterspecs.py:113
-msgid "Past 7 days"
+#: utils/dates.py:19
+msgid "mar"
msgstr ""
-#: contrib/admin/filterspecs.py:115
-msgid "This month"
+#: utils/dates.py:19
+msgid "apr"
msgstr ""
-#: contrib/admin/filterspecs.py:117
-msgid "This year"
+#: utils/dates.py:19
+msgid "may"
msgstr ""
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
+#: utils/dates.py:19
+msgid "jun"
msgstr ""
-#: contrib/admin/filterspecs.py:143
-msgid "No"
+#: utils/dates.py:20
+msgid "jul"
msgstr ""
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
+#: utils/dates.py:20
+msgid "aug"
msgstr ""
-#: contrib/admin/models.py:16
-msgid "action time"
+#: utils/dates.py:20
+msgid "sep"
msgstr ""
-#: contrib/admin/models.py:19
-msgid "object id"
+#: utils/dates.py:20
+msgid "oct"
msgstr ""
-#: contrib/admin/models.py:20
-msgid "object repr"
+#: utils/dates.py:20
+msgid "nov"
msgstr ""
-#: contrib/admin/models.py:21
-msgid "action flag"
+#: utils/dates.py:20
+msgid "dec"
msgstr ""
-#: contrib/admin/models.py:22
-msgid "change message"
+#: utils/dates.py:27
+msgid "Jan."
msgstr ""
-#: contrib/admin/models.py:25
-msgid "log entry"
+#: utils/dates.py:27
+msgid "Feb."
msgstr ""
-#: contrib/admin/models.py:26
-msgid "log entries"
+#: utils/dates.py:28
+msgid "Aug."
msgstr ""
-#: contrib/admin/templatetags/admin_list.py:230
-msgid "All dates"
+#: utils/dates.py:28
+msgid "Sept."
msgstr ""
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
+#: utils/dates.py:28
+msgid "Oct."
msgstr ""
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
+#: utils/dates.py:28
+msgid "Nov."
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."
+#: utils/dates.py:28
+msgid "Dec."
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."
+#: utils/dateformat.py:40
+msgid "p.m."
msgstr ""
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
+#: utils/dateformat.py:41
+msgid "a.m."
msgstr ""
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
+#: utils/dateformat.py:46
+msgid "PM"
msgstr ""
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
+#: utils/dateformat.py:47
+msgid "AM"
msgstr ""
-#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
+#: utils/dateformat.py:95
+msgid "midnight"
msgstr ""
-#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:22
-msgid "You may edit it again below."
+#: utils/dateformat.py:97
+msgid "noon"
msgstr ""
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: oldforms/__init__.py:392
#, python-format
-msgid "You may add another %s below."
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
msgstr ""
-#: contrib/admin/views/main.py:289
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
#, python-format
-msgid "Add %s"
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr ""
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
msgstr ""
-#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339
-msgid "and"
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
msgstr ""
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
msgstr ""
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
+#: 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 ""
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
msgstr ""
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
msgstr ""
-#: contrib/admin/views/main.py:353
-#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
msgstr ""
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
msgstr ""
-#: contrib/admin/views/main.py:473
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
msgstr ""
-#: contrib/admin/views/main.py:478
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
msgstr ""
-#: contrib/admin/views/main.py:511
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+#: 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 ""
-#: contrib/admin/views/main.py:514
-msgid "Are you sure?"
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
msgstr ""
-#: contrib/admin/views/main.py:536
-#, python-format
-msgid "Change history: %s"
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
msgstr ""
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
msgstr ""
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s to change"
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
msgstr ""
-#: contrib/admin/views/main.py:758
-msgid "Database error"
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
msgstr ""
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
-msgid "tag:"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
msgstr ""
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
-msgid "filter:"
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
msgstr ""
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
-msgid "view:"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
msgstr ""
-#: contrib/admin/views/doc.py:164
-#, python-format
-msgid "App %r not found"
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
msgstr ""
-#: contrib/admin/views/doc.py:171
-#, python-format
-msgid "Model %r not found in app %r"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
msgstr ""
-#: contrib/admin/views/doc.py:183
-#, python-format
-msgid "the related `%s.%s` object"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
msgstr ""
-#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
-msgid "model:"
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
msgstr ""
-#: contrib/admin/views/doc.py:214
-#, python-format
-msgid "related `%s.%s` objects"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
msgstr ""
-#: contrib/admin/views/doc.py:219
-#, python-format
-msgid "all %s"
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
msgstr ""
-#: contrib/admin/views/doc.py:224
-#, python-format
-msgid "number of %s"
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
msgstr ""
-#: contrib/admin/views/doc.py:229
-#, python-format
-msgid "Fields on %s objects"
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
msgstr ""
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
-#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
-#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
-msgid "Integer"
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
msgstr ""
-#: contrib/admin/views/doc.py:292
-msgid "Boolean (Either True or False)"
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
msgstr ""
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
-#, python-format
-msgid "String (up to %(maxlength)s)"
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
msgstr ""
-#: contrib/admin/views/doc.py:294
-msgid "Comma-separated integers"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
msgstr ""
-#: contrib/admin/views/doc.py:295
-msgid "Date (without time)"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
msgstr ""
-#: contrib/admin/views/doc.py:296
-msgid "Date (with time)"
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
msgstr ""
-#: contrib/admin/views/doc.py:297
-msgid "E-mail address"
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
msgstr ""
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
-msgid "File path"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
msgstr ""
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
msgstr ""
-#: contrib/admin/views/doc.py:306
-msgid "Boolean (Either True, False or None)"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
msgstr ""
-#: contrib/admin/views/doc.py:307
-msgid "Relation to parent model"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
msgstr ""
-#: contrib/admin/views/doc.py:308
-msgid "Phone number"
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
msgstr ""
-#: contrib/admin/views/doc.py:313
-msgid "Text"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
msgstr ""
-#: contrib/admin/views/doc.py:314
-msgid "Time"
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
msgstr ""
-#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
-msgid "URL"
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
msgstr ""
-#: contrib/admin/views/doc.py:316
-msgid "U.S. state (two uppercase letters)"
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
msgstr ""
-#: contrib/admin/views/doc.py:317
-msgid "XML text"
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
msgstr ""
-#: contrib/admin/views/doc.py:343
-#, python-format
-msgid "%s does not appear to be a urlpattern object"
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
msgstr ""
-#: contrib/admin/views/auth.py:28
-msgid "Add user"
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Documentation"
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
-msgid "History"
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
msgstr ""
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "N j, Y, P"
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
-#: contrib/admin/templates/admin/object_history.html:36
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
msgstr ""
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
msgstr ""
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
msgstr ""
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
msgstr ""
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
msgstr ""
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
msgstr ""
-#: contrib/admin/templates/admin/500.html:10
-msgid ""
-"There's been an error. It's been reported to the site administrators via e-"
-"mail and should be fixed shortly. Thanks for your patience."
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
msgstr ""
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
msgstr ""
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
msgstr ""
-#: contrib/admin/templates/admin/index.html:17
-#, python-format
-msgid "Models available in the %(name)s application."
+#: contrib/localflavor/de/forms.py:63
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format"
msgstr ""
-#: contrib/admin/templates/admin/index.html:18
-#, python-format
-msgid "%(name)s"
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
msgstr ""
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
-msgid "Add"
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
msgstr ""
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
msgstr ""
-#: contrib/admin/templates/admin/index.html:44
-msgid "You don't have permission to edit anything."
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
msgstr ""
-#: contrib/admin/templates/admin/index.html:52
-msgid "Recent Actions"
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
msgstr ""
-#: contrib/admin/templates/admin/index.html:53
-msgid "My Actions"
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
msgstr ""
-#: contrib/admin/templates/admin/index.html:57
-msgid "None available"
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
msgstr ""
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
msgstr ""
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
msgstr ""
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
-"related objects, but your account doesn't have permission to delete the "
-"following types of objects:"
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
msgstr ""
-#: 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:"
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
msgstr ""
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
msgstr ""
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
msgstr ""
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
msgstr ""
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
msgstr ""
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
+#: contrib/sessions/models.py:68
+msgid "session key"
msgstr ""
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
+#: contrib/sessions/models.py:69
+msgid "session data"
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
+#: contrib/sessions/models.py:70
+msgid "expire date"
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr ""
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
+#: contrib/sessions/models.py:75
+msgid "sessions"
msgstr ""
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
+#: 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/admin/templates/admin/submit_line.html:7
-msgid "Save"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
msgstr ""
-#: contrib/admin/templates/admin/invalid_setup.html:8
+#: contrib/auth/forms.py:85
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."
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:6
-msgid ""
-"First, enter a username and password. Then, you'll be able to edit more user "
-"options."
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:18
-msgid "Password"
+#: contrib/auth/views.py:39
+msgid "Logged out"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:23
-msgid "Password (again)"
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
msgstr ""
-#: contrib/admin/templates/admin/auth/user/add_form.html:24
-msgid "Enter the same password as above, for verification."
+#: contrib/auth/models.py:40
+msgid "codename"
msgstr ""
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_form.html:6
-#: contrib/admin/templates/registration/password_change_form.html:10
-msgid "Password change"
+#: contrib/auth/models.py:42
+msgid "permission"
msgstr ""
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
msgstr ""
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
+#: contrib/auth/models.py:60
+msgid "group"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:12
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr ""
+
+#: contrib/auth/models.py:90
msgid ""
-"Forgotten your password? Enter your e-mail address below, and we'll reset "
-"your password and e-mail the new one to you."
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
+#: contrib/auth/models.py:91
+msgid "first name"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
+#: contrib/auth/models.py:92
+msgid "last name"
msgstr ""
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
+#: contrib/auth/models.py:93
+msgid "e-mail address"
msgstr ""
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
+#: contrib/auth/models.py:94
+msgid "password"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
msgstr ""
-#: contrib/admin/templates/registration/password_reset_done.html:12
+#: 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 ""
-"We've e-mailed a new password to the e-mail address you submitted. You "
-"should be receiving it shortly."
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:12
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr ""
+
+#: contrib/auth/models.py:97
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."
+"Designates that this user has all permissions without explicitly assigning "
+"them."
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
+#: contrib/auth/models.py:98
+msgid "last login"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
+#: contrib/auth/models.py:99
+msgid "date joined"
msgstr ""
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
+#: 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/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
+#: contrib/auth/models.py:102
+msgid "user permissions"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:2
-msgid "You're receiving this e-mail because you requested a password reset"
+#: contrib/auth/models.py:105
+msgid "user"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:3
-#, python-format
-msgid "for your user account at %(site_name)s"
+#: contrib/auth/models.py:106
+msgid "users"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:5
-#, python-format
-msgid "Your new password is: %(new_password)s"
+#: contrib/auth/models.py:111
+msgid "Personal info"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:7
-msgid "Feel free to change this password by going to this page:"
+#: contrib/auth/models.py:112
+msgid "Permissions"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:11
-msgid "Your username, in case you've forgotten:"
+#: contrib/auth/models.py:113
+msgid "Important dates"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:13
-msgid "Thanks for using our site!"
+#: contrib/auth/models.py:114
+msgid "Groups"
msgstr ""
-#: contrib/admin/templates/registration/password_reset_email.html:15
-#, python-format
-msgid "The %(site_name)s team"
+#: contrib/auth/models.py:258
+msgid "message"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:9
-msgid ""
-"\n"
-"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
-"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
-"select the bookmarklet from any page in the site. Note that some of these\n"
-"bookmarklets require you to be viewing the site from a computer designated\n"
-"as \"internal\" (talk to your system administrator if you aren't sure if\n"
-"your computer is \"internal\").</p>\n"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
-msgid ""
-"Jumps you from any page to the documentation for the view that generates "
-"that page."
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
-msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
msgstr ""
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
msgstr ""
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
msgstr ""
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
msgstr ""
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
msgstr ""
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
msgstr ""
#: contrib/redirects/models.py:7
@@ -1149,6 +1130,10 @@ msgstr ""
msgid "redirects"
msgstr ""
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr ""
+
#: contrib/flatpages/models.py:8
msgid ""
"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
@@ -1192,178 +1177,312 @@ msgstr ""
msgid "flat pages"
msgstr ""
-#: contrib/auth/views.py:39
-msgid "Logged out"
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
msgstr ""
-#: contrib/auth/models.py:38 contrib/auth/models.py:57
-msgid "name"
+#: contrib/comments/models.py:68
+msgid "headline"
msgstr ""
-#: contrib/auth/models.py:40
-msgid "codename"
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
msgstr ""
-#: contrib/auth/models.py:42
-msgid "permission"
+#: contrib/comments/models.py:70
+msgid "rating #1"
msgstr ""
-#: contrib/auth/models.py:43 contrib/auth/models.py:58
-msgid "permissions"
+#: contrib/comments/models.py:71
+msgid "rating #2"
msgstr ""
-#: contrib/auth/models.py:60
-msgid "group"
+#: contrib/comments/models.py:72
+msgid "rating #3"
msgstr ""
-#: contrib/auth/models.py:61 contrib/auth/models.py:100
-msgid "groups"
+#: contrib/comments/models.py:73
+msgid "rating #4"
msgstr ""
-#: contrib/auth/models.py:90
-msgid "username"
+#: contrib/comments/models.py:74
+msgid "rating #5"
msgstr ""
-#: contrib/auth/models.py:90
-msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
+#: contrib/comments/models.py:75
+msgid "rating #6"
msgstr ""
-#: contrib/auth/models.py:91
-msgid "first name"
+#: contrib/comments/models.py:76
+msgid "rating #7"
msgstr ""
-#: contrib/auth/models.py:92
-msgid "last name"
+#: contrib/comments/models.py:77
+msgid "rating #8"
msgstr ""
-#: contrib/auth/models.py:93
-msgid "e-mail address"
+#: contrib/comments/models.py:82
+msgid "is valid rating"
msgstr ""
-#: contrib/auth/models.py:94
-msgid "password"
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
msgstr ""
-#: contrib/auth/models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]'"
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
msgstr ""
-#: contrib/auth/models.py:95
-msgid "staff status"
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
msgstr ""
-#: contrib/auth/models.py:95
-msgid "Designates whether the user can log into this admin site."
+#: contrib/comments/models.py:86
+msgid "is removed"
msgstr ""
-#: contrib/auth/models.py:96
-msgid "active"
+#: 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/auth/models.py:96
-msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
+#: contrib/comments/models.py:91
+msgid "comments"
msgstr ""
-#: contrib/auth/models.py:97
-msgid "superuser status"
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
msgstr ""
-#: contrib/auth/models.py:97
+#: contrib/comments/models.py:159
+#, python-format
msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
msgstr ""
-#: contrib/auth/models.py:98
-msgid "last login"
+#: contrib/comments/models.py:168
+msgid "person's name"
msgstr ""
-#: contrib/auth/models.py:99
-msgid "date joined"
+#: contrib/comments/models.py:171
+msgid "ip address"
msgstr ""
-#: contrib/auth/models.py:101
+#: 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 ""
+
+#: contrib/comments/models.py:258
+#, python-format
msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
msgstr ""
-#: contrib/auth/models.py:102
-msgid "user permissions"
+#: contrib/comments/models.py:265
+msgid "flag date"
msgstr ""
-#: contrib/auth/models.py:105
-msgid "user"
+#: contrib/comments/models.py:268
+msgid "user flag"
msgstr ""
-#: contrib/auth/models.py:106
-msgid "users"
+#: contrib/comments/models.py:269
+msgid "user flags"
msgstr ""
-#: contrib/auth/models.py:111
-msgid "Personal info"
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
msgstr ""
-#: contrib/auth/models.py:112
-msgid "Permissions"
+#: contrib/comments/models.py:278
+msgid "deletion date"
msgstr ""
-#: contrib/auth/models.py:113
-msgid "Important dates"
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
msgstr ""
-#: contrib/auth/models.py:114
-msgid "Groups"
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
msgstr ""
-#: contrib/auth/models.py:256
-msgid "message"
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
msgstr ""
-#: contrib/auth/forms.py:52
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+#: 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/auth/forms.py:61
-msgid "This account is inactive."
+#: 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/contenttypes/models.py:20
-msgid "python model class name"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
msgstr ""
-#: contrib/contenttypes/models.py:23
-msgid "content type"
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
msgstr ""
-#: contrib/contenttypes/models.py:24
-msgid "content types"
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
msgstr ""
-#: contrib/sessions/models.py:51
-msgid "session key"
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
msgstr ""
-#: contrib/sessions/models.py:52
-msgid "session data"
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
msgstr ""
-#: contrib/sessions/models.py:53
-msgid "expire date"
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
msgstr ""
-#: contrib/sessions/models.py:57
-msgid "session"
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
msgstr ""
-#: contrib/sessions/models.py:58
-msgid "sessions"
+#: 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 ""
+
+#: 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] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: 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 ""
+
+#: 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
@@ -1382,520 +1501,1054 @@ msgstr ""
msgid "sites"
msgstr ""
-#: utils/dates.py:6
-msgid "Monday"
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
msgstr ""
-#: utils/dates.py:6
-msgid "Tuesday"
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
msgstr ""
-#: utils/dates.py:6
-msgid "Wednesday"
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
msgstr ""
-#: utils/dates.py:6
-msgid "Thursday"
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
msgstr ""
-#: utils/dates.py:6
-msgid "Friday"
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
msgstr ""
-#: utils/dates.py:7
-msgid "Saturday"
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
msgstr ""
-#: utils/dates.py:7
-msgid "Sunday"
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
msgstr ""
-#: utils/dates.py:14
-msgid "January"
+#: contrib/admin/models.py:16
+msgid "action time"
msgstr ""
-#: utils/dates.py:14
-msgid "February"
+#: contrib/admin/models.py:19
+msgid "object id"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
+#: contrib/admin/models.py:20
+msgid "object repr"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
+#: contrib/admin/models.py:21
+msgid "action flag"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
+#: contrib/admin/models.py:22
+msgid "change message"
msgstr ""
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
+#: contrib/admin/models.py:25
+msgid "log entry"
msgstr ""
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
+#: contrib/admin/models.py:26
+msgid "log entries"
msgstr ""
-#: utils/dates.py:15
-msgid "August"
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
msgstr ""
-#: utils/dates.py:15
-msgid "September"
+#: 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 ""
-#: utils/dates.py:15
-msgid "October"
+#: 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 ""
-#: utils/dates.py:15
-msgid "November"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
msgstr ""
-#: utils/dates.py:16
-msgid "December"
+#: 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 ""
-#: utils/dates.py:19
-msgid "jan"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
msgstr ""
-#: utils/dates.py:19
-msgid "feb"
+#: 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 ""
-#: utils/dates.py:19
-msgid "mar"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
msgstr ""
-#: utils/dates.py:19
-msgid "apr"
+#: 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 ""
-#: utils/dates.py:19
-msgid "may"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
msgstr ""
-#: utils/dates.py:19
-msgid "jun"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
msgstr ""
-#: utils/dates.py:20
-msgid "jul"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
msgstr ""
-#: utils/dates.py:20
-msgid "aug"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
msgstr ""
-#: utils/dates.py:20
-msgid "sep"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
msgstr ""
-#: utils/dates.py:20
-msgid "oct"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
msgstr ""
-#: utils/dates.py:20
-msgid "nov"
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
msgstr ""
-#: utils/dates.py:20
-msgid "dec"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
msgstr ""
-#: utils/dates.py:27
-msgid "Jan."
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
msgstr ""
-#: utils/dates.py:27
-msgid "Feb."
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
msgstr ""
-#: utils/dates.py:28
-msgid "Aug."
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
msgstr ""
-#: utils/dates.py:28
-msgid "Sept."
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
msgstr ""
-#: utils/dates.py:28
-msgid "Oct."
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
msgstr ""
-#: utils/dates.py:28
-msgid "Nov."
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
msgstr ""
-#: utils/dates.py:28
-msgid "Dec."
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
msgstr ""
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr ""
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+#: 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 ""
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
msgstr[0] ""
msgstr[1] ""
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: 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 "N j, 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 ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: 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] ""
-#: utils/translation/trans_real.py:362
-msgid "DATE_FORMAT"
-msgstr "N j, Y"
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr ""
-#: utils/translation/trans_real.py:363
-msgid "DATETIME_FORMAT"
-msgstr "N j, Y, P"
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr ""
-#: utils/translation/trans_real.py:364
-msgid "TIME_FORMAT"
-msgstr "P"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr ""
-#: utils/translation/trans_real.py:380
-msgid "YEAR_MONTH_FORMAT"
-msgstr "F Y"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
-#: utils/translation/trans_real.py:381
-msgid "MONTH_DAY_FORMAT"
-msgstr "F j"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
-#: conf/global_settings.py:39
-msgid "Arabic"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
msgstr ""
-#: conf/global_settings.py:40
-msgid "Bengali"
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
msgstr ""
-#: conf/global_settings.py:41
-msgid "Czech"
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
msgstr ""
-#: conf/global_settings.py:42
-msgid "Welsh"
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
msgstr ""
-#: conf/global_settings.py:43
-msgid "Danish"
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
msgstr ""
-#: conf/global_settings.py:44
-msgid "German"
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
msgstr ""
-#: conf/global_settings.py:45
-msgid "Greek"
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
msgstr ""
-#: conf/global_settings.py:46
-msgid "English"
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
msgstr ""
-#: conf/global_settings.py:47
-msgid "Spanish"
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
msgstr ""
-#: conf/global_settings.py:48
-msgid "Argentinean Spanish"
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
msgstr ""
-#: conf/global_settings.py:49
-msgid "Finnish"
+#: 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 ""
-#: conf/global_settings.py:50
-msgid "French"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
msgstr ""
-#: conf/global_settings.py:51
-msgid "Galician"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
msgstr ""
-#: conf/global_settings.py:52
-msgid "Hungarian"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
msgstr ""
-#: conf/global_settings.py:53
-msgid "Hebrew"
+#: 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 ""
-#: conf/global_settings.py:54
-msgid "Icelandic"
+#: 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 ""
-#: conf/global_settings.py:55
-msgid "Italian"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
msgstr ""
-#: conf/global_settings.py:56
-msgid "Japanese"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
msgstr ""
-#: conf/global_settings.py:57
-msgid "Dutch"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
msgstr ""
-#: conf/global_settings.py:58
-msgid "Norwegian"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
msgstr ""
-#: conf/global_settings.py:59
-msgid "Brazilian"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
msgstr ""
-#: conf/global_settings.py:60
-msgid "Romanian"
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
msgstr ""
-#: conf/global_settings.py:61
-msgid "Russian"
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
msgstr ""
-#: conf/global_settings.py:62
-msgid "Slovak"
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
msgstr ""
-#: conf/global_settings.py:63
-msgid "Slovenian"
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
msgstr ""
-#: conf/global_settings.py:64
-msgid "Serbian"
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
msgstr ""
-#: conf/global_settings.py:65
-msgid "Swedish"
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
msgstr ""
-#: conf/global_settings.py:66
-msgid "Tamil"
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
msgstr ""
-#: conf/global_settings.py:67
-msgid "Turkish"
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
msgstr ""
-#: conf/global_settings.py:68
-msgid "Ukrainian"
+#: 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 ""
-#: conf/global_settings.py:69
-msgid "Simplified Chinese"
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
msgstr ""
-#: conf/global_settings.py:70
-msgid "Traditional Chinese"
+#: 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 ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/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 ""
+
+#: 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 ""
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: 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 ""
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: 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 ""
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr ""
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr ""
+
+#: 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 ""
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: 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 ""
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr ""
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr ""
+
+#: 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 ""
-#: core/validators.py:63
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+
+#: 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 ""
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr ""
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr ""
+
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr ""
-#: core/validators.py:67
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-#: core/validators.py:71
+#: core/validators.py:72
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
-#: core/validators.py:75
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr ""
-#: core/validators.py:79
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr ""
-#: core/validators.py:86
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr ""
-#: core/validators.py:98
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr ""
-#: core/validators.py:102
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr ""
-#: core/validators.py:106
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr ""
-#: core/validators.py:110
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr ""
-#: core/validators.py:114
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr ""
-#: core/validators.py:119
-msgid "Enter a whole number."
-msgstr ""
-
-#: core/validators.py:123
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr ""
-#: core/validators.py:138
+#: core/validators.py:139
msgid "Year must be 1900 or later."
msgstr ""
-#: core/validators.py:142
+#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
-msgstr ""
-
-#: core/validators.py:146 db/models/fields/__init__.py:415
-msgid "Enter a valid date in YYYY-MM-DD format."
+msgid "Invalid date: %s"
msgstr ""
-#: core/validators.py:151
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr ""
-#: core/validators.py:155 db/models/fields/__init__.py:477
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr ""
-
-#: core/validators.py:160
-msgid "Enter a valid e-mail address."
-msgstr ""
-
-#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
-msgid "No file was submitted. Check the encoding type on the form."
-msgstr ""
-
-#: core/validators.py:176
+#: 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:183
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr ""
-#: core/validators.py:187
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-#: core/validators.py:195
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr ""
-#: core/validators.py:199
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr ""
-#: core/validators.py:213
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-#: core/validators.py:220
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr ""
-#: core/validators.py:230
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr ""
-#: core/validators.py:234 core/validators.py:236
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr ""
-#: core/validators.py:242
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr ""
-#: core/validators.py:256
+#: core/validators.py:266
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:263
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr ""
-#: core/validators.py:282
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr ""
-#: core/validators.py:291 core/validators.py:302
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr ""
-#: core/validators.py:309
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr ""
-#: core/validators.py:321
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr ""
-#: core/validators.py:340
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr ""
-#: core/validators.py:363
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr ""
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr ""
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr ""
+
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr ""
-#: core/validators.py:374
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr ""
-#: core/validators.py:378
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
@@ -1903,7 +2556,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:381
+#: core/validators.py:425
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
@@ -1912,7 +2565,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:384
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -1920,178 +2573,73 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: core/validators.py:394
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-#: core/validators.py:395
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-#: core/validators.py:412
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr ""
-#: core/validators.py:427
+#: core/validators.py:471
msgid "This field is invalid."
msgstr ""
-#: core/validators.py:463
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr ""
-#: core/validators.py:466
+#: core/validators.py:510
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-#: core/validators.py:499
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-#: core/validators.py:503
+#: 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 ""
-#: core/validators.py:508
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-#: core/validators.py:513
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-#: core/validators.py:517
+#: 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 ""
-#: core/validators.py:522
+#: 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 ""
-
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr ""
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr ""
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr ""
-
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr ""
-
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr ""
-
-#: db/models/fields/__init__.py:340
-msgid "This value must be an integer."
-msgstr ""
-
-#: db/models/fields/__init__.py:372
-msgid "This value must be either True or False."
-msgstr ""
-
-#: db/models/fields/__init__.py:388
-msgid "This field cannot be null."
-msgstr ""
-
-#: db/models/fields/__init__.py:571
-msgid "Enter a valid filename."
-msgstr ""
-
-#: db/models/fields/related.py:51
-#, python-format
-msgid "Please enter a valid %s."
-msgstr ""
-
-#: db/models/fields/related.py:618
-msgid "Separate multiple IDs with commas."
-msgstr ""
-
-#: db/models/fields/related.py:620
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-
-#: db/models/fields/related.py:664
-#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural ""
-"Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] ""
-msgstr[1] ""
-
-#: forms/__init__.py:381
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] ""
-msgstr[1] ""
-
-#: forms/__init__.py:386
-msgid "Line breaks are not allowed here."
-msgstr ""
-
-#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr ""
-
-#: forms/__init__.py:663
-msgid "The submitted file is empty."
-msgstr ""
-
-#: forms/__init__.py:719
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr ""
-
-#: forms/__init__.py:729
-msgid "Enter a positive number."
-msgstr ""
-
-#: forms/__init__.py:739
-msgid "Enter a whole number between 0 and 32,767."
-msgstr ""
-
-#: template/defaultfilters.py:401
-msgid "yes,no,maybe"
-msgstr ""
diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo
index fe44d24a17..b8b9185b6d 100644
--- a/django/conf/locale/es/LC_MESSAGES/django.mo
+++ b/django/conf/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/es/LC_MESSAGES/django.po b/django/conf/locale/es/LC_MESSAGES/django.po
index 8036e398b9..6b55435a12 100644
--- a/django/conf/locale/es/LC_MESSAGES/django.po
+++ b/django/conf/locale/es/LC_MESSAGES/django.po
@@ -1,25 +1,1115 @@
-# translation of django.po to Spanish
-# translation of django.po to Español
+# translation of django.po to Castellano
# This file is distributed under the same license as the PACKAGE package.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER.
+#
# Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>, 2005.
# Ricardo Javier Cardenes Medina <ricardo.cardenes@gmail.com>, 2005.
-#
+# AgarFu <heaven@croasanaso.sytes.net>, 2007.
+# Mario Gonzalez <gonzalemario @t gmail.com>, 2007
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:11+0200\n"
-"PO-Revision-Date: 2005-11-28 15:28+0000\n"
-"Last-Translator: Ricardo Javier Cardenes Medina <ricardo.cardenes@gmail."
-"com>\n"
-"Language-Team: Spanish <en@li.org>\n"
+"POT-Creation-Date: 2007-02-24 17:08+0000\n"
+"PO-Revision-Date: 2007-02-24 18:02-0600\n"
+"Last-Translator: Mario Gonzalez <gonzalemario @t gmail.com>\n"
+"Language-Team: Castellano <Django-I18N@googlegroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.10.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Enero"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febrero"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junio"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septiembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Noviembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Diciembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ene"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ene."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "j N Y P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "j \\de F"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Árabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Catalán"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Galés"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Danés"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Alemán"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Griego"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Inglés"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Español"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Español Argentino"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Finés"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Francés"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Gallego"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonés"
+
+#: conf/global_settings.py:58
+msgid "Latvian"
+msgstr "Latvio"
+
+#: conf/global_settings.py:59
+msgid "Macedonian"
+msgstr "Macedonio"
+
+#: conf/global_settings.py:60
+msgid "Dutch"
+msgstr "Alemán"
+
+#: conf/global_settings.py:61
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: conf/global_settings.py:62
+msgid "Polish"
+msgstr "Polaco"
+
+#: conf/global_settings.py:63
+msgid "Brazilian"
+msgstr "Brasileño"
+
+#: conf/global_settings.py:64
+msgid "Romanian"
+msgstr "Rumano"
+
+#: conf/global_settings.py:65
+msgid "Russian"
+msgstr "Ruso"
+
+#: conf/global_settings.py:66
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:67
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:68
+msgid "Serbian"
+msgstr "Serbio"
+
+#: conf/global_settings.py:69
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:70
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:71
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:72
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:73
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+#: conf/global_settings.py:74
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+#: db/models/manipulators.py:305
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s de este %(type)s ya existen en este %(field)s."
+
+#: db/models/manipulators.py:306 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "y"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Separe múltiples IDs con comas."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar más de uno."
+
+#: 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] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:116 db/models/fields/__init__.py:273
+#: db/models/fields/__init__.py:605 db/models/fields/__init__.py:616
+#: newforms/models.py:177 newforms/fields.py:78 newforms/fields.py:374
+#: newforms/fields.py:450 newforms/fields.py:461 oldforms/__init__.py:352
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:366
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un entero."
+
+#: db/models/fields/__init__.py:401
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser Verdadero o Falso."
+
+#: db/models/fields/__init__.py:422
+msgid "This field cannot be null."
+msgstr "Este campo no puede estar vacío."
+
+#: db/models/fields/__init__.py:454 core/validators.py:147
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: db/models/fields/__init__.py:521 core/validators.py:156
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:625
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de fichero válido"
+
+#: template/defaultfilters.py:436
+msgid "yes,no,maybe"
+msgstr "si,no,tal vez"
+
+#: newforms/models.py:164 newforms/fields.py:360
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escoja una opción válida. Esa opción no está entre las aceptadas."
+
+#: newforms/models.py:181 newforms/fields.py:378 newforms/fields.py:454
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: newforms/models.py:187 newforms/fields.py:387
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Escoja una opción válida; '%s' no es una de las opciones disponibles."
+
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Asegúrese de que su texto tiene a lo más %d caracteres."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Asegúrese de que su texto tiene al menos %d caracteres."
+
+#: newforms/fields.py:126 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor es menor o igual a %s."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor es mayor o igual a %s."
+
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "Introduzca un valor correcto."
+
+#: newforms/fields.py:269 core/validators.py:161
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: newforms/widgets.py:170 oldforms/__init__.py:572
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: newforms/widgets.py:170 oldforms/__init__.py:572
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sí"
+
+#: newforms/widgets.py:170 oldforms/__init__.py:572
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "No"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Este valor debe contener letras, números, guiones bajos o barras solamente."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor debe contener sólo letras, números, guiones bajos o medios."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "No se admiten letras mayúsculas."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "No se admiten letras minúsculas."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduzca una dirección IP válida."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "No se admiten valores vacíos."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No se admiten caracteres no numéricos."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor no puede comprender sólo dígitos."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sólo se admiten caracteres alfabéticos."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "El año debe ser 1900 o posterior."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s."
+msgstr "Fecha no válida: %s"
+
+#: core/validators.py:152
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduzca una hora válida en formato HH:MM."
+
+#: core/validators.py:173 core/validators.py:443 oldforms/__init__.py:667
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el "
+"formulario."
+
+#: core/validators.py:177
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#: core/validators.py:184
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imagen válida."
+
+#: core/validators.py:188
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Los números de teléfono deben guardar el formato XXX-XXX-XXXX. \"%s\" "
+"no es válido."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
+
+#: core/validators.py:200
+msgid "A valid URL is required."
+msgstr "Se precisa una URL válida."
+
+#: core/validators.py:214
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Se precisa HTML válido. Los errores específicos son:\n"
+"%s"
+
+#: core/validators.py:221
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:238
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL no válida: %s"
+
+#: core/validators.py:243 core/validators.py:245
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s es un enlace roto."
+
+#: core/validators.py:251
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+
+#: core/validators.py:265
+#, 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] "¡Cuida tu vocabulario! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Cuida tu vocabulario! Aquí no admitimos las palabras %s."
+
+#: core/validators.py:272
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo debe concordar con el campo '%s'."
+
+#: core/validators.py:291
+msgid "Please enter something for at least one field."
+msgstr "Por favor, introduzca algo en al menos un campo."
+
+#: core/validators.py:300 core/validators.py:311
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+
+#: core/validators.py:318
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+
+#: core/validators.py:330
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
+
+#: core/validators.py:349
+msgid "Duplicate values are not allowed."
+msgstr "No se admiten valores duplicados."
+
+#: core/validators.py:364
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor debe ser como mínimo %s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor no debe ser mayor que %s."
+
+#: core/validators.py:405
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: core/validators.py:416
+msgid "Please enter a valid decimal number."
+msgstr "Por favor, introduzca un número decimal válido."
+
+#: core/validators.py:420
+#, 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] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígito en "
+"total."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
+"total."
+
+#: core/validators.py:423
+#, 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] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígito en "
+"su parte entera."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
+"su parte entera."
+
+#: core/validators.py:426
+#, 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] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígito "
+"decimal."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos "
+"decimales."
+
+#: core/validators.py:436
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene al menos %s bytes."
+
+#: core/validators.py:437
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene como máximo %s bytes."
+
+#: core/validators.py:454
+msgid "The format for this field is wrong."
+msgstr "El formato de este campo es incorrecto."
+
+#: core/validators.py:469
+msgid "This field is invalid."
+msgstr "Este campo no es válido."
+
+#: core/validators.py:505
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No pude obtener nada de %s."
+
+#: core/validators.py:508
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
+
+#: core/validators.py:541
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:545
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:550
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:555
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:559
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:564
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza por \"%(start)s\".)"
+
+#: oldforms/__init__.py:387
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: oldforms/__init__.py:392
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: oldforms/__init__.py:493 oldforms/__init__.py:566 oldforms/__init__.py:605
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Escoja una opción válida; '%(data)s' no está en %(choices)s."
+
+#: oldforms/__init__.py:669
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
+
+#: oldforms/__init__.py:725
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32,768 y 32,767."
+
+#: oldforms/__init__.py:735
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32,767."
+
+#: contrib/contenttypes/models.py:26
+msgid "python model class name"
+msgstr "nombre de módulo python"
+
+#: contrib/contenttypes/models.py:29
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: contrib/contenttypes/models.py:30
+msgid "content types"
+msgstr "tipos de contenido"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:318
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
+"final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "admitir comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema usará "
+"'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Sesión terminada"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "nombre en código"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "nombre de usuario"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requerido. 30 caracteres o menos. Sólo caracteres alfanuméricos (letras, "
+"dígitos y guiones bajos)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "apellidos"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "dirección de correo"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "clave"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use'[algo]$[sal]$[hash hexadecimal]' o use <a href=\"password/\">el "
+"formulario para cambiar la contraseña</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "es staff"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede entrar en este sitio de administración."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica si el usuario puede entrar en este sitio de administración. Desmarque "
+"esto en lugar de borrar la cuenta."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "es superusuario"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica que este usuario tiene todos los permisos sin asignárselos "
+"explícitamente."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "Último registro"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "fecha de creación"
+
+#: 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 ""
+"Además de los permisos asignados manualmente, este usuario también tendrá "
+"todos los permisos de los grupos en los que esté."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Información personal"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Fechas importantes"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "mensaje"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Las dos contraseñas no coinciden."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ya existe un usuario con este nombre."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Tu navegador de internet parece no tener las cookies habilitadas. Las "
+"cookies se necesitan para poder ingresar."
+
+#: 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 ""
+"Por favor, introduzca un correcto nombre de usuario y contraseña. Note que "
+"ambos campos son sensibles a mayúsculas/minúsculas."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Esta dirección de correo electrónico no tiene una cuenta de usuario "
+"asociada. ¿Está seguro de que se ha registrado?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Las contraseñas introducidas en los campos 'nueva contraseña' no coinciden."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"Tu contraseña antigua es incorrecta. Por favor, vuelve a introducirla "
+"correctamente."
+
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "ID de objeto"
@@ -77,7 +1167,7 @@ msgstr "fecha/hora de envío"
msgid "is public"
msgstr "es público"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:307
msgid "IP address"
msgstr "Dirección IP"
@@ -94,9 +1184,8 @@ msgstr ""
"\"Este comentario ha sido eliminado\"."
#: contrib/comments/models.py:91
-#, fuzzy
msgid "comments"
-msgstr "comentario"
+msgstr "comentarios"
#: contrib/comments/models.py:131 contrib/comments/models.py:207
msgid "Content object"
@@ -130,14 +1219,12 @@ msgid "approved by staff"
msgstr "aprobado por el staff"
#: contrib/comments/models.py:176
-#, fuzzy
msgid "free comment"
-msgstr "Comentario libre"
+msgstr "comentario libre"
#: contrib/comments/models.py:177
-#, fuzzy
msgid "free comments"
-msgstr "Comentarios libres"
+msgstr "comentarios libres"
#: contrib/comments/models.py:233
msgid "score"
@@ -148,19 +1235,17 @@ msgid "score date"
msgstr "fecha de la puntuación"
#: contrib/comments/models.py:237
-#, fuzzy
msgid "karma score"
-msgstr "Punto karma"
+msgstr "punto karma"
#: contrib/comments/models.py:238
-#, fuzzy
msgid "karma scores"
-msgstr "Puntos karma"
+msgstr "puntos karma"
#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
-msgstr "Puntuado %(score)d por %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
#: contrib/comments/models.py:258
#, python-format
@@ -178,14 +1263,12 @@ msgid "flag date"
msgstr "fecha de la marca"
#: contrib/comments/models.py:268
-#, fuzzy
msgid "user flag"
-msgstr "Marca de usuario"
+msgstr "marca de usuario"
#: contrib/comments/models.py:269
-#, fuzzy
msgid "user flags"
-msgstr "Marcas de usuario"
+msgstr "marcas de usuario"
#: contrib/comments/models.py:273
#, python-format
@@ -197,38 +1280,92 @@ msgid "deletion date"
msgstr "fecha de eliminación"
#: contrib/comments/models.py:280
-#, fuzzy
msgid "moderator deletion"
-msgstr "Eliminación de moderador"
+msgstr "eliminación de moderador"
#: contrib/comments/models.py:281
-#, fuzzy
msgid "moderator deletions"
-msgstr "Eliminaciones de moderador"
+msgstr "eliminaciones de moderador"
#: contrib/comments/models.py:285
#, python-format
msgid "Moderator deletion by %r"
msgstr "Eliminación del moderador %r"
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Los usuarios anónimos no pueden votar"
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Tu nombre:"
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "ID de comentario no válido"
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Comentario:"
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "No puedes votarte tú mismo"
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
-#: contrib/comments/views/comments.py:28
-msgid ""
-"This rating is required because you've entered at least one other rating."
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: 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 "Terminar sesión"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Clave:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "¿Has olvidado tu contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Postea una fotografía"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -251,32 +1388,35 @@ msgstr[1] ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
+"Este comentario ha sido colocado por un usuario poco preciso: \n"
+"\n"
+"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Sólo se admite POST"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
"Alguien está jugando con el formulario de comentarios (violación de "
"seguridad)"
-#: contrib/comments/views/comments.py:207
+#: 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 "
@@ -290,78 +1430,65 @@ msgstr ""
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Usuario:"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Clave:"
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
-#: contrib/comments/templates/comments/form.html:6
-#, fuzzy
-msgid "Forgotten your password?"
-msgstr "Cambiar mi clave"
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
-msgstr "Terminar sesión"
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "No puedes votarte tú mismo"
-#: contrib/comments/templates/comments/form.html:12
-#, fuzzy
-msgid "Ratings"
-msgstr "calificación 1"
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
msgstr ""
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejeplo: '/"
+"events/search/'."
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr ""
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
msgstr ""
+"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
+"empiece con 'http://'."
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-#, fuzzy
-msgid "Comment:"
-msgstr "Comentario"
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-#, fuzzy
-msgid "Preview comment"
-msgstr "Comentario libre"
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
-#: contrib/comments/templates/comments/freeform.html:4
-#, fuzzy
-msgid "Your name:"
-msgstr "nombre de usuario"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nombre para mostrar"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -373,7 +1500,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Todo"
@@ -397,18 +1524,6 @@ msgstr "Este mes"
msgid "This year"
msgstr "Este año"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Sí"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "No"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Desconocido"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "hora de acción"
@@ -437,266 +1552,181 @@ msgstr "entrada de registro"
msgid "log entries"
msgstr "entradas de registro"
-#: contrib/admin/templatetags/admin_list.py:228
-msgid "All dates"
-msgstr "Todas las fechas"
-
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Identificarse"
-
-#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Por favor, identifíquese de nuevo, porque su sesión ha caducado. No se "
-"preocupe: se ha guardado su envío."
-
-#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
-"por favor, recargue esta página, e inténtelo de nuevo."
-
-#: contrib/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente:"
-#: contrib/admin/views/decorators.py:84
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr ""
-"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
-"lugar."
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "Sitio administrativo"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Puede editarlo de nuevo abajo."
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: 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 "Cambiar clave"
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
-#, python-format
-msgid "You may add another %s below."
-msgstr "Puede agregar otro %s abajo."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Home"
+msgstr "Inicio"
-#: contrib/admin/views/main.py:290
-#, python-format
-msgid "Add %s"
-msgstr "Agregar %s"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: 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 "Documentación"
-#: contrib/admin/views/main.py:336
-#, python-format
-msgid "Added %s."
-msgstr "Agregado %s."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "y"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
-#: contrib/admin/views/main.py:338
-#, python-format
-msgid "Changed %s."
-msgstr "Modificado %s."
+#: 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\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
+"favoritos.\n"
+"Ahora puede escoger el bookmarklet desde cualquier página en el sitio.\n"
+"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un computador señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
+"p>\n"
-#: contrib/admin/views/main.py:340
-#, python-format
-msgid "Deleted %s."
-msgstr "Borrado %s."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación de esta página"
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "No ha cambiado ningún campo."
+#: 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 "Le lleva desde cualquier página a la documentación de la vista que la genera."
-#: contrib/admin/views/main.py:346
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
-#: contrib/admin/views/main.py:354
-#, python-format
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
msgstr ""
-"Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
-
-#: contrib/admin/views/main.py:392
-#, python-format
-msgid "Change %s"
-msgstr "Modificar %s"
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
-#: contrib/admin/views/main.py:470
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
-#: contrib/admin/views/main.py:475
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Uno o más %(fieldname)s en %(name)s:"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Le lleva a la página de administración de páginas que representan un único "
+"objeto."
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "¿Está seguro?"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como antes, pero abre la página de administración en una nueva ventana."
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "Modificar histórico: %s"
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s"
-msgstr "Escoja %s"
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s to change"
-msgstr "Escoja %s para modificar"
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
-msgid "Integer"
-msgstr "Entero"
+#: 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 ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
+"paciencia."
-#: contrib/admin/views/doc.py:278
-msgid "Boolean (Either True or False)"
-msgstr "Booleano (Verdadero o Falso)"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Cadena (máximo %(maxlength)s)"
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
-#: contrib/admin/views/doc.py:280
-msgid "Comma-separated integers"
-msgstr "Enteros separados por comas"
-
-#: contrib/admin/views/doc.py:281
-msgid "Date (without time)"
-msgstr "Fecha (sin hora)"
-
-#: contrib/admin/views/doc.py:282
-msgid "Date (with time)"
-msgstr "Fecha (con hora)"
-
-#: contrib/admin/views/doc.py:283
-msgid "E-mail address"
-msgstr "Dirección de correo electrónico"
-
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
-msgid "File path"
-msgstr "Ruta de fichero"
-
-#: contrib/admin/views/doc.py:285
-msgid "Decimal number"
-msgstr "Número decimal"
-
-#: contrib/admin/views/doc.py:291
-msgid "Boolean (Either True, False or None)"
-msgstr "Booleano (Verdadero, Falso o Nulo)"
-
-#: contrib/admin/views/doc.py:292
-msgid "Relation to parent model"
-msgstr "Relación con el modelo padre"
-
-#: contrib/admin/views/doc.py:293
-msgid "Phone number"
-msgstr "Número de teléfono"
-
-#: contrib/admin/views/doc.py:298
-msgid "Text"
-msgstr "Texto"
-
-#: contrib/admin/views/doc.py:299
-msgid "Time"
-msgstr "Hora"
-
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:301
-msgid "U.S. state (two uppercase letters)"
-msgstr "Estado de los EEUU (dos letras mayúsculas)"
-
-#: contrib/admin/views/doc.py:302
-msgid "XML text"
-msgstr "Texto XML"
-
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Documentation"
-msgstr "Documentación"
-
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
-msgstr "Cambiar clave"
-
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Inicio"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Histórico"
@@ -714,7 +1744,7 @@ msgstr "Acción"
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
-msgstr ""
+msgstr "j M Y P"
#: contrib/admin/templates/admin/object_history.html:36
msgid ""
@@ -732,26 +1762,48 @@ msgstr "Sitio de administración de Django"
msgid "Django administration"
msgstr "Administración de Django"
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Error del servidor"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bienvenido,"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Error del servidor (500)"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Identificarse"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Error de servidor <em>(500)</em>"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
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."
+"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 ""
-"Ha ocurrido un error. Se ha informado a los administradores del sitio "
-"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
-"paciencia"
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para borrar los "
+"siguientes tipos de objetos:"
+
+#: 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 ""
+"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s"
+"\"? Se borrarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -762,10 +1814,35 @@ msgstr "Página no encontrada"
msgid "We're sorry, but the requested page could not be found."
msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr ""
+msgstr "Modelos disponibles en la aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
@@ -792,106 +1869,77 @@ msgstr "Mis acciones"
msgid "None available"
msgstr "Ninguno disponible"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Agregar %(name)s"
-
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "¿Ha <a href=\"/password_reset/\">olvidado su clave</a>?"
-
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-msgstr "Bienvenido,"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrarlo todo"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Eliminar"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-"Eliminar el %(object_name)s '%(object)s' provocaría la eliminación de "
-"objetos relacionados, pero su cuenta no tiene permiso para borrar los "
-"siguientes tipos de objetos:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
-msgstr ""
-"¿Está seguro de que quiere borrar los %(object_name)s \"%(object)s\"? Se "
-"borrarán los siguientes objetos relacionados:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "Sí, estoy seguro"
-
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " Por %(title)s "
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Buscar"
-
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Ver en el sitio"
-#: contrib/admin/templates/admin/change_form.html:30
+#: 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] "Por favor, corrija el siguiente error."
msgstr[1] "Por favor, corrija los siguientes errores."
-#: contrib/admin/templates/admin/change_form.html:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
msgstr "Ordenación"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Orden:"
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Grabar como nuevo"
+#: 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 ""
+"Algo va mal con la instalación de la base de datos. Asegúrate que las tablas "
+"necesarias han sido creadas, y que la base de datos puede ser leída por el "
+"usuario apropiado."
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Grabar y añadir otro"
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Grabar y continuar editando"
+#: 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 ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
+"editar el resto de opciones del usuario."
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Grabar"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nombre de usuario"
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_form.html:6
-#: contrib/admin/templates/registration/password_change_form.html:10
-msgid "Password change"
-msgstr "Cambio de clave"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Contraseña"
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Cambio de clave exitoso"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Contraseña (de nuevo)"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Su clave ha sido cambiada."
+#: 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 "Introduzca la misma contraseña que arriba, para verificación"
+
+#: 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 ""
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/password_reset_form.html:6
@@ -924,43 +1972,6 @@ msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
msgid "Log in again"
msgstr "Identificarse de nuevo"
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Recuperación de clave exitosa"
-
-#: 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 ""
-"Le hemos enviado una clave nueva a la dirección que ha suministrado. Debería "
-"recibirla en breve."
-
-#: 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 ""
-"Por favor, introduzca su clave antigua, por seguridad, y después introduzca "
-"la nueva clave dos veces para verificar que la ha escrito correctamente."
-
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
-msgstr "Clave antigua:"
-
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
-msgstr "Clave nueva:"
-
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
-msgstr "Confirme clave:"
-
-#: contrib/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
-msgstr "Cambiar mi clave"
-
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
msgstr "Está recibiendo este mensaje debido a que solicitó recuperar la clave"
@@ -992,1064 +2003,369 @@ msgstr "¡Gracias por usar nuestro sitio!"
msgid "The %(site_name)s team"
msgstr "El equipo de %(site_name)s"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "Bookmarklets"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "Bookmarklets de documentación"
-
-#: 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\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
-"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
-"favoritos.\n"
-"Ahora puede escoger el bookmarklet desde cualquier página en el sitio.\n"
-"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
-"el sitio desde un computador señalado como \"interno\" (hable\n"
-"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
-"p>\n"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "Documentación de esta página"
-
-#: 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 ""
-"Le lleva desde cualquier página a la documentación de la vista que la genera."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "Mostrar ID de objeto"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
-msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
-msgstr ""
-"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
-"único objeto."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "Editar este objeto (ventana actual)"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
-msgstr ""
-"Le lleva a la página de administración de páginas que representan un único "
-"objeto."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "Editar este objeto (nueva ventana)"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
-msgstr ""
-"Como antes, pero abre la página de administración en una nueva ventana."
-
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Fecha:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-#, fuzzy
-msgid "Time:"
-msgstr "Hora"
-
-#: contrib/admin/templates/widget/file.html:2
-#, fuzzy
-msgid "Currently:"
-msgstr "Actualmente"
-
-#: contrib/admin/templates/widget/file.html:3
-#, fuzzy
-msgid "Change:"
-msgstr "Modificar"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigir desde"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejeplo: '/"
-"events/search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigir a"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
-"empiece con 'http://'."
-
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "redirección"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "redirecciones"
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Recuperación de clave exitosa"
-#: contrib/flatpages/models.py:8
+#: contrib/admin/templates/registration/password_reset_done.html:12
msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
msgstr ""
-"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
-"final."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "título"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenido"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "admitir comentarios"
+"Le hemos enviado una clave nueva a la dirección que ha suministrado. Debería "
+"recibirla en breve."
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nombre de plantilla"
+#: 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 "Cambio de clave"
-#: contrib/flatpages/models.py:13
+#: contrib/admin/templates/registration/password_change_form.html:12
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"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 ""
-"Ejemplo: 'flatpages/contact_page'. Si no lo proporciona, el sistema usará "
-"'flatpages/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "debe estar registrado"
-
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
-
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "página estática"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "páginas estáticas"
-
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
-msgid "name"
-msgstr "nombre"
-
-#: contrib/auth/models.py:15
-msgid "codename"
-msgstr "nombre en código"
-
-#: contrib/auth/models.py:17
-#, fuzzy
-msgid "permission"
-msgstr "Permiso"
-
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
-#, fuzzy
-msgid "permissions"
-msgstr "Permisos"
-
-#: contrib/auth/models.py:29
-#, fuzzy
-msgid "group"
-msgstr "Grupo"
-
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
-#, fuzzy
-msgid "groups"
-msgstr "Grupos"
-
-#: contrib/auth/models.py:55
-msgid "username"
-msgstr "nombre de usuario"
-
-#: contrib/auth/models.py:56
-msgid "first name"
-msgstr "nombre"
-
-#: contrib/auth/models.py:57
-msgid "last name"
-msgstr "apellidos"
-
-#: contrib/auth/models.py:58
-msgid "e-mail address"
-msgstr "dirección de correo"
-
-#: contrib/auth/models.py:59
-msgid "password"
-msgstr "clave"
+"Por favor, introduzca su clave antigua, por seguridad, y después introduzca "
+"la nueva clave dos veces para verificar que la ha escrito correctamente."
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Use '[algo]$[salt]$[hexdigest]'"
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Clave antigua:"
-#: contrib/auth/models.py:60
-msgid "staff status"
-msgstr "es staff"
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Clave nueva:"
-#: contrib/auth/models.py:60
-msgid "Designates whether the user can log into this admin site."
-msgstr "Indica si el usuario puede entrar en este sitio de administración."
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme clave:"
-#: contrib/auth/models.py:61
-msgid "active"
-msgstr "activo"
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar mi clave"
-#: contrib/auth/models.py:62
-msgid "superuser status"
-msgstr "es superusuario"
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de clave exitoso"
-#: contrib/auth/models.py:63
-msgid "last login"
-msgstr "último registro"
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su clave ha sido cambiada."
-#: contrib/auth/models.py:64
-msgid "date joined"
-msgstr "fecha de creación"
+#: contrib/admin/templatetags/admin_list.py:238
+msgid "All dates"
+msgstr "Todas las fechas"
-#: contrib/auth/models.py:66
+#: contrib/admin/views/decorators.py:62
msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
msgstr ""
-"Además de los permisos asignados manualmente, este usuario también tendrá "
-"todos los permisos de los grupos en los que esté."
-
-#: contrib/auth/models.py:67
-#, fuzzy
-msgid "user permissions"
-msgstr "Permisos"
-
-#: contrib/auth/models.py:70
-#, fuzzy
-msgid "user"
-msgstr "Usuario"
-
-#: contrib/auth/models.py:71
-#, fuzzy
-msgid "users"
-msgstr "Usuarios"
-
-#: contrib/auth/models.py:76
-msgid "Personal info"
-msgstr "Información personal"
-
-#: contrib/auth/models.py:77
-msgid "Permissions"
-msgstr "Permisos"
-
-#: contrib/auth/models.py:78
-msgid "Important dates"
-msgstr "Fechas importantes"
-
-#: contrib/auth/models.py:79
-msgid "Groups"
-msgstr "Grupos"
-
-#: contrib/auth/models.py:219
-#, fuzzy
-msgid "message"
-msgstr "Mensaje"
+"Por favor, identifíquese de nuevo, porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
-#: contrib/auth/forms.py:30
+#: contrib/admin/views/decorators.py:69
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-
-#: contrib/contenttypes/models.py:25
-#, fuzzy
-msgid "python model class name"
-msgstr "nombre de módulo python"
-
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "tipo de contenido"
-
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "tipos de contenido"
-
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "clave de sesión"
-
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "datos de sesión"
-
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "fecha de caducidad"
-
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "sesión"
-
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "sesiones"
-
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nombre de dominio"
-
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nombre para mostrar"
-
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "sitio"
-
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sitios"
-
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr ""
-
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr ""
-
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr ""
-
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "Lunes"
-
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "Martes"
-
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "Miércoles"
-
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "Jueves"
-
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "Viernes"
-
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "Sábado"
-
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "Domingo"
-
-#: utils/dates.py:14
-msgid "January"
-msgstr "Enero"
-
-#: utils/dates.py:14
-msgid "February"
-msgstr "Febrero"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
-msgstr "Marzo"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
-msgstr "Abril"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
-msgstr "Mayo"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
-msgstr "Junio"
-
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
-msgstr "Julio"
-
-#: utils/dates.py:15
-msgid "August"
-msgstr "Agosto"
-
-#: utils/dates.py:15
-msgid "September"
-msgstr "Septiembre"
-
-#: utils/dates.py:15
-msgid "October"
-msgstr "Octubre"
-
-#: utils/dates.py:15
-msgid "November"
-msgstr "Noviembre"
-
-#: utils/dates.py:16
-msgid "December"
-msgstr "Diciembre"
-
-#: utils/dates.py:19
-#, fuzzy
-msgid "jan"
-msgstr "y"
-
-#: 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
-#, fuzzy
-msgid "may"
-msgstr "día"
-
-#: 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 "Ene."
-
-#: utils/dates.py:27
-msgid "Feb."
-msgstr "Feb."
-
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "Ago."
-
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "Sept."
-
-#: utils/dates.py:28
-msgid "Oct."
-msgstr "Oct."
-
-#: utils/dates.py:28
-msgid "Nov."
-msgstr "Nov."
-
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "Dic."
-
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "año"
-msgstr[1] "años"
-
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mes"
-msgstr[1] "meses"
-
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "día"
-msgstr[1] "días"
-
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
-
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
-
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengalí"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Checo"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Galés"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Danés"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Alemán"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr ""
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Inglés"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Español"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Francés"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Gallego"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr ""
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
msgstr ""
+"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
+"por favor, recargue esta página, e inténtelo de nuevo."
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandés"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italiano"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr ""
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
-#: conf/global_settings.py:52
-msgid "Dutch"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
+"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
+"lugar."
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Noruego"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brasileño"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Rumano"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Ruso"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Eslovaco"
-
-#: conf/global_settings.py:58
-#, fuzzy
-msgid "Slovenian"
-msgstr "Eslovaco"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbio"
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "etiqueta:"
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Sueco"
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
-#: conf/global_settings.py:61
-#, fuzzy
-msgid "Ukrainian"
-msgstr "Brasileño"
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vista:"
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Chino simplificado"
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Aplicación %r no encontrada"
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr ""
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "El modelo %(model_name)s no se ha encontrado en la aplicación %(app_label)r"
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+#: contrib/admin/views/doc.py:184
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "el objeto relacionado`%(app_label)s.%(data_type)s` "
-#: core/validators.py:64
-#, fuzzy
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Este valor debe contener sólo letras, números, guiones bajos y barras (/)."
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:222 contrib/admin/views/doc.py:227
+msgid "model:"
+msgstr "modelo:"
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "No se admiten letras mayúsculas."
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "los objetos relacionados `%(app_label)s.%(object_name)s`"
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "No se admiten letras minúsculas."
+#: contrib/admin/views/doc.py:222
+#, python-format
+msgid "all %s"
+msgstr "todo %s"
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Introduzca sólo dígitos separados por comas."
+#: contrib/admin/views/doc.py:227
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Introduzca direcciones de correo válidas separadas por comas."
+#: contrib/admin/views/doc.py:232
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos en %s objetos"
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Por favor introduzca una dirección IP válida."
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Entero"
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "No se admiten valores vacíos."
+#: contrib/admin/views/doc.py:295
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "No se admiten caracteres no numéricos."
+#: contrib/admin/views/doc.py:296 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadena (máximo %(maxlength)s)"
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Este valor no puede comprender sólo dígitos."
+#: contrib/admin/views/doc.py:297
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Introduzca un número entero."
+#: contrib/admin/views/doc.py:298
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Sólo se admiten caracteres alfabéticos."
+#: contrib/admin/views/doc.py:299
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Dirección de correo electrónico"
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Introduzca una hora válida en formato HH:MM."
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Ruta de fichero"
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
+#: contrib/admin/views/doc.py:303
+msgid "Decimal number"
+msgstr "Número decimal"
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Introduzca una dirección de correo electrónico válida"
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
-"trataba de una imagen corrupta."
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Relación con el modelo padre"
-#: core/validators.py:155
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "La URL %s no apunta a una imagen válida."
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Número de teléfono"
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Los números de teléfono deben guardar el formato XXX-XXX-XXXX format. \"%s\" "
-"no es válido."
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Texto"
-#: core/validators.py:167
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "La URL %s no apunta a un vídeo QuickTime válido."
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Hora"
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Se precisa una URL válida."
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado de los EEUU (dos letras mayúsculas)"
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Se precisa HTML válido. Los errores específicos son:\n"
-"%s"
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "Texto XML"
-#: core/validators.py:192
+#: contrib/admin/views/doc.py:346
#, python-format
-msgid "Badly formed XML: %s"
-msgstr "XML mal formado: %s"
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no parece ser un objeto urlpattern"
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "URL no válida: %s"
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Sitio administrativo"
-#: core/validators.py:206 core/validators.py:208
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
#, python-format
-msgid "The URL %s is a broken link."
-msgstr "La URL %s es un enlace roto."
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+#: 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 "Puede editarlo de nuevo abajo."
-#: core/validators.py:229
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, 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] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
-msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
+msgid "You may add another %s below."
+msgstr "Puede agregar otro %s abajo."
-#: core/validators.py:236
+#: contrib/admin/views/main.py:289
#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Este campo debe concordar con el campo '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Por favor, introduzca algo en al menos un campo."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+msgid "Add %s"
+msgstr "Agregar %s"
-#: core/validators.py:282
+#: contrib/admin/views/main.py:335
#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+msgid "Added %s."
+msgstr "Agregado %s."
-#: core/validators.py:294
+#: contrib/admin/views/main.py:337
#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "No se admiten valores duplicados."
+msgid "Changed %s."
+msgstr "Modificado %s."
-#: core/validators.py:336
+#: contrib/admin/views/main.py:339
#, python-format
-msgid "This value must be a power of %s."
-msgstr "Este valor debe ser una potencia de %s."
+msgid "Deleted %s."
+msgstr "Borrado %s."
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Por favor, introduzca un número decimal válido."
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
-#: core/validators.py:349
+#: contrib/admin/views/main.py:345
#, 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] ""
-"Por favor, introduzca un número decimal válido con a lo más %s dígito en "
-"total."
-msgstr[1] ""
-"Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
-"total."
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
-#: core/validators.py:352
+#: contrib/admin/views/main.py:353
#, 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] ""
-"Por favor, introduzca un número decimal válido con a lo más %s dígito "
-"decimal."
-msgstr[1] ""
-"Por favor, introduzca un número decimal válido con a lo más %s dígitos "
-"decimales."
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
-#: core/validators.py:362
+#: contrib/admin/views/main.py:391
#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Asegúrese de que el fichero que envía tiene al menos %s bytes."
+msgid "Change %s"
+msgstr "Modificar %s"
-#: core/validators.py:363
+#: contrib/admin/views/main.py:473
#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Asegúrese de que el fichero que envía tiene como máximo %s bytes."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "El formato de este campo es incorrecto."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Este campo no es válido."
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-#: core/validators.py:426
+#: contrib/admin/views/main.py:478
#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "No pude obtener nada de %s."
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
-#: core/validators.py:429
+#: contrib/admin/views/main.py:511
#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
-"es válida."
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
-"empieza por \"%(start)s\".)"
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
-#: core/validators.py:466
+#: contrib/admin/views/main.py:536
#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
-"contexto. (La línea empieza por \"%(start)s\".)"
+msgid "Change history: %s"
+msgstr "Modificar histórico: %s"
-#: core/validators.py:471
+#: contrib/admin/views/main.py:570
#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
-"empieza por \"%(start)s\".)"
+msgid "Select %s"
+msgstr "Escoja %s"
-#: core/validators.py:476
+#: contrib/admin/views/main.py:570
#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
-"empieza por \"%(start)s\".)"
+msgid "Select %s to change"
+msgstr "Escoja %s para modificar"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
-"requeridos. (La línea empieza por \"%(start)s\".)"
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "Erorr en la base de datos"
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
-"válido. (La línea empieza por \"%(start)s\".)"
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Añadir usuario"
-#: db/models/manipulators.py:302
-#, fuzzy, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "Ya existe %(optname)s con este %(fieldname)s."
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "La clave se ha cambiado exitosamente."
-#: db/models/fields/__init__.py:40
+#: contrib/admin/views/auth.py:64
#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "Ya existe %(optname)s con este %(fieldname)s."
+msgid "Change password: %s"
+msgstr "Cambiar clave: %s"
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Este campo es obligatorio."
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXXX-XXXX."
-#: db/models/fields/__init__.py:337
-#, fuzzy
-msgid "This value must be an integer."
-msgstr "Este valor debe ser una potencia de %s."
-
-#: db/models/fields/__init__.py:369
-#, fuzzy
-msgid "This value must be either True or False."
-msgstr "Este valor debe ser una potencia de %s."
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Introduzca un código postal. Se necesita un espacio entre las dos partes del "
+"código."
-#: db/models/fields/__init__.py:385
-#, fuzzy
-msgid "This field cannot be null."
-msgstr "Este campo no es válido."
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "clave de sesión"
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Introduzca un nombre de fichero válido"
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "datos de sesión"
-#: db/models/fields/related.py:43
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Por favor, introduzca un %s válido."
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "fecha de caducidad"
-#: db/models/fields/related.py:579
-#, fuzzy
-msgid "Separate multiple IDs with commas."
-msgstr " Separe múltiples IDs con comas."
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "sesión"
-#: db/models/fields/related.py:581
-#, fuzzy
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "Pulse \"Control\" o \"Command\" en un Mac para escoger más de uno."
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "sesiones"
-#: db/models/fields/related.py:625
+#: views/generic/create_update.py:43
#, 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] ""
-"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
-"válido."
-msgstr[1] ""
-"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
-"válidos."
+msgid "The %(verbose_name)s was created successfully."
+msgstr "El %(verbose_name)s se ha creado correctamente."
-#: forms/__init__.py:380
+#: views/generic/create_update.py:117
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
-msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito el %(verbose_name)s."
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "No se permiten saltos de línea."
-
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: views/generic/create_update.py:184
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Escoja una opción válida; '%(data)s' no está en %(choices)s."
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "El fichero enviado está vacío."
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Introduzca un número entero entre -32,768 y 32,767."
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Introduzca un número positivo."
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Introduzca un número entero entre 0 y 32,767."
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "si,no,tal vez"
-
-#~ msgid "Comment"
-#~ msgstr "Comentario"
-
-#~ msgid "Comments"
-#~ msgstr "Comentarios"
-
-#~ msgid "String (up to 50)"
-#~ msgstr "Cadena (máximo 50)"
-
-#~ msgid "label"
-#~ msgstr "etiqueta"
-
-#~ msgid "package"
-#~ msgstr "paquete"
-
-#~ msgid "packages"
-#~ msgstr "paquetes"
+msgid "The %(verbose_name)s was deleted."
+msgstr "El %(verbose_name)s ha sido eliminado."
-#, fuzzy
-#~ 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] ""
-#~ "Por favor, introduzca un número decimal válido con a lo más %s dígito en "
-#~ "total."
-#~ msgstr[1] ""
-#~ "Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
-#~ "total."
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
index a247bb2385..717bbcbd05 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.mo
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po
index 36cae2f7f2..02f80682e7 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.po
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po
@@ -1,15 +1,13 @@
-# Translation of django.po to Argentinean spanish, based on Spanish
-# translation work by Ricardo Javier Cárdenes Medina.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
-# Ramiro Morales <rm0@gmx.net>, 2006.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR
#
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-11-05 19:57-0300\n"
-"PO-Revision-Date: 2006-11-05 20:00-0300\n"
+"POT-Creation-Date: 2007-05-19 13:22-0300\n"
+"PO-Revision-Date: 2007-05-19 13:33-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,51 +15,405 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: contrib/contenttypes/models.py:20
-msgid "python model class name"
-msgstr "nombre de la clase python del modelo"
+#: newforms/fields.py:82 newforms/fields.py:378 newforms/fields.py:454
+#: newforms/fields.py:465 newforms/models.py:186
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:612 db/models/fields/__init__.py:623
+#: oldforms/__init__.py:357
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
-#: contrib/contenttypes/models.py:23
-msgid "content type"
-msgstr "tipo de contenido"
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Asegúrese de que este valor tenga como máximo %d caracteres."
-#: contrib/contenttypes/models.py:24
-msgid "content types"
-msgstr "tipos de contenido"
+#: newforms/fields.py:107 newforms/fields.py:260
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Asegúrese de que este valor tenga al menos %d caracteres."
-#: contrib/auth/views.py:39
-msgid "Logged out"
-msgstr "Sesión cerrada"
+#: newforms/fields.py:130 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor sea menor o igual a %s."
+
+#: newforms/fields.py:134
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %s."
+
+#: newforms/fields.py:167
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: newforms/fields.py:194
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+#: newforms/fields.py:230
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+#: newforms/fields.py:244
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+#: newforms/fields.py:273 core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: newforms/fields.py:291 newforms/fields.py:313
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: newforms/fields.py:315
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: newforms/fields.py:366 newforms/models.py:173
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. Esa opción no es una de las opciones "
+"disponibles."
+
+#: newforms/fields.py:382 newforms/fields.py:458 newforms/models.py:190
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: newforms/fields.py:391 newforms/models.py:196
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %s no es una de las opciones disponibles."
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:577
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "Yes"
+msgstr "Sí"
+
+#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "No"
+msgstr "No"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "medianoche"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "mediodía"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d milisegundos"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Enero"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febrero"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junio"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setiembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Noviembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Diciembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ene"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Enero"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: 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 \\de F"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
+"empiece con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
-#: contrib/auth/models.py:38 contrib/auth/models.py:57
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
msgid "name"
msgstr "nombre"
-#: contrib/auth/models.py:40
+#: contrib/auth/models.py:46
msgid "codename"
msgstr "nombre en código"
-#: contrib/auth/models.py:42
+#: contrib/auth/models.py:49
msgid "permission"
msgstr "permiso"
-#: contrib/auth/models.py:43 contrib/auth/models.py:58
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
msgid "permissions"
msgstr "permisos"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:68
msgid "group"
msgstr "grupo"
-#: contrib/auth/models.py:61 contrib/auth/models.py:100
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
msgid "groups"
msgstr "grupos"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:99
msgid "username"
msgstr "nombre de usuario"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:99
msgid ""
"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
"digits and underscores)."
@@ -69,39 +421,43 @@ msgstr ""
"Requerido. Longitud máxima 30 caracteres alfanuméricos (letras, dígitos y "
"guiones bajos)."
-#: contrib/auth/models.py:91
+#: contrib/auth/models.py:100
msgid "first name"
msgstr "nombre"
-#: contrib/auth/models.py:92
+#: contrib/auth/models.py:101
msgid "last name"
msgstr "apellido"
-#: contrib/auth/models.py:93
+#: contrib/auth/models.py:102
msgid "e-mail address"
msgstr "dirección de correo"
-#: contrib/auth/models.py:94
+#: contrib/auth/models.py:103
msgid "password"
msgstr "contraseña"
-#: contrib/auth/models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use '[algo]$[salt]$[hexdigest]' o use el <a href=\"password/\">formulario de "
+"cambio de contraseña</a>."
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:104
msgid "staff status"
msgstr "es staff"
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:104
msgid "Designates whether the user can log into this admin site."
msgstr "Indica si el usuario puede ingresar a este sitio de administración."
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:105
msgid "active"
msgstr "activo"
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:105
msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
@@ -109,11 +465,11 @@ msgstr ""
"Indica si el usuario puede ingresar al sitio de administración Django."
"Desactive este campo en lugar de eliminar usuarios."
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:106
msgid "superuser status"
msgstr "es superusuario"
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:106
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
@@ -121,15 +477,15 @@ msgstr ""
"Indica que este usuario posee todos los permisos, sin asignarle los mismos "
"explícitamente."
-#: contrib/auth/models.py:98
+#: contrib/auth/models.py:107
msgid "last login"
-msgstr "último registro"
+msgstr "último ingreso"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:108
msgid "date joined"
msgstr "fecha de creación"
-#: contrib/auth/models.py:101
+#: contrib/auth/models.py:110
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -137,47 +493,51 @@ msgstr ""
"Además de los permisos asignados manualmente, este usuario también poseerá "
"todos los permisos de los grupos a los que pertenezca."
-#: contrib/auth/models.py:102
+#: contrib/auth/models.py:111
msgid "user permissions"
msgstr "permisos de usuario"
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:115
msgid "user"
msgstr "usuario"
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:116
msgid "users"
msgstr "usuarios"
-#: contrib/auth/models.py:111
+#: contrib/auth/models.py:122
msgid "Personal info"
msgstr "Información personal"
-#: contrib/auth/models.py:112
+#: contrib/auth/models.py:123
msgid "Permissions"
msgstr "Permisos"
-#: contrib/auth/models.py:113
+#: contrib/auth/models.py:124
msgid "Important dates"
msgstr "Fechas importantes"
-#: contrib/auth/models.py:114
+#: contrib/auth/models.py:125
msgid "Groups"
msgstr "Grupos"
-#: contrib/auth/models.py:258
+#: contrib/auth/models.py:269
msgid "message"
msgstr "mensaje"
-#: contrib/auth/forms.py:16
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "UsuarioAnonimo"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
msgid "The two password fields didn't match."
msgstr "Los dos campos de contraseñas no coinciden entre si."
-#: contrib/auth/forms.py:24
+#: contrib/auth/forms.py:25
msgid "A user with that username already exists."
msgstr "Ya existe un usuario con ese nombre."
-#: contrib/auth/forms.py:52
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -185,19 +545,19 @@ msgstr ""
"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
"requerimiento para poder ingresar."
-#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10
+#: 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 ""
-"Por favor ingrese un nombre de usuario y una contraseña correctos. Note que "
-"ambos campos son sensibles a mayúsculas/minúsculas."
+"Por favor introduzca un nombre de usuario y una contraseña correctos. Note "
+"que ambos campos son sensibles a mayúsculas/minúsculas."
-#: contrib/auth/forms.py:61
+#: contrib/auth/forms.py:62
msgid "This account is inactive."
msgstr "Esta cuenta está inactiva"
-#: contrib/auth/forms.py:84
+#: contrib/auth/forms.py:85
msgid ""
"That e-mail address doesn't have an associated user account. Are you sure "
"you've registered?"
@@ -205,466 +565,19 @@ msgstr ""
"Esa dirección de e-mail no está asociada a ninguna cuenta de usuario. ¿Está "
"seguro de que ya se ha registrado?"
-#: contrib/auth/forms.py:116
+#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
msgstr "Los dos campos 'nueva contraseña' no coinciden entre si."
-#: contrib/auth/forms.py:123
+#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
msgstr ""
"La antigua contraseña ingresada es incorrecta. Por favor ingrésela "
"nuevamente."
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigir desde"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
-"events/search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigir a"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
-"empiece con 'http://'."
-
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "redirección"
-
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "redirecciones"
-
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "ID de objeto"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "encabezado"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "comentario"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "calificación 1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "calificación 2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "calificación 3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "calificación 4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "calificación 5"
-
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "calificación 6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "calificación 7"
-
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "calificación 8"
-
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "es calificación válida"
-
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "fecha/hora de envío"
-
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "es público"
-
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
-msgid "IP address"
-msgstr "Dirección IP"
-
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "está eliminado"
-
-#: 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 ""
-"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará "
-"\"Este comentario ha sido eliminado\"."
-
-#: contrib/comments/models.py:91
-msgid "comments"
-msgstr "comentarios"
-
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Objeto contenido"
-
-#: 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 ""
-"Enviado por %(user)s el %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
-
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "nombre de la persona"
-
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "dirección ip"
-
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "aprobado por el staff"
-
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "comentario libre"
-
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "comentarios libres"
-
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "puntuación"
-
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "fecha de la puntuación"
-
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "punto karma"
-
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "puntos karma"
-
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "puntuado %(score)d por %(user)s"
-
-#: contrib/comments/models.py:258
-#, python-format
-msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Este comentario fue marcado por %(user)s:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "fecha de la marca"
-
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "marca de usuario"
-
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "marcas de usuario"
-
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Marca de %r"
-
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "fecha de eliminación"
-
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "Eliminación por moderador"
-
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "eliminaciones por moderador"
-
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Eliminación del moderador %r"
-
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Los usuarios anónimos no pueden votar"
-
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "ID de comentario no válido"
-
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "No puedes votarte tú mismo"
-
-#: contrib/comments/views/comments.py:27
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
-
-#: 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] ""
-"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
-"comentario:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
-"comentarios:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:116
-#, fuzzy, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Este comentario ha sido enviado por un usuario 'sketcky':\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Sólo se admiten POSTs"
-
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
-
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr ""
-"Alguien está jugando con el formulario de comentarios (violación de "
-"seguridad)"
-
-#: 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 ""
-"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
-"objeto era inválido)"
-
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
-
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Su nombre:"
-
-#: contrib/comments/templates/comments/freeform.html:5
-#: contrib/comments/templates/comments/form.html:28
-msgid "Comment:"
-msgstr "Comentario:"
-
-#: contrib/comments/templates/comments/freeform.html:10
-#: contrib/comments/templates/comments/form.html:35
-msgid "Preview comment"
-msgstr "Previsualizar comentario"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Usuario:"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/object_history.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/delete_confirmation.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
-msgstr "Cerrar sesión"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Contraseña:"
-
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
-msgstr "Olvidó su contraseña?"
-
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Calificaciones"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Requerido"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Opcional"
-
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Enviar una foto"
-
-#: 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 ""
-"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
-"final."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "título"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenido"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "activar comentarios"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nombre de plantilla"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
-msgstr ""
-"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
-"usará 'flatpages/default.html'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "debe estar registrado"
-
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
-
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "página estática"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "páginas estáticas"
-
-#: contrib/sessions/models.py:51
-msgid "session key"
-msgstr "clave de sesión"
-
-#: contrib/sessions/models.py:52
-msgid "session data"
-msgstr "datos de sesión"
-
-#: contrib/sessions/models.py:53
-msgid "expire date"
-msgstr "fecha de caducidad"
-
-#: contrib/sessions/models.py:57
-msgid "session"
-msgstr "sesión"
-
-#: contrib/sessions/models.py:58
-msgid "sessions"
-msgstr "sesiones"
-
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nombre de dominio"
-
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nombre para visualizar"
-
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "sitio"
-
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sitios"
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Sesión cerrada"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -700,18 +613,6 @@ msgstr "Este mes"
msgid "This year"
msgstr "Este año"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Sí"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "No"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Desconocido"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "hora de acción"
@@ -740,10 +641,6 @@ msgstr "entrada de registro"
msgid "log entries"
msgstr "entradas de registro"
-#: contrib/admin/templatetags/admin_list.py:230
-msgid "All dates"
-msgstr "Todas las fechas"
-
#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
@@ -773,111 +670,31 @@ msgstr "Los nombres de usuario no pueden contener el carácter '@'."
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
-"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
-"lugar."
-
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
-msgstr "Sitio administrativo"
+"Su dirección de correo no es su nombre de usuario. Intente nuevamente usando "
+"'%s'."
-#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:18
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "Se agregó con éxito %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:23
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Puede modificarlo nuevamente abajo."
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
-#, python-format
-msgid "You may add another %s below."
-msgstr "Puede agregar otro %s abajo."
-
-#: contrib/admin/views/main.py:289
-#, python-format
-msgid "Add %s"
-msgstr "Agregar %s"
-
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
-msgstr "Agregado %s."
-
-#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339 db/models/manipulators.py:306
-msgid "and"
-msgstr "y"
-
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
-msgstr "Modifica %s."
-
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
-msgstr "Elimina %s."
-
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
-msgstr "No ha modificado ningún campo."
-
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "Se modificó con éxito %(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 ""
-"Se agregó con éxito %(name)s \"%(obj)s. Puede modificarlo nuevamente abajo."
-
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
-msgstr "Modificar %s"
-
-#: contrib/admin/views/main.py:473
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:478
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Uno o más %(fieldname)s en %(name)s:"
-
-#: contrib/admin/views/main.py:511
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
-
-#: contrib/admin/views/main.py:514
-msgid "Are you sure?"
-msgstr "¿Está seguro?"
-
-#: contrib/admin/views/main.py:536
-#, python-format
-msgid "Change history: %s"
-msgstr "Historia de modificaciones: %s"
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Agregar usuario"
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s"
-msgstr "Seleccione %s"
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Cambio de contraseña exitoso"
-#: contrib/admin/views/main.py:570
+#: contrib/admin/views/auth.py:64
#, python-format
-msgid "Select %s to change"
-msgstr "Seleccione %s a modificar"
-
-#: contrib/admin/views/main.py:758
-msgid "Database error"
-msgstr "Error de base de datos"
+msgid "Change password: %s"
+msgstr "Cambiar contraseña: %s"
#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
#: contrib/admin/views/doc.py:50
@@ -887,7 +704,7 @@ msgstr "etiqueta:"
#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
#: contrib/admin/views/doc.py:81
msgid "filter:"
-msgstr "Filtrar:"
+msgstr "filtrar:"
#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
#: contrib/admin/views/doc.py:139
@@ -897,17 +714,17 @@ msgstr "ver:"
#: contrib/admin/views/doc.py:164
#, python-format
msgid "App %r not found"
-msgstr "App %r no encontrada"
+msgstr "Aplicación %r no encontrada"
#: contrib/admin/views/doc.py:171
#, python-format
-msgid "Model %r not found in app %r"
-msgstr "Modelo %r no encontrado en app %r"
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modelo %(name)r no encontrado en aplicación %(label)r"
#: contrib/admin/views/doc.py:183
#, python-format
-msgid "the related `%s.%s` object"
-msgstr "El objeto relacionado `%s.%s`"
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "el objeto relacionado `%(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
@@ -916,8 +733,8 @@ msgstr "modelo:"
#: contrib/admin/views/doc.py:214
#, python-format
-msgid "related `%s.%s` objects"
-msgstr "objetos relacionados `%s.%s`"
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "objetos relacionados `%(label)s.%(name)s`"
#: contrib/admin/views/doc.py:219
#, python-format
@@ -932,7 +749,7 @@ msgstr "número de %s"
#: contrib/admin/views/doc.py:229
#, python-format
msgid "Fields on %s objects"
-msgstr "Capos en %s objetos"
+msgstr "Campos en %s objetos"
#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
@@ -974,6 +791,10 @@ msgstr "Ruta de archivo"
msgid "Decimal number"
msgstr "Número decimal"
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "Dirección IP"
+
#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
@@ -994,9 +815,13 @@ msgstr "Texto"
msgid "Time"
msgstr "Hora"
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
-msgstr "Estado de los EEUU (dos letras mayúsculas)"
+msgstr "Estado de los EE.UU. (dos letras mayúsculas)"
#: contrib/admin/views/doc.py:317
msgid "XML text"
@@ -1007,160 +832,118 @@ msgstr "Texto XML"
msgid "%s does not appear to be a urlpattern object"
msgstr "%s no parece ser un objeto urlpattern"
-#: contrib/admin/views/auth.py:29
-msgid "Add user"
-msgstr "Agregar usuario"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Actualmente"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modificar:"
-
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Fecha:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Hora:"
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Sitio administrativo"
-#: contrib/admin/templates/admin/object_history.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/delete_confirmation.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Documentation"
-msgstr "Documentación"
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puede agregar otro %s abajo."
-#: contrib/admin/templates/admin/object_history.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/delete_confirmation.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
-msgstr "Cambiar contraseña"
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Inicio"
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Agregado %s."
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
-msgid "History"
-msgstr "Historia"
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
+msgid "and"
+msgstr "y"
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Fecha/hora"
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Modifica %s."
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Usuario"
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Elimina %s."
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Acción"
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "No ha modificado ningún campo."
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "j M Y P"
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito %(name)s \"%(obj)s\"."
-#: contrib/admin/templates/admin/object_history.html:36
+#: contrib/admin/views/main.py:353
+#, python-format
msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Este objeto no tiene historia de modificaciones. Probablemente no fue "
-"añadido usando este sitio de administración."
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede modificarlo nuevamente abajo."
-#: contrib/admin/templates/admin/change_list.html:11
+#: contrib/admin/views/main.py:391
#, python-format
-msgid "Add %(name)s"
-msgstr "Agregar %(name)s"
+msgid "Change %s"
+msgstr "Modificar %s"
-#: contrib/admin/templates/admin/filter.html:2
+#: contrib/admin/views/main.py:476
#, python-format
-msgid " By %(filter_title)s "
-msgstr " Por %(filter_title)s "
-
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Error del servidor"
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Error del servidor (500)"
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Error de servidor <em>(500)</em>"
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
-#: contrib/admin/templates/admin/500.html:10
-msgid ""
-"There's been an error. It's been reported to the site administrators via e-"
-"mail and should be fixed shortly. Thanks for your patience."
-msgstr ""
-"Ha ocurrido un error. Se ha informado a los administradores del sitio "
-"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
-"paciencia"
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Buscar"
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de modificaciones: %s"
-#: contrib/admin/templates/admin/search_form.html:10
+#: contrib/admin/views/main.py:573
#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "un resultado"
-msgstr[1] "%(counter)s resultados"
+msgid "Select %s"
+msgstr "Seleccione %s"
-#: contrib/admin/templates/admin/search_form.html:10
+#: contrib/admin/views/main.py:573
#, python-format
-msgid "%(full_result_count)s total"
-msgstr "total: %(full_result_count)s"
+msgid "Select %s to change"
+msgstr "Seleccione %s a modificar"
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Mostrar todos/as"
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Error de base de datos"
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Sitio de administración de Django"
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Todas las fechas"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administración de Django"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
#: contrib/admin/templates/admin/index.html:17
#, python-format
@@ -1197,46 +980,236 @@ msgstr "Mis acciones"
msgid "None available"
msgstr "Ninguna disponible"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Página no encontrada"
-
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Lo sentimos, pero no se encuentra la página solicitada."
-
#: contrib/admin/templates/admin/filters.html:4
msgid "Filter"
msgstr "Filtrar"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "un resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos/as"
+
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: 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_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: 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_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inicio"
+
#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historia"
+
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Ver en el sitio"
-#: contrib/admin/templates/admin/change_form.html:30
+#: 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] "Por favor, corrija el siguiente error."
msgstr[1] "Por favor, corrija los siguientes errores."
-#: contrib/admin/templates/admin/change_form.html:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
msgstr "Ordenación"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Orden:"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Contraseña:"
+
#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bienvenido,"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
msgid "Delete"
msgstr "Eliminar"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M 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 ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fué "
+"añadido usando este sitio de administración."
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <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 ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería ser solucionado en breve. Gracias por "
+"su paciencia."
+
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
@@ -1261,55 +1234,49 @@ msgstr ""
msgid "Yes, I'm sure"
msgstr "Sí, estoy seguro"
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Grabar como nuevo"
-
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Grabar y añadir otro"
-
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Grabar y continuar editando"
-
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Grabar"
-
#: 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 ""
-"hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"Hay algún problema con su instalación de base de datos. Asegúrese de que las "
"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
-"apropiado tenga permisos de escritura en la base de datos."
+"apropiado tenga permisos de lectura en la base de datos."
-#: contrib/admin/templates/admin/auth/user/add_form.html:6
-msgid ""
-"First, enter a username and password. Then, you'll be able to edit more user "
-"options."
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
msgstr ""
-"Primero, ingrese un nombre de usuario y una contraseña. Luego podrá "
-"configurar opciones adicionales."
-
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
-msgstr "Nombre de usuario:"
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
#: contrib/admin/templates/admin/auth/user/add_form.html:18
msgid "Password"
msgstr "Contraseña:"
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
#: contrib/admin/templates/admin/auth/user/add_form.html:23
msgid "Password (again)"
msgstr "Contraseña (de nuevo)"
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
#: contrib/admin/templates/admin/auth/user/add_form.html:24
msgid "Enter the same password as above, for verification."
-msgstr "Para verificación, ingrese la misma contraseña que ingresó arriba."
+msgstr "Para verificación, introduzca la misma contraseña que ingresó arriba."
+
+#: 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 ""
+"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá "
+"configurar opciones adicionales."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nombre de usuario:"
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
@@ -1348,15 +1315,7 @@ msgstr "Dirección de correo electrónico:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
-msgstr "Recuperar mi cöntraseña"
-
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
-
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "Identificarse de nuevo"
+msgstr "Recuperar mi contraseña"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
@@ -1376,9 +1335,9 @@ 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 ""
-"Por favor, introduzca su contraseña antigua, por seguridad, y después "
-"introduzca la nueva contraseña dos veces para verificar que la ha escrito "
-"correctamente."
+"Por favor, por razones de seguridad, introduzca su contraseña antigua, y "
+"luego introduzca la nueva contraseña dos veces para verificar que la ha "
+"escrito correctamente."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -1428,6 +1387,14 @@ msgstr "¡Gracias por usar nuestro sitio!"
msgid "The %(site_name)s team"
msgstr "El equipo de %(site_name)s"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "Bookmarklets"
@@ -1450,8 +1417,8 @@ msgstr ""
"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
"favoritos.\n"
-"Ahora puede sleccionar el bookmarklet desde cualquier página en el sitio.\n"
-"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
+"Ahora puede seleccionar el bookmarklet desde cualquier página en el sitio.\n"
+"Tenga en cuenta que algunos de estos bookmarklets precisan que esté viendo\n"
"el sitio desde un equipo señalado como \"interno\" (hable\n"
"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
"p>\n"
@@ -1498,213 +1465,1057 @@ msgid "As above, but opens the admin page in a new window."
msgstr ""
"Como antes, pero abre la página de administración en una nueva ventana."
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "Lunes"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nombre de dominio"
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "Martes"
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nombre para visualizar"
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "Miércoles"
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "Jueves"
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "Viernes"
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "clave de sesión"
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "Sábado"
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "datos de sesión"
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "Domingo"
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "fecha de caducidad"
-#: utils/dates.py:14
-msgid "January"
-msgstr "Enero"
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesión"
-#: utils/dates.py:14
-msgid "February"
-msgstr "Febrero"
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesiones"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
-msgstr "Marzo"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "nombre de la clase python del modelo"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
-msgstr "Abril"
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "tipo de contenido"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
-msgstr "Mayo"
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "tipos de contenido"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
-msgstr "Junio"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
+"final."
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
-msgstr "Julio"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
-#: utils/dates.py:15
-msgid "August"
-msgstr "Agosto"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
-#: utils/dates.py:15
-msgid "September"
-msgstr "Setiembre"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
-#: utils/dates.py:15
-msgid "October"
-msgstr "Octubre"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
-#: utils/dates.py:15
-msgid "November"
-msgstr "Noviembre"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
+"usará 'flatpages/default.html'."
-#: utils/dates.py:16
-msgid "December"
-msgstr "Diciembre"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
-#: utils/dates.py:19
-msgid "jan"
-msgstr "ene"
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
-#: utils/dates.py:19
-msgid "feb"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduzca un zip code en formato XXX."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduzca un número de seguridad social Noruego válido."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduzca un zip code en el formato XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Introduzca un Número de Seguridad Social en formato XXX-XX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
msgstr ""
-#: utils/dates.py:19
-msgid "mar"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
msgstr ""
-#: utils/dates.py:19
-msgid "apr"
-msgstr "abr"
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
-#: utils/dates.py:19
-msgid "may"
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
msgstr ""
-#: utils/dates.py:19
-msgid "jun"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
msgstr ""
-#: utils/dates.py:20
-msgid "jul"
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
msgstr ""
-#: utils/dates.py:20
-msgid "aug"
-msgstr "ago"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
-#: utils/dates.py:20
-msgid "sep"
-msgstr "set"
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
-#: utils/dates.py:20
-msgid "oct"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
msgstr ""
-#: utils/dates.py:20
-msgid "nov"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
msgstr ""
-#: utils/dates.py:20
-msgid "dec"
-msgstr "dic"
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
-#: utils/dates.py:27
-msgid "Jan."
-msgstr "Enero"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
-#: utils/dates.py:27
-msgid "Feb."
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
msgstr ""
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "Ago."
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "Set."
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
-#: utils/dates.py:28
-msgid "Oct."
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
msgstr ""
-#: utils/dates.py:28
-msgid "Nov."
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
msgstr ""
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "Dic."
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "año"
-msgstr[1] "años"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mes"
-msgstr[1] "meses"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semana"
-msgstr[1] "semanas"
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "día"
-msgstr[1] "días"
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
-#: utils/translation/trans_real.py:362
-msgid "DATE_FORMAT"
-msgstr "j N Y"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
-#: utils/translation/trans_real.py:363
-msgid "DATETIME_FORMAT"
-msgstr "j N Y P"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
-#: utils/translation/trans_real.py:364
-msgid "TIME_FORMAT"
-msgstr "P"
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
-#: utils/translation/trans_real.py:380
-msgid "YEAR_MONTH_FORMAT"
-msgstr "F Y"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
-#: utils/translation/trans_real.py:381
-msgid "MONTH_DAY_FORMAT"
-msgstr "j \\de F"
+#: 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/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduzca un código postal en formato XXXXXX o XXX-XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Introduzca un número válido de tarjeta de identidad o pasaporte Suizos en "
+"formato X1234567<0 o 1234567890."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduzca un zip code en formato XXXXX."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduzca un número de seguridad social finlandés válido."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Introduzca un post code de 4 dígitos."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Introduzca un número de identificación islandés válido. El formato es XXXXXX-"
+"XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificación islandés no es válido."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Introduzca un postcode. Se requiere un espacio entre las dos secciones del "
+"mismo."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Introduzca un número de tarjeta de identidad alemán válido en formato "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introduzca un zip code en formato XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Los números telefónicos deben respetar el formato XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Este campo permite sólo valores numéricos."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo requiere como máximo 11 dígitos o 14 caracteres."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Número CPF inválido."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Este campo requiere al menos 14 dígitos."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ inválido."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduzca un RUT chileno válido. EL formato es XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Introduzca un RUT chileno válido."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Introduzca un zip code válido."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Introduzca un número de Seguridad Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduzca un número VAT válido."
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de objeto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encabezado"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "calificación 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "calificación 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "calificación 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "calificación 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "calificación 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "calificación 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "calificación 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "calificación 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "es calificación válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está eliminado"
+
+#: 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 ""
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará "
+"\"Este comentario ha sido eliminado\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: 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 ""
+"Enviado por %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nombre de la persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fecha de la marca"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Eliminación por moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones por moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Ud. no puede votarse a sí mismo"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: 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] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\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 ""
+"Este comentario ha sido enviado por un usuario 'semi-anónimo':\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admiten POSTs"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
+
+#: 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 ""
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Olvidó su contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Su nombre:"
+
+#: 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 millón"
+msgstr[1] "%(value).1f millones"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f millardo"
+msgstr[1] "%(value).1f millardos"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billón"
+msgstr[1] "%(value).1f billones"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "uno"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dos"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "cuatro"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "siete"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "ocho"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nueve"
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s."
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un número entero."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser True o False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+#: db/models/fields/__init__.py:459 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: db/models/fields/__init__.py:528 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de archivo válido."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "Este valor debe ser None, True o False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr " Separe múltiples identificadores con comas."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
+"más de uno."
+
+#: 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] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: 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] "Asegúrese de que su texto tiene menos de %s caracter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: 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 "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
+
+#: 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 ""
+"No se envió un archivo. Verifique el tipo de codificación en el formulario."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32.768 y 32.767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32.767."
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Se creó con éxito %(verbose_name)s."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito %(verbose_name)s."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Se eliminó %(verbose_name)s."
#: conf/global_settings.py:39
msgid "Arabic"
@@ -1715,239 +2526,192 @@ msgid "Bengali"
msgstr "Bengalí"
#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Catalán"
+
+#: conf/global_settings.py:43
msgid "Czech"
msgstr "Checo"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:44
msgid "Welsh"
msgstr "Galés"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:45
msgid "Danish"
msgstr "Danés"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:46
msgid "German"
msgstr "Alemán"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:47
msgid "Greek"
msgstr "Griego"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:48
msgid "English"
msgstr "Inglés"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:49
msgid "Spanish"
msgstr "Español"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:50
msgid "Argentinean Spanish"
msgstr "Español Argentino"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:51
msgid "Finnish"
msgstr "Finlandés"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:52
msgid "French"
msgstr "Francés"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:53
msgid "Galician"
msgstr "Gallego"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:54
msgid "Hungarian"
msgstr "Húngaro"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:55
msgid "Hebrew"
msgstr "Hebreo"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:56
msgid "Icelandic"
msgstr "Islandés"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:57
msgid "Italian"
msgstr "Italiano"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:58
msgid "Japanese"
msgstr "Japonés"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "Koreano"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr "Canarés"
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr "Letón"
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "Macedonio"
+
+#: conf/global_settings.py:63
msgid "Dutch"
msgstr "Holandés"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:64
msgid "Norwegian"
msgstr "Noruego"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:65
msgid "Polish"
msgstr "Polaco"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "Portugués"
+
+#: conf/global_settings.py:67
msgid "Brazilian"
msgstr "Brasileño"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:68
msgid "Romanian"
msgstr "Rumano"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:69
msgid "Russian"
msgstr "Ruso"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:70
msgid "Slovak"
msgstr "Eslovaco"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:71
msgid "Slovenian"
msgstr "Esloveno"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:72
msgid "Serbian"
msgstr "Serbio"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:73
msgid "Swedish"
msgstr "Sueco"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:74
msgid "Tamil"
msgstr "Tamil"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:76
msgid "Turkish"
msgstr "Turco"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:77
msgid "Ukrainian"
msgstr "Ucraniano"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:78
msgid "Simplified Chinese"
msgstr "Chino simplificado"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:79
msgid "Traditional Chinese"
msgstr "Chino tradicional"
-#: db/models/manipulators.py:305
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s."
-
-#: db/models/fields/__init__.py:41
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "Ya existe %(optname)s con este %(fieldname)s."
-
-#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266
-#: db/models/fields/__init__.py:569 db/models/fields/__init__.py:580
-#: forms/__init__.py:347
-msgid "This field is required."
-msgstr "Este campo es obligatorio."
-
-#: db/models/fields/__init__.py:349
-msgid "This value must be an integer."
-msgstr "Este valor debe ser un número entero."
-
-#: db/models/fields/__init__.py:381
-msgid "This value must be either True or False."
-msgstr "Este valor debe ser True o False."
-
-#: db/models/fields/__init__.py:397
-msgid "This field cannot be null."
-msgstr "Este campo no puede ser nulo."
-
-#: db/models/fields/__init__.py:424 core/validators.py:146
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
-
-#: db/models/fields/__init__.py:488 core/validators.py:155
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
-
-#: db/models/fields/__init__.py:589
-msgid "Enter a valid filename."
-msgstr "Introduzca un nombre de achivo válido"
-
-#: db/models/fields/related.py:51
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Por favor, introduzca un %s válido."
-
-#: db/models/fields/related.py:618
-msgid "Separate multiple IDs with commas."
-msgstr " Separe múltiples IDs con comas."
-
-#: db/models/fields/related.py:620
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Mantenga presionada \"Control\" (\"Command\" en un Mac) para seleccionar más "
-"de uno."
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "si,no,talvez"
-#: db/models/fields/related.py:664
+#: template/defaultfilters.py:520
#, 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."
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
msgstr[0] ""
-"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
-"válido."
msgstr[1] ""
-"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
-"válidos."
-#: forms/__init__.py:382
+#: template/defaultfilters.py:522
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
-msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
-
-#: forms/__init__.py:387
-msgid "Line breaks are not allowed here."
-msgstr "No se permiten saltos de línea."
+msgid "%.1f KB"
+msgstr ""
-#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600
+#: template/defaultfilters.py:524
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
-
-#: forms/__init__.py:662 core/validators.py:172 core/validators.py:401
-msgid "No file was submitted. Check the encoding type on the form."
+msgid "%.1f MB"
msgstr ""
-"No se envió un archivo. Verifique el tipo de codificación en el formulario."
-
-#: forms/__init__.py:664
-msgid "The submitted file is empty."
-msgstr "El archivo enviado está vacío."
-
-#: forms/__init__.py:720
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Introduzca un número entero entre -32.768 y 32.767."
-
-#: forms/__init__.py:730
-msgid "Enter a positive number."
-msgstr "Introduzca un número positivo."
-#: forms/__init__.py:740
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Introduzca un número entero entre 0 y 32.767."
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr ""
-#: core/validators.py:63
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "Este valor debe contener sólo letras, números y guiones bajos."
-#: core/validators.py:67
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
@@ -1955,69 +2719,61 @@ msgstr ""
"Este valor debe contener sólo letras, números, guiones bajos, guiones o "
"barras (/)"
-#: core/validators.py:71
+#: core/validators.py:72
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
"Este valor debe contener sólo letras, números, guiones bajos o guiones."
-#: core/validators.py:75
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "No se admiten letras mayúsculas."
-#: core/validators.py:79
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "No se admiten letras minúsculas."
-#: core/validators.py:86
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "Introduzca sólo dígitos separados por comas."
-#: core/validators.py:98
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Introduzca direcciones de correo válidas separadas por comas."
-#: core/validators.py:102
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "Por favor introduzca una dirección IP válida."
-#: core/validators.py:106
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "No se admiten valores vacíos."
-#: core/validators.py:110
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "No se admiten caracteres no numéricos."
-#: core/validators.py:114
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "Este valor no puede estar formado sólo por dígitos."
-#: core/validators.py:119
-msgid "Enter a whole number."
-msgstr "Introduzca un número entero."
-
-#: core/validators.py:123
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "Sólo se admiten caracteres alfabéticos."
-#: core/validators.py:138
+#: core/validators.py:139
msgid "Year must be 1900 or later."
msgstr "El año debe ser 1900 o posterior."
-#: core/validators.py:142
+#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
-msgstr "Fecha no válida: %s."
+msgid "Invalid date: %s"
+msgstr "Fecha no válida: %s"
-#: core/validators.py:151
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "Introduzca una hora válida en formato HH:MM."
-#: core/validators.py:160
-msgid "Enter a valid e-mail address."
-msgstr "Introduzca una dirección de correo electrónico válida"
-
-#: core/validators.py:176
+#: core/validators.py:178
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@@ -2025,28 +2781,28 @@ msgstr ""
"Envíe una imagen válida. El archivo que ha enviado no era una imagen o se "
"trataba de una imagen corrupta."
-#: core/validators.py:183
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "La URL %s no apunta a una imagen válida."
-#: core/validators.py:187
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
"Los números telefónicos deben respetar el formato XXX-XXX-XXXX. \"%s\" no es "
"válido."
-#: core/validators.py:195
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "La URL %s no apunta a un vídeo QuickTime válido."
-#: core/validators.py:199
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr "Se precisa una URL válida."
-#: core/validators.py:213
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -2055,81 +2811,96 @@ msgstr ""
"Se precisa HTML válido. Los errores específicos son:\n"
"%s"
-#: core/validators.py:220
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "XML mal formado: %s"
-#: core/validators.py:230
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "URL no válida: %s"
-#: core/validators.py:234 core/validators.py:236
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "La URL %s es un enlace roto."
-#: core/validators.py:242
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+msgstr "Introduzca una abreviatura válida de estado de los EE.UU."
-#: core/validators.py:256
+#: 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] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
-#: core/validators.py:263
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "Este campo debe concordar con el campo '%s'."
-#: core/validators.py:282
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "Por favor, introduzca algo en al menos un campo."
-#: core/validators.py:291 core/validators.py:302
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
-#: core/validators.py:309
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
-#: core/validators.py:321
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
-#: core/validators.py:340
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "No se admiten valores duplicados."
-#: core/validators.py:363
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor debe ser al menos %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor debe ser no mayor que %s."
+
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr "Este valor debe ser una potencia de %s."
-#: core/validators.py:374
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "Por favor, introduzca un número decimal válido."
-#: core/validators.py:378
+#: 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] ""
-"Por favor, introduzca un número decimal válido con con un máximo de un "
-"dígito en total."
+"Por favor, introduzca un número decimal válido con un máximo de un dígito en "
+"total."
msgstr[1] ""
"Por favor, introduzca un número decimal válido con un maximo de %s dígitos "
"en total."
-#: core/validators.py:381
+#: core/validators.py:425
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
@@ -2142,7 +2913,7 @@ msgstr[1] ""
"Por favor, introduzca un número decimal válido con un máximo de %s dígitos "
"enteros."
-#: core/validators.py:384
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -2154,30 +2925,32 @@ msgstr[1] ""
"Por favor, introduzca un número decimal válido con un máximo de %s "
"posiciones decimales."
-#: core/validators.py:394
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Asegúrese de que el archivo que envía tiene al menos %s bytes."
+msgstr ""
+"Asegúrese de que el archivo que envía es de un tamaño mínimo de %s bytes."
-#: core/validators.py:395
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Asegúrese de que el archivo que envía tiene como máximo %s bytes."
+msgstr ""
+"Asegúrese de que el archivo que envía es de un tamaño máximo de %s bytes."
-#: core/validators.py:412
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "El formato de este campo es incorrecto."
-#: core/validators.py:427
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "Este campo no es válido."
-#: core/validators.py:463
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
-msgstr "No pude obtener nada de %s."
+msgstr "No se pudo obtener nada de %s."
-#: core/validators.py:466
+#: core/validators.py:510
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
@@ -2185,78 +2958,62 @@ msgstr ""
"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
"es válida."
-#: core/validators.py:499
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
-"empieza por \"%(start)s\".)"
+"empieza con \"%(start)s\".)"
-#: core/validators.py:503
+#: 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 ""
"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
-"contexto. (La línea empieza por \"%(start)s\".)"
+"contexto. (La línea empieza con \"%(start)s\".)"
-#: core/validators.py:508
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
-"empieza por \"%(start)s\".)"
+"empieza con \"%(start)s\".)"
-#: core/validators.py:513
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
-"empieza por \"%(start)s\".)"
+"empieza con \"%(start)s\".)"
-#: core/validators.py:517
+#: 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 ""
"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
-"requeridos. (La línea empieza por \"%(start)s\".)"
+"requeridos. (La línea empieza con \"%(start)s\".)"
-#: core/validators.py:522
+#: 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 ""
"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
-"válido. (La línea empieza por \"%(start)s\".)"
+"válido. (La línea empieza con \"%(start)s\".)"
-#: template/defaultfilters.py:401
-msgid "yes,no,maybe"
-msgstr "si,no,tal vez"
-
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "Se creó con éxito %(verbose_name)."
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "Se actualizó con éxito %(verbose_name)s."
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "Se eliminó %(verbose_name)s."
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
#~ msgstr "¿Ha <a href=\"/password_reset/\">olvidado su contraseña</a>?"
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
index 3f89e3e33f..d8e3cc6fd6 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
index 1865de9450..91ecb09eed 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -1,15 +1,14 @@
# Argentinean spanish translation for the django-admin JS files, based on
# Spanish translation work by Jorge Gajon.
-# Copyright (C)
-# This file is distributed under the same license as the PACKAGE package.
-# Ramiro Morales <rm0@gmx.net>, 2006.
+# This file is distributed under the same license as the Django package.
+# Copyright (C) Ramiro Morales <rm0@gmx.net>, 2006,2007.
#
msgid ""
msgstr ""
"Project-Id-Version: Django JavaScript 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-09-25 15:09-0300\n"
-"PO-Revision-Date: 2006-05-16 10:20-0300\n"
+"POT-Creation-Date: 2007-02-25 17:48-0300\n"
+"PO-Revision-Date: 2007-02-25 17:55-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
diff --git a/django/conf/locale/fi/LC_MESSAGES/django.mo b/django/conf/locale/fi/LC_MESSAGES/django.mo
index 1e690716fd..024d2ad98b 100644
--- a/django/conf/locale/fi/LC_MESSAGES/django.mo
+++ b/django/conf/locale/fi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/fi/LC_MESSAGES/django.po b/django/conf/locale/fi/LC_MESSAGES/django.po
index 9b91982e6b..275feaaf81 100644
--- a/django/conf/locale/fi/LC_MESSAGES/django.po
+++ b/django/conf/locale/fi/LC_MESSAGES/django.po
@@ -93,7 +93,7 @@ msgstr "tšekki"
#: conf/global_settings.py:42
msgid "Welsh"
-msgstr ""
+msgstr "wales"
#: conf/global_settings.py:43
msgid "Danish"
@@ -169,15 +169,15 @@ msgstr "venäjä"
#: conf/global_settings.py:61
msgid "Slovak"
-msgstr ""
+msgstr "slovakia"
#: conf/global_settings.py:62
msgid "Slovenian"
-msgstr ""
+msgstr "slovenia"
#: conf/global_settings.py:63
msgid "Serbian"
-msgstr ""
+msgstr "serbia"
#: conf/global_settings.py:64
msgid "Swedish"
@@ -189,15 +189,15 @@ msgstr ""
#: conf/global_settings.py:66
msgid "Ukrainian"
-msgstr ""
+msgstr "ukraina"
#: conf/global_settings.py:67
msgid "Simplified Chinese"
-msgstr ""
+msgstr "kiina (yksinkertaistettu)"
#: conf/global_settings.py:68
msgid "Traditional Chinese"
-msgstr ""
+msgstr "kiina (perinteinen)"
#: core/validators.py:63
msgid "This value must contain only letters, numbers and underscores."
@@ -211,7 +211,7 @@ msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä a
#: core/validators.py:75
msgid "Uppercase letters are not allowed here."
-msgstr "Versaalit (ABC) eivät kelpaa tässä."
+msgstr "Isot kirjaimet (ABC) eivät kelpaa tässä."
#: core/validators.py:79
msgid "Lowercase letters are not allowed here."
@@ -270,7 +270,7 @@ msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vio
#: core/validators.py:162
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "Osoittessa %s ei ole kelpaavaa kuvaa."
+msgstr "Osoittessa %s ei ole kuvaa tai se on vioittunut."
#: core/validators.py:166
#, python-format
@@ -280,7 +280,7 @@ msgstr "Puhelinnumeron tulee olla muodossa XXX-XXX-XXXX. \"%s\" ei kelpaa."
#: core/validators.py:174
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Osoitteessa %s ei ole kelpaavaa QuickTime-videota."
+msgstr "Osoitteessa %s ei ole QuickTime-videota tai se on vioittunut."
#: core/validators.py:178
msgid "A valid URL is required."
@@ -308,7 +308,7 @@ msgstr "URL-osoite %s ei kelpaa."
#: core/validators.py:213 core/validators.py:215
#, python-format
msgid "The URL %s is a broken link."
-msgstr "Osoite %s on katkennut linkki."
+msgstr "Osoite %s on rikkoutunut tai väärä linkki."
#: core/validators.py:221
msgid "Enter a valid U.S. state abbreviation."
@@ -324,7 +324,7 @@ msgstr[1] "Sanoja \"%s\" ei saa käyttää tässä."
#: core/validators.py:243
#, python-format
msgid "This field must match the '%s' field."
-msgstr ""
+msgstr "Arvon täytyy olla sama kuin kentässä '%s'."
#: core/validators.py:262
msgid "Please enter something for at least one field."
@@ -403,7 +403,7 @@ msgstr "Tämä arvo ei kelpaa."
#: core/validators.py:441
#, python-format
msgid "Could not retrieve anything from %s."
-msgstr ""
+msgstr "Tietoja ei voida noutaa kohteesta: %s."
#: core/validators.py:444
#, python-format
@@ -1029,19 +1029,19 @@ msgstr " %(filter_title)s:"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
-msgstr "Talleta uutena"
+msgstr "Tallenna uutena"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "Talleta ja lisää seuraava"
+msgstr "Tallenna ja lisää seuraava"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
-msgstr "Talleta välillä ja jatka muokkaamista"
+msgstr "Tallenna välillä ja jatka muokkaamista"
#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
-msgstr "Talleta ja poistu"
+msgstr "Tallenna ja poistu"
#: contrib/admin/templates/admin/change_list.html:11
#, python-format
@@ -1676,7 +1676,13 @@ msgid_plural ""
"\n"
"%(text)s"
msgstr[0] ""
+"Kommentin kirjoittanut käyttäjä on kirjoittanut vain yhden kommentin:\n"
+"\n"
+"%(text)s"
msgstr[1] ""
+"Kommentin kirjoittanut käyttäjä on kirjoittanut alle %(count)s kommenttia:\n"
+"\n"
+"%(text)s"
# Mitä "sketchy user" tarkoittaa?
#: contrib/comments/views/comments.py:116
@@ -1972,38 +1978,38 @@ msgstr "joulu"
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "vuosi"
+msgstr[1] "vuotta"
#: utils/timesince.py:13
msgid "month"
msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "kuukausi"
+msgstr[1] "kuukautta"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "viikko"
+msgstr[1] "viikkoa"
#: utils/timesince.py:15
msgid "day"
msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "päivä"
+msgstr[1] "päivää"
#: utils/timesince.py:16
msgid "hour"
msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "tunti"
+msgstr[1] "tuntia"
#: utils/timesince.py:17
msgid "minute"
msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "minuutti"
+msgstr[1] "minuuttia"
#: utils/translation/trans_real.py:362
msgid "DATE_FORMAT"
@@ -2019,10 +2025,9 @@ msgstr "G:i"
#: utils/translation/trans_real.py:380
msgid "YEAR_MONTH_FORMAT"
-msgstr "N j, Y"
+msgstr "N Y"
#: utils/translation/trans_real.py:381
-#, fuzzy
msgid "MONTH_DAY_FORMAT"
msgstr "N j, Y"
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo
index 7b2b1f6e9e..b96306cabd 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.mo
+++ b/django/conf/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.po b/django/conf/locale/fr/LC_MESSAGES/django.po
index 104e9a2aa1..2e525466b1 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.po
+++ b/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -7,15 +7,779 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"POT-Creation-Date: 2007-04-22 09:06+0200\n"
"PO-Revision-Date: 2006-05-08 15:12+0200\n"
-"Last-Translator: Gaël Chardon <gael.dev_at_nospam_4now.net>\n"
+"Last-Translator: Baptiste Goupil <baptiste.goupil_at_google_email.com>\n"
"Language-Team: français <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:271 db/models/fields/__init__.py:607
+#: db/models/fields/__init__.py:618 newforms/models.py:178
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+#: 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] "Assurez-vous que votre texte fait moins de %s caractère."
+msgstr[1] "Assurez-vous que votre texte fait moins de %s caractères."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Les retours à la ligne ne sont pas autorisés ici."
+
+#: 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 "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Oui"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Non"
+
+#: 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 "Le fichier soumis est vide."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Entrez un nombre entier positif."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Entrez un nombre entier entre 0 et 32 767."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/manipulators.py:303
+msgid "and"
+msgstr "et"
+
+#: db/models/fields/__init__.py:41
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
+
+#: db/models/fields/__init__.py:364
+msgid "This value must be an integer."
+msgstr "Cette valeur doit être un entier."
+
+#: db/models/fields/__init__.py:399
+msgid "This value must be either True or False."
+msgstr "Cette valeur doit être soit Vraie soit Fausse."
+
+#: db/models/fields/__init__.py:420
+msgid "This field cannot be null."
+msgstr "Ce champ ne peut pas être vide."
+
+#: db/models/fields/__init__.py:454 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Entrez une date valide au format AAAA-MM-JJ."
+
+#: db/models/fields/__init__.py:523 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
+
+#: db/models/fields/__init__.py:627
+msgid "Enter a valid filename."
+msgstr "Entrez un nom de fichier valide."
+
+#: db/models/fields/__init__.py:748
+msgid "This value must be either None, True or False."
+msgstr "Cette valeur doit être Nulle, Vraie ou Fausse."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Entrez un %s valide."
+
+#: db/models/fields/related.py:624
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
+"pour en sélectionner plusieurs."
+
+#: db/models/fields/related.py:668
+#, 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] "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
+msgstr[1] ""
+"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Indien"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Catalan"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Tchèque"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Gallois"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Allemand"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grec"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Anglais"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Espagnol Argentin"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Français"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galicien"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Israélien"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italien"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonais"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "Letton"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "Polonais"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "Brésilien"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "Roumain"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "Russe"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "Serbe"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "Suédois"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "Tamoul"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "Télougou"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "Turc"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
+"('_')."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
+"et des '/'."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
+"et des '-'."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Les lettres majuscules ne sont pas autorisées ici."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Les lettres minuscules ne sont pas autorisées ici."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Saisissez uniquement des chiffres séparés par des virgules."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Entrez des adresses de courriel valides séparées par des virgules."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Entrez une adresse IP valide."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Vous ne pouvez pas laisser ce champ vide."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Les caractères non numériques ne sont pas autorisés ici."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
+
+#: core/validators.py:120 newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Entrez un nombre entier."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Seules les lettres de l'alphabet sont autorisées ici."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "L'année doit être supérieure à 1900."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Date invalide&amp;nbsp;: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Entrez une heure valide au format HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "Entrez une adresse de courriel valide."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
+"image ou bien est une image corrompue."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s ne pointe pas vers une image valide."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
+"incorrect."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Une URL valide est requise."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Du HTML valide est requis. Les erreurs sont les suivantes&amp;nbsp;:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formé&amp;nbsp;: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalide&amp;nbsp;: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s est un lien cassé."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Entrez une abréviation d'état américain valide."
+
+#: 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] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
+msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ce champ doit correspondre au champ '%s'."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Des valeurs identiques ne sont pas autorisées."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Cette valeur doit être comprise entre %(lower)s et %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Cette valeur doit être au moins %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Cette valeur ne doit pas dépasser %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Cette valeur doit être une puissance de %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Saisissez un nombre décimal valide s'il vous plaît."
+
+#: 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] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
+msgstr[1] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
+
+#: 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] "Veuillez saisir un nombre décimal valide avec au plus %s chiffre."
+msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s chiffres."
+
+#: 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] "Veuillez saisir un nombre décimal valide avec au plus %s décimale."
+msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s décimales."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Le format de ce champ est mauvais."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Ce champ est invalide."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
+"pas valide."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
+"\"%(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 ""
+"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
+"(Ligne débutant par \"%(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\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
+"par \"%(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>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
+"(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 ""
+"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
+"(Ligne débutant par \"%(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 ""
+"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "L'objet %(verbose_name)s a été créé avec succès."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "L'objet %(verbose_name)s a été mis à jour avec succès."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "L'objet %(verbose_name)s a été supprimé."
+
+#: newforms/models.py:165 newforms/fields.py:362
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux "
+"disponibles."
+
+#: newforms/models.py:182 newforms/fields.py:380 newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "Entrez une liste de valeur."
+
+#: newforms/models.py:188 newforms/fields.py:389
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Sélectionnez un choix valide ; %s n'en fait pas partie."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Assurez-vous que cette valeur fait moins de %d caractère."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Assurez-vous que cette valeur fait au moins %d caractère."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit plus petite ou égale à %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit plus grande ou égale à %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Entrez une date valide."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Entrez une heure valide."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Entrez une date et une heure valides."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Entrez une valeur valide."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Entrez une URL valide."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "L'URL est un lien cassé."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "<sup>e</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "<sup>er</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "<sup>d</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "<sup>e</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f million"
+msgstr[1] "%(value).1f millions"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milliard"
+msgstr[1] "%(value).1f milliards"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billion"
+msgstr[1] "%(value).1f billions"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "deux"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "trois"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "quatre"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinq"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "six"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sept"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "huit"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "neuf"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigé depuis"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigé vers"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
+"débutant par 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirige"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirige"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:156
msgid "object ID"
msgstr "ID de l'objet"
@@ -23,8 +787,8 @@ msgstr "ID de l'objet"
msgid "headline"
msgstr "titre"
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
+#: contrib/comments/models.py:69 contrib/comments/models.py:91
+#: contrib/comments/models.py:157
msgid "comment"
msgstr "commentaire"
@@ -64,15 +828,15 @@ msgstr "vote n°8"
msgid "is valid rating"
msgstr "est un vote valide"
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
+#: contrib/comments/models.py:83 contrib/comments/models.py:159
msgid "date/time submitted"
msgstr "date et heure soumises"
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
+#: contrib/comments/models.py:84 contrib/comments/models.py:160
msgid "is public"
msgstr "est public"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admindocs/views.py:304
msgid "IP address"
msgstr "adresse IP"
@@ -88,15 +852,15 @@ msgstr ""
"Cochez cette case si le commentaire est inadéquat. Un message type \"Ce "
"commentaire a été supprimé\" sera affiché en lieu et place de celui-ci."
-#: contrib/comments/models.py:91
+#: contrib/comments/models.py:92
msgid "comments"
msgstr "commentaires"
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#: contrib/comments/models.py:121 contrib/comments/models.py:188
msgid "Content object"
msgstr "Type de contenu"
-#: contrib/comments/models.py:159
+#: contrib/comments/models.py:149
#, python-format
msgid ""
"Posted by %(user)s at %(date)s\n"
@@ -111,48 +875,48 @@ msgstr ""
"\n"
"http://%(domain)s%(url)s"
-#: contrib/comments/models.py:168
+#: contrib/comments/models.py:158
msgid "person's name"
msgstr "nom"
-#: contrib/comments/models.py:171
+#: contrib/comments/models.py:161
msgid "ip address"
msgstr "adresse IP"
-#: contrib/comments/models.py:173
+#: contrib/comments/models.py:163
msgid "approved by staff"
msgstr "approuvé par l'équipe"
-#: contrib/comments/models.py:176
+#: contrib/comments/models.py:167
msgid "free comment"
msgstr "commentaire libre"
-#: contrib/comments/models.py:177
+#: contrib/comments/models.py:168
msgid "free comments"
msgstr "commentaires libres"
-#: contrib/comments/models.py:233
+#: contrib/comments/models.py:214
msgid "score"
msgstr "evaluation"
-#: contrib/comments/models.py:234
+#: contrib/comments/models.py:215
msgid "score date"
msgstr "date d'évaluation"
-#: contrib/comments/models.py:237
+#: contrib/comments/models.py:219
msgid "karma score"
msgstr "point de Karma"
-#: contrib/comments/models.py:238
+#: contrib/comments/models.py:220
msgid "karma scores"
msgstr "points de Karma"
-#: contrib/comments/models.py:242
+#: contrib/comments/models.py:224
#, python-format
msgid "%(score)d rating by %(user)s"
msgstr "%(score)d évalué par %(user)s"
-#: contrib/comments/models.py:258
+#: contrib/comments/models.py:240
#, python-format
msgid ""
"This comment was flagged by %(user)s:\n"
@@ -163,36 +927,36 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/models.py:265
+#: contrib/comments/models.py:247
msgid "flag date"
msgstr "date d'indicateur"
-#: contrib/comments/models.py:268
+#: contrib/comments/models.py:251
msgid "user flag"
msgstr "indicateur utilisateur"
-#: contrib/comments/models.py:269
+#: contrib/comments/models.py:252
msgid "user flags"
msgstr "indicateurs utilisateur"
-#: contrib/comments/models.py:273
+#: contrib/comments/models.py:256
#, python-format
msgid "Flag by %r"
msgstr "Indicateur par %r"
-#: contrib/comments/models.py:278
+#: contrib/comments/models.py:261
msgid "deletion date"
msgstr "date de suppression"
-#: contrib/comments/models.py:280
+#: contrib/comments/models.py:264
msgid "moderator deletion"
msgstr "suppression de modérateur"
-#: contrib/comments/models.py:281
+#: contrib/comments/models.py:265
msgid "moderator deletions"
msgstr "suppressions de modérateur"
-#: contrib/comments/models.py:285
+#: contrib/comments/models.py:269
#, python-format
msgid "Moderator deletion by %r"
msgstr "Suppression de modérateur par %r"
@@ -209,13 +973,13 @@ msgstr "ID de commentaire invalide"
msgid "No voting for yourself"
msgstr "Impossible de voter pour soi-même"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
"Ce votre est nécéssaire parceque vous avez saisi au moins un autre vote."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -229,44 +993,44 @@ msgid_plural ""
"%(text)s"
msgstr[0] ""
"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
-"commentaire :\n"
+"commentaire&amp;nbsp;:\n"
"\n"
"%(text)s"
msgstr[1] ""
"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
-"commentaires :\n"
+"commentaires&amp;nbsp;:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
-"Ce commentaire a été posté par un utilisateur imprécis :\n"
+"Ce commentaire a été posté par un utilisateur imprécis&amp;nbsp;:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Seuls les POSTs sont autorisés"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Un ou plusieurs champs requis n'ont pas été remplis"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
"Quelqu'un a trafiqué le formulaire de commentaire (violation des règles de "
"sécurité)"
-#: contrib/comments/views/comments.py:207
+#: 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 "
@@ -282,27 +1046,33 @@ msgstr ""
"Le formulaire de commentaire ne proposait ni les options de prévisualisation "
"ni d'envoi"
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Votre nom&amp;nbsp;:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Commentaire&amp;nbsp;:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Prévisualisation du commentaire"
+
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
+#: contrib/admin/templates/admin/login.html:19
msgid "Username:"
msgstr "Nom d'utilisateur"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Mot de passe"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Mot de passe oublié?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/change_form.html:16
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -318,6 +1088,15 @@ msgstr "Mot de passe oublié?"
msgid "Log out"
msgstr "Déconnexion"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:22
+msgid "Password:"
+msgstr "Mot de passe"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Mot de passe oublié?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Votes"
@@ -336,19 +1115,21 @@ msgstr "Optionel"
msgid "Post a photo"
msgstr "Poster une photo"
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Commentaire :"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nom de domaine"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-msgid "Preview comment"
-msgstr "Prévisualisation du commentaire"
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nom à afficher"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Votre nom :"
+#: contrib/sites/models.py:16
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:17
+msgid "sites"
+msgstr "sites"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -356,11 +1137,11 @@ msgid ""
"<h3>By %s:</h3>\n"
"<ul>\n"
msgstr ""
-"<h3>Par %s :</h3>\n"
+"<h3>Par %s&amp;nbsp;:</h3>\n"
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Tout"
@@ -384,17 +1165,65 @@ msgstr "Ce mois-ci"
msgid "This year"
msgstr "Cette année"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Oui"
+#: contrib/admin/options.py:307 contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Non"
+#: contrib/admin/options.py:311 contrib/admin/options.py:363
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "Vous pouvez continuez de l'éditez ci-dessous."
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Inconnu"
+#: contrib/admin/options.py:321 contrib/admin/options.py:372
+#, python-format
+msgid "You may add another %s below."
+msgstr "Vous pouvez ajouter un autre %s ci-dessous."
+
+#: contrib/admin/options.py:358
+msgid "No fields changed."
+msgstr "Aucun champ modifié."
+
+#: contrib/admin/options.py:361
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
+
+#: contrib/admin/options.py:369
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
+"de l'éditez ci-dessous."
+
+#: contrib/admin/options.py:408
+#, python-format
+msgid "Add %s"
+msgstr "Ajouter %s"
+
+#: contrib/admin/options.py:468
+#, python-format
+msgid "Change %s"
+msgstr "Changement %s"
+
+#: contrib/admin/options.py:494
+msgid "Database error"
+msgstr "Erreur de base de données"
+
+#: contrib/admin/options.py:539
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
+
+#: contrib/admin/options.py:542
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#: contrib/admin/options.py:564
+#, python-format
+msgid "Change history: %s"
+msgstr "Historique des changements&amp;nbsp;: %s"
#: contrib/admin/models.py:16
msgid "action time"
@@ -424,12 +1253,16 @@ msgstr "entrée d'historique"
msgid "log entries"
msgstr "entrées d'historique"
-#: contrib/admin/templatetags/admin_list.py:228
-msgid "All dates"
-msgstr "Toutes les dates"
+#: contrib/admin/widgets.py:43
+msgid "Date:"
+msgstr "Date&amp;nbsp;:"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
+#: contrib/admin/widgets.py:43
+msgid "Time:"
+msgstr "Heure&amp;nbsp;:"
+
+#: contrib/admin/sites.py:13 contrib/admin/views/decorators.py:10
+#: contrib/auth/forms.py:60
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -438,12 +1271,12 @@ msgstr ""
"Remarquez que chacun de ces champs est sensible à la casse (différenciation "
"des majuscules/minuscules)."
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/sites.py:33 contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:27
msgid "Log in"
msgstr "Connectez-vous"
-#: contrib/admin/views/decorators.py:61
+#: contrib/admin/sites.py:186 contrib/admin/views/decorators.py:62
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -451,7 +1284,7 @@ msgstr ""
"Votre session a expiré, connectez-vous de nouveau s'il vous plaît. Ne vous "
"inquiétez pas, votre travail précédement éffectué a été sauvé."
-#: contrib/admin/views/decorators.py:68
+#: contrib/admin/sites.py:193 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."
@@ -459,202 +1292,85 @@ msgstr ""
"Il semblerait que votre navigateur n'accepte pas les cookies. Activez-les, "
"rechargez cette page et rééssayez s'il vous plaît."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/sites.py:207 contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Les noms d'utilisateur ne peuvent contenir le caractère '@'"
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/sites.py:209 contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
"Votre courriel n'est pas votre nom d'utilisateur. Essayez '%s' à la place."
-#: contrib/admin/views/main.py:226
+#: contrib/admin/sites.py:263 contrib/admin/views/main.py:136
msgid "Site administration"
msgstr "Gestion du site"
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
-
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Vous pouvez continuez de l'éditez ci-dessous."
-
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
-#, python-format
-msgid "You may add another %s below."
-msgstr "Vous pouvez ajouter un autre %s ci-dessous."
-
-#: contrib/admin/views/main.py:290
-#, python-format
-msgid "Add %s"
-msgstr "Ajouter %s"
-
-#: contrib/admin/views/main.py:336
-#, python-format
-msgid "Added %s."
-msgstr "Ajouté %s."
-
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "et"
-
-#: contrib/admin/views/main.py:338
-#, python-format
-msgid "Changed %s."
-msgstr "Modifié %s."
-
-#: contrib/admin/views/main.py:340
-#, python-format
-msgid "Deleted %s."
-msgstr "Supprimé %s."
-
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "Aucun champ modifié."
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Toutes les dates"
-#: contrib/admin/views/main.py:346
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Ajouter l'utilisateur"
-#: contrib/admin/views/main.py:354
-#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr ""
-"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
-"de l'éditez ci-dessous."
+#: contrib/admin/views/auth.py:55
+msgid "Password changed successfully."
+msgstr "Mot de passe modifié avec succés"
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/auth.py:62
#, python-format
-msgid "Change %s"
-msgstr "Changement %s"
+msgid "Change password: %s"
+msgstr "Modifier le mot de passe&amp;nbsp;: %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:215
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Un ou plusieurs %(fieldname)s dans %(name)s: %(obj)s"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:220
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Un ou plusieurs %(fieldname)s dans %(name)s:"
-
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
-
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "Êtes-vous sûr ?"
-
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "Historique des changements : %s"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;: "
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:262
#, python-format
msgid "Select %s"
msgstr "Sélectionnez %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:262
#, python-format
msgid "Select %s to change"
msgstr "Sélectionnez %s pour changer"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
-msgid "Integer"
-msgstr "Entier"
-
-#: contrib/admin/views/doc.py:278
-msgid "Boolean (Either True or False)"
-msgstr "Booléen (Vrai ou Faux)"
-
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Chaîne de caractère (jusqu'à %(maxlength)s)"
-
-#: contrib/admin/views/doc.py:280
-msgid "Comma-separated integers"
-msgstr "Des entiers séparés par une virgule"
-
-#: contrib/admin/views/doc.py:281
-msgid "Date (without time)"
-msgstr "Date (sans l'heure)"
-
-#: contrib/admin/views/doc.py:282
-msgid "Date (with time)"
-msgstr "Date (avec l'heure)"
-
-#: contrib/admin/views/doc.py:283
-msgid "E-mail address"
-msgstr "Courriel :"
-
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
-msgid "File path"
-msgstr "Chemin vers le fichier"
-
-#: contrib/admin/views/doc.py:285
-msgid "Decimal number"
-msgstr "Nombre décimal"
-
-#: contrib/admin/views/doc.py:291
-msgid "Boolean (Either True, False or None)"
-msgstr "Booléen (Vrai, Faux ou None)"
-
-#: contrib/admin/views/doc.py:292
-msgid "Relation to parent model"
-msgstr "Relation au modèle parent"
-
-#: contrib/admin/views/doc.py:293
-msgid "Phone number"
-msgstr "Numéro de téléphone"
-
-#: contrib/admin/views/doc.py:298
-msgid "Text"
-msgstr "Texte"
-
-#: contrib/admin/views/doc.py:299
-msgid "Time"
-msgstr "Heure"
-
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:301
-msgid "U.S. state (two uppercase letters)"
-msgstr "État U.S. (deux lettres majuscules)"
-
-#: contrib/admin/views/doc.py:302
-msgid "XML text"
-msgstr "Texte XML"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actuellement&amp;nbsp;:"
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modification&amp;nbsp;:"
+
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/change_form.html:16
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Documentation"
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/change_form.html:16
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -670,12 +1386,14 @@ msgstr "Documentation"
msgid "Change password"
msgstr "Modifier votre mot de passe"
-#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/object_history.html:7
+#: contrib/admin/templates/admin/change_list.html:10
#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -685,8 +1403,8 @@ msgstr "Modifier votre mot de passe"
msgid "Home"
msgstr "Accueil"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:7
+#: contrib/admin/templates/admin/change_form.html:29
msgid "History"
msgstr "Historique"
@@ -706,7 +1424,7 @@ msgstr "Action"
msgid "DATE_WITH_TIME_FULL"
msgstr "j. N Y, H:i"
-#: contrib/admin/templates/admin/object_history.html:36
+#: contrib/admin/templates/admin/object_history.html:34
msgid ""
"This object doesn't have a change history. It probably wasn't added via this "
"admin site."
@@ -714,13 +1432,19 @@ msgstr ""
"Cet objet n'a pas d'historique de modification. Il n'a probablement pas été "
"ajouté au moyen de ce site d'administration."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Site d'administration de Django"
+#: contrib/admin/templates/admin/change_list.html:18
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administration de Django"
+#: contrib/admin/templates/admin/change_list.html:28
+msgid "Filter"
+msgstr "Filtre"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Par %(filter_title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -743,6 +1467,43 @@ msgstr ""
"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
"pour votre patience."
+#: contrib/admin/templates/admin/invalid_setup.html:7
+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 ""
+"Quelque chose ne va pas avec votre base de données. Vérifiez que lesbonnes "
+"bases ont été créées, et qu'elle est lisible par le bon utilisateur."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Envoyer"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 résultat"
+msgstr[1] "%(counter)s résultats"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s résultats"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Tout montrer"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
msgid "Page not found"
@@ -752,105 +1513,86 @@ msgstr "Cette page n'a pas été trouvée"
msgid "We're sorry, but the requested page could not be found."
msgstr "Nous sommes désolés, mais la page demandée est introuvable."
-#: contrib/admin/templates/admin/index.html:17
+#: contrib/admin/templates/admin/index.html:18
#, python-format
msgid "Models available in the %(name)s application."
msgstr "Modèles disponibles dans l'application %(name)s."
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:29
+#: contrib/admin/templates/admin/change_form.html:22
msgid "Add"
msgstr "Ajouter"
-#: contrib/admin/templates/admin/index.html:34
+#: contrib/admin/templates/admin/index.html:35
msgid "Change"
msgstr "Modifier"
-#: contrib/admin/templates/admin/index.html:44
+#: contrib/admin/templates/admin/index.html:45
msgid "You don't have permission to edit anything."
msgstr "Vous n'avez pas la permission d'éditer quoi que ce soit."
-#: contrib/admin/templates/admin/index.html:52
+#: contrib/admin/templates/admin/index.html:53
msgid "Recent Actions"
msgstr "Actions récentes"
-#: contrib/admin/templates/admin/index.html:53
+#: contrib/admin/templates/admin/index.html:54
msgid "My Actions"
msgstr "Mes actions"
-#: contrib/admin/templates/admin/index.html:57
+#: contrib/admin/templates/admin/index.html:58
msgid "None available"
msgstr "Aucun(e) disponible"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Ajouter %(name)s"
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "View on site"
+msgstr "Voir sur le site"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
+#: contrib/admin/templates/admin/change_form.html:40
+#: 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] "Veuillez corriger l'erreur ci-dessous."
+msgstr[1] "Veuillez corriger les erreurs ci-dessous."
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bienvenue,"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/delete_confirmation.html:11
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
msgstr "Supprimer"
-#: contrib/admin/templates/admin/delete_confirmation.html:14
+#: contrib/admin/templates/admin/delete_confirmation.html:17
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"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 ""
-"Supprimer l'objet %(object_name)s '%(object)s' provoquerait la suppression "
-"des objets qui lui sont liés mais votre compte ne possède pas la permission "
-"de supprimer les types d'objets suivants :"
+"Supprimer l'objet %(object_name)s '%(escaped_object)s' provoquerait la "
+"suppression des objets qui lui sont liés mais votre compte ne possède pas la "
+"permission de supprimer les types d'objets suivants&amp;nbsp;:"
-#: contrib/admin/templates/admin/delete_confirmation.html:21
+#: contrib/admin/templates/admin/delete_confirmation.html:24
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%(object)s"
-"\" ? Les éléments suivant sont liés à celui-ci et seront aussi supprimés :"
+"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%"
+"(escaped_object)s\" ? Les éléments suivant sont liés à celui-ci et seront "
+"aussi supprimés&amp;nbsp;:"
-#: contrib/admin/templates/admin/delete_confirmation.html:26
+#: contrib/admin/templates/admin/delete_confirmation.html:29
msgid "Yes, I'm sure"
msgstr "Oui, j'en suis certain"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " Par %(title)s "
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Envoyer"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Voir sur le site"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Veuillez corriger l'erreur ci-dessous."
-msgstr[1] "Veuillez corriger les erreurs ci-dessous."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Tri"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Ordre :"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Sauver en tant que nouveau"
@@ -867,6 +1609,40 @@ msgstr "Sauver et continuer les modifications"
msgid "Save"
msgstr "Sauver"
+#: 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 ""
+"Entrez un nouveau mot de passe pour l'utilisateur <strong>%(username)s</"
+"strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Mot de passe"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Mot de passe (à nouveau)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Entrez le même mot de passe que précedemment, par sécurité."
+
+#: 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 ""
+"Entrez tout d'abord un nom d'utilisateur et un mot de passe.Vous pourrez "
+"ensuite modifier plus d'options."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -901,7 +1677,7 @@ msgstr ""
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "Courriel :"
+msgstr "Courriel&amp;nbsp;:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
@@ -939,11 +1715,11 @@ msgstr ""
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Ancien mot de passe :"
+msgstr "Ancien mot de passe&amp;nbsp;:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
-msgstr "Nouveau mot de passe :"
+msgstr "Nouveau mot de passe&amp;nbsp;:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
@@ -966,15 +1742,15 @@ msgstr "pour votre compte au site %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "Votre nouveau mot de passe est : %(new_password)s"
+msgstr "Votre nouveau mot de passe est&amp;nbsp;: %(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 "Vous pouvez modifier ce mot de passe à l'adresse suivante :"
+msgstr "Vous pouvez modifier ce mot de passe à l'adresse suivante&amp;nbsp;:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "Votre nom d'utilisateur, en cas d'oubli :"
+msgstr "Votre nom d'utilisateur, en cas d'oubli&amp;nbsp;:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
@@ -1003,6 +1779,15 @@ msgid ""
"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\">Pour installer des bookmarklets, faîtes glisser le lien "
+"vers\n"
+"votre barre de marques-pages, ou cliquez droit dessus et ajoutez-y le.\n"
+"Maintenant vous pouvez le sélectionner depuis n'importe quelle page\n"
+"du site. Notez que certains d'entre eux nécessitent que vous visionniez\n"
+"le site depuis un ordinateur dit \"interne\" (veuillez contacter votre\n"
+"administrateur système si vous n'êtes pas sûr que votre ordinateur le soit)."
+"</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
@@ -1046,176 +1831,123 @@ msgstr ""
"Comme ci-dessus, mais ouvre la page d'administration dans une nouvelle "
"fenêtre."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Date :"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Heure :"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Actuellement :"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modification :"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigé depuis"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
-"search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigé vers"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
-"débutant par 'http://'."
-
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "redirige"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "redirige"
-
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Par exemple : '/about/contact/'. Vérifiez la présence du caractère '/' en "
-"début et en fin de chaine."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "titre"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenu"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "autoriser les commentaires"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nom du template"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
-"'flatfiles/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "enregistrement requis"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "nom du module python"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
-"cette page."
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "type de contenu"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "page à plat"
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "types de contenu"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "pages à plat"
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Déconnecté"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
msgid "name"
msgstr "nom"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "nom de code"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:43
msgid "permission"
msgstr "permission"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
msgid "permissions"
msgstr "permissions"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:62
msgid "group"
msgstr "groupe"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:63 contrib/auth/models.py:100
msgid "groups"
msgstr "groupes"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:90
msgid "username"
msgstr "nom d'utilisateur"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requis. 30 caractères maximum, alphanumériques uniquement (lettres, "
+"chiffres, et tirets bas '_')."
+
+#: contrib/auth/models.py:91
msgid "first name"
msgstr "prénom"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:92
msgid "last name"
msgstr "nom"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:93
msgid "e-mail address"
msgstr "courriel"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "password"
msgstr "mot de passe"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Utilisez [algo]$[salt]$[hexdigest]' ou le <a href=\"password/\">formulaire "
+"de changement de mot de passe</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "staff status"
msgstr "statut équipe"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "Designates whether the user can log into this admin site."
msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:96
msgid "active"
msgstr "actif"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Précise si l'utilisateur peut se connecter à l'administration. "
+"Déselectionnezceci plutôt que supprimer le compte."
+
+#: contrib/auth/models.py:97
msgid "superuser status"
msgstr "statut super-utilisateur"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Précise que l'utilisateur possède toutes les permissions sans les assigner "
+"explicitement."
+
+#: contrib/auth/models.py:98
msgid "last login"
msgstr "dernière connexion"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:99
msgid "date joined"
msgstr "date d'inscription"
-#: contrib/auth/models.py:66
+#: 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."
@@ -1224,39 +1956,51 @@ msgstr ""
"recevra aussi toutes les permissions de tous les groupes auquels il "
"appartient. "
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:102
msgid "user permissions"
msgstr "permissions de l'utilisateur"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:106
msgid "user"
msgstr "utilisateur"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:107
msgid "users"
msgstr "utilisateurs"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:248
+msgid "message"
+msgstr "message"
+
+#: contrib/auth/models.py:261
+msgid "AnonymousUser"
+msgstr "Anonyme"
+
+#: contrib/auth/models.py:320
msgid "Personal info"
msgstr "Information personnelle"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:321
msgid "Permissions"
msgstr "Permissions"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:322
msgid "Important dates"
msgstr "Dates importantes"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:323
msgid "Groups"
msgstr "Groupes"
-#: contrib/auth/models.py:219
-msgid "message"
-msgstr "message"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Les deux mots de passe ne correspondent pas."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Un utilisateur avec ce nom existe déjà."
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -1264,65 +2008,532 @@ msgstr ""
"Votre navigateur ne semble pas avoir activé les cookies. Les cookies sont "
"nécessaire pour se connecter"
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "nom du module python"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ce compte est inactif."
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "type de contenu"
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Cette adresse e-mail ne correspond à aucun compte utilisateur. Êtes-vous sûr "
+"de vous être enregistré ?"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "types de contenu"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Les deux nouveaux mots de passe ne correspondent pas."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Votre ancien mot de passe est incorrect. Veuillez le rectifier."
+
+#: contrib/admindocs/views.py:46 contrib/admindocs/views.py:48
+#: contrib/admindocs/views.py:50
+msgid "tag:"
+msgstr "mot-clé&amp;nbsp;:"
+
+#: contrib/admindocs/views.py:77 contrib/admindocs/views.py:79
+#: contrib/admindocs/views.py:81
+msgid "filter:"
+msgstr "filtre&amp;nbsp;:"
+
+#: contrib/admindocs/views.py:135 contrib/admindocs/views.py:137
+#: contrib/admindocs/views.py:139
+msgid "view:"
+msgstr "vue&amp;nbsp;:"
+
+#: contrib/admindocs/views.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "L'application %r n'a pas été trouvée."
+
+#: contrib/admindocs/views.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(app)r"
+msgstr "Le modèle %(name)r n'a pas été trouvé dans l'application %(app)r"
+
+#: contrib/admindocs/views.py:183
+#, python-format
+msgid "the related `%(app)s.%(type)s` object"
+msgstr "l'objet `%(app)s.%(type)s en relation "
+
+#: contrib/admindocs/views.py:183 contrib/admindocs/views.py:205
+#: contrib/admindocs/views.py:219 contrib/admindocs/views.py:224
+msgid "model:"
+msgstr "modèle&amp;nbsp;:"
+
+#: contrib/admindocs/views.py:214
+#, python-format
+msgid "related `%(app)s.%(name)s` objects"
+msgstr "les objets `%(app)s.%(name)s en relation"
+
+#: contrib/admindocs/views.py:219
+#, python-format
+msgid "all %s"
+msgstr "tous les %s"
+
+#: contrib/admindocs/views.py:224
+#, python-format
+msgid "number of %s"
+msgstr "nombre de %s"
+
+#: contrib/admindocs/views.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Champs sur les objets %s"
+
+#: contrib/admindocs/views.py:291 contrib/admindocs/views.py:301
+#: contrib/admindocs/views.py:303 contrib/admindocs/views.py:309
+#: contrib/admindocs/views.py:310 contrib/admindocs/views.py:312
+msgid "Integer"
+msgstr "Entier"
+
+#: contrib/admindocs/views.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Booléen (Vrai ou Faux)"
+
+#: contrib/admindocs/views.py:293 contrib/admindocs/views.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Chaîne de caractère (jusqu'à %(maxlength)s)"
+
+#: contrib/admindocs/views.py:294
+msgid "Comma-separated integers"
+msgstr "Des entiers séparés par une virgule"
+
+#: contrib/admindocs/views.py:295
+msgid "Date (without time)"
+msgstr "Date (sans l'heure)"
+
+#: contrib/admindocs/views.py:296
+msgid "Date (with time)"
+msgstr "Date (avec l'heure)"
+
+#: contrib/admindocs/views.py:297
+msgid "E-mail address"
+msgstr "Courriel&amp;nbsp;:"
+
+#: contrib/admindocs/views.py:298 contrib/admindocs/views.py:299
+#: contrib/admindocs/views.py:302
+msgid "File path"
+msgstr "Chemin vers le fichier"
+
+#: contrib/admindocs/views.py:300
+msgid "Decimal number"
+msgstr "Nombre décimal"
+
+#: contrib/admindocs/views.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Booléen (Vrai, Faux ou None)"
+
+#: contrib/admindocs/views.py:307
+msgid "Relation to parent model"
+msgstr "Relation au modèle parent"
+
+#: contrib/admindocs/views.py:308
+msgid "Phone number"
+msgstr "Numéro de téléphone"
+
+#: contrib/admindocs/views.py:313
+msgid "Text"
+msgstr "Texte"
+
+#: contrib/admindocs/views.py:314
+msgid "Time"
+msgstr "Heure"
+
+#: contrib/admindocs/views.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "État U.S. (deux lettres majuscules)"
+
+#: contrib/admindocs/views.py:317
+msgid "XML text"
+msgstr "Texte XML"
+
+#: contrib/admindocs/views.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ne semble pas être un objet urlpattern"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Entrez un code postal Anglais. Un espace est requis entre les deux parties."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Entrez un code postal Australien (4 chiffres)."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/it/forms.py:14 contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Entrez un code postal (format XXXXX)."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Entrez un code postal Japonais (format XXXXXXX ou XXX-XXXX)."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "HokkaidÅ"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "KyÅto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "HyÅgo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
-#: contrib/sessions/models.py:35
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "ÅŒita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Entrez un code postal Brésilien (format XXXXX-XXX)."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Les numéros de téléphone doivent être au format XX-XXXX-XXXX."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Bade-Wurtemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavière"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandebourg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Brême"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hambourg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hess"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklembourg-Poméranie occidentale"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Basse Saxe"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Rhénanie-du-Nord-Westphalie"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhénanie-Palatinat"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Sarre"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxe"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxe-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringe"
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Entrez un numéro de carte d'identité Allemand (format XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X)."
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Entrez un code postal Norvégien (format XXXX)."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Entrez un numéro de sécurité sociale Norvégien."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "Entrez un numéro de sécurité sociale Finlandais."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Entrez un code postal Américain (format XXXXX ou XXXXX-XXXX)."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Entrez un numéro de sécurité sociale Américain (format XXX-XX-XXXX)."
+
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "clé de session"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "donnée de session"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "date d'expiration"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "session"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "sessions"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nom de domaine"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Par exemple&amp;nbsp;: '/about/contact/'. Vérifiez la présence du caractère "
+"'/' en début et en fin de chaine."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nom à afficher"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titre"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "site"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenu"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sites"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "autoriser les commentaires"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "j F Y"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nom du template"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "j F Y, G:i"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
+"'flatfiles/default'."
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "G:i:s"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "enregistrement requis"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
+"cette page."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "page à plat"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "pages à plat"
#: utils/dates.py:6
msgid "Monday"
@@ -1491,8 +2702,8 @@ msgstr[1] "mois"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "semaine"
+msgstr[1] "semaines"
#: utils/timesince.py:15
msgid "day"
@@ -1512,484 +2723,106 @@ msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Indien"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Tchèque"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Gallois"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Dannois"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Allemand"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Grec"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Anglais"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Espagnol"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Français"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galicien"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "Hongrois"
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Israélien"
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandais"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italien"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "Japonais"
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "Néerlandais"
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norvégien"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brésilien"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Roumain"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Russe"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Slovaque"
-
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "Slovaque"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbe"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Suédois"
-
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "Ukrainien"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Chinois simplifié"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Chinois traditionnel"
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
-"('_')."
-
-#: core/validators.py:64
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
-"et des '/'."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Les lettres majuscules ne sont pas autorisées ici."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Les lettres minuscules ne sont pas autorisées ici."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Saisissez uniquement des chiffres séparés par des virgules."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Entrez des adresses de courriel valides séparées par des virgules."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Entrez une adresse IP valide."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Vous ne pouvez pas laisser ce champ vide."
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Les caractères non numériques ne sont pas autorisés ici."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Entrez un nombre entier."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Seules les lettres de l'alphabet sont autorisées ici."
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Entrez une date valide au format AAAA-MM-JJ."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Entrez une heure valide au format HH:MM."
-
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Entrez une adresse de courriel valide."
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
-"image ou bien est une image corrompue."
-
-#: core/validators.py:155
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "L'URL %s ne pointe pas vers une image valide."
-
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
-"incorrect."
-
-#: core/validators.py:167
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
-
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Une URL valide est requise."
-
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
-"%s"
-
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "XML mal formé : %s"
-
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "URL invalide : %s"
-
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "L'URL %s est un lien cassé."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Entrez une abréviation d'état américain valide."
-
-#: core/validators.py:229
-#, 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] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
-msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Ce champ doit correspondre au champ '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr ""
-"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Des valeurs identiques ne sont pas autorisées."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Cette valeur doit être une puissance de %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Saisissez un nombre décimal valide s'il vous plaît."
-
-#: core/validators.py:349
-#, 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] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
-msgstr[1] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
-
-#: core/validators.py:352
-#, 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] ""
-"Saisissez un nombre décimal valide avec au plus %s décimale s'il vous plaît"
-msgstr[1] ""
-"Saisissez un nombre décimal valide avec au plus %s décimales s'il vous plaît"
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "après-midi"
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr ""
-"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "matin"
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr ""
-"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "Matin"
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Le format de ce champ est mauvais."
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "Après-midi"
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Ce champ est invalide."
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "minuit"
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "midi"
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
-"pas valide."
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "j F Y"
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
-"\"%(start)s\".)"
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, G:i"
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
-"(Ligne débutant par \"%(start)s\".)"
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "G:i:s"
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
-"par \"%(start)s\".)"
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
-"(start)s\".)"
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
-"(Ligne débutant par \"%(start)s\".)"
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "oui,non,peut-être"
-#: core/validators.py:485
+#: template/defaultfilters.py:520
#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
-"(Ligne débutant par \"%(start)s\".)"
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d octet"
+msgstr[1] "%(size)d octets"
-#: db/models/manipulators.py:302
+#: template/defaultfilters.py:522
#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
+msgid "%.1f KB"
+msgstr "%.1f Ko"
-#: db/models/fields/__init__.py:40
+#: template/defaultfilters.py:524
#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
+msgid "%.1f MB"
+msgstr "%.1f Mo"
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Ce champ est obligatoire."
-
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "Cette valeur doit être un entier."
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "Cette valeur doit être soit Vraie soit Fausse."
-
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "Ce champ ne peut pas être vide."
-
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Entrez un nom de fichier valide."
-
-#: db/models/fields/related.py:43
+#: template/defaultfilters.py:525
#, python-format
-msgid "Please enter a valid %s."
-msgstr "Entrez un %s valide."
+msgid "%.1f GB"
+msgstr "%.1f Go"
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "Séparez les ID par des virgules."
+#~ msgid "One or more %(fieldname)s in %(name)s&amp;nbsp;:"
+#~ msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;:"
-#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
-"pour en sélectionner plusieurs."
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Séparez les ID par des virgules."
-#: db/models/fields/related.py:625
-#, 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] "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
-msgstr[1] ""
-"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+#~ msgid "Added %s."
+#~ msgstr "Ajouté %s."
-#: forms/__init__.py:380
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Assurez-vous que votre texte fais moins de %s caractère."
-msgstr[1] "Assurez-vous que votre texte fais moins de %s caractères."
+#~ msgid "Changed %s."
+#~ msgstr "Modifié %s."
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Les retours à la ligne ne sont pas autorisés ici."
+#~ msgid "Deleted %s."
+#~ msgstr "Supprimé %s."
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+#~ msgid "Ordering"
+#~ msgstr "Tri"
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Le fichier soumis est vide."
+#~ msgid "Order:"
+#~ msgstr "Ordre&amp;nbsp;:"
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+#~ msgid "%dth"
+#~ msgstr "%de"
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Entrez un nombre entier positif."
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr ""
+#~ "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Entrez un nombre entier entre 0 et 32 767."
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "oui,non,peut-être"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
#~ msgid "Comment"
#~ msgstr "Commentaire"
diff --git a/django/conf/locale/he/LC_MESSAGES/django.mo b/django/conf/locale/he/LC_MESSAGES/django.mo
index 0f8b07e5bb..50021ed86d 100644
--- a/django/conf/locale/he/LC_MESSAGES/django.mo
+++ b/django/conf/locale/he/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/he/LC_MESSAGES/django.po b/django/conf/locale/he/LC_MESSAGES/django.po
index 6e4df17521..9fc5d7ee80 100644
--- a/django/conf/locale/he/LC_MESSAGES/django.po
+++ b/django/conf/locale/he/LC_MESSAGES/django.po
@@ -1,121 +1,171 @@
# translation of Django.
# Copyright (C) 2006 THE Django'S COPYRIGHT HOLDER
# This file is distributed under the same license as the Django package.
+# Meir Kriheli <meir@mksoft.co.il>, 2007.
#
#
msgid ""
msgstr ""
"Project-Id-Version: Django 0.95\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-15 12:42+0300\n"
-"PO-Revision-Date: 2006-06-15 12:40+0300\n"
-"Last-Translator: Meir Kriheli <meir@mksoft.co.il>\n"
-"Language-Team: Hebrew\n"
+"POT-Creation-Date: 2007-05-04 19:38+0300\n"
+"PO-Revision-Date: 2007-05-06 12:43+0300\n"
+"Last-Translator: meir <(null)>\n"
+"Language-Team: English <en@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Transfer-Encoding: 8bit"
-#: template/defaultfilters.py:389
-msgid "yes,no,maybe"
-msgstr "כן,ל×,×ולי"
+#: newforms/models.py:165 newforms/fields.py:364
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "יש לבחור ×פשרות חוקית; '%(data)s' ×ינו בין %(choices)s."
-#: forms/__init__.py:346 db/models/fields/__init__.py:114
-#: db/models/fields/__init__.py:265 db/models/fields/__init__.py:545
-#: db/models/fields/__init__.py:556
+#: newforms/models.py:178 newforms/fields.py:80 newforms/fields.py:376
+#: newforms/fields.py:452 newforms/fields.py:463
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:612 db/models/fields/__init__.py:623
+#: oldforms/__init__.py:357
msgid "This field is required."
msgstr "יש להזין תוכן בשדה זה."
-#: forms/__init__.py:381
+#: newforms/models.py:182 newforms/fields.py:380 newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "יש להזין רשימת ערכי×"
+
+#: newforms/models.py:188 newforms/fields.py:389
#, 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] "× × ×œ×•×•×“× ×©×”×˜×§×¡×˜ שלך מכיל פחות מ %s תווי×."
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "יש לבחור ×פשרות חוקית. %s ×ינו בין ×”×פשרויות הזמינות."
-#: forms/__init__.py:386
-msgid "Line breaks are not allowed here."
-msgstr "מעברי שורה ××¡×•×¨×™× ×›×ן."
+#: newforms/widgets.py:180 oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "×œ× ×™×“×•×¢"
+
+#: newforms/widgets.py:180 oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "כן"
-#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597
+#: newforms/widgets.py:180 oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "ל×"
+
+#: newforms/fields.py:103 newforms/fields.py:256
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "יש לבחור ×פשרות חוקית; '%(data)s' ×ינו בין %(choices)s."
+msgid "Ensure this value has at most %d characters."
+msgstr "× × ×œ×•×•×“× ×©×”×˜×§×¡×˜ שלך מכיל %d ×ª×•×•×™× ×œ×›×œ היותר."
-#: forms/__init__.py:659 core/validators.py:151 core/validators.py:376
-msgid "No file was submitted. Check the encoding type on the form."
-msgstr "×œ× × ×©×œ×— ×©×•× ×§×•×‘×¥. × × ×œ×‘×“×•×§ ×ת סוג הקידוד של הטופס."
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "× × ×œ×•×•×“× ×©×¢×¨×š ×–×” מכיל לפחות %d תווי×"
-#: forms/__init__.py:661
-msgid "The submitted file is empty."
-msgstr "הקובץ שנשלח ריק."
+#: newforms/fields.py:128 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "× × ×œ×”×–×™×Ÿ מספר של×."
-#: forms/__init__.py:717
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "חש להזין מספר ×©×œ× ×‘×™×Ÿ ‎-32,768 ל- 32,767."
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "יש ×œ×•×•×“× ×©×¢×¨×š ×–×” פחות מ ×ו שווה ל %s."
-#: forms/__init__.py:727
-msgid "Enter a positive number."
-msgstr "יש להזין מספר חיובי."
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "יש ×œ×•×•×“× ×©×”×¢×¨×š גדול מ ×ו שווה ל %s."
-#: forms/__init__.py:737
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "יש להזין מספר ×©×œ× ×‘×™×Ÿ 0 ל- 32,767."
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "יש להזין ת×ריך חוקי."
-#: utils/translation.py:363
-msgid "DATE_FORMAT"
-msgstr "d.m.Y"
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "יש להזין שעה חוקית."
-#: utils/translation.py:364
-msgid "DATETIME_FORMAT"
-msgstr "d.m.y H:i:s"
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "יש להזין ת×ריך ושעה חוקיי×."
-#: utils/translation.py:365
-msgid "TIME_FORMAT"
-msgstr "H:i:s"
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "יש להזין ערך חוקי."
-#: utils/translation.py:381
-msgid "YEAR_MONTH_FORMAT"
-msgstr "d.m.Y"
+#: newforms/fields.py:271 core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "יש להזין כתובת דו×\"ל חוקית."
-#: utils/translation.py:382
-msgid "MONTH_DAY_FORMAT"
-msgstr "d.m.Y"
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "יש להזין URL חוקי."
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "שנה"
-msgstr[1] "שני×"
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "×”-URL†הזה כנר××” מכיל קישור שבור."
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "חודש"
-msgstr[1] "חודשי×"
+#: 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 נתון."
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "שבוע"
-msgstr[1] "שבועות"
+#: 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 "ו"
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "יו×"
-msgstr[1] "ימי×"
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "יש להזין %s חוקי."
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "שעה"
-msgstr[1] "שעות"
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "יש להפריד ×ž×–×”×™× ×ž×¨×•×‘×™× ×‘×¤×¡×™×§×™×."
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "דקה"
-msgstr[1] "דקות"
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "החזק ×ת \"Control\", ×ו \"Command\" על מק, לחוץ כדי לבחור יותר מ×חד."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr "× × ×œ×”×–×™×Ÿ זיהוי %(self)s חוקי. הערך %(value)r ×ינו חוקי."
+
+#: 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:369
+msgid "This value must be an integer."
+msgstr "ערך ×–×” חייב להיות מספר של×."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "ערך ×–×” חייב להיות ×מת ×ו שקר."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "שדה ×–×” ×ינו יכול להכיל null."
+
+#: db/models/fields/__init__.py:459 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "יש להזין ת×ריך במבנה YYYY-MM-DD."
+
+#: db/models/fields/__init__.py:528 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "יש להזין ת×ריך ושעה במבנה YYYY-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "יש להזין ×©× ×§×•×‘×¥ חוקי."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "ערך ×–×” חייב להיות כלו×, ×מת ×ו שקר."
#: utils/dates.py:6
msgid "Monday"
@@ -269,147 +319,411 @@ msgstr "נוב'"
msgid "Dec."
msgstr "דצמ'"
-#: db/models/manipulators.py:302
+#: utils/timesince.py:12
+msgid "year"
+msgstr "שנה"
+
+#: utils/timesince.py:13
+msgid "month"
+msgstr "חודש"
+
+#: utils/timesince.py:14
+msgid "week"
+msgstr "שבוע"
+
+#: utils/timesince.py:15
+msgid "day"
+msgstr "יו×"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgstr "שעה"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgstr "דקה"
+
+#: utils/timesince.py:40
#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s ×¢× %(type)s ×§×™×™× ×›×‘×¨ עבור %(field)s נתון."
+msgid "%d milliseconds"
+msgstr "%d מילישניות"
-#: db/models/fields/__init__.py:40
+#: utils/timesince.py:41
#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s·ע×·%(fieldname)s·זה קיימת כבר."
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "ערך ×–×” חייב להיות מספר של×."
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "ערך ×–×” חייב להיות ×מת ×ו שקר."
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "×חר הצהריי×"
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "שדה ×–×” ×ינו יכול להכיל null."
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "בבוקר"
-#: db/models/fields/__init__.py:471 core/validators.py:135
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "יש להזין ת×ריך ושעה במבנה YYYY-MM-DD HH:MM."
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "×חר הצהריי×"
-#: db/models/fields/__init__.py:565
-msgid "Enter a valid filename."
-msgstr "יש להזין ×©× ×§×•×‘×¥ חוקי."
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "בבוקר"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "חצות"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "צהריי×"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "d.m.y H:i:s"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ערבית"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "בנג×לית - Bengali"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "ק×טלונית - Catalan"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "צ'כית - Czech"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "וולשית - Welsh"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "דנית - Danish"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "גרמנית - German"
-#: db/models/fields/related.py:43
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "יוונית - Greek"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "×נגלית - English"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "ספרדית - Spanish"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "ספרדית ×רגנטינ×ית - Argentinean Spanish"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "פינית - Finnish"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "צרפתית - French"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "×’×ליצית - Galician"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "הונגרית (Hungarian)"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "עברית - Hebrew"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "×יסלנדית - Icelandic"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "×יטלקית - Italian"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "יפנית - Japanese"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "קורי×נית - Korean"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "קנדה - Kannada"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "לטבית - Latvian"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "מקדונית - Macedonian"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "הולנדית - Dutch"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "נורווגית - Norwegian"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "פולנית - Polish"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "פורטוגזית - Portugese"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "ברזיל×ית - Brazilian"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "רומנית - Romanian"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "רוסית - Russian"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "סלובקית - Slovak"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "סלובנית - Slovenian"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "סרבית - Serbian"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "שוודית - Swedish"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "טורקית - Turkish"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "×וקר×ינית - Ukrainian"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "סינית פשוטה - Simplified·Chinese"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "סינית מסורתית - Traditional·Chinese"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "כן,ל×,×ולי"
+
+#: template/defaultfilters.py:520
#, python-format
-msgid "Please enter a valid %s."
-msgstr "יש להזין %s חוקי."
+msgid "%(size)d byte"
+msgstr "%(size)d בתי×"
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "יש להפריד ×ž×–×”×™× ×ž×¨×•×‘×™× ×‘×¤×¡×™×§×™×."
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
-#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "החזק ×ת \"Control\", ×ו \"Command\" על מק, לחוץ כדי לבחור יותר מ×חד."
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
-#: db/models/fields/related.py:625
+#: template/defaultfilters.py:525
#, 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 חוקי. הערך %(value)r ×ינו חוקי."
-msgstr[1] ""
-"× × ×œ×”×–×™×Ÿ זיהויי %(self)s חוקיי×. ×”×¢×¨×›×™× %(value)r ××™× × ×—×•×§×™×™×."
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: 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 נמחק."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "× × ×œ×•×•×“× ×©×”×˜×§×¡×˜ שלך מכיל פחות מ %s תו."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "מעברי שורה ××¡×•×¨×™× ×›×ן."
-#: core/validators.py:63
+#: 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: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 "חש להזין מספר ×©×œ× ×‘×™×Ÿ ‎-32,768 ל- 32,767."
+
+#: 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 ל- 32,767."
+
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "ערך ×–×” חייב להכיל ×ותיות, ספרות ×•×§×•×•×™× ×ª×—×ª×•× ×™× ×‘×œ×‘×“."
-#: core/validators.py:67
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr "ערך ×–×” חייב להכיל ×ותיות, ספרות, מקפי×, ×§×•×•×™× ×ª×—×ª×•× ×™× ×•× ×˜×•×™×™× ×‘×œ×‘×“."
-#: core/validators.py:75
+#: 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:79
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "×סור להשתמש ב×ותיות קטנות."
-#: core/validators.py:86
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "יש להזין רק ספרות מופרדות בפסיקי×."
-#: core/validators.py:98
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "יש להזין רק כתובות דו×\"ל מופרדות בפסיקי×."
-#: core/validators.py:102
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "× × ×œ×”×–×™×Ÿ כתובת IP חוקית."
-#: core/validators.py:106
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "חובה להזין ערך בשדה זה."
-#: core/validators.py:110
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "מותר להזין ספרות בלבד."
-#: core/validators.py:114
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "ערך ×–×” ×ינו יכול להכיל ספרות בלבד."
-#: core/validators.py:119
-msgid "Enter a whole number."
-msgstr "× × ×œ×”×–×™×Ÿ מספר של×."
-
-#: core/validators.py:123
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "יש להזין ×›×ן ×ותיות בלבד."
-#: core/validators.py:127
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "יש להזין ת×ריך במבנה YYYY-MM-DD."
+#: 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:131
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "יש להזין שעה במבנה HH:MM."
-#: core/validators.py:139
-msgid "Enter a valid e-mail address."
-msgstr "יש להזין כתובת דו×\"ל חוקית."
-
-#: core/validators.py:155
+#: 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:162
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "×”-URL %s ×נו מצביע לתמונה חוקית."
-#: core/validators.py:166
+#: 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:174
+#: 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:178
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr "יש להזין URL חוקי."
-#: core/validators.py:192
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -418,123 +732,141 @@ msgstr ""
"יש להזין HTML חוקי. שגי×ות ספציפיות:\n"
"%s"
-#: core/validators.py:199
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "מבנה XML שגוי: %s"
-#: core/validators.py:209
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "URL שגוי: %s"
-#: core/validators.py:213 core/validators.py:215
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "×”-URL†%s ×”×•× ×§×™×©×•×¨ שבור."
-#: core/validators.py:221
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr "יש להזין קיצור חוקי למדינה ב×רה\"ב."
-#: core/validators.py:236
+#: 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 ×סורות לשימוש ×›×ן."
+msgstr "שמור על לשונך! המילה %s ×סורה לשימוש ×›×ן."
-#: core/validators.py:243
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "תוכן השדה חייב להיות זהה לשדה '%s'."
-#: core/validators.py:262
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "יש להזין תוכן בלפחות ×חד מהשדות."
-#: core/validators.py:271 core/validators.py:282
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "יש להזין תוכן בשני השדות ×ו להש×יר ×ת ×©× ×™×”× ×¨×™×§×™×."
-#: core/validators.py:289
+#: 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:301
+#: 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:320
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "×œ× × ×™×ª×Ÿ להזין ×¢×¨×›×™× ×›×¤×•×œ×™×."
-#: core/validators.py:343
+#: 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:354
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "יש להזין מספר עשרוני חוקי."
-#: core/validators.py:356
+#: 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 ספרות לכל היותר."
+msgstr "× × ×œ×”×–×™×Ÿ מספר עשרוני חוקי ×¢× %s ספרה לכל היותר."
+"× × ×œ×”×–×™×Ÿ מספר עשורני חוקי ×¢× %s ספרות לכל היותר."
-#: core/validators.py:359
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+"× × ×œ×”×–×™×Ÿ מספר עשרוני המכיל מספר ×©×œ× ×¢× %s ספרה לכל היותר."
+"× × ×œ×”×–×™×Ÿ מספר עשרוני המכיל מספר ×©×œ× ×¢× %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 ספרות ×חרי הנקודה לכל היותר."
+msgstr "× × ×œ×”×–×™×Ÿ מספר עשרוני חוקי בעל %s ספרה לכל היותר ×‘×ž×§×•× ×”×¢×©×¨×•× ×™."
+"× × ×œ×”×–×™×Ÿ מספר עשרוני חוקי בעל %s ספרות לכל היותר ×‘×ž×§×•× ×”×¢×©×¨×•× ×™."
-#: core/validators.py:369
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "יש להעלות קובץ בגודל %s ×‘×ª×™× ×œ×¤×—×•×ª."
-#: core/validators.py:370
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "יש ×œ×•×•×“× ×©×”×§×•×‘×¥ שהעלת ×”×•× ×‘×’×•×“×œ %s ×‘×ª×™× ×œ×›×œ היותר."
-#: core/validators.py:387
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "מבנה תוכן שדה זה שגוי."
-#: core/validators.py:402
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "שדה ×–×” ×ינו חוקי."
-#: core/validators.py:438
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "×œ× × ×™×ª×Ÿ ל×חזר ×›×œ×•× ×ž %s."
-#: core/validators.py:441
+#: 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:474
+#: 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:478
+#: core/validators.py:547
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -542,7 +874,7 @@ msgid ""
msgstr ""
"חלק מהטקסט בשורה·%(line)s·×סור בהקשר ×–×”.·(השורה·מתחילה ב·\"%(start)s\".)"
-#: core/validators.py:483
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -550,7 +882,7 @@ msgid ""
msgstr ""
"\"%(attr)s\"·בשורה·%(line)s·××™× ×” תכונה חוקית.·(השורה מתחילה ב·\"%(start)s\".)"
-#: core/validators.py:488
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -558,16 +890,16 @@ msgid ""
msgstr ""
"\"<%(tag)s>\"·בשורה·%(line)s·×ינו תג חוקי.·(השורה מתחילה ב·\"%(start)s\".)"
-#: core/validators.py:492
+#: 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\".)"
+"לתג בשורה %(line)s חסרה תכונה ×חת ×ו יותר נדרשות. (השורה מתחילה ב-\"%(start)s"
+"\".)"
-#: core/validators.py:497
+#: core/validators.py:566
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -576,138 +908,6 @@ msgstr ""
"לתכונה·\"%(attr)s\"·בשורה·%(line)s·יש ערך ×œ× ×—×•×§×™.·(השורה·מתחילה ב·\"%(start)"
"s\".)"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "בנג×לית - Bengali"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "צ'כית - Czech"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "וולשית - Welsh"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "דנית - Danish"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "גרמנית - German"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "יוונית - Greek"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "×נגלית - English"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "ספרדית - Spanish"
-
-#: conf/global_settings.py:45
-msgid "Argentinean Spanish"
-msgstr "ספרדית ×רגנטינ×ית - Argentinean Spanish"
-
-#: conf/global_settings.py:46
-msgid "French"
-msgstr "צרפתית - French"
-
-#: conf/global_settings.py:47
-msgid "Galician"
-msgstr "×’×ליצית - Galician"
-
-#: conf/global_settings.py:48
-msgid "Hungarian"
-msgstr "הונגרית (Hungarian)"
-
-#: conf/global_settings.py:49
-msgid "Hebrew"
-msgstr "עברית - Hebrew"
-
-#: conf/global_settings.py:50
-msgid "Icelandic"
-msgstr "×יסלנדית - Icelandic"
-
-#: conf/global_settings.py:51
-msgid "Italian"
-msgstr "×יטלקית - Italian"
-
-#: conf/global_settings.py:52
-msgid "Japanese"
-msgstr "יפנית - Japanese"
-
-#: conf/global_settings.py:53
-msgid "Dutch"
-msgstr "הולנדית - Dutch"
-
-#: conf/global_settings.py:54
-msgid "Norwegian"
-msgstr "נורווגית - Norwegian"
-
-#: conf/global_settings.py:55
-msgid "Brazilian"
-msgstr "ברזיל×ית - Brazilian"
-
-#: conf/global_settings.py:56
-msgid "Romanian"
-msgstr "רומנית - Romanian"
-
-#: conf/global_settings.py:57
-msgid "Russian"
-msgstr "רוסית - Russian"
-
-#: conf/global_settings.py:58
-msgid "Slovak"
-msgstr "סלובקית - Slovak"
-
-#: conf/global_settings.py:59
-msgid "Slovenian"
-msgstr "סלובנית - Slovenian"
-
-#: conf/global_settings.py:60
-msgid "Serbian"
-msgstr "סרבית - Serbian"
-
-#: conf/global_settings.py:61
-msgid "Swedish"
-msgstr "שוודית - Swedish"
-
-#: conf/global_settings.py:62
-msgid "Ukrainian"
-msgstr "×וקר×ינית - Ukrainian"
-
-#: conf/global_settings.py:63
-msgid "Simplified Chinese"
-msgstr "סינית פשוטה - Simplified·Chinese"
-
-#: conf/global_settings.py:64
-msgid "Traditional Chinese"
-msgstr "סינית מסורתית - Traditional·Chinese"
-
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "מפתח התחברות (session key)"
-
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "מידע התחברות (session data)"
-
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "ת×ריך פג תוקף"
-
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "התחברות"
-
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "התחברויות"
-
#: contrib/sites/models.py:10
msgid "domain name"
msgstr "×©× ×ž×ª×—×"
@@ -724,18 +924,6 @@ msgstr "×תר"
msgid "sites"
msgstr "×תרי×"
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "×©× ×”-class של מודל פייתון"
-
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "סוג תוכן"
-
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "סוגי תוכן"
-
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "מזהה ×ובייקט"
@@ -793,7 +981,7 @@ msgstr "ת×ריך/שעת הגשה"
msgid "is public"
msgstr "ציבורי"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "כתובת IP"
@@ -917,103 +1105,31 @@ msgstr "מחיקות מודרטור"
msgid "Moderator deletion by %r"
msgstr "מחיקת מודרציה ע\"י %r"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "שמך:"
-
-#: contrib/comments/templates/comments/freeform.html:5
-#: contrib/comments/templates/comments/form.html:27
-msgid "Comment:"
-msgstr "תגובה:"
-
-#: contrib/comments/templates/comments/freeform.html:9
-#: contrib/comments/templates/comments/form.html:32
-msgid "Preview comment"
-msgstr "תצוגה מקדימה של התגובה"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "×©× ×ž×©×ª×ž×©:"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "סיסמה:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "שכחת ×ת סיסמתך ?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin/base.html:24
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: 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: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/views/comments.py:28
+#: 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:112
+#: 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"
+msgstr ""
+"התגובה נשלחה ×¢\"×™ משתמש ×שר שלח פחות מ-%(count)s תגובה:\n"
"\n"
"%(text)s"
-msgstr[1] ""
-"התגובה נשלחה ×¢\"×™ משתמש ×שר שלח פחות מ-%(count)s "
-"תגובות:\n"
+"התגובה נשלחה ×¢\"×™ משתמש ×שר שלח פחות מ-%(count)s תגובות:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -1024,22 +1140,22 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "רק פעולות POST מותרות"
-#: contrib/comments/views/comments.py:193
+#: 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:197
+#: 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:207
+#: 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 "
@@ -1063,6 +1179,170 @@ msgstr "מזהה תגובה שגוי"
msgid "No voting for yourself"
msgstr "×œ× × ×™×ª×Ÿ להצביע לעצמך"
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "×©× ×ž×©×ª×ž×©:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/view_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/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+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/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"
+msgstr "%(value).1f מיליון"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f ביליון"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f טריליון"
+
+#: 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/admin/models.py:16
+msgid "action time"
+msgstr "זמן פעולה"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "מזהה ×ובייקט"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "ייצוג ×ובייקט"
+
+#: 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/filterspecs.py:40
#, python-format
msgid ""
@@ -1073,7 +1353,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "הכל"
@@ -1097,90 +1377,337 @@ msgstr "החודש"
msgid "This year"
msgstr "השנה"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "כן"
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "כל הת×ריכי×"
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "ל×"
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"× × ×œ×”×–×™×Ÿ ×©× ×ž×©×ª×ž×© וסיסמה נכוני×. בשני השדות גודל ×”×ותיות ×”×נגליות משנה."
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "×œ× ×™×“×•×¢"
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "כניסה"
-#: contrib/admin/models.py:16
-msgid "action time"
-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/models.py:19
-msgid "object id"
-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 ""
+"נר××” שהדפדפן שלך ×ינו מוגדר לקבל עוגיות. × × ×œ×פשר עוגיות, לטעון מחדש ×ת הדף "
+"ולנסות שוב."
-#: contrib/admin/models.py:20
-msgid "object repr"
-msgstr "ייצוג ×ובייקט"
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "×©× ×ž×©×ª×ž×© ×ינו יכול להכיל ×ת התו '@'."
-#: contrib/admin/models.py:21
-msgid "action flag"
-msgstr "דגל פעולה"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "כתובת הדו×\"ל שלך ××™× ×” ×©× ×”×ž×©×ª×ž×© שלך. נסה/×™ '%s' במקו×."
-#: contrib/admin/models.py:22
-msgid "change message"
-msgstr "הערה לשינוי"
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "תג:"
-#: contrib/admin/models.py:25
-msgid "log entry"
-msgstr "×¨×™×©×•× ×™×•×ž×Ÿ"
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "סינון:"
-#: contrib/admin/models.py:26
-msgid "log entries"
-msgstr "רישומי יומן"
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "צפיה (view):"
-#: contrib/admin/templatetags/admin_list.py:230
-msgid "All dates"
-msgstr "כל הת×ריכי×"
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "×™×™×©×•× %r ×œ× × ×ž×¦×"
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "הנוכחי."
+#: 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/templates/widget/file.html:3
-msgid "Change:"
-msgstr "שינוי:"
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "×”×ובייקט `%(label)s.%(type)s` הקשור"
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "ת×ריך:"
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "מודל:"
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-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 "Fields on %s objects"
+
+#: 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 "בולי×× ×™ (×מת ×ו שקר)"
+
+#: 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 "כתובת דו×\"ל"
+
+#: 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 "בולי×× ×™ (×מת, שקר ×ו כלו×)"
+
+#: 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:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: 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:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "ניתן לערוך שוב מתחת"
+
+#: 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"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+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/templates/admin_doc/view_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/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "שינוי סיסמה"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/admin/base.html:29
-#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin/change_form.html:13
#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/invalid_setup.html:4
#: 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/change_list.html:6
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
msgid "Home"
msgstr "דף הבית"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/admin/base.html:24
-#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
msgid "Documentation"
msgstr "תיעוד"
@@ -1188,26 +1715,6 @@ msgstr "תיעוד"
msgid "Bookmarklets"
msgstr "ייסומניות"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin/base.html:24
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: 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 "ייסומוניות תיעוד"
@@ -1266,64 +1773,132 @@ msgstr "עריכת ×ובייקט ×–×” (בחלון חדש)"
msgid "As above, but opens the admin page in a new window."
msgstr "×›× \"ל, ×ך דף הניהול ייפתח בחלון חדש."
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "×”×× <a href=\"/password_reset/\">שכחת ×ת הסיסמה שלך</a>?"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "סינון"
-#: contrib/admin/templates/admin/login.html:25
-#: contrib/admin/views/decorators.py:23
-msgid "Log in"
-msgstr "כניסה"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "שלו×"
+
+#: 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:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+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."
+msgstr "× × ×œ×ª×§×Ÿ ×ת השגי××” המופיעה מתחת."
+
+#: 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/submit_line.html:3
#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
msgstr "מחיקה"
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-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/submit_line.html:5
-msgid "Save and add another"
-msgstr "שמירה והוספת ×חר"
+#: 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/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "שמירה והמשך עריכה"
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "כן, ×× ×™ בטוח/×”"
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "שמירה"
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " לפי %(filter_title)s "
-#: contrib/admin/templates/admin/base.html:24
-msgid "Welcome,"
-msgstr "שלו×"
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "שגי×ת שרת"
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "סינון"
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "שגי×ת שרת (500)"
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "בצע"
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "שגי×ת שרת <em>(500)</em>"
-#: contrib/admin/templates/admin/search_form.html:10
+#: 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/index.html:17
#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "תוצ××” ×חת"
-msgstr[1] "%(counter)s תוצ×ות"
+msgid "Models available in the %(name)s application."
+msgstr "×ž×•×“×œ×™× ×–×ž×™× ×™× ×‘×™×™×©×•× %(name)s."
-#: contrib/admin/templates/admin/search_form.html:10
+#: contrib/admin/templates/admin/index.html:18
#, python-format
-msgid "%(full_result_count)s total"
-msgstr "%(full_result_count)s סה\"כ"
+msgid "%(name)s"
+msgstr "%(name)s"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
-msgid "History"
-msgstr "היסטוריה"
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "שינוי"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "×ין לך הרש×ות לעריכה"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "פעולות ×חרונות"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "הפעולות שלי"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "×œ× × ×ž×¦×ו"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"משהו שגוי בהתקנת בסיס ×”× ×ª×•× ×™× ×©×œ×š. × × ×œ×•×•×“× ×©× ×•×¦×¨×• טבל×ות בסיס ×”× ×ª×•× ×™× "
+"המת×ימות, ובסיס ×”× ×ª×•× ×™× × ×™×ª×Ÿ לקרי××” על ידי המשתמש המת××™×."
#: contrib/admin/templates/admin/object_history.html:18
msgid "Date/time"
@@ -1348,40 +1923,21 @@ msgid ""
msgstr ""
"ל×ובייקט ×–×” ×ין היסטוריית שינוי. כנר××” ×œ× ×”×©×ª×ž×©×• בממשק הניהול ×”×–×” להוספתו."
-#: 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:21
-msgid "View on site"
-msgstr "צפיה ב×תר"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "× × ×œ×ª×§×Ÿ ×ת השגי××” המופיעה מתחת."
-msgstr[1] "× × ×œ×ª×§×Ÿ ×ת השגי×ות המופיעות מתחת."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "מיון"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "מיון:"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "שמירה כחדש"
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "ניהול ×תר Django"
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "שמירה והוספת ×חר"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "ניהול Django"
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "שמירה והמשך עריכה"
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "הצג הכל"
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "שמירה"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -1392,91 +1948,126 @@ msgstr "דף ×œ× ×§×™×™×"
msgid "We're sorry, but the requested page could not be found."
msgstr "×נו מצטערי×, ×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ת הדף המבוקש."
-#: contrib/admin/templates/admin/filter.html:2
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "בצע"
+
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid " By %(title)s "
-msgstr " לפי %(title)s "
+msgid "1 result"
+msgstr "תוצ××” ×חת"
-#: contrib/admin/templates/admin/delete_confirmation.html:14
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(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 '%(object)s' תמחק ××•×‘×™×™×§×˜×™× ×§×©×•×¨×™×, ×ך לחשבון שלך ×ין "
-"הרש×ות למחיקת ××•×‘×™×™×§×˜×™× ×ž×”×¡×•×’ הב×:"
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s סה\"כ"
-#: contrib/admin/templates/admin/delete_confirmation.html:21
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "הצג הכל"
+
+#: contrib/admin/templates/admin/change_list.html:12
#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
-msgstr ""
-"×”×× ×‘×¨×¦×•× ×š למחוק ×ת %(object_name)s·\"%(object)s\"? ×›×œ×”×¤×¨×™×˜×™× ×”×§×©×•×¨×™× ×”×‘××™× "
-"יימחקו:"
+msgid "Add %(name)s"
+msgstr "הוספת %(name)s"
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "כן, ×× ×™ בטוח/×”"
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ניהול ×תר Django"
-#: contrib/admin/templates/admin/invalid_setup.html:8
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ניהול Django"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
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 ""
-"משהו שגוי בהתקנת בסיס ×”× ×ª×•× ×™× ×©×œ×š. × × ×œ×•×•×“× ×©× ×•×¦×¨×• טבל×ות בסיס ×”× ×ª×•× ×™× "
-"המת×ימות, ובסיס ×”× ×ª×•× ×™× × ×™×ª×Ÿ לקרי××” על ידי המשתמש המת××™×."
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+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/auth/user/add_form.html:12
+msgid "Username"
+msgstr "×©× ×ž×©×ª×ž×©"
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
-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/index.html:44
-msgid "You don't have permission to edit anything."
-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/index.html:52
-msgid "Recent Actions"
-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/index.html:53
-msgid "My Actions"
-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/admin/index.html:57
-msgid "None available"
-msgstr "×œ× × ×ž×¦×ו"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "הנוכחי."
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "שגי×ת שרת"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "שינוי:"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "שגי×ת שרת (500)"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "ת×ריך:"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "שגי×ת שרת <em>(500)</em>"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "שעה:"
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "×יפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
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."
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
msgstr ""
-"התרחשה שגי××”. ×”×™× ×“×•×•×—×” למנהלי ×”×תר בדו×\"ל ותתוקן בקרוב. תודה על סבלנותך."
+"שכחת ×ת סיסמתך ? × × ×œ×”×–×™×Ÿ ×ת כתובת הדו×\"ל מתחת, ×נו × ×פס×ת הסיסמה ונשלח ×ת "
+"החדשה ×ליך."
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "הוספת %(name)s"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "כתובת דו×\"ל:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "×פס ×ת סיסמתי"
+
+#: contrib/admin/templates/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_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "הסיסמה ×ופסה בהצלחה"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"שלחנו ×ת הסיסמה החדשה לכתובת הדו×\"ל שהזנת. ×”×™× ×מורה להתקבל תוך זמן קצר."
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
@@ -1509,13 +2100,22 @@ msgstr "תודה על השימוש ב×תר שלנו!"
msgid "The %(site_name)s team"
msgstr "צוות %(site_name)s"
+#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
#: contrib/admin/templates/registration/password_change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:4
msgid "Password change"
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_change_form.html:12
msgid ""
"Please enter your old password, for security's sake, and then enter your new "
@@ -1540,378 +2140,620 @@ msgstr "×ימות סיסמה:"
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/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "יש להזין מיקוד חוקי."
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "סיסמתך שונתה."
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "יש להזין מספר ביטוח ל×ומי חוקי."
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "תודה על בילוי זמן ×יכות ×¢× ×”×תר."
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "יש להזין מספר מעמ חוקי"
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "התחבר/י שוב"
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "יש להזין מיקוד חוקי בתחביר XXXXX ×ו XXXXX-XXXX."
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-msgid "Password reset"
-msgstr "×יפוס סיסמה"
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "יש להזין מספר ביטוח ל×ומי ×מריק××™ בתחביר XXX-XX-XXXX."
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "הסיסמה ×ופסה בהצלחה"
+#: contrib/localflavor/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/admin/templates/registration/password_reset_done.html:12
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "יש להזין מיקוד בתחביר XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
msgid ""
-"We've e-mailed a new password to the e-mail address you submitted. You "
-"should be receiving it shortly."
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
msgstr ""
-"שלחנו ×ת הסיסמה החדשה לכתובת הדו×\"ל שהזנת. ×”×™× ×מורה להתקבל תוך זמן קצר."
+"יש להזין מספר זיהוי ×ו דרכון שוויצרי בתחביר X1234567<0 ×ו "
+"1234567890."
-#: contrib/admin/templates/registration/password_reset_form.html:12
-msgid ""
-"Forgotten your password? Enter your e-mail address below, and we'll reset "
-"your password and e-mail the new one to you."
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
msgstr ""
-"שכחת ×ת סיסמתך ? × × ×œ×”×–×™×Ÿ ×ת כתובת הדו×\"ל מתחת, ×נו × ×פס×ת הסיסמה ונשלח ×ת "
-"החדשה ×ליך."
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "כתובת דו×\"ל:"
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "×פס ×ת סיסמתי"
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
-msgid "Integer"
-msgstr "מספר של×"
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
-#: contrib/admin/views/doc.py:280
-msgid "Boolean (Either True or False)"
-msgstr "בולי×× ×™ (×מת ×ו שקר)"
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
-#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "מחרוזת (עד %(maxlength)s תווי×)"
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "ברן"
-#: contrib/admin/views/doc.py:282
-msgid "Comma-separated integers"
-msgstr "×ž×¡×¤×¨×™× ×©×œ×ž×™× ×ž×•×¤×¨×“×™× ×‘×¤×¡×™×§×™×"
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
-#: contrib/admin/views/doc.py:283
-msgid "Date (without time)"
-msgstr "ת×ריך (×œ×œ× ×©×¢×”)"
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "ג'נבה"
-#: contrib/admin/views/doc.py:284
-msgid "Date (with time)"
-msgstr "ת×ריך (כולל שעה)"
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "גלרוס"
-#: contrib/admin/views/doc.py:285
-msgid "E-mail address"
-msgstr "כתובת דו×\"ל"
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
-#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
-#: contrib/admin/views/doc.py:290
-msgid "File path"
-msgstr "נתיב קובץ"
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
-#: contrib/admin/views/doc.py:288
-msgid "Decimal number"
-msgstr "מספר עשרוני"
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "לוצרן"
-#: contrib/admin/views/doc.py:294
-msgid "Boolean (Either True, False or None)"
-msgstr "בולי×× ×™ (×מת, שקר ×ו כלו×)"
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
-#: contrib/admin/views/doc.py:295
-msgid "Relation to parent model"
-msgstr "יחס למודל ×ב"
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
-#: contrib/admin/views/doc.py:296
-msgid "Phone number"
-msgstr "מספר טלפון"
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
-#: contrib/admin/views/doc.py:301
-msgid "Text"
-msgstr "טקסט"
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
-#: contrib/admin/views/doc.py:302
-msgid "Time"
-msgstr "זמן"
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
-#: contrib/admin/views/doc.py:303 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
-#: contrib/admin/views/doc.py:304
-msgid "U.S. state (two uppercase letters)"
-msgstr "מדינה ב×רה\"ב (שתי ×ותיות גדולות)"
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
-#: contrib/admin/views/doc.py:305
-msgid "XML text"
-msgstr "טקסט XML"
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "ניהול ×תר"
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "ניתן לערוך שוב מתחת"
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
-#, python-format
-msgid "You may add another %s below."
-msgstr "ניתן להוסיף %s נוסף מתחת."
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
-#: contrib/admin/views/main.py:290
-#, python-format
-msgid "Add %s"
-msgstr "הוספת %s"
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "צוג"
-#: contrib/admin/views/main.py:336
-#, python-format
-msgid "Added %s."
-msgstr "%s התווסף."
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "ו"
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "יש להזין מספר ביטוח ל×ומי נורבגי חוקי."
-#: contrib/admin/views/main.py:338
-#, python-format
-msgid "Changed %s."
-msgstr "%s שונה."
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "יש להזין מיקוד בתחביר XXXXX-XXX."
-#: contrib/admin/views/main.py:340
-#, python-format
-msgid "Deleted %s."
-msgstr "%s נמחק."
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "מספרי טלפון ×—×™×™×‘×™× ×œ×”×™×•×ª בתחביר XX-XXXX-XXXX."
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "××£ שדה ×œ× ×”×©×ª× ×”."
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "יש להזין רק ספרות בשדה זה."
-#: contrib/admin/views/main.py:346
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה."
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "שדה ×–×” דורש 11 ×ו 14 ספרות לכל היותר."
-#: contrib/admin/views/main.py:354
-#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן לערוך ×ותו שוב מתחת."
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "מספר CPF ×œ× ×—×•×§×™"
-#: contrib/admin/views/main.py:392
-#, python-format
-msgid "Change %s"
-msgstr "שינוי %s"
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "שדה זה דורש לפחות 14 ספרות."
-#: contrib/admin/views/main.py:470
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "×חד ×ו יותר %(fieldname)s ב%(name)s: %(obj)s"
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "מספר CNPJ ×œ× ×—×•×§×™"
-#: contrib/admin/views/main.py:475
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "×חד ×ו יותר %(fieldname)s ב%(name)s:"
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "יש להזין קוד דו×ר. נדרש רווח בין שני חלקי הקוד."
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"יש להזין מספר זיהוי ×יסלנדי חוקי. התחביר ×”×•× XXXXXX-XXXX."
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "×”×× ×ת/×” בטוח/×” ?"
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr ""
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "היסטוריית שינוי: %s"
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "יש להזין מספר ביטוח ל×ומי פיני חוקי."
-#: contrib/admin/views/main.py:567
-#, python-format
-msgid "Select %s"
-msgstr "בחירת %s"
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "יש להזין RUT צ'ילי×× ×™ חוקי. התחביר ×”×•× XX.XXX.XXX-X."
-#: contrib/admin/views/main.py:567
-#, python-format
-msgid "Select %s to change"
-msgstr "בחירת %s לשינוי"
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "יש להזין RUT צ'ילי×× ×™ חוקי."
-#: contrib/admin/views/main.py:743
-msgid "Database error"
-msgstr "שגי×ת בסיס נתוני×"
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "יש להזין קוד דו×ר בן 4 ספרות."
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:43
+#: contrib/localflavor/de/forms.py:60
msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
msgstr ""
-"× × ×œ×”×–×™×Ÿ ×©× ×ž×©×ª×ž×© וסיסמה נכוני×. בשני השדות גודל ×”×ותיות ×”×נגליות משנה."
+"יש להזין מספר זיהוי גרמני חוקי בתחביר XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
-#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
msgstr ""
-"× × ×œ×”×ª×—×‘×¨ שוב, מ×חר ופג תוקף ההתחברות הנוכחית. ×ל ד××’×”: המידע ששלחת נשמר."
-#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
+#: 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/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "×©× ×ž×©×ª×ž×© ×ינו יכול להכיל ×ת התו '@'."
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "ברמן"
-#: contrib/admin/views/decorators.py:84
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "כתובת הדו×\"ל שלך ××™× ×” ×©× ×”×ž×©×ª×ž×© שלך. נסה/×™ '%s' במקו×."
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "המבורג"
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "הפניה מ"
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "הסה"
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr "×–×” ×מור להיות נתיב מל×, ×œ×œ× ×©× ×”×ž×ª×—×. לדוגמ×: '‎/events/search'."
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "הפניה ×ל"
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+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/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "הפניה"
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
-#: contrib/redirects/models.py:14
-msgid "redirects"
-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/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 "Iwate"
+
+#: 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 "Shimane"
+
+#: 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 "Ehime"
+
+#: 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/sessions/models.py:68
+msgid "session key"
+msgstr "מפתח התחברות (session key)"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "מידע התחברות (session data)"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "ת×ריך פג תוקף"
-#: contrib/auth/forms.py:30
+#: 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 "נר××” שעוגיות ×œ× ×ž×ופשרות בדפדפן שלך.הן נדרשות כדי להתחבר."
-#: contrib/auth/forms.py:45
+#: contrib/auth/forms.py:62
msgid "This account is inactive."
msgstr "חשבון ×–×” ×ינו פעיל."
-#: contrib/auth/views.py:39
-msgid "Logged out"
-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 "כתובת דו×ר ×לקטרוני זו ××™× ×” משוייכת למשתמש. בטוח שנרשמת ?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "שני שדות 'הסיסמה החדשה' ××™× × ×–×”×™×."
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "סיסמתך הישנה הוזנה בצורה השגויה. × × ×œ×”×–×™× ×” שוב."
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
msgid "name"
msgstr "ש×"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:46
msgid "codename"
msgstr "×©× ×§×•×“"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:49
msgid "permission"
msgstr "הרש××”"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
msgid "permissions"
msgstr "הרש×ות"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:68
msgid "group"
msgstr "קבוצה"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
msgid "groups"
msgstr "קבוצות"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:99
msgid "username"
msgstr "×©× ×ž×©×ª×ž×©"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "דורש 30 ×ª×•×•×™× ×ו פחות. ×ª×•×•×™× ×לפ×× ×•×ž×¨×™×™× ×‘×œ×‘×“ (×ותיות, ספרות ×•×§×•×•×™× ×ª×—×ª×•× ×™×)."
+
+#: contrib/auth/models.py:100
msgid "first name"
msgstr "×©× ×¤×¨×˜×™"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:101
msgid "last name"
msgstr "×©× ×ž×©×¤×—×”"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:102
msgid "e-mail address"
msgstr "כתובת דו×\"ל"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:103
msgid "password"
msgstr "סיסמה"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "השתמש ב '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:103
+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:60
+#: contrib/auth/models.py:104
msgid "staff status"
msgstr "סטטוס ×יש צוות"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "Designates whether the user can log into this admin site."
msgstr "מציין ×”×× ×”×ž×©×ª×ž×© יכול להתחבר ל×תר הניהול."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:105
msgid "active"
msgstr "פעיל"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "מציין ×”×× ×”×ž×©×ª×ž×© יכול להתחבר ל×תר הניהול. יש לבטל בחירה זו"
+"×‘×ž×§×•× ×œ×ž×—×•×§ חשבונות משתמשי×."
+
+#: contrib/auth/models.py:106
msgid "superuser status"
msgstr "סטטוס משתמש על"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "מציין שלמשתמש ×–×” יש ×ת כל ההרש×ות ×œ×œ× ×”×¦×•×¨×š המפורש בהענקתן."
+
+#: contrib/auth/models.py:107
msgid "last login"
msgstr "כניסה ×חרונה"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:108
msgid "date joined"
msgstr "ת×ריך הצטרפות"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:110
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -1919,38 +2761,46 @@ msgstr ""
"בנוסף לכל ההרש×ות שהוקצו ידנית, יוענקו למשתמש ×’× ×›×œ ההרש×ות של כל קבוצה "
"המשוייכת ×ליו."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:111
msgid "user permissions"
msgstr "הרש×ות משתמש"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:115
msgid "user"
msgstr "משתמש"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:116
msgid "users"
msgstr "משתמשי×"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:122
msgid "Personal info"
msgstr "מידע ×ישי"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:123
msgid "Permissions"
msgstr "הרש×ות"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:124
msgid "Important dates"
msgstr "ת××¨×™×›×™× ×—×©×•×‘×™×"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:125
msgid "Groups"
msgstr "קבוצות"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:269
msgid "message"
msgstr "הודעה"
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "משתמש ×נונימי"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "יצ×ת מהמערכת"
+
#: contrib/flatpages/models.py:8
msgid ""
"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
@@ -1975,11 +2825,11 @@ msgstr "×©× ×ª×‘× ×™×ª"
#: contrib/flatpages/models.py:13
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-"דוגמ×: 'flatpages/contact_page'. ×”×× ×ינו קיי×, המערכתתשתמש ב 'flatpages/"
-"default'."
+"דוגמ×: 'flatpages/contact_page.html'. ×× ×–×” ×œ× ×¦×•×™×™×Ÿ, המערכת "
+"תשתמש ב-'flatpages/default.html'."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -1997,3 +2847,43 @@ msgstr "דף פשוט"
msgid "flat pages"
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/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "×©× ×”-class של מודל פייתון"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "סוג תוכן"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "סוגי תוכן"
+
diff --git a/django/conf/locale/he/LC_MESSAGES/djangojs.mo b/django/conf/locale/he/LC_MESSAGES/djangojs.mo
index 2539598770..09ecd64d87 100644
--- a/django/conf/locale/he/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/he/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/he/LC_MESSAGES/djangojs.po b/django/conf/locale/he/LC_MESSAGES/djangojs.po
index 75b53dd8db..0f94f2ef09 100644
--- a/django/conf/locale/he/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/he/LC_MESSAGES/djangojs.po
@@ -8,26 +8,14 @@ msgid ""
msgstr ""
"Project-Id-Version: djangojs 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-03-30 13:28+0200\n"
-"PO-Revision-Date: 2006-03-30 13:35+0200\n"
+"POT-Creation-Date: 2007-05-06 13:08+0300\n"
+"PO-Revision-Date: 2007-05-06 13:08+0300\n"
"Last-Translator: Meir Kriheli <meir@mksoft.co.il>\n"
"Language-Team: Hebrew\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit"
-#: contrib/admin/media/js/dateparse.js:32
-#: 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:33
-msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr "ר×שון שני שלישי רביעי חמישי שישי שבת"
-
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
msgid "Available %s"
@@ -58,54 +46,75 @@ msgstr "יש לסמן ×ת ההרש×ות המבוקשות וללחוץ על "
msgid "Clear all"
msgstr "×יפוס הכל"
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"ינו×ר פברו×ר מרץ ×פריל מ××™ יוני יולי ×וגוסט ספטמבר ×וקטובר נובמבר דצמבר"
+
#: contrib/admin/media/js/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
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ר×שון שני שלישי רביעי חמישי שישי שבת"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "הצג"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "הסתר"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "כעת"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "שעון"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr "בחירת שעה"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "חצות"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 בבוקר"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "צהריי×"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
msgstr "ביטול"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "היו×"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "לוח שנה"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "×תמול"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "מחר"
diff --git a/django/conf/locale/it/LC_MESSAGES/django.mo b/django/conf/locale/it/LC_MESSAGES/django.mo
index 6b7dd0f01f..e0d5e0442d 100644
--- a/django/conf/locale/it/LC_MESSAGES/django.mo
+++ b/django/conf/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/it/LC_MESSAGES/django.po b/django/conf/locale/it/LC_MESSAGES/django.po
index ecc1cfd159..2c9060a076 100644
--- a/django/conf/locale/it/LC_MESSAGES/django.po
+++ b/django/conf/locale/it/LC_MESSAGES/django.po
@@ -1,356 +1,182 @@
+# translation of django.po to Italiano
# Italian translation of Django.
# Copyright (C) 2006 the Lawrence Journal-World
# This file is distributed under the same license as the Django package.
-# Carlo C8E Miron <carlo.miron AT gmail.com>, 2006.
-#
-#
+#
msgid ""
msgstr ""
-"Project-Id-Version: Django pre-1.0\n"
+"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:12+0200\n"
-"PO-Revision-Date: 2006-05-21 23:45+0200\n"
-"Last-Translator: Carlo C8E Miron <carlo.miron AT gmail.com>\n"
-"Language-Team: Italian <Django-I18N@googlegroups.com>\n"
+"POT-Creation-Date: 2007-04-11 17:39+0200\n"
+"PO-Revision-Date: 2007-03-14 19:29+0100\n"
+"Last-Translator: Flavio Curella <flavio.curella@gmail.com>\n"
+"Language-Team: Italiano\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "ID dell'oggetto"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "intestazione"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "commento"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "valutazione #1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "valutazione #2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "valutazione #3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "valutazione #4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "valutazione #5"
-
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "valutazione #6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "valutazione #7"
-
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "valutazione #8"
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabo"
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "valutazione valida"
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengali"
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "data/ora di sottomissione"
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Catalano"
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "pubblico"
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Ceco"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
-msgid "IP address"
-msgstr "indirizzo IP"
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Gallese"
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "eliminato"
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Danese"
-#: 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 ""
-"Spunta la casella se il commento è inappropriato. Verrà sostituito con un "
-"messaggio \"Questo commento è stato rimosso\"."
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Tedesco"
-#: contrib/comments/models/comments.py:31
-msgid "Comment"
-msgstr "Commento"
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Greco"
-#: contrib/comments/models/comments.py:32
-#: contrib/comments/models.py:91
-msgid "Comments"
-msgstr "Commenti"
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Inglese"
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Contenitore"
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Spagnolo"
-#: 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 ""
-"Commento di %(user)s del %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Spagnolo argentino"
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "nome della persona"
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Finlandese"
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "indirizzo IP"
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Francese"
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "approvato dallo staff"
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galiziano"
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "commento libero"
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Ungherese"
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "commenti liberi"
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Ebraico"
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "punteggio"
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandese"
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "data punteggio"
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italiano"
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "livello karma"
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Giapponese"
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "livelli karma"
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Korean"
+msgstr "Norvegese"
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "valutazione: %(score)d da %(user)s"
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Kannada"
-#: contrib/comments/models.py:258
-#, python-format
-msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Questo commento ha un flag di %(user)s:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Lettone"
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "data flag"
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Macedone"
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "flag utente"
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Olandese"
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "flag utente"
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norvegese"
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Flag da %r"
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Polacco"
-#: contrib/comments/models/comments.py:278
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "data eliminazione"
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portoghese"
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "rimozione da moderatore"
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brasiliano"
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "rimozioni da moderatore"
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Rumeno"
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Rimozione da moderatore di %r"
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Russo"
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Gli utenti anonimi non possono votare"
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Slovacco"
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "ID commento non valido"
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Sloveno"
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "Non votare per te stesso"
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbo"
-#: contrib/comments/views/comments.py:28
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr ""
-"Questa valutazione è obbligatoria perché hai inserito almeno un'altra valutazione"
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Svedese"
-#: contrib/comments/views/comments.py:112
-#, python-format
-msgid ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comment:\n"
-"\n"
-"%(text)s"
-msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
-"\n"
-"%(text)s"
-msgstr[0] ""
-"Commento di un utente autore di meno di %(count)s commento:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Commento di un utente autore di meno di %(count)s commenti:\n"
-"\n"
-"%(text)s"
-""
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamil"
-#: contrib/comments/views/comments.py:117
-#, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
+#: conf/global_settings.py:74
+msgid "Telugu"
msgstr ""
-"Commento di un utente \"sketchy\":\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:189
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Sono ammessi solo POST"
-
-#: contrib/comments/views/comments.py:193
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "Uno o più dei campi richiesti non sono stati sottomessi"
-#: contrib/comments/views/comments.py:197
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Qualcuno ha alterato il modulo di commento (violazione di sicurezza)"
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Turco"
-#: contrib/comments/views/comments.py:207
-#: contrib/comments/views/comments.py:292
-msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
-msgstr ""
-"Il modulo di commento ha un parametro 'target' non valido -- l'ID dell'oggetto non e` valido"
-
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Il modulo di commento non fornisce 'anteprima' o 'invia'"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Nome utente:"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Password:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Hai dimenticato la password?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
-msgstr "Esci"
-
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Valutazioni"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Obbligatorio"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Opzionale"
-
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Invia una foto"
-
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Commento:"
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ucraino"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-msgid "Preview comment"
-msgstr "Anteprima commento"
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Cinese semplificato"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Il tuo nome:"
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Cinese tradizionale"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -362,7 +188,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Tutti"
@@ -386,15 +212,18 @@ msgstr "Questo mese"
msgid "This year"
msgstr "Quest'anno"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Yes"
msgstr "Sì"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "No"
msgstr "No"
-#: contrib/admin/filterspecs.py:150
+#: contrib/admin/filterspecs.py:150 newforms/widgets.py:180
+#: oldforms/__init__.py:577
msgid "Unknown"
msgstr "Sconosciuto"
@@ -404,11 +233,11 @@ msgstr "data azione"
#: contrib/admin/models.py:19
msgid "object id"
-msgstr "ID dell'oggetto"
+msgstr "ID oggetto"
#: contrib/admin/models.py:20
msgid "object repr"
-msgstr "rappresentazione dell'oggetto"
+msgstr "rappresentazione oggetto"
#: contrib/admin/models.py:21
msgid "action flag"
@@ -416,7 +245,7 @@ msgstr "flag azione"
#: contrib/admin/models.py:22
msgid "change message"
-msgstr "modifica messaggio"
+msgstr "messaggio di modifica"
#: contrib/admin/models.py:25
msgid "log entry"
@@ -426,340 +255,202 @@ msgstr "voce di log"
msgid "log entries"
msgstr "voci di log"
-#: contrib/admin/templatetags/admin_list.py:228
-msgid "All dates"
-msgstr "Tutte le date"
-
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Inserire nome utente e password corretti. Entrambi i campi sono case sensitive."
-
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Accedi"
-
-#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"La sessione è scaduta, si prega di accedere nuovamente. I dati sono stati salvati."
-
-#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Il browser non è configurato per accettare cookie. Abilitarli, ricaricare la pagina e provare di nuovo."
-
-#: contrib/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "Il nome utente non può contenere il carattere '@'."
-
-#: contrib/admin/views/decorators.py:84
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Il nome utente non è l'indirizzo e-mail. Provare con '%s'."
-
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "Amministrazione sito"
-
-#: contrib/admin/views/main.py:410
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato aggiunto."
-
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Puoi modificarlo nuovamente qui sotto."
-
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
-#, python-format
-msgid "You may add another %s below."
-msgstr "Puoi aggiungere un altro %s qui sotto."
-
-#: contrib/admin/views/main.py:290
-#, python-format
-msgid "Add %s"
-msgstr "Aggiungi %s"
-
-#: contrib/admin/views/main.py:336
-#, python-format
-msgid "Added %s."
-msgstr "Aggiunto %s"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina non trovata"
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "e"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Spiacenti, ma la pagina richiesta non è stata trovata."
-#: contrib/admin/views/main.py:338
-#, python-format
-msgid "Changed %s."
-msgstr "Modificato %s."
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Pagina iniziale"
-#: contrib/admin/views/main.py:340
-#, python-format
-msgid "Deleted %s."
-msgstr "Rimosso %s"
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Errore del server"
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "Nessun campo modificato."
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Errore del server (500)"
-#: contrib/admin/views/main.py:346
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato modificato."
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Errore del server <em>(500)</em>"
-#: contrib/admin/views/main.py:354
-#, python-format
+#: contrib/admin/templates/admin/500.html:10
msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+"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 ""
-"L'oggetto %(name)s di tipo \"%(obj)s\" è stato aggiunto. Puoi modificarlo nuovamente qui sotto."
-
-#: contrib/admin/views/main.py:392
-#, python-format
-msgid "Change %s"
-msgstr "Modifica %s"
-
-#: contrib/admin/views/main.py:470
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Uno o più %(fieldname)s in %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:475
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Uno o più %(fieldname)s in %(name)s:"
-
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato rimosso."
-
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "Sei sicuro?"
-
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "Storia delle modifiche: %s"
-
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s"
-msgstr "Selezionare %s"
-
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s to change"
-msgstr "Selezionare %s per modificare"
-
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
-msgid "Integer"
-msgstr "Intero"
+"Si è verificato un errore. È stato riportato agli amministratori del sito "
+"via e-mail e verrà corretto a breve. Grazie per la tua pazienza."
-#: contrib/admin/views/doc.py:278
-msgid "Boolean (Either True or False)"
-msgstr "Booleano (True o False)"
-
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Stringa (massimo %(maxlength)s caratteri)"
-
-#: contrib/admin/views/doc.py:280
-msgid "Comma-separated integers"
-msgstr "Interi separati da virgola"
-
-#: contrib/admin/views/doc.py:281
-msgid "Date (without time)"
-msgstr "Data (senza orario)"
-
-#: contrib/admin/views/doc.py:282
-msgid "Date (with time)"
-msgstr "Data (con orario)"
-
-#: contrib/admin/views/doc.py:283
-msgid "E-mail address"
-msgstr "Indirizzo e-mail"
-
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
-msgid "File path"
-msgstr "Percorso di file"
-
-#: contrib/admin/views/doc.py:285
-msgid "Decimal number"
-msgstr "Numero decimale"
-
-#: contrib/admin/views/doc.py:291
-msgid "Boolean (Either True, False or None)"
-msgstr "Booleano (True, False o None)"
-
-#: contrib/admin/views/doc.py:292
-msgid "Relation to parent model"
-msgstr "Relazione a modello padre"
-
-#: contrib/admin/views/doc.py:293
-msgid "Phone number"
-msgstr "Numero di telefono"
-
-#: contrib/admin/views/doc.py:263
-msgid "String (up to 50)"
-msgstr "Stringa (massimo 50 caratteri)"
-
-#: contrib/admin/views/doc.py:298
-msgid "Text"
-msgstr "Testo"
-
-#: contrib/admin/views/doc.py:299
-msgid "Time"
-msgstr "Ora"
-
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:301
-msgid "U.S. state (two uppercase letters)"
-msgstr "Stato americano (due lettere maiuscole)"
-
-#: contrib/admin/views/doc.py:302
-msgid "XML text"
-msgstr "Testo XML"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Benvenuto,"
-#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Documentazione"
-#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
#: contrib/admin/templates/admin_doc/template_detail.html:4
#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Cambia la password"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
-msgstr "Modifica la password"
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Esci"
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Pagina iniziale"
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Amministrazione sito Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Amministrazione Django"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Aggiungi"
+#: contrib/admin/templates/admin/change_form.html:21
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
msgid "History"
msgstr "Storia"
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Data/ora"
-
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Utente"
-
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Azione"
-
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "j F Y, H:i"
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Vedi sul sito"
-#: 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 ""
-"Questo oggetto non ha cambiamenti storicizzati. Probabilmente non è stato "
-"creato con questo sito di amministrazione."
+#: 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] "Correggere l'errore qui sotto."
+msgstr[1] "Correggere gli errori qui sotto."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Amministrazione sito Django"
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Ordinamento"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Amministrazione Django"
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Ordine:"
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Errore del server"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Aggiungi %(name)s"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Errore del server (500)"
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Cancella"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Errore del Server <em>(500)</em>"
+#: 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 ""
+"La cancellazione di %(object_name)s '%(escaped_object)s' causerebbe la "
+"cancellazione di oggetti collegati, ma questo account non ha i permessi per "
+"cancellare gli oggetti dei seguenti tipi:"
-#: contrib/admin/templates/admin/500.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
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."
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"C'è stato un errore. E' stato riportato agli amministratori del sito via e-"
-"mail e verrà risolto a breve. Grazie per la pazienza."
+"Sei sicuro di voler rimuovere %(object_name)s \"%(escaped_object)s\"? Tutti "
+"i seguenti oggetti collegati saranno cancellati:"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Pagina non trovata"
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sì, sono sicuro"
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Spiacente, ma la pagina richiesta non esiste."
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Per %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
msgstr "Modelli disponibili nell'applicazione %(name)s."
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
-msgid "Add"
-msgstr "Aggiungi"
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
@@ -767,7 +458,7 @@ msgstr "Modifica"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
-msgstr "Non hai i permessi di modificare nulla."
+msgstr "Non hai i privilegi per modificare alcunché."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
@@ -779,76 +470,77 @@ msgstr "Azioni Proprie"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
-msgstr "Nessuna disponibile"
+msgstr "Nessuno disponibile"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Aggiungi %(name)s"
+#: 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 ""
+"Ci sono problemi nell'installazione del database. Assicurarsi che le tabelle "
+"appropriate del database siano state create, e che il database sia leggibile "
+"dall'utente appropriato."
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Hai <a href=\"/password_reset/\">dimenticato la tua password</a>?"
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Nome utente:"
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-msgstr "Benvenuto,"
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Password:"
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Elimina"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Accedi"
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-"La rimozione di %(object_name)s '%(object)s' causerebbe la cancellazione "
-"degli oggetti relazionati, ma il tuo account non ha i permessi per rimuovere "
-"i seguenti tipi di oggetti:"
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/orario"
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utente"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Azione"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j F Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
msgstr ""
-"Sei sicuro di voler rimuovere %(object_name)s \"%(object)s\"? I seguenti "
-"oggetti relazionati saranno rimossi:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "Sì, sono sicuro"
+"Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato "
+"creato con questo sito di amministrazione."
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " Per %(title)s "
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostra tutto"
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
msgstr "Vai"
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Vedi sul sito"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Correggere l'errore qui sotto."
-msgstr[1] "Correggere gli errori qui sotto."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Ordinamento"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 risultato"
+msgstr[1] "%(counter)s risultati"
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Ordinamento:"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totali"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -856,87 +548,157 @@ msgstr "Salva come nuovo"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "Salva e crea nuovo"
+msgstr "Salva e aggiungi un altro"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
-msgstr "Salva e continua"
+msgstr "Salva e continua le modifiche"
#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
msgstr "Salva"
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_form.html:6
-#: contrib/admin/templates/registration/password_change_form.html:10
-msgid "Password change"
-msgstr "Modifica la password"
+#: 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 ""
+"Inserire innanzitutto nome utente e password. Si potrà quindi modificare le "
+"altre impostazioni dell'utente."
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "La password è stata cambiata"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nome utente"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "La tua password è stata modificata."
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Password"
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
-msgstr "Resetta la password"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Password (di nuovo)"
-#: contrib/admin/templates/registration/password_reset_form.html:12
+#: 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 "Inserire la stessa password inserita sopra, come verifica."
+
+#: 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 ""
+"Inserire una nuova password per l'utente <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklet"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklet alla documentazione"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
-"Forgotten your password? Enter your e-mail address below, and we'll reset "
-"your password and e-mail the new one to you."
+"\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 ""
-"Hai dimenticato la tua password? Inserisci il tuo indirizzo e-mail qui "
-"sotto, la tua password sarà resettata e te ne verrà spedita una nuova."
+"\n"
+"<p class=\"help\">Per installare i bookmarklet, trascinare il link sulla "
+"barra \n"
+"dei bookmark, o cliccare il link con il tasto destro e aggiungerlo ai "
+"bookmark.\n"
+"Sarà quindi possibile selezionare un bookmarklet in qualsiasi pagina del "
+"sito.\n"
+"Si noti che alcuni di questi bookmarklet richiedono l'accesso al sito "
+"tramite un\n"
+"computer designato come \"interno\" (chiedere al proprio amministratore di \n"
+"sistema se non si è sicuri che il proprio computer sia \"interno\").</p>\n"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "Indirizzo e-mail:"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentazione per questa pagina"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Resetta la mia password"
+#: 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 ""
+"Porta da qualsiasi pagina alla documentazione della view che genera quella "
+"pagina."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostra l'ID dell'oggetto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra il content-type e l'ID univoco di pagine che rappresentano un singolo "
+"oggetto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Modifica quest'oggetto (nella finestra corrente)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Porta alla pagina amministrativa di pagine che rappresentano un oggetto "
+"singolo."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Modifica quest'oggetto (in una nuova finestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Come sopra, ma apre la pagina di amministrazione in una nuova finestra."
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Grazie per aver speso il tuo tempo prezioso con questo sito."
+msgstr "Grazie per aver speso il tuo tempo prezioso su questo sito oggi."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
msgstr "Accedi di nuovo"
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Password resettata"
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio password"
-#: 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 ""
-"Ti abbiamo inviato la nuova password all'indirizzo e-mail da te selezionato. "
-"Dovresti riceverla a breve."
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio di password avvenuto correttamente"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "La password è stata cambiata."
#: 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 ""
-"Inserisci la tua vecchia password, per ragioni di sicurezza, e poi la tua "
-"nuova password due volte per verificare che tu l'abbia scritta correttamente."
+"Inserire l'attuale password, per ragioni di sicurezza, e poi la nuova "
+"password due volte, per verificare di averla scritta correttamente."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Vecchia password:"
+msgstr "Password attuale:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
@@ -944,15 +706,36 @@ msgstr "Nuova password:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "Conferma password:"
+msgstr "Confermare la password:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
msgstr "Modifica la mia password"
+#: 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 "Reimposta la password"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Password reimpostata correttamente"
+
+#: 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 ""
+"La nuova password è stata inviata all'indirizzo e-mail inserito. Arriverà a "
+"breve."
+
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Hai ricevuto questa e-mail perché hai chiesto di resettare la password"
+msgstr ""
+"Hai ricevuto questa e-mail perché hai chiesto di reimpostare la password"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -966,84 +749,36 @@ msgstr "La tua nuova password è: %(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 "Puoi modificare la tua password su questa pagina:"
+msgstr "Puoi liberamente cambiare la tua password tramite questa pagina:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:"
+msgstr "Il tuo nome utente, in caso l'abbia dimenticato:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
-msgstr "Ti ringraziamo per l'utilizzo del nostro sito!"
+msgstr "Grazie per aver usato il nostro sito!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
msgstr "Il team di %(site_name)s"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "Bookmarklet"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "Bookmarklet alla documentazione"
-
-#: 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\">Per installare i bookmarklet, trascinare il link nella barra \n"
-"dei bookmark, o cliccare il link con il tasto destro e selezionare aggiungi ai \n"
-"bookmark. È possibile selezionare il bookmarklet da qualsiasi pagina del sito. \n"
-"Alcuni di questi bookmarklet richiedono l'utilizzo di un computer \"interno\" \n"
-"(chiedi al tuo amministratore di sistema se non sei sicuro che il tuo computer \n"
-"sia \"interno\").</p>\n"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "Documentazione per questa pagina"
-
-#: 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 ""
-"Ti porta da qualsiasi pagina alla documentazione della view che genera quella pagina."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "Mostra l'ID dell'oggetto"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/admin/templates/registration/password_reset_form.html:12
msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
msgstr ""
-"Mostra il tipo di contenuto e l'ID univoco per pagine che rappresentano un singolo oggetto."
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "Modifica quest'oggetto (nella finestra corrente)"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "Ti porta alla pagina amministrativa per pagine che rappresentano un oggetto singolo."
+"Dimenticata la password? Inserire il proprio indirizzo e-mail qui sotto: la "
+"password sarà reimpostata, e la nuova ti verrà inviata per e-mail."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "Modifica quest'oggetto (in una nuova finestra)"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Indirizzo e-mail:"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
-msgstr "Come sopra, ma apre la pagina di amministrazione in una nuova finestra."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reimposta la mia password"
#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
@@ -1051,7 +786,7 @@ msgstr "Data:"
#: contrib/admin/templates/widget/date_time.html:4
msgid "Time:"
-msgstr "Ora:"
+msgstr "Orario:"
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
@@ -1061,732 +796,1524 @@ msgstr "Attualmente:"
msgid "Change:"
msgstr "Modifica:"
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigi da"
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Tutte le date"
-#: contrib/redirects/models.py:8
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" è stato aggiunto correttamente."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "È possibile modificarlo nuovamente qui sotto."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Aggiungi utente"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "La password è stata cambiata correttamente."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambia la password: %s"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
msgstr ""
-"Un percorso assoluto, senza nome a dominio. Esempio: '/events/search/'."
+"Inserire nome utente e password corretti. Entrambi i campi sono case "
+"sensitive."
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigi verso"
+#: 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 ""
+"La sessione è scaduta: occorre accedere nuovamente. I dati inseriti sono "
+"stati comunquesalvati."
-#: contrib/redirects/models.py:10
+#: contrib/admin/views/decorators.py:69
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
msgstr ""
-"Un percorso assoluto (come sopra) o un URL completo iniziante con 'http://'."
+"Il browser non sembra configurato per accettare i cookie. Una volta "
+"abilitati, ricaricare la pagina e riprovare."
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "redirigi"
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "I nomi utente non possono contenere il carattere '@'."
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "redirezioni"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Il nome utente non è costituito dall'indirizzo e-mail. Provare con '%s'."
-#: contrib/flatpages/models.py:8
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Appl. %r non trovata"
+
+#: contrib/admin/views/doc.py:171
+#, fuzzy, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modello %r non trovato nell'appl. %r"
+
+#: contrib/admin/views/doc.py:183
+#, fuzzy, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "l'oggetto `%s.%s` collegato"
+
+#: 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 "modello:"
+
+#: contrib/admin/views/doc.py:214
+#, fuzzy, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "oggetti `%s.%s` collegati"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "tutti %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "numero di %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campi sugli oggetti %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 "Intero"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (True o False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Stringa (fino a %(maxlength)s caratteri)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Interi separati da virgola"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (senza orario)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (con orario)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Indirizzo e-mail"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Percorso di file"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Numero decimale"
+
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "indirizzo IP"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (True, False o None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Collegamento a modello padre"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Numero di telefono"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Testo"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Orario"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stato USA (due lettere maiuscole)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Testo XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s non sembra essere un oggetto urlpattern"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Amministrazione sito"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "È possibile aggiungere un altro %s qui sotto."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Aggiungere %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Aggiunto %s"
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Modificato %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Cancellato %s"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Nessun campo modificato."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" è stato modificato correttamente."
+
+#: contrib/admin/views/main.py:353
+#, python-format
msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Esempio: '/about/contact/'. Attenzione alla barra ('/') iniziale e finale."
+"%(name)s \"%(obj)s\" è stato aggiunto correttamente. È possibile modificarlo "
+"nuovamente qui sotto."
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "titolo"
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificare %s"
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenuto"
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o più %(fieldname)s in %(name)s: %(obj)s"
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "abilita commenti"
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o più %(fieldname)s in %(name)s:"
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nome modello"
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" è stato cancellato correttamente."
-#: contrib/flatpages/models.py:13
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Tracciato delle modifiche: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Seleziona %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleziona %s per modificare"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Errore nel database"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "I due campi password non corrispondono."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Un utente con questo nome·è già presente."
+
+#: contrib/auth/forms.py:53
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-"Esempio: 'flatpages/contact_page'. Se non specificato, il sistema userà "
-"'flatpages/default'."
+"Il browser web sembra non avere i cookie abilitati. I cookie sono necessari "
+"per poter accedere."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "registrazione obbligatoria"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Questo account non è attivo."
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Se selezionata, solo gli utenti registrati potranno vedere la pagina."
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Questo indirizzo email non è associato ad alcun account utente. Sei sicuro "
+"di esserti registrato?"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "pagina statica"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "I due campi 'nuova password' non corrispondono."
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "pagine statiche"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La vecchia password non è stata inserita correttamente: va inserita di nuovo."
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
msgid "name"
msgstr "nome"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "nome in codice"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:43
msgid "permission"
msgstr "permesso"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
msgid "permissions"
msgstr "permessi"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:62
msgid "group"
msgstr "gruppo"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
msgid "groups"
msgstr "gruppi"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:93
msgid "username"
msgstr "nome utente"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:93
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obbligatorio. 30 caratteri o meno. Solo caratteri alfanumerici (lettere, "
+"cifre e sottolineature)."
+
+#: contrib/auth/models.py:94
msgid "first name"
msgstr "nome"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:95
msgid "last name"
msgstr "cognome"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:96
msgid "e-mail address"
msgstr "indirizzo e-mail"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:97
msgid "password"
msgstr "password"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Usare '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:97
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Usare '[algo]$[salt]$[hexdigest]' oppure la maschera di <a href=\"password/"
+"\">cambio password</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:98
msgid "staff status"
-msgstr "staff"
+msgstr "privilegi di staff"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:98
msgid "Designates whether the user can log into this admin site."
-msgstr "Autorizza l'utente ad accedere a questo sito di amministrazione."
+msgstr "Indica se l'utente può accedere a questo sito di amministrazione."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:99
msgid "active"
msgstr "attivo"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:99
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica se l'utente può accedere all'amministrazione di Django. Deselezionare "
+"qui, piuttosto che cancellare gli account."
+
+#: contrib/auth/models.py:100
msgid "superuser status"
-msgstr "superuser"
+msgstr "privilegi di superutente"
+
+#: contrib/auth/models.py:100
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica che l'utente ha tutti i privilegi, senza che siano stati assegnati "
+"esplicitamente."
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:101
msgid "last login"
msgstr "ultimo accesso"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:102
msgid "date joined"
-msgstr "iscritto da"
+msgstr "iscritto in data"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:104
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
msgstr ""
-"In aggiunta ai permessi assegnati manualmente, l'utente riceverà anche tutti "
-"i permessi assegnati ad ogni gruppo cui appartiene."
+"In aggiunta ai privilegi assegnati manualmente, l'utente riceverà anche "
+"tutti i privilegi assegnati ad ogni gruppo cui appartiene."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:105
msgid "user permissions"
-msgstr "permessi utente"
+msgstr "privilegi utente"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:109
msgid "user"
msgstr "utente"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:110
msgid "users"
msgstr "utenti"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:116
msgid "Personal info"
msgstr "Informazioni personali"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:117
msgid "Permissions"
-msgstr "Permessi"
+msgstr "Privilegi"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:118
msgid "Important dates"
msgstr "Date importanti"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:119
msgid "Groups"
msgstr "Gruppi"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:263
msgid "message"
msgstr "messaggio"
-#: contrib/auth/forms.py:30
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Accesso annullato"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID dell'oggetto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "intestazione"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "commento"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "valutazione #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "valutazione #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "valutazione #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "valutazione #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "valutazione #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "valutazione #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "valutazione #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "valutazione #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "è una valutazione valida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/orario di inserimento"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "è pubblico"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "è rimosso"
+
+#: contrib/comments/models.py:86
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Spuntare la casella se il commento è inappropriato. Verrà sostituito dal "
+"messaggio \"Questo commento è stato rimosso\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "commenti"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Oggetto con contenuto"
+
+#: 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 ""
+"Inserito da %(user)s il %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome della persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "indirizzo IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "approvato dallo staff"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "commento libero"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "commenti liberi"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "punteggio"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data punteggio"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "livello karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "livelli karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "valutazione: %(score)d da %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Il browser non ha i cookie abilitati. Per accedere, è necessario abilitarli."
+"A questo commento è stato apposto un flag da %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data flag"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag da %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data cancellazione"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "cancellazione da moderatore"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "cancellazioni da moderatore"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Cancellazione da moderatore %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Hai dimenticato la password?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Valutazioni"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obbligatorio"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Facoltativo"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Invia una foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Commento:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Anteprima commento"
-#: contrib/contenttypes/models.py:25
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Il suo nome:"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Questa valutazione è obbligatoria perché hai inserito almeno un'altra "
+"valutazione."
+
+#: 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] ""
+"Questo commento è stato inserito da un utente autore di meno di %(count)s "
+"commento:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Questo commento è stato inserito da un utente autore di meno di %(count)s "
+"commenti:\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 ""
+"Questo commento è stato inserito da un utente non confermato:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sono ammessi solo 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 "Uno o più campi richiesti non sono stati inseriti"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Qualcuno ha alterato il modulo di commento (violazione di sicurezza)"
+
+#: 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 ""
+"Il modulo di commento ha un parametro 'target' non valido -- l'ID "
+"dell'oggetto non è valido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Il modulo di commento non fornisce né 'anteprima' né 'invia'"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Gli utenti anonimi non possono votare"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID commento non valido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Impossibile votare per se stessi"
+
+#: contrib/contenttypes/models.py:36
msgid "python model class name"
-msgstr "nome della classe modello in python"
+msgstr "nome della classe modello in Python"
-#: contrib/contenttypes/models.py:28
+#: contrib/contenttypes/models.py:39
msgid "content type"
-msgstr "tipo di contenuto"
+msgstr "content type"
-#: contrib/contenttypes/models.py:29
+#: contrib/contenttypes/models.py:40
msgid "content types"
-msgstr "tipo di contenuti"
+msgstr "content type"
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "chiave di sessione"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Esempio: '/about/contact/'. Assicurarsi di inserire le barre diagonali "
+"iniziali e finali."
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "dati di sessione"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titolo"
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "data di scadenza"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenuto"
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "sessione"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "abilita commenti"
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "sessioni"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome modello"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nome a dominio"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Esempio: 'flatpages/contact_page.html'. Se non specificato, il sistema userà "
+"'flatpages/default.html'."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nome visualizzato"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrazione obbligatoria"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "sito"
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Se selezionato, solo gli utenti che hanno effettuato l'accesso potranno "
+"vedere la pagina."
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "siti"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "pagina statica"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "j F Y"
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pagine statiche"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "j F Y, H:i"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "H:i"
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "º"
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "Lunedì"
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "nd"
+msgstr "º"
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "Martedì"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "º"
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "Mercoledì"
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milione"
+msgstr[1] "%(value).1f milioni"
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "Giovedì"
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliardo"
+msgstr[1] "%(value).1f miliardi"
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "Venerdì"
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "Sabato"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr ""
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "Domenica"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "due"
-#: utils/dates.py:14
-msgid "January"
-msgstr "Gennaio"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tre"
-#: utils/dates.py:14
-msgid "February"
-msgstr "Febbraio"
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "four"
+msgstr "quattro"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
-msgstr "Marzo"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinque"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
-msgstr "Aprile"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sei"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
-msgstr "Maggio"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sette"
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
-msgstr "Giugno"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "otto"
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
-msgstr "Luglio"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nove"
-#: utils/dates.py:15
-msgid "August"
-msgstr "Agosto"
+#: contrib/localflavor/au/forms.py:18
+#, fuzzy
+msgid "Enter a 4 digit post code."
+msgstr "Inserire una codici postale di 4 cifre."
-#: utils/dates.py:15
-msgid "September"
-msgstr "Settembre"
+#: contrib/localflavor/br/forms.py:18
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Inserire un codice postale nel formato XXXXX o XXXXX-XXXX."
-#: utils/dates.py:15
-msgid "October"
-msgstr "Ottobre"
+#: contrib/localflavor/br/forms.py:30
+#, fuzzy
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+"I numeri di telefono devono essere in formato XXX-XXX-XXXX. \"%s\" non è "
+"valido."
-#: utils/dates.py:15
-msgid "November"
-msgstr "Novembre"
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
-#: utils/dates.py:16
-msgid "December"
-msgstr "Dicembre"
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
-#: utils/dates.py:19
-msgid "jan"
-msgstr "gen"
+#: contrib/localflavor/de/de_states.py:7
+#, fuzzy
+msgid "Berlin"
+msgstr "Berlino"
-#: utils/dates.py:19
-msgid "feb"
-msgstr "feb"
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
-#: utils/dates.py:19
-msgid "mar"
-msgstr "mar"
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
-#: utils/dates.py:19
-msgid "apr"
-msgstr "apr"
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Amburgo"
-#: utils/dates.py:19
-msgid "may"
-msgstr "mag"
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr ""
-#: utils/dates.py:19
-msgid "jun"
-msgstr "giu"
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
-#: utils/dates.py:20
-msgid "jul"
-msgstr "lug"
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
-#: utils/dates.py:20
-msgid "aug"
-msgstr "ago"
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
-#: utils/dates.py:20
-msgid "sep"
-msgstr "set"
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
-#: utils/dates.py:20
-msgid "oct"
-msgstr "ott"
+#: contrib/localflavor/de/de_states.py:16
+#, fuzzy
+msgid "Saarland"
+msgstr ""
-#: utils/dates.py:20
-msgid "nov"
-msgstr "nov"
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sassonia"
-#: utils/dates.py:20
-msgid "dec"
-msgstr "dic"
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
-#: utils/dates.py:27
-msgid "Jan."
-msgstr "Gen."
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
-#: utils/dates.py:27
-msgid "Feb."
-msgstr "Feb."
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "Ago."
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Inserire un codice postale nel formato XXXXX o XXXXX-XXXX."
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "Set."
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr "Inserire un numero tedesco di carta d'identità valido nel formato XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+#, fuzzy
+msgid "Enter a valid Finnish social security number."
+msgstr "Inserire un numero valido di assisstenza sociale finlandese."
+
+#: contrib/localflavor/jp/forms.py:21
+#, fuzzy
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Inserire un codice postale nel formato XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
-#: utils/dates.py:28
-msgid "Oct."
-msgstr "Ott."
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
-#: utils/dates.py:28
-msgid "Nov."
-msgstr "Nov."
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "Dic."
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "anno"
-msgstr[1] "anni"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mese"
-msgstr[1] "mesi"
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "settimana"
-msgstr[1] "settimane"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "giorno"
-msgstr[1] "giorni"
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "ora"
-msgstr[1] "ore"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minuti"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengali"
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Ceco"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Gallese"
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Danese"
+#: contrib/localflavor/jp/jp_prefectures.py:17
+#, fuzzy
+msgid "Kanagawa"
+msgstr "Kannada"
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Tedesco"
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Greco"
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Inglese"
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Spagnolo"
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Francese"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galiziano"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "Ungherese"
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Ebreo"
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandese"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italiano"
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "Giapponese"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "Olandese"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norvegese"
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brasiliano"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Rumeno"
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Russo"
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Slovacco"
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "Sloveno"
+#: contrib/localflavor/jp/jp_prefectures.py:35
+#, fuzzy
+msgid "Shimane"
+msgstr "Modifica"
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbo"
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Svedese"
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "Ucraino"
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Cinese semplificato"
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Cinese tradizionale"
+#: contrib/localflavor/jp/jp_prefectures.py:40
+#, fuzzy
+msgid "Kagawa"
+msgstr "Kannada"
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Sono ammesse solo lettere, numeri e sottolineature ('_')."
+#: contrib/localflavor/jp/jp_prefectures.py:41
+#, fuzzy
+msgid "Ehime"
+msgstr "Orario"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:15
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "Inserire un codice postale nel formato XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "Inserire un numero decimale valido."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Inserire un codice postale. È obbligatorio uno spazio tra le due parti del "
+"codice postale."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Inserire un codice postale nel formato XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Inserire un numero di assistenza sociale statunitense valido, nel formato XXX-XX-XXXX."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigi da"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Deve essere un percorso assoluto, senza nome di dominio. Esempio: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigi verso"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Può essere un percorso assoluto (come sopra) o una URL completa che inizia "
+"con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirezione"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirezioni"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "chiave di sessione"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "dati di sessione"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "data di scadenza"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sessione"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessioni"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome di dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome visualizzato"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sito"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "siti"
#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Questo valore può contenere solo lettere, cifre e sottolineature."
+
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
-msgstr "Sono ammesse solo lettere, numeri, sottolineature ('_'), trattini"
-"('-') e barre ('/')."
+msgstr ""
+"Questo valore può contenere solo lettere, cifre, sottolineature, trattini e "
+"barre diagonali."
#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Questo valore può contenere solo lettere, cifre, sottolineature e trattini."
+
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "Non sono ammesse lettere maiuscole."
-#: core/validators.py:76
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "Non sono ammesse lettere minuscole."
-#: core/validators.py:83
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
-msgstr "Inserire solo numeri separati da virgole."
+msgstr "Inserire solo cifre separate da virgole."
-#: core/validators.py:95
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Inserire indirizzi e-mail validi separati da virgole."
-#: core/validators.py:99
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "Inserire un indirizzo IP valido."
-#: core/validators.py:103
+#: core/validators.py:107
msgid "Empty values are not allowed here."
-msgstr "E' necessario inserire un valore."
+msgstr "È necessario inserire un valore."
-#: core/validators.py:107
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "Sono ammessi soltanto caratteri numerici."
-#: core/validators.py:111
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
-msgstr "Il valore non può essere composto solo da cifre."
+msgstr "Questo valore non può essere composto solo da cifre."
-#: core/validators.py:116
+#: core/validators.py:120 newforms/fields.py:128
msgid "Enter a whole number."
-msgstr "Inserire un numero."
+msgstr "Inserire un numero intero."
-#: core/validators.py:120
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "Sono ammessi solo caratteri alfabetici."
-#: core/validators.py:124
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "L'anno deve essere 1900 o successivo."
+
+#: core/validators.py:143
+#, fuzzy, python-format
+msgid "Invalid date: %s"
+msgstr "Data non valida: %s."
+
+#: core/validators.py:148 db/models/fields/__init__.py:457
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Inserire un data valida in formato AAAA-MM-GG."
+msgstr "Inserire una data valida in formato AAAA-MM-GG."
-#: core/validators.py:128
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "Inserire un orario valido in formato OO:MM."
-#: core/validators.py:132 db/models/fields/__init__.py:468
+#: core/validators.py:157 db/models/fields/__init__.py:526
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Inserire una data/ora in formato AAAA-MM-GG OO:MM."
+msgstr "Inserire una data/ora valida in formato AAAA-MM-GG OO:MM."
-#: core/validators.py:136
+#: core/validators.py:162 newforms/fields.py:271
msgid "Enter a valid e-mail address."
msgstr "Inserire un indirizzo e-mail valido."
-#: core/validators.py:148
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Non è stato inviato alcun file. Verificare il tipo di codifica della form."
+
+#: core/validators.py:178
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-"Caricare un'immagine valida. Il file inserito non è un'immagine o è corrotto."
+"Caricare un'immagine valida. Il file caricato non è un'immagine o è corrotto."
-#: core/validators.py:155
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "L'URL %s non punta ad un'immagine valida."
+msgstr "La URL %s non punta ad un'immagine valida."
-#: core/validators.py:159
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
"I numeri di telefono devono essere in formato XXX-XXX-XXXX. \"%s\" non è "
"valido."
-#: core/validators.py:167
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "L'URL %s non punta ad un video QuickTime valido."
+msgstr "La URL %s non punta ad un video QuickTime valido."
-#: core/validators.py:171
+#: core/validators.py:201
msgid "A valid URL is required."
-msgstr "Inserire un URL valido."
+msgstr "Inserire una URL valida."
-#: core/validators.py:185
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"E' richiesto HTML valido. Gli errori sono i seguenti:\n"
+"È richiesto HTML valido. Gli errori sono i seguenti:\n"
"%s"
-#: core/validators.py:192
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "XML malformato: %s"
-#: core/validators.py:202
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "URL non valida: %s"
-#: core/validators.py:206 core/validators.py:208
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
-msgstr "L'URL %s è un link rotto."
+msgstr "La URL %s è un link non funzionante."
-#: core/validators.py:214
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Inserire un nome di stato americano abbreviato valido."
+msgstr "Inserire un valido nome di stato USA abbreviato."
-#: core/validators.py:229
+#: 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] "Attenzione! La parola %s non è ammessa."
-msgstr[1] "Attenzione! Le parole %s non sono ammesse."
+msgstr[0] "Moderare i termini: la parola %s non è ammessa."
+msgstr[1] "Moderare i termini: le parole %s non sono ammesse."
-#: core/validators.py:236
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "Questo campo deve corrispondere al campo '%s'."
-#: core/validators.py:255
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "Inserire qualcosa in almeno un campo."
-#: core/validators.py:264 core/validators.py:275
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "Inserire entrambi i campi o lasciarli entrambi vuoti."
-#: core/validators.py:282
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Il campo è obbligatorio se %(field)s è %(value)s"
+msgstr "Questo campo è obbligatorio se %(field)s è %(value)s"
-#: core/validators.py:294
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Il campo è obbligatorio se %(field)s non è %(value)s"
+msgstr "Questo campo è obbligatorio se %(field)s non è %(value)s"
-#: core/validators.py:313
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "Non sono ammessi valori duplicati."
-#: core/validators.py:336
+#: core/validators.py:367
+#, fuzzy, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Questo valore deve essere compreso tra %s e %s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Questo valore deve essere almeno pari a %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Questo valore non deve essere maggiore di %s."
+
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
-msgstr "Il valore deve essere una potenza di %s."
+msgstr "Questo valore deve essere una potenza di %s."
-#: core/validators.py:347
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "Inserire un numero decimale valido."
-#: core/validators.py:349
+#: 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] "Inserire un numero decimale con non più di %s cifra."
-msgstr[1] "Inserire un numero decimale con non più di %s cifre totali."
+msgstr[0] "Inserire un numero decimale con non più di %s cifra in totale."
+msgstr[1] "Inserire un numero decimale con non più di %s cifre in totale."
-#: core/validators.py:352
+#: 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] ""
+"Inserire un numero decimale la cui parte intera sia composta da non più di %"
+"s cifra."
+msgstr[1] ""
+"Inserire un numero decimale la cui parte intera sia composta da non più di %"
+"s cifre."
+
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -1794,45 +2321,47 @@ msgid_plural ""
msgstr[0] "Inserire un decimale con non più di %s cifra decimale."
msgstr[1] "Inserire un decimale con non più di %s cifre decimali."
-#: core/validators.py:362
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Verifica che il file inserito sia almeno di %s byte."
+msgstr "Verificare che il file caricato sia grande almeno %s byte."
-#: core/validators.py:363
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Verifica che il file inserito sia al massimo %s byte."
+msgstr "Verificare che il file caricato non sia più grande di %s byte."
-#: core/validators.py:376
+#: core/validators.py:456
msgid "The format for this field is wrong."
-msgstr "Formato del file non valido."
+msgstr "Il formato di questo campo non è valido."
-#: core/validators.py:391
+#: core/validators.py:471
msgid "This field is invalid."
-msgstr "Il campo non è valido."
+msgstr "Questo campo non è valido."
-#: core/validators.py:426
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Impossibile recuperare alcunché da %s."
-#: core/validators.py:429
+#: core/validators.py:510
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-"L'URL %(url)s restituisce un Content-Type header non valido '%(contenttype)s'."
+"La URL %(url)s ha restituito un header Content-Type non valido: '%"
+"(contenttype)s'."
-#: core/validators.py:462
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Il tag %(tag)s alla linea %(line)s non è chiuso. (La linea comincia con \"%(start)s\".)"
+"Chiudere il tag %(tag)s a linea %(line)s. (La linea inizia con \"%(start)s"
+"\".)"
-#: core/validators.py:466
+#: core/validators.py:547
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -1841,130 +2370,447 @@ msgstr ""
"Il testo che comincia a linea %(line)s non e' ammesso in questo contesto. "
"(La linea comincia con \"%(start)s\".)"
-#: core/validators.py:471
+#: 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\" alla linea %(line)s è un attributo invalido. (La linea comincia "
+"\"%(attr)s\" a linea %(line)s non è un attributo valido. (La linea comincia "
"con \"%(start)s\".)"
-#: core/validators.py:476
+#: 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>\" alla linea %(line)s: tag non valido. (La linea comincia con \"%"
-"(start)s\".)"
+"\"<%(tag)s>\" a linea %(line)s non è un tag valido. (La linea comincia con "
+"\"%(start)s\".)"
-#: core/validators.py:480
+#: 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 ""
-"Un tag alla linea %(line)s manca di uno o più attributi richiesti. (La linea "
+"Un tag a linea %(line)s manca di uno o più attributi richiesti. (La linea "
"comincia con \"%(start)s\".)"
-#: core/validators.py:485
+#: 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 ""
-"L'attributo \"%(attr)s\" alla linea %(line)s ha un valore non valido. (La "
-"linea comincia con \"%(start)s\".)"
+"L'attributo \"%(attr)s\" a linea %(line)s ha un valore non valido. (La linea "
+"comincia con \"%(start)s\".)"
-#: db/models/manipulators.py:302
+#: db/models/manipulators.py:307
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s·con questo·%(type)s·esistono già per questo·%(field)s."
+msgstr "%(object)s·con questo·%(type)s·esiste già per questo·%(field)s."
-#: core/meta/fields.py:60
-#: db/models/fields/__init__.py:40
+#: db/models/fields/__init__.py:42
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(optname)s·con questo·%(fieldname)s·esiste già."
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463 newforms/models.py:178 oldforms/__init__.py:357
msgid "This field is required."
-msgstr "Il campo è obbligatorio."
+msgstr "Questo campo è obbligatorio."
-#: db/models/fields/__init__.py:337
+#: db/models/fields/__init__.py:367
msgid "This value must be an integer."
-msgstr "Il valore deve essere un intero."
+msgstr "Questo valore deve essere un intero."
-#: db/models/fields/__init__.py:369
+#: db/models/fields/__init__.py:402
msgid "This value must be either True or False."
-msgstr "Il valore deve essere True o False."
+msgstr "Questo valore deve essere True o False."
-#: db/models/fields/__init__.py:385
+#: db/models/fields/__init__.py:423
msgid "This field cannot be null."
-msgstr "Il campo non può essere nullo."
+msgstr "Questo campo non può essere nullo."
-#: db/models/fields/__init__.py:562
+#: db/models/fields/__init__.py:630
msgid "Enter a valid filename."
msgstr "Inserire un nome file valido."
-#: db/models/fields/related.py:43
+#: db/models/fields/__init__.py:751
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Questo valore deve essere True o False."
+
+#: db/models/fields/related.py:53
#, python-format
msgid "Please enter a valid %s."
msgstr "Inserire un %s valido."
-#: db/models/fields/related.py:579
+#: db/models/fields/related.py:642
msgid "Separate multiple IDs with commas."
-msgstr "Separa ID multipli con virgole."
+msgstr "Separare ID multipli con virgole."
-#: db/models/fields/related.py:581
+#: db/models/fields/related.py:644
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr " Premi \"Control\", o \"Command\" su Mac, per selezionarne più di uno."
+msgstr ""
+"Tenere premuto \"Control\", o \"Command\" su Mac, per selezionarne più di "
+"uno."
-#: db/models/fields/related.py:625
+#: 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] "Inserire un ID valido per %(self)s. Il valore %(value)r non è valido."
-msgstr[1] "Inserire un ID valido per %(self)s. I valori %(value)r non sono validi."
+msgstr[0] ""
+"Inserire un ID validi per %(self)s. Il valore %(value)r non è valido."
+msgstr[1] ""
+"Inserire un ID validi per %(self)s. I valori %(value)r non sono validi."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Assicurarsi che questo valore non contenga più di %d caratteri."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Assicurarsi che questo valore contenga almeno %d caratteri."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Assicurarsi che questo valore sia minore o uguale a %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assicurarsi che questo valore sia maggiore o uguale a %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Inserire una data valida."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Inserire un orario valido."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Inserire una coppia data/orario valida."
-#: forms/__init__.py:380
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Inserire un valore valido."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Inserire una URL valida."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Questa URL non sembra funzionare."
+
+#: newforms/fields.py:362 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Selezionare un'opzione valida. La scelta effettuata non compare tra quelle "
+"disponibili."
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "Inserire una lista di valori."
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Selezionare un'opzione valida;'%s non compare tra quelle disponibili."
+
+#: 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] "Assicurati che il testo sia più corto di %s carattere."
-msgstr[1] "Assicurati che il testo sia più corto di %s caratteri."
+msgstr[0] "Assicurarsi che il testo sia più corto di %s carattere."
+msgstr[1] "Assicurarsi che il testo sia più corto di %s caratteri."
-#: forms/__init__.py:385
+#: oldforms/__init__.py:397
msgid "Line breaks are not allowed here."
-msgstr "Non è ammesso andare a capo."
+msgstr "Non sono ammessi a capo manuali."
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: 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 "Selezionare un'opzione valida; '%(data)s' non presente in %(choices)s."
-#: forms/__init__.py:645
+#: oldforms/__init__.py:674
msgid "The submitted file is empty."
-msgstr "Il file sottomesso è vuoto."
+msgstr "Il file inviato è vuoto."
-#: forms/__init__.py:699
+#: oldforms/__init__.py:730
msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Inserire un numero tra -32768 e 32767."
+msgstr "Inserire un numero intero compreso tra -32.768 e 32.767."
-#: forms/__init__.py:708
+#: oldforms/__init__.py:740
msgid "Enter a positive number."
msgstr "Inserire un numero positivo."
-#: forms/__init__.py:717
+#: oldforms/__init__.py:750
msgid "Enter a whole number between 0 and 32,767."
-msgstr "Inserire un numero compreso tra 0 e 32767."
+msgstr "Inserire un numero intero compreso tra 0 e 32.767."
-#: template/defaultfilters.py:379
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
msgstr "sì,no,forse"
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "mezzanotte"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "mezzogiorno"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunedì"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martedì"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mercoledì"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Giovedì"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Venerdì"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sabato"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domenica"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Gennaio"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febbraio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Aprile"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maggio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Giugno"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Luglio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Settembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Ottobre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dicembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "gen"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mag"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "giu"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "lug"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "ott"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Gen."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Ott."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "anno"
+msgstr[1] "anni"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mese"
+msgstr[1] "mesi"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "settimana"
+msgstr[1] "settimane"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "giorno"
+msgstr[1] "giorni"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ora"
+msgstr[1] "ore"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minuti"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "j F Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, H:i"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y F"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s è stato creato correttamente."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s è stato aggiornato correttamente."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s è stato cancellato."
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Hai <a href=\"/password_reset/\">dimenticato la password</a>?"
diff --git a/django/conf/locale/it/LC_MESSAGES/djangojs.mo b/django/conf/locale/it/LC_MESSAGES/djangojs.mo
index 2df21b6558..c34009f148 100644
--- a/django/conf/locale/it/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/it/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/it/LC_MESSAGES/djangojs.po b/django/conf/locale/it/LC_MESSAGES/djangojs.po
index 4b68decff2..4f01cd04a0 100644
--- a/django/conf/locale/it/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/it/LC_MESSAGES/djangojs.po
@@ -1,20 +1,39 @@
+# translation of djangojs.po to Italiano
# Italian translation for the django-admin JS files
# Copyright (C) 2006 the Lawrence Journal-World
# This file is distributed under the same license as the Django package.
-# Carlo C8E Miron <carlo.miron AT gmail.com>, 2006.
#
+# Carlo C8E Miron <carlo.miron AT gmail.com>, 2006.
+# Nicola 'tekNico' Larosa <nico@tekNico.net>, 2007.
msgid ""
msgstr ""
-"Project-Id-Version: Django JavaScript 1.0\n"
+"Project-Id-Version: djangojs\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-12-09 11:51+0100\n"
-"PO-Revision-Date: 2005-12-04 21:47+0100\n"
-"Last-Translator: Carlo C8E Miron <carlo.miron AT gmail.com>\n"
-"Language-Team: Italian <Django-I18N@googlegroups.com>\n"
+"POT-Creation-Date: 2007-02-26 20:46+0100\n"
+"PO-Revision-Date: 2007-02-26 20:55+0100\n"
+"Last-Translator: Nicola Larosa <nico@tekNico.net>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre "
+"Novembre Dicembre"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M G V S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato"
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
@@ -23,7 +42,7 @@ msgstr "Disponibile %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
-msgstr "Seleziona tutto"
+msgstr "Scegli tutto"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
@@ -36,7 +55,7 @@ msgstr "Rimuovi"
#: contrib/admin/media/js/SelectFilter2.js:53
#, perl-format
msgid "Chosen %s"
-msgstr "Selezionato %s"
+msgstr "Scelto %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
@@ -46,66 +65,59 @@ msgstr "Seleziona le tue scelte e clicca "
msgid "Clear all"
msgstr "Cancella tutto"
-#: 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 ""
-"Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre "
-"Novembre Dicembre"
-
-#: contrib/admin/media/js/dateparse.js:27
-msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr "Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato"
-
-#: contrib/admin/media/js/calendar.js:25
-msgid "S M T W T F S"
-msgstr "D L M M G V S"
-
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "Adesso"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Orologio"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
-msgstr "Seleziona un orario"
+msgstr "Scegli un orario"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Mezzanotte"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 del mattino"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "Mezzogiorno"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
msgstr "Annulla"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "Oggi"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Calendario"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "Ieri"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "Domani"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostra"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Nascondi"
+
diff --git a/django/conf/locale/ja/LC_MESSAGES/django.mo b/django/conf/locale/ja/LC_MESSAGES/django.mo
index e6725c1140..07d3994755 100644
--- a/django/conf/locale/ja/LC_MESSAGES/django.mo
+++ b/django/conf/locale/ja/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ja/LC_MESSAGES/django.po b/django/conf/locale/ja/LC_MESSAGES/django.po
index a55af3b45d..ab761254ae 100644
--- a/django/conf/locale/ja/LC_MESSAGES/django.po
+++ b/django/conf/locale/ja/LC_MESSAGES/django.po
@@ -1,13 +1,13 @@
# Translation of django.po to japanese.
-# Copyright (C) 2005,2006 THE PACKAGE'S COPYRIGHT HOLDER
+# Copyright (C) 2005,2006,2007 makoto tsuyuki
# This file is distributed under the same license as the PACKAGE package.
-# makoto tsuyuki <mtsuyuki@gmail.com>, 2005,2006.
+# makoto tsuyuki <mtsuyuki@gmail.com>, 2005,2006,2007.
#
msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-21 20:42+0900\n"
+"POT-Creation-Date: 2007-03-26 22:51+0900\n"
"PO-Revision-Date: 2006-05-18 00:28+0900\n"
"Last-Translator: makoto tsuyuki <mtsuyuki@gmail.com>\n"
"Language-Team: Japanese <django-ja@googlegroups.com>\n"
@@ -24,126 +24,150 @@ msgid "Bengali"
msgstr "ベンガル語"
#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "カタロニア語"
+
+#: conf/global_settings.py:42
msgid "Czech"
msgstr "ãƒã‚§ã‚³èªž"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:43
msgid "Welsh"
msgstr "ウェールズ語"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:44
msgid "Danish"
msgstr "デンマーク語"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:45
msgid "German"
msgstr "ドイツ語"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:46
msgid "Greek"
msgstr "ギリシャ語"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:47
msgid "English"
msgstr "英語"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:48
msgid "Spanish"
msgstr "スペイン語"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:49
msgid "Argentinean Spanish"
msgstr "アルゼンãƒãƒ³ã‚¹ãƒšã‚¤ãƒ³èªž"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:50
msgid "Finnish"
msgstr "フィンランド語"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:51
msgid "French"
msgstr "フランス語"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:52
msgid "Galician"
msgstr "ガリシア語"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:53
msgid "Hungarian"
msgstr "ãƒãƒ³ã‚¬ãƒªãƒ¼èªž"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:54
msgid "Hebrew"
msgstr "ヘブライ語"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:55
msgid "Icelandic"
msgstr "アイスランド語"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:56
msgid "Italian"
msgstr "イタリア語"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:57
msgid "Japanese"
msgstr "日本語"
-#: conf/global_settings.py:57
+#: 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:58
+#: conf/global_settings.py:62
msgid "Norwegian"
msgstr "ノルウェー語"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:63
msgid "Polish"
msgstr "ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "ãƒãƒ«ãƒˆã‚¬ãƒ«èªž"
+
+#: conf/global_settings.py:65
msgid "Brazilian"
msgstr "ブラジル語"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:66
msgid "Romanian"
msgstr "ルーマニア語"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:67
msgid "Russian"
msgstr "ロシア語"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:68
msgid "Slovak"
msgstr "スロãƒã‚­ã‚¢èªž"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:69
msgid "Slovenian"
msgstr "スロヴェニア語"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:70
msgid "Serbian"
msgstr "セルビア語"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:71
msgid "Swedish"
msgstr "スウェーデン語"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:72
msgid "Tamil"
msgstr "タミル語"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "テルグ語"
+
+#: conf/global_settings.py:74
msgid "Turkish"
msgstr "トルコ語"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:75
msgid "Ukrainian"
msgstr "ウクライナ語"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:76
msgid "Simplified Chinese"
msgstr "簡体字中国語"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:77
msgid "Traditional Chinese"
msgstr "ç¹ä½“字中国語"
@@ -181,15 +205,18 @@ msgstr "今月"
msgid "This year"
msgstr "今年"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:170
+#: oldforms/__init__.py:577
msgid "Yes"
msgstr "ã¯ã„"
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:170
+#: oldforms/__init__.py:577
msgid "No"
msgstr "ã„ã„ãˆ"
-#: contrib/admin/filterspecs.py:150
+#: contrib/admin/filterspecs.py:150 newforms/widgets.py:170
+#: oldforms/__init__.py:577
msgid "Unknown"
msgstr "ä¸æ˜Ž"
@@ -237,6 +264,7 @@ msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ãŠæŽ¢ã—ã®ãƒšãƒ¼ã‚¸ã¯è¦‹ã¤ã‹ã‚Šã¾ã›
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/logged_out.html:4
#: contrib/admin/templates/registration/password_change_done.html:4
@@ -275,6 +303,7 @@ msgstr "よã†ã“ã"
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@@ -286,6 +315,9 @@ msgstr "ドキュメント"
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
@@ -306,6 +338,7 @@ msgstr "パスワードã®å¤‰æ›´"
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
@@ -335,30 +368,31 @@ msgstr "Django 管ç†ã‚µã‚¤ãƒˆ"
msgid "Add"
msgstr "追加"
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
#: contrib/admin/templates/admin/object_history.html:5
msgid "History"
msgstr "履歴"
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "サイト上ã§è¡¨ç¤º"
-#: contrib/admin/templates/admin/change_form.html:30
+#: 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:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
msgstr "é †åº"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "並ã³å¤‰ãˆ:"
-#: contrib/admin/templates/admin/change_list.html:11
+#: contrib/admin/templates/admin/change_list.html:12
#, python-format
msgid "Add %(name)s"
msgstr "%(name)s を追加"
@@ -451,10 +485,6 @@ msgstr "ユーザå:"
msgid "Password:"
msgstr "パスワード:"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "<a href=\"/password_reset/\">パスワードをãŠå¿˜ã‚Œã§ã™ã‹</a>?"
-
#: contrib/admin/templates/admin/login.html:25
#: contrib/admin/views/decorators.py:24
msgid "Log in"
@@ -533,17 +563,26 @@ 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/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "ブックマークレット"
@@ -576,7 +615,6 @@ msgstr ""
msgid "Documentation for this page"
msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ"
-# TODO
#: contrib/admin/templates/admin_doc/bookmarklets.html:20
msgid ""
"Jumps you from any page to the documentation for the view that generates "
@@ -743,25 +781,34 @@ msgstr "ç¾åœ¨:"
msgid "Change:"
msgstr "変更:"
-#: contrib/admin/templatetags/admin_list.py:230
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "ã„ã¤ã§ã‚‚"
-#: contrib/admin/views/auth.py:17 contrib/admin/views/main.py:257
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "%(name)s \"%(obj)s\" を追加ã—ã¾ã—ãŸã€‚"
-#: contrib/admin/views/auth.py:22 contrib/admin/views/main.py:261
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "続ã‘ã¦ç·¨é›†ã§ãã¾ã™ã€‚"
-#: contrib/admin/views/auth.py:28
+#: contrib/admin/views/auth.py:30
msgid "Add user"
msgstr "ユーザを追加"
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+#: 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"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -815,13 +862,13 @@ msgstr "アプリケーション %r ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
#: contrib/admin/views/doc.py:171
#, python-format
-msgid "Model %r not found in app %r"
-msgstr "モデル %r ㌠%r アプリケーションã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+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 `%s.%s` object"
-msgstr "`%s.%s` (関連オブジェクト)"
+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
@@ -830,8 +877,8 @@ msgstr "モデル :"
#: contrib/admin/views/doc.py:214
#, python-format
-msgid "related `%s.%s` objects"
-msgstr "`%s.%s` (関連オブジェクト)"
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "`%(label)s.%(name)s` (関連オブジェクト)"
#: contrib/admin/views/doc.py:219
#, python-format
@@ -949,7 +996,7 @@ msgid "Added %s."
msgstr "%s を追加ã—ã¾ã—ãŸã€‚"
#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
msgid "and"
msgstr "ã¨"
@@ -983,53 +1030,53 @@ msgstr "%(name)s \"%(obj)s\" を追加ã—ã¾ã—ãŸã€‚続ã‘ã¦ç·¨é›†ã§ãã¾ã™
msgid "Change %s"
msgstr "%s を変更"
-#: contrib/admin/views/main.py:473
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "%(name)s ã« %(fieldname)s ãŒä¸€ã¤ä»¥ä¸Šã‚ã‚Šã¾ã™: %(obj)s"
-#: contrib/admin/views/main.py:478
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "%(name)s ã« %(fieldname)s ãŒä¸€ã¤ä»¥ä¸Šã‚ã‚Šã¾ã™:"
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)s \"%(obj)s\" を削除ã—ã¾ã—ãŸã€‚"
-#: contrib/admin/views/main.py:514
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
-#: contrib/admin/views/main.py:536
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
msgstr "変更履歴: %s"
-#: contrib/admin/views/main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "%s ã‚’é¸æŠž"
-#: contrib/admin/views/main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
msgstr "変更ã™ã‚‹ %s ã‚’é¸æŠž"
-#: contrib/admin/views/main.py:758
+#: contrib/admin/views/main.py:768
msgid "Database error"
msgstr "データベースエラー"
-#: contrib/auth/forms.py:16
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
msgid "The two password fields didn't match."
msgstr "確èªç”¨ãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。"
-#: contrib/auth/forms.py:24
+#: contrib/auth/forms.py:25
msgid "A user with that username already exists."
msgstr "åŒã˜ãƒ¦ãƒ¼ã‚¶åãŒæ—¢ã«ç™»éŒ²æ¸ˆã¿ã§ã™ã€‚"
-#: contrib/auth/forms.py:52
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -1037,21 +1084,21 @@ msgstr ""
"ãŠä½¿ã„ã®ãƒ–ラウザã¯ã‚¯ãƒƒã‚­ãƒ¼ã‚’有効ã«ã—ã¦ã„ãªã„よã†ã§ã™ã€‚ログインã«ã¯ã‚¯ãƒƒã‚­ãƒ¼ãŒ"
"å¿…è¦ã§ã™ã€‚"
-#: contrib/auth/forms.py:61
+#: contrib/auth/forms.py:62
msgid "This account is inactive."
msgstr "アカウントãŒç„¡åŠ¹ã§ã™ã€‚"
-#: contrib/auth/forms.py:84
+#: contrib/auth/forms.py:85
msgid ""
"That e-mail address doesn't have an associated user account. Are you sure "
"you've registered?"
msgstr "メールアドレスã®ä¸€è‡´ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ã¯ã„ã¾ã›ã‚“。本当ã«ç™»éŒ²ã—ã¾ã—ãŸã‹ï¼Ÿ"
-#: contrib/auth/forms.py:116
+#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
msgstr "æ–°ã—ã„パスワード(確èªç”¨)ãŒä¸€è‡´ã—ã¾ã›ã‚“。"
-#: contrib/auth/forms.py:123
+#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
msgstr "å…ƒã®ãƒ‘スワードãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚ã‚‚ã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。"
@@ -1108,8 +1155,12 @@ msgid "password"
msgstr "パスワード"
#: contrib/auth/models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "'[アルゴリズム]$[ソルト]$[ダイジェスト(hex)]' å½¢å¼ã‚’使ã£ã¦ä¸‹ã•ã„"
+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"
@@ -1478,15 +1529,15 @@ msgstr "コメント ID ãŒä¸æ­£ã§ã™"
msgid "No voting for yourself"
msgstr "自分ã«ã¯æŠ•ç¥¨ã§ãã¾ã›ã‚“。"
-#: contrib/contenttypes/models.py:20
+#: contrib/contenttypes/models.py:36
msgid "python model class name"
msgstr "Python モデルクラスå"
-#: contrib/contenttypes/models.py:23
+#: contrib/contenttypes/models.py:39
msgid "content type"
msgstr "コンテンツタイプ"
-#: contrib/contenttypes/models.py:24
+#: contrib/contenttypes/models.py:40
msgid "content types"
msgstr "コンテンツタイプ"
@@ -1536,6 +1587,284 @@ msgstr "フラットページ"
msgid "flat pages"
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 å…†"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "1"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "2"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "3"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "4"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "5"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "6"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "7"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "8"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "9"
+
+#: contrib/localflavor/fr/forms.py:17
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX."
+msgstr "XXXXXã®å½¢å¼ã§Zipコードを入力ã—ã¦ãã ã•ã„。"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "XXXXXã‹ã€XXXXX-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/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "ãƒã‚¹ã‚¿ãƒ«ã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。コードã¨ã‚³ãƒ¼ãƒ‰ã®é–“ã¯åŠè§’ã®ã‚¹ãƒšãƒ¼ã‚¹ã§åŒºåˆ‡ã£ã¦ãã ã•ã„。"
+
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "XXXXXã‹ã€XXXXX-XXXXã®å½¢å¼ã§éƒµä¾¿ç•ªå·ã‚’入力ã—ã¦ãã ã•ã„。"
+
#: contrib/redirects/models.py:7
msgid "redirect from"
msgstr "リダイレクト元"
@@ -1564,23 +1893,23 @@ msgstr "リダイレクト"
msgid "redirects"
msgstr "リダイレクト"
-#: contrib/sessions/models.py:51
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "セッションキー"
-#: contrib/sessions/models.py:52
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "セッションデータ"
-#: contrib/sessions/models.py:53
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "有効期é™"
-#: contrib/sessions/models.py:57
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "セッション"
-#: contrib/sessions/models.py:58
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "セッション"
@@ -1600,92 +1929,92 @@ msgstr "サイト"
msgid "sites"
msgstr "サイト"
-#: core/validators.py:63
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "åŠè§’ã®è‹±æ•°å­—ãŠã‚ˆã³ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ä»¥å¤–ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:67
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
"åŠè§’ã®è‹±æ•°å­—ã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã€ãƒ€ãƒƒã‚·ãƒ¥ã€ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ä»¥å¤–ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:71
+#: core/validators.py:72
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr "åŠè§’ã®è‹±æ•°å­—ã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã€ãƒã‚¤ãƒ•ãƒ³ä»¥å¤–ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:75
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "大文字ã¯ã“ã“ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:79
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "å°æ–‡å­—ã¯ã“ã“ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:86
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "カンマ区切りã®æ•°å­—ã ã‘を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:98
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "カンマ区切りã®æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:102
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "有効㪠IP アドレスを入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:106
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "入力ã¯å¿…é ˆã§ã™ã€‚"
-#: core/validators.py:110
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "数値以外ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-#: core/validators.py:114
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "数値ã ã‘ã®å€¤ã«ã¯ã§ãã¾ã›ã‚“。"
-#: core/validators.py:119
+#: core/validators.py:120 newforms/fields.py:126
msgid "Enter a whole number."
msgstr "整数を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:123
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "åŠè§’アルファベット以外使用ã§ãã¾ã›ã‚“。"
-#: core/validators.py:138
+#: core/validators.py:139
msgid "Year must be 1900 or later."
msgstr "1900年以é™ã‚’指定ã—ã¦ãã ã•ã„。"
-#: core/validators.py:142
+#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
+msgid "Invalid date: %s"
msgstr "無効ãªæ—¥ä»˜: %s"
-#: core/validators.py:146 db/models/fields/__init__.py:424
+#: core/validators.py:148 db/models/fields/__init__.py:457
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "YYYY-MM-DDå½¢å¼ã§æ—¥ä»˜ã‚’入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:151
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "HH:MMå½¢å¼ã§æ™‚刻を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:155 db/models/fields/__init__.py:486
+#: core/validators.py:157 db/models/fields/__init__.py:526
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "YYYY-MM-DD HH:MMå½¢å¼ã§æ—¥æ™‚を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:160
+#: core/validators.py:162 newforms/fields.py:269
msgid "Enter a valid e-mail address."
msgstr "有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:172 core/validators.py:401 forms/__init__.py:662
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"ファイルãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚formã®encoding typeを確èªã—ã¦ãã ã•ã„。"
-#: core/validators.py:176
+#: core/validators.py:178
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@@ -1693,26 +2022,26 @@ msgstr ""
"ç”»åƒã‚’アップロードã—ã¦ãã ã•ã„。アップロードã—ãŸç”»åƒã¯ç”»åƒã§ãªã„ã‹ã€ã¾ãŸã¯å£Š"
"ã‚Œã¦ã„ã¾ã™ã€‚"
-#: core/validators.py:183
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "URL ( %s ) ã¯ç”»åƒã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
-#: core/validators.py:187
+#: 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:195
+#: 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:199
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr "æ­£ã—ã„ URL を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:213
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -1721,71 +2050,86 @@ msgstr ""
"有効㪠HTML を入力ã—ã¦ãã ã•ã„。エラー:\n"
"%s"
-#: core/validators.py:220
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "ä¸æ­£ãª XML ã§ã™: %s"
-#: core/validators.py:230
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "無効ãªURL: %s"
-#: core/validators.py:234 core/validators.py:236
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "URL ( %s ) ã¯ãƒªãƒ³ã‚¯ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚"
-#: core/validators.py:242
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr "æ­£ã—ã„米州略称を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:256
+#: 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:263
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯ '%s' フィールドã¨ä¸€è‡´ã›ã­ã°ãªã‚Šã¾ã›ã‚“。"
-#: core/validators.py:282
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "å°‘ãªãã¨ã‚‚一ã¤ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ä½•ã‹å…¥åŠ›ã—ã¦ãã ã•ã„。"
-#: core/validators.py:291 core/validators.py:302
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "両方ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«å…¥åŠ›ã™ã‚‹ã‹ã€ä¸¡æ–¹ã¨ã‚‚未入力ã«ã—ã¦ãã ã•ã„。"
-#: core/validators.py:309
+#: 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:321
+#: 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:340
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "é‡è¤‡ã™ã‚‹å€¤ã¯èªã‚られã¾ã›ã‚“。"
-#: core/validators.py:363
+#: 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:374
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "有効㪠10 進数を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:378
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
@@ -1793,7 +2137,7 @@ msgid_plural ""
msgstr[0] "全体㧠%s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
msgstr[1] "全体㧠%s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:381
+#: core/validators.py:425
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
@@ -1802,7 +2146,7 @@ msgid_plural ""
msgstr[0] "整数部㯠%s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
msgstr[1] "整数部㯠%s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:384
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -1810,37 +2154,37 @@ msgid_plural ""
msgstr[0] "å°æ•°éƒ¨ã¯ %s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
msgstr[1] "å°æ•°éƒ¨ã¯ %s 文字以下ã®æ•°å­—を入力ã—ã¦ãã ã•ã„。"
-#: core/validators.py:394
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "アップロードã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®å¤§ãã•ã¯ %s ãƒã‚¤ãƒˆä»¥ä¸Šã«ã—ã¦ãã ã•ã„。"
-#: core/validators.py:395
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "アップロードã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®å¤§ãã•ã¯ %s 最大ãƒã‚¤ãƒˆã¾ã§ã§ã™ã€‚"
-#: core/validators.py:412
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "フィールドã®å½¢å¼ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。"
-#: core/validators.py:427
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯ç„¡åŠ¹ã§ã™ã€‚"
-#: core/validators.py:463
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "%s ã‹ã‚‰ä½•ã‚‚検索ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
-#: core/validators.py:466
+#: core/validators.py:510
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
"URL %(url)s ã¯ç„¡åŠ¹ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„タイプヘッダ '%(contenttype)s' ã‚’è¿”ã—ã¾ã—ãŸã€‚"
-#: core/validators.py:499
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
@@ -1849,7 +2193,7 @@ msgstr ""
"%(line)s 行目ã‹ã‚‰å§‹ã¾ã‚‹ %(tag)s ã‚¿ã‚°ã‚’é–‰ã˜ã¦ãã ã•ã„ (\"%(start)s\" ã§å§‹ã¾ã‚‹"
"è¡Œã§ã™)。"
-#: core/validators.py:503
+#: core/validators.py:547
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -1858,7 +2202,7 @@ msgstr ""
"%(line)s 行目ã‹ã‚‰å§‹ã¾ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã¯ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ä½¿ãˆã¾ã›ã‚“。 (\"%(start)"
"s\" ã§å§‹ã¾ã‚‹è¡Œã§ã™)。"
-#: core/validators.py:508
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -1867,7 +2211,7 @@ msgstr ""
"%(line)s 行目㮠\"%(attr)s\" ã¯ç„¡åŠ¹ãªã‚¢ãƒˆãƒªãƒ“ュートã§ã™ (\"%(start)s\" ã§å§‹ã¾"
"ã‚‹è¡Œã§ã™)。"
-#: core/validators.py:513
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -1876,7 +2220,7 @@ msgstr ""
"%(line)s 行目㮠\"<%(tag)s>\" ã¯ç„¡åŠ¹ãªã‚¿ã‚°ã§ã™( \"%(start)s\" ã§å§‹ã¾ã‚‹è¡Œã§"
"ã™)。"
-#: core/validators.py:517
+#: core/validators.py:561
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@@ -1885,7 +2229,7 @@ msgstr ""
"%(line)s 行目ã®ã‚¿ã‚°ã¯å¿…須アトリビュートãŒæœªå…¥åŠ›ã§ã™( \"%(start)s\" ã§å§‹ã¾ã‚‹è¡Œ"
"ã§ã™)。"
-#: core/validators.py:522
+#: core/validators.py:566
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -1894,56 +2238,61 @@ msgstr ""
"%(line)s 行目㮠\"%(attr)s\" アトリビュートã®å€¤ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ (\"%(start)"
"s\" ã§å§‹ã¾ã‚‹è¡Œã§ã™) 。"
-#: db/models/manipulators.py:305
+#: db/models/manipulators.py:307
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr ""
"%(field)s ã«å…¥åŠ›ã•ã‚ŒãŸã‚‚ã®ã¯ã€ã“ã® %(type)s ã® %(object)s ã«æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
-#: db/models/fields/__init__.py:41
+#: db/models/fields/__init__.py:42
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(fieldname)s ã« %(optname)s ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
-#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266
-#: db/models/fields/__init__.py:560 db/models/fields/__init__.py:571
-#: forms/__init__.py:347
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461 newforms/models.py:177 oldforms/__init__.py:357
msgid "This field is required."
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯å¿…é ˆã§ã™ã€‚"
-#: db/models/fields/__init__.py:349
+#: db/models/fields/__init__.py:367
msgid "This value must be an integer."
msgstr "値ã¯æ•´æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-#: db/models/fields/__init__.py:381
+#: db/models/fields/__init__.py:402
msgid "This value must be either True or False."
msgstr "値ã¯çœŸ: True ã¾ãŸã¯å½: False ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-#: db/models/fields/__init__.py:397
+#: db/models/fields/__init__.py:423
msgid "This field cannot be null."
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã¯ NULL を指定ã§ãã¾ã›ã‚“。"
-#: db/models/fields/__init__.py:580
+#: db/models/fields/__init__.py:630
msgid "Enter a valid filename."
msgstr "æ­£ã—ã„ファイルåを入力ã—ã¦ãã ã•ã„。"
-#: db/models/fields/related.py:51
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "値ã¯ã€ç©º: Noneã€çœŸ: True ã¾ãŸã¯å½: False ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: db/models/fields/related.py:53
#, python-format
msgid "Please enter a valid %s."
msgstr "æ­£ã—ã„ %s を入力ã—ã¦ãã ã•ã„。"
-#: db/models/fields/related.py:618
+#: db/models/fields/related.py:642
msgid "Separate multiple IDs with commas."
msgstr "複数㮠ID ã¯ã‚«ãƒ³ãƒžã§åŒºåˆ‡ã£ã¦ãã ã•ã„。"
-#: db/models/fields/related.py:620
+#: db/models/fields/related.py:644
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"複数é¸æŠžã™ã‚‹ã¨ãã«ã¯ Control キーを押ã—ãŸã¾ã¾é¸æŠžã—ã¦ãã ã•ã„。Mac 㯠"
"Command キーを使ã£ã¦ãã ã•ã„"
-#: db/models/fields/related.py:664
+#: db/models/fields/related.py:691
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@@ -1951,42 +2300,123 @@ msgid_plural ""
msgstr[0] "æ­£ã—ã„ %(self)s IDを入力ã—ã¦ãã ã•ã„。 %(value)r ã¯ç„¡åŠ¹ã§ã™ã€‚"
msgstr[1] "æ­£ã—ã„ %(self)s IDを入力ã—ã¦ãã ã•ã„。 %(value)r ã¯ç„¡åŠ¹ã§ã™ã€‚"
-#: forms/__init__.py:382
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "%d 字以下ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "%d 字以上ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "ã“ã®å€¤ã¯ %s 以下ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "ã“ã®å€¤ã¯ %s 以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "日付を正ã—ã入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr "時間を正ã—ã入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr "日付/時間を正ã—ã入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "値を正ã—ã入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "URLã‚’æ­£ã—ã入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "ã“ã®URLã¯ãƒªãƒ³ã‚¯ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚"
+
+#: newforms/fields.py:360 newforms/models.py:164
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "æ­£ã—ãé¸æŠžã—ã¦ãã ã•ã„。é¸æŠžã—ãŸã‚‚ã®ã¯å€™è£œã«ã‚ã‚Šã¾ã›ã‚“。"
+
+#: newforms/fields.py:378 newforms/fields.py:454 newforms/models.py:181
+msgid "Enter a list of values."
+msgstr "リストを入力ã—ã¦ãã ã•ã„。"
+
+#: newforms/fields.py:387 newforms/models.py:187
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "æ­£ã—ãé¸æŠžã—ã¦ãã ã•ã„。 %s ã¯å€™è£œã«ã‚ã‚Šã¾ã›ã‚“。"
+
+#: 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] "%s 字以下ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
-#: forms/__init__.py:387
+#: oldforms/__init__.py:397
msgid "Line breaks are not allowed here."
msgstr "改行ã¯ã§ãã¾ã›ã‚“。"
-#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600
+#: 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 ã«ã‚ã‚Šã¾ã›ã‚“。"
-#: forms/__init__.py:664
+#: oldforms/__init__.py:674
msgid "The submitted file is empty."
msgstr "入力ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ç©ºã§ã™ã€‚"
-#: forms/__init__.py:720
+#: oldforms/__init__.py:730
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "-32,768 ã‹ã‚‰ 32,767 ã¾ã§ã®æ•´æ•°ã‚’入力ã—ã¦ãã ã•ã„。"
-#: forms/__init__.py:730
+#: oldforms/__init__.py:740
msgid "Enter a positive number."
msgstr "æ­£ã®æ•°ã‚’入力ã—ã¦ãã ã•ã„。"
-#: forms/__init__.py:740
+#: oldforms/__init__.py:750
msgid "Enter a whole number between 0 and 32,767."
msgstr "0 ã‹ã‚‰ 32,767 ã¾ã§ã®æ•´æ•°ã‚’入力ã—ã¦ãã ã•ã„。"
-#: template/defaultfilters.py:401
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
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 "0時"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "12時"
+
#: utils/dates.py:6
msgid "Monday"
msgstr "月曜日"
@@ -2209,21 +2639,3 @@ msgstr "%(verbose_name)s ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚"
#, python-format
msgid "The %(verbose_name)s was deleted."
msgstr " %(verbose_name)s を削除ã—ã¾ã—ãŸã€‚"
-
-#~ msgid "String (up to 50)"
-#~ msgstr "文字列 (50 å­—ã¾ã§)"
-
-#~ msgid "Comment"
-#~ msgstr "コメント"
-
-#~ msgid "Comments"
-#~ msgstr "コメント"
-
-#~ msgid "label"
-#~ msgstr "ラベル"
-
-#~ msgid "package"
-#~ msgstr "パッケージ"
-
-#~ msgid "packages"
-#~ msgstr "パッケージ"
diff --git a/django/conf/locale/ja/LC_MESSAGES/djangojs.mo b/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
index bddecacb10..45a4ff9f67 100644
--- a/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/ja/LC_MESSAGES/djangojs.po b/django/conf/locale/ja/LC_MESSAGES/djangojs.po
index 0ec1cadcf5..d35b88aa73 100644
--- a/django/conf/locale/ja/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/ja/LC_MESSAGES/djangojs.po
@@ -1,14 +1,12 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# Japanese translation for js.
+# Copyright (C) 2005 makoto tsuyuki
# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
+# makoto tsuyuki <mtsuyuki@gmail.com>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-06 00:30+0900\n"
+"POT-Creation-Date: 2007-03-26 23:41+0900\n"
"PO-Revision-Date: 2006-05-08 13:39+0900\n"
"Last-Translator: makoto tsuyuki <mtsuyuki@gmail.com>\n"
"Language-Team: Japanese <django-ja@googlegroups.com>\n"
@@ -85,7 +83,7 @@ msgstr "時間をé¸æŠž"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
-msgstr "夜中"
+msgstr "0時"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
@@ -93,7 +91,7 @@ msgstr "åˆå‰ 6 時"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
-msgstr "æ­£åˆ"
+msgstr "12時"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
diff --git a/django/conf/locale/kn/LC_MESSAGES/django.mo b/django/conf/locale/kn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..51e9ab5fbc
--- /dev/null
+++ b/django/conf/locale/kn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/kn/LC_MESSAGES/django.po b/django/conf/locale/kn/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..b8adeb2c43
--- /dev/null
+++ b/django/conf/locale/kn/LC_MESSAGES/django.po
@@ -0,0 +1,2533 @@
+# Kannada translation of Django.
+# Copyright (C) 2007 Translation Team <translation@sampada.info>
+# This file is distributed under the same license as the Django package.
+# Kannada Localization Team <translation@sampada.info>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django-kn 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-01-08 20:22+0530\n"
+"Last-Translator: Kannada Localization Team <translation@sampada.info>\n"
+"Language-Team: Kannada <translation@sampada.info>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ವಸà³à²¤à³à²µà²¿à²¨ à²à²¡à²¿"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "ತಲೆಬರಹ"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "ಟಿಪà³à²ªà²£à²¿"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೧"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೨"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೩ "
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೪"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೫ "
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ ೬ "
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ à³­"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "ಕà³à²°à²®à²¾à²‚ಕ à³®"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "ಕà³à²°à²®à²¬à²¦à³à²§ ಕà³à²°à²®à²¾à²‚ಕ"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py: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 "ಒಳವಿಷಯ ವಸà³à²¤à³"
+
+#: 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 " %(user)s ಇಂದ %(score)d ಕà³à²°à²®à²¾à²‚ಕ"
+
+#: 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/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+"ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೠಮತ "
+"ಹಾಕà³à²µà²‚ತಿಲà³à²²"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ತಪà³à²ªà³ ಟಿಪà³à²ªà²£à²¿ à²à²¡à²¿"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+"ತಮಗೇ ಮತ ಹಾಕಿಕೊಳà³à²³à³à²µà²‚ತಿಲà³à²²."
+
+#: contrib/comments/views/comments.py:27
+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"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(count)s ಕà³à²•à²¿à²‚ತಲೂ ಕಡಿಮೆ "
+"ಟಿಪà³à²ªà²£à²¿à²—ಳನà³à²¨à³ ಬರೆದಿರà³à²µ "
+"ಸದಸà³à²¯à²°à²¿à²‚ದ ಈ ಟಿಪà³à²ªà²£à²¿ "
+"ಬರೆಯಲà³à²ªà²Ÿà³à²Ÿà²¿à²¦à³†:\n"
+"\n"
+"%(text)s"
+"%(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 ""
+"ಸಲà³à²²à²¿à²•à³†à²—ಳಿಗೆ ಮಾತà³à²° "
+"ಅನà³à²®à²¤à²¿à²¯à²¿à²¦à³†"
+
+#: 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 ""
+"ಟಿಪà³à²ªà²£à²¿ ನಮೂನೆಗೆ ತಪà³à²ªà³ "
+"ಟಾರà³à²—ೆಟೠಪà³à²¯à²¾à²°à²¾à²®à³€à²Ÿà²°à³ ಇದೆ. "
+"ವಸà³à²¤à³à²µà²¿à²¨ à²à²¡à²¿à²¯à³ "
+"ದೋಷಪೂರಿತವಾಗಿತà³à²¤à³."
+
+#: 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/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/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+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/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 "ಕಳೆದ à³­ ದಿನಗಳà³"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "ಈ ತಿಂಗಳà³"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "ಈ ವರà³à²·"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "ಹೌದà³"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "ಇಲà³à²²"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "ಗೊತà³à²¤à²¿à²²à³à²²(ದ/ದà³à²¦à³)"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "ಕà³à²°à²®à²¦(ಕà³à²°à²¿à²¯à³†à²¯) ಸಮಯ"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "ವಸà³à²¤à³à²µà²¿à²¨ à²à²¡à²¿"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "ವಸà³à²¤à³ ಪà³à²°à²¾à²¤à²¿à²¨à²¿à²§à³à²¯"
+
+#: 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:230
+msgid "All dates"
+msgstr "ಎಲà³à²²à²¾ ದಿನಾಂಕಗಳà³"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are "
+"case-sensitive."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ಬಳಕೆದಾರ-ಪದ "
+"ಮತà³à²¤à³ ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಬರೆಯಿರಿ "
+".ಎರಡೂ ಇಂಗà³à²²à³€à²·à²¿à²¨ ಸಣà³à²£ ಮತà³à²¤à³ "
+"ದೊಡà³à²¡ ಅಕà³à²·à²° ಸಂವೇದಿ "
+"ಎಂಬà³à²¦à²¨à³à²¨à³ ಗಮನದಲà³à²²à²¿à²¡à²¿"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+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 ""
+"ಕà³à²•à³€à²—ಳನà³à²¨à³ ಸà³à²µà³€à²•à²°à²¿à²¸à³à²µà²‚ತೆ "
+"ನಿಮà³à²® ಜಾಲವೀಕà³à²·à²•à²µà²¨à³à²¨à³ "
+"ಸಂರಚಿಸಲಾಗಿಲà³à²² ಎಂದೠ"
+"ತೋರà³à²¤à³à²¤à²¦à³†. ದಯವಿಟà³à²Ÿà³ "
+"ಕà³à²•à³€à²—ಳನà³à²¨à³ ಸಕà³à²°à²¿à²¯à²—ೊಳಿಸಿ , ಈ "
+"ಪà³à²Ÿà²µà²¨à³à²¨à³ ಮತà³à²¤à³† ಲೋಡೠಮಾಡಿ "
+"ಮತà³à²¤à³† ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿à²°à²¿. "
+
+#: 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 ""
+"ನಿಮà³à²® ವಿ-ಅಂಚೆ ವಿಳಾಸವೠನಿಮà³à²® "
+"ಬಳಕೆದಾರ-ಹೆಸರಲà³à²²; ಬದಲಾಗಿ '%s' "
+"ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "ತಾಣ ನಿರà³à²µà²¹à²£à³†"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, 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:22
+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:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ಮತà³à²¤à³"
+
+#: 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:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+"%(name)s ನಲà³à²²à²¿ ಒಂದೠಅಥವಾ ಹೆಚà³à²šà³ "
+"%(fieldname)s :%(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+"%(name)s ನಲà³à²²à²¿ ಒಂದೠಅಥವಾ ಹೆಚà³à²šà³ "
+"%(fieldname)s :"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+"%(name)s \"%(obj)s\" ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ "
+"ಅಳಿಸಲಾಯಿತà³."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "ಖಚಿತಪಡಿಸà³à²µà²¿à²°à²¾? "
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "%s ಆಯà³à²¦à³à²•à³Šà²³à³à²³à²¿"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "ಬದಲಾಯಿಸಲೠ%s ಆಯà³à²¦à³à²•à³Šà²³à³à²³à²¿"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "ದತà³à²¤à²¸à²‚ಚಯದ ದೋಷ"
+
+#: 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 %r not found in app %r"
+msgstr ""
+"%r ಅನà³à²µà²¯à²¾à²‚ಶದಲà³à²²à²¿ %r ಮಾಡೆಲà³à²²à³ "
+"ಸಿಗಲಿಲà³à²²"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "ಸಂಬಂಧಿಸಿದ `%s.%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 `%s.%s` objects"
+msgstr "ಸಂಬಂಧಿಸಿದ `%s.%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 "ಬೂಲಿಯನà³( ನಿಜ ಅಥವಾ ಸà³à²³à³à²³à³)"
+
+#: 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 "ವಿ-ಅಂಚೆ ವಿಳಾಸ"
+
+#: 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 ""
+"ಬೂಲಿಯನà³( ನಿಜ ಅಥವಾ ಸà³à²³à³à²³à³ "
+"ಅಥವಾ ಯಾವà³à²¦à³‚ ಅಲà³à²²)"
+
+#: 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:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: 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 URL ಸà³à²µà²°à³‚ಪದà³à²¦à²¾à²—ಿ ತೋರà³à²µà²¦à²¿à²²à³à²²."
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "ಬಳಕೆದಾರನನà³à²¨à³ ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ವಿವರಮಾಹಿತಿ"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಬದಲಿಸಿ"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "ಪà³à²°à²¾à²°à²‚ಭಸà³à²¥à²³(ಮನೆ)"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+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 "N j, 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/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/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 "ಸರà³à²µà²°à³ ದೋಷ<em>(೫೦೦)</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/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/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:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "ಬದಲಿಸಿ/ಬದಲಾವಣೆ"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr ""
+"ಯಾವà³à²¦à²¨à³à²¨à³‚ ತಿದà³à²¦à²²à³ ನಿಮಗೆ "
+"ಅನà³à²®à²¤à²¿ ಇಲà³à²² ."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "ಇತà³à²¤à³€à²šà²¿à²¨ ಕà³à²°à²®à²—ಳà³"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "ನನà³à²¨ ಕà³à²°à²®à²—ಳà³"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "ಯಾವà³à²¦à³‚ ಲಭà³à²¯à²µà²¿à²²à³à²²"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+"ನೀವೠ<a "
+"href=\"/password_reset/\">ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ "
+"ಮರೆತಿದà³à²¦à³€à²°à²¾</a>?"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "ಸà³à²¸à³à²µà²¾à²—ತ."
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+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 ""
+"'%(escaped_object)s' %(object_name)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)ಗಳನà³à²¨à³\"? "
+"ತೆಗೆದà³à²¹à²¾à²•à²¬à²¯à²¸à²¿à²¦à³à²¦à³€à²°à²¾? "
+"ಸಂಬಂಧಪಟà³à²Ÿ ಕೆಳಕಂಡ ಎಲà³à²²à²µà²¨à³à²¨à³‚ "
+"ತೆಗೆದà³à²¹à²¾à²•à²²à²¾à²—à³à²¤à³à²¤à²¦à³†:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "ಹೌದà³,ನನಗೆ ಖಚಿತವಿದೆ"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ಇಂದ"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "ಹೋಗಿ"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "೧ ಫಲಿತಾಂಶ"
+
+#: 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/pagination.html:10
+msgid "Show all"
+msgstr "ಎಲà³à²²à²µà²¨à³à²¨à³‚ ತೋರಿಸà³"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "ಸೋಸಕ"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "ತಾಣದಲà³à²²à²¿ ನೋಡಿ"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgstr ""
+"ದಯಮಾಡಿ ಕೆಳಗಿನ ತಪà³à²ªà²¨à³à²¨à³ "
+"ಸರಿಪಡಿಸಿ "
+"ದಯಮಾಡಿ ಕೆಳಗಿನ ತಪà³à²ªà³à²—ಳನà³à²¨à³ "
+"ಸರಿಪಡಿಸಿ. "
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "ಅನà³à²•à³à²°à²®à²¦à²²à³à²²à²¿ ಜೋಡಣೆ"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+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/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/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
+msgid "Password"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦(ಇನà³à²¨à³Šà²®à³à²®à³†)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr ""
+"ಖಚಿತಗೊಳಿಸಲೠಮೇಲಿನ "
+"ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಇನà³à²¨à³Šà²®à³à²®à³† "
+"ಬರೆಯಿರಿ."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಬದಲಾವಣೆ"
+
+#: 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:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಿಸà³à²µà²¿à²•à³†"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಮರೆತಿದà³à²¦à³€à²°à²¾? "
+"ನಿಮà³à²® ವಿ-ಅಂಚೆಯ ವಿಳಾಸವನà³à²¨à³ "
+"ಕೆಳಗೆ ಸೂಚಿಸಿರಿ, ನಾವೠನಿಮà³à²® "
+"ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಾಯಿಸಿ "
+"ಅದನà³à²¨à³ ರವಾನಿಸà³à²¤à³à²¤à³‡à²µà³†."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ವಿ-ಅಂಚೆ ವಿಳಾಸ:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+"ನನà³à²¨ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಮತà³à²¤à³† "
+"ನಿರà³à²§à²°à²¿à²¸à²¿ "
+
+#: contrib/admin/templates/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_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: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_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"ಪà³à²°à²µà³‡à²¶à²ªà²¦à²¦ ಮರà³à²¨à²¿à²°à³à²§à²¾à²°à²µà²¨à³à²¨à³ "
+"ನೀವೠಕೇಳಿದà³à²¦à²°à²¿à²‚ದ ಈ "
+"ವಿ-ಅಂಚೆಯನà³à²¨à³ "
+"ಪಡೆಯà³à²¤à³à²¤à²¿à²¦à³à²¦à³€à²°à²¿."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+"%(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/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ಚಿಕà³à²• ಪà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳà³"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+"ಮಾಹಿತಿಯ ಚಿಕà³à²• ಪà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳà³"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p "
+"class=\"help\">ಸಣà³à²£à³à²ªà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳನà³à²¨à³ "
+"ಅನà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²²à³ ಕೊಂಡಿಯನà³à²¨à³ "
+"ಪà³à²Ÿà²—à³à²°à³à²¤à³ ಉಪಕರಣಪಟà³à²Ÿà²¿(ಟೂಲೠ"
+"ಬಾರà³)ಕಡೆಗೆ ಎಳೆದೊಯà³à²¯à²¿à²°à²¿,\n"
+" ಅಥವಾ ಕೊಂಡಿಯ ಮೇಲೆ "
+"ಮೂಷಿಕ(ಮೌಸà³)ದ ಬಲಬಟನà³à²¨à²¨à³à²¨à³ "
+"ಒತà³à²¤à²¿ ಪà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳಿಗೆ "
+"ಸೇರಿಸಿಕೊಳà³à²³à²¿. ಈಗ \n"
+" ನೀವೠಸಣà³à²£à²ªà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳನà³à²¨à³ "
+"ತಾಣದ ಯಾವ ಪà³à²Ÿà²¦à²¿à²‚ದ ಬೇಕಾದರೂ "
+"ಆಯà³à²•à³†à²®à²¾à²¡à²¿à²•à³Šà²³à³à²³à²¬à²¹à³à²¦à³.\n"
+"ನೆನಪಿರಲಿ, ಕೆಲವೠ"
+"ಸಣà³à²£à²ªà³à²Ÿà²—à³à²°à³à²¤à³à²—ಳಿಗೆ ನೀವೠಈ "
+"ತಾಣವನà³à²¨à³ ಆಂತರಿಕ (\"internal\") ಎಂದೠ"
+"ಸೂಚಿತವಾಗಿರà³à²µ ಗಣಕದಿಂದ "
+"ವೀಕà³à²·à²¿à²¸à²¬à³‡à²•à²¾à²—à³à²¤à³à²¤à²¦à³†.\n"
+"( ನಿಮà³à²® ಗಣಕವೠ\"internal\" ಹೌದೇ "
+"ಅಲà³à²²à²µà³‡ ಎಂದೠ"
+"ಗೊತà³à²¤à²¿à²²à³à²²à²¦à²¿à²¦à³à²¦à²°à³† , ಗಣಕದ "
+"ಆಡಳಿತಗಾರರನà³à²¨à³ ಕೇಳಿರಿ).</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 "ವಸà³à²¤à³à²µà²¿à²¨ à²à²¡à²¿ ತೋರಿಸಿ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"à²à²•à³ˆà²• ವಸà³à²¤à³à²µà²¨à³à²¨à³ "
+"ಪà³à²°à²¤à²¿à²¨à²¿à²§à²¿à²¸à³à²µ ಪà³à²Ÿà²—ಳ ವಿಶಿಷà³à²  "
+"à²à²¡à²¿ ಮತà³à²¤à³ ಒಳವಿಷಯಬಗೆಯನà³à²¨à³ "
+"ತೋರಿಸà³à²¤à³à²¤à²¦à³†."
+
+#: 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/widget/date_time.html:3
+msgid "Date:"
+msgstr "ದಿನಾಂಕ:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ಸಮಯ:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "ಈಗ:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "ಬದಲಿಸಿ / ಬದಲಾವಣೆ :"
+
+#: contrib/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 ""
+"ಇದೠಮೇಲಿನಂತೆ ಸಂಪೂರà³à²£ "
+"ಪಥವಾದರೂ ಆಗಿರಬಹà³à²¦à³ ಅಥವಾ "
+"'http://'ದಿಂದ ಆರಂಭವಾಗà³à²µ ಸಂಪೂರà³à²£ URL "
+"ಆಗಿರಬಹà³à²¦à³."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "ಪà³à²¨à²°à³à²¨à²¿à²°à³à²¦à³‡à²¶à²¨"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "ಪà³à²¨à²°à³à²¨à²¿à²°à³à²¦à³‡à²¶à²¨(ಗಳà³)"
+
+#: 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/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 ""
+"೩೦ ಅಥವಾ ಕಡಿಮೆ ಅಕà³à²·à²°à²—ಳೠ"
+"ಅವಶà³à²¯. ( ಅಕà³à²·à²°à²—ಳೠ, ಅಂಕೆಗಳೠ"
+"ಮತà³à²¤à³ ಅಂಡರà³à²¸à³à²•à³‹à²°à³(_) ಗಳೠ"
+"ಮಾತà³à²°)"
+
+#: 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 "ವಿ-ಅಂಚೆ ವಿಳಾಸ"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "ಪà³à²°à²µà³‡à²¶à²ªà²¦"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr " '[algo]$[salt]$[hexdigest]' ಬಳಸಿ"
+
+#: 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:256
+msgid "message"
+msgstr "ಸಂದೇಶ"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"ನಿಮà³à²® ಜಾಲವೀಕà³à²·à²•à²¦à²²à³à²²à²¿ "
+"ಕà³à²•à³€à²—ಳೠ"
+"ಸಕà³à²°à²¿à²¯à²—ೊಳಿಸಲà³à²ªà²Ÿà³à²Ÿà²‚ತಿಲà³à²². "
+"ಒಳಬರಲೠಕà³à²•à³€à²—ಳೠಅಗತà³à²¯. "
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "ಈ ಖಾತೆಯೠನಿಷà³à²•à³à²°à²¿à²¯à²µà²¾à²—ಿದೆ"
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr ""
+"ಪೈಥಾನೠಮಾಡೆಲೠಕà³à²²à²¾à²¸à²¿à²¨ ಹೆಸರà³"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "ಒಳವಿಷಯದ ಬಗೆ"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "ಒಳವಿಷಯದ ಬಗೆಗಳà³"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "ಅಧಿವೇಶನದ ಕೀಲಿಕೈ"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "ಅಧಿವೇಶನದ ದತà³à²¤à²¾à²‚ಶ"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "ಅವಧಿಮೀರà³à²µ ದಿನಾಂಕ"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "ಅಧಿವೇಶನ"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+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 "ತಾಣಗಳà³"
+
+#: 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/timesince.py:12
+msgid "year"
+msgstr "ವರà³à²·"
+
+#: utils/timesince.py:13
+msgid "month"
+msgstr "ತಿಂಗಳà³"
+
+#: utils/timesince.py:14
+msgid "week"
+msgstr "ವಾರ"
+
+#: utils/timesince.py:15
+msgid "day"
+msgstr "ದಿನ"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgstr "ಘಂಟೆ"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgstr "ನಿಮಿಷ"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ಅರೇಬಿಕà³"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "ಬೆಂಗಾಲಿ"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "à²à³†à²•à³"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "ವೆಲà³à²·à³"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "ಡà³à²¯à²¾à²¨à²¿à²·à³"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "ಜರà³à²®à²¨à³"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "ಗà³à²°à³€à²•à³"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ಇಂಗà³à²²à²¿à²·à³"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "ಸà³à²ªà³à²¯à²¾à²¨à²¿à²·à³"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "ಅರà³à²œà³†à²‚ಟೈನಾದ ಸà³à²ªà³à²¯à²¾à²¨à²¿à²·à³"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "ಫಿನà³à²¨à²¿à²¶à³"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "ಫà³à²°à³†à²‚ಚà³"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "ಗà³à²¯à²¾à²²à²¿à²¶à²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "ಹಂಗೇರಿಯನà³"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "ಹೀಬà³à²°à³‚"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "à²à²¸à³â€à²²à³à²¯à²¾à²‚ಡಿಕà³"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "ಇಟಾಲಿಯನà³"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "ಜಪಾನೀಸà³"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "ಡಚà³"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "ನಾರà³à²µà³‡à²œà²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "ಬà³à²°à²¾à²à²¿à²²à²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "ರೋಮೇನಿಯನà³"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "ರಶಿಯನà³"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "ಸà³à²²à³‹à²µà²¾à²•à³"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "ಸà³à²²à³‹à²µà³‡à²¨à²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "ಸೆರà³à²¬à²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "ಸà³à²µà³€à²¡à²¿à²·à³"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "ತಮಿಳà³"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "ಟರà³à²•à²¿à²¶à³"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "ಯà³à²•à³à²°à³‡à²¨à²¿à²¯à²¨à³"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "ಸರಳೀಕೃತ ಚೈನೀಸà³"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "ಸಂಪà³à²°à²¦à²¾à²¯à²¿à²• ಚೈನೀಸೠ"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"ಈ ಬೆಲೆಯೠಕೇವಲ ಅಕà³à²·à²°à²—ಳೠ, "
+"ಅಂಕೆಗಳೠಮತà³à²¤à³ ಅಂಡರà³à²¸à³à²•à³‹à²°à³(_) "
+"ಗಳನà³à²¨à³ ಒಳಗೊಂಡಿರಬೇಕà³"
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"ಈ ಬೆಲೆಯೠಅಕà³à²·à²°à²—ಳೠ, ಅಂಕೆಗಳೠ, "
+"ಅಡಿಗೆರೆ ಅರà³à²¥à²¾à²¤à³ "
+"ಅಂಡರà³à²¸à³à²•à³‹à²°à³(_) ,ಅಡà³à²¡à²—ೆರೆ "
+"ಅರà³à²¥à²¾à²¤à³ ಡà³à²¯à²¾à²·à³(-) ಮತà³à²¤à³ "
+"ಓರೆಗೆರೆ ಅರà³à²¥à²¾à²¤à³ ಸà³à²²à³à²¯à²¾à²¶à³ (/) "
+"ಗಳನà³à²¨à³ ಒಳಗೊಳà³à²³à²¬à²¹à³à²¦à³."
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"ಈ ಬೆಲೆಯೠಕೇವಲ ಅಕà³à²·à²°à²—ಳೠ, "
+"ಅಂಕೆಗಳೠಮತà³à²¤à³ ಅಂಡರà³à²¸à³à²•à³‹à²°à³(_) "
+"ಮತà³à²¤à³ ಹೈಫನà³(-)ಗಳನà³à²¨à³ "
+"ಒಳಗೊಂಡಿರಬೇಕà³"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+"ಇಂಗà³à²²à³€à²·à³ ದೊಡà³à²¡à²•à³à²·à²°à²—ಳನà³à²¨à³ "
+"ಇಲà³à²²à²¿ ಬಳಸà³à²µà²‚ತಿಲà³à²²"
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+"ಇಂಗà³à²²à³€à²·à³ ಸಣà³à²£à²•à³à²·à²°à²—ಳನà³à²¨à³ "
+"ಇಲà³à²²à²¿ ಬಳಸà³à²µà²‚ತಿಲà³à²²"
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr ""
+"ಅಲà³à²ªà²µà²¿à²°à²¾à²®(,)ಗಳಿಂದ ಬೇರà³à²ªà²Ÿà³à²Ÿ "
+"ಅಂಕೆಗಳನà³à²¨à³ ಮಾತà³à²° ಬರೆಯಿರಿ."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+"ಇ-ಅಂಚೆಗಳ ವಿಳಾಸಗಳನà³à²¨à³, "
+"ಅಲà³à²ªà²µà²¿à²°à²¾à²®(,)ಗಳಿಂದ "
+"ಬೇರà³à²ªà²Ÿà³à²Ÿà²¿à²°à³à²µà²‚ತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "ಸರಿಯಾದ IP ವಿಳಾಸ ಬರೆಯಿರಿ"
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "ಇಲà³à²²à²¿ ಖಾಲಿ ಬಿಡà³à²µà²‚ತಿಲà³à²²"
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+"ಅಂಕೆಗಳಲà³à²²à²¦à³† ಯಾವದೇ "
+"ಅಕà³à²·à²°à²—ಳನà³à²¨à³ ಇಲà³à²²à²¿ "
+"ಬಳಸà³à²µà²‚ತಿಲà³à²²"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+"ಈ ಬೆಲೆಯಲà³à²²à²¿ ಅಂಕೆಗಳಷà³à²Ÿà³‡ "
+"ಇರà³à²µà²‚ತಿಲà³à²²"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "ಪೂರà³à²£à²¾à²‚ಕವೊಂದನà³à²¨à³ ಬರೆಯಿರಿ"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+"ವರà³à²£à²®à²¾à²²à³†à²¯ ಅಕà³à²·à²°à²—ಳನà³à²¨à³ "
+"ಮಾತà³à²° ಇಲà³à²²à²¿ ಬಳಸಬಹà³à²¦à³."
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr ""
+"ವರà³à²·à²µà³ ೧೯೦೦ ಅಥವಾ "
+"ನಂತರದà³à²¦à²¿à²°à²¬à³‡à²•à³."
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "ತಪà³à²ªà³ ದಿನಾಂಕ: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+"ಸರಿಯಾದ ದಿನಾಂಕವನà³à²¨à³ "
+"ವವವವ-ತಿತಿ-ದಿದಿ ರೀತಿಗೆ "
+"ಹೊಂದà³à²µà²‚ತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+"HH:MM ರೂಪದಲà³à²²à²¿ ಸರಿಯಾದ ಸಮಯವನà³à²¨à³ "
+"ಬರೆಯಿರಿ"
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"ಸರಿಯಾದ ದಿನಾಂಕ/ವೇಳೆಯನà³à²¨à³ "
+"ವವವವ-ತಿತಿ-ದಿದಿ ಗಗ:ನಿನಿ "
+"ರೀತಿಗೆ ಹೊಂದà³à²µà²‚ತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr ""
+"ಕà³à²°à²®à²¬à²¦à³à²§ ವಿ-ವಿಳಾಸವೊಂದನà³à²¨à³ "
+"ಇಲà³à²²à²¿ ಬರೆಯಿರಿ"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"ಯಾವದೇ ಕಡತವನà³à²¨à³‚ "
+"ಸಲà³à²²à²¿à²¸à²²à²¾à²—ಿಲà³à²².ನಮೂನೆಯ ಮೇಲಿನ "
+"ಸಂಕೇತೀಕರಣ ಬಗೆಯನà³à²¨à³ "
+"ಪರೀಕà³à²·à²¿à²¸à²¿."
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"ಸರಿಯಾದ ಚಿತà³à²°à²µà²¨à³à²¨à³ à²à²°à²¿à²¸à²¿. "
+"ನೀವೠà²à²°à²¿à²¸à²¿à²¦ ಕಡತವೠಚಿತà³à²°à²µà²²à³à²² "
+"ಅಥವಾ ಅದೠಕೆಟà³à²Ÿà³ ಹೋಗಿರà³à²µ "
+"ಚಿತà³à²°. "
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+"%s URL ಸರಿಯಾದ ಚಿತà³à²°à²¦à³†à²¡à³†à²—ೆ "
+"ಒಯà³à²¯à³à²¤à³à²¤à²¿à²²à³à²²."
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"ದೂರವಾಣಿ ಅಂಕೆಗಳೠXXX-XXX-XXXX "
+"ರೀತಿಯಲà³à²²à²¿à²°à²¬à³‡à²•à³. \"%s\" "
+"ತಪà³à²ªà²¾à²—ಿರà³à²¤à³à²¤à²¦à³†."
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+"%s URL ಸರಿಯಾದ ಕà³à²µà²¿à²•à³â€à²Ÿà³ˆà²®à³ "
+"ದೃಶà³à²¯à²¦à³†à²¡à³†à²—ೆ ಒಯà³à²¯à³à²¤à³à²¤à²¿à²²à³à²²."
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "ಸರಿಯಾದ URL ಅವಶà³à²¯à²µà²¿à²¦à³†"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"ಸರಿಯಾದ HTML ಅವಶà³à²¯. ಇಲà³à²²à²¿à²¨ "
+"ನಿರà³à²¦à²¿à²·à³à²Ÿ ತಪà³à²ªà³à²—ಳà³:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "ತಪà³à²ªà³ XML: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "ತಪà³à²ªà³ URL: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s ಈ URL ಮà³à²°à²¿à²¦ ಕೊಂಡಿಯಾಗಿದೆ."
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+" ಅಮೇರಿಕೆಯ ಸಂಯà³à²•à³à²¤ ಸಂಸà³à²¥à²¾à²¨à²¦ "
+"ರಾಜà³à²¯à²¦ ಸರಿಯಾದ "
+"ಸಂಕà³à²·à²¿à²ªà³à²¤à²°à³‚ಪವನà³à²¨à³ ಕೊಡಿ."
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr ""
+"ನಾಲಿಗೆ ಬಿಗಿ ಹಿಡಿಯಿರಿ! %s "
+"ಶಬà³à²¦à²µà²¨à³à²¨à³ ಇಲà³à²²à²¿ "
+"ಬಳಸà³à²µà²‚ತಿಲà³à²²."
+"ನಾಲಿಗೆ ಬಿಗಿ ಹಿಡಿಯಿರಿ! %s ಈ "
+"ಶಬà³à²¦à²—ಳನà³à²¨à³ ಇಲà³à²²à²¿ "
+"ಬಳಸà³à²µà²‚ತಿಲà³à²²."
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+"ಈ ಅಂಶವೠ'%s' ಅಂಶದೊಂದಿಗೆ "
+"ಹೊಂದಿಕೊಳà³à²³à²¬à³‡à²•à³."
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr ""
+"ಕನಿಷà³à²  ಒಂದೠಅಂಶದಲà³à²²à²¿ "
+"à²à²¨à²¨à³à²¨à²¾à²¦à²°à³‚ ಬರೆಯಿರಿ."
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"ಎರಡೂ ಅಂಶಗಳನà³à²¨à³ ಭರತಿ ಮಾಡಿರಿ "
+"ಅಥವಾ ಎರಡನà³à²¨à³‚ ಖಾಲಿಯಾಗಿಡಿ."
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+" %(field)s ಇದೠ%(value)s ಆಗಿದà³à²¦à²°à³† ಈ "
+"ಅಂಶವನà³à²¨à³ ಕೊಡಲೇಬೇಕà³"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+" %(field)s ಇದೠ%(value)s ಆಗಿಲà³à²²à²¦à²¿à²¦à³à²¦à²°à³† ಈ "
+"ಅಂಶವನà³à²¨à³ ಕೊಡಲೇಬೇಕà³"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr ""
+"ಪಡಿಯಚà³à²šà³à²¬à³†à²²à³†à²—ಳಿಗೆ "
+"ಅನà³à²®à²¤à²¿à²¯à²¿à²²à³à²²"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "ಈ ಬೆಲೆಯೠ%sದ ಘಾತವಾಗಿರಬೇಕà³."
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³† ಬರೆಯಿರಿ"
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ಹೆಚà³à²šà³†à²‚ದರೆ "
+"ಒಟà³à²Ÿà³ %s ಅಂಕೆ ಇರà³à²µà²‚ತೆ - "
+"ಬರೆಯಿರಿ."
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ಹೆಚà³à²šà³†à²‚ದರೆ "
+"ಒಟà³à²Ÿà³ %s ಅಂಕೆಗಳೠಇರà³à²µà²‚ತೆ - "
+"ಬರೆಯಿರಿ."
+
+#: core/validators.py:381
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ಪೂರà³à²£à²¾à²‚ಕ ಭಾಗವೠ"
+"ಹೆಚà³à²šà³†à²‚ದರೆ ಒಟà³à²Ÿà³ %s ಅಂಕೆ "
+"ಇರà³à²µà²‚ತೆ - ಬರೆಯಿರಿ."
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ಪೂರà³à²£à²¾à²‚ಕ ಭಾಗವೠ"
+"ಹೆಚà³à²šà³†à²‚ದರೆ ಒಟà³à²Ÿà³ %s ಅಂಕೆಗಳೠ"
+"ಇರà³à²µà²‚ತೆ - ಬರೆಯಿರಿ."
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ದಶಮಾಂಶ ಭಾಗವೠ"
+"ಹೆಚà³à²šà³†à²‚ದರೆ ಒಟà³à²Ÿà³ %s ಸà³à²¥à²¾à²¨ "
+"ಇರà³à²µà²‚ತೆ - ಬರೆಯಿರಿ."
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ - ದಶಮಾಂಶ ಭಾಗವೠ"
+"ಹೆಚà³à²šà³†à²‚ದರೆ %s ಸà³à²¥à²¾à²¨à²—ಳೠ"
+"ಇರà³à²µà²‚ತೆ - ಬರೆಯಿರಿ."
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"ನೀವೠà²à²°à²¿à²¸à²¿à²¦ ಕಡತವೠಕನಿಷà³à²Ÿ %s "
+"ಬೈಟà³â€à²—ಳಷà³à²Ÿà³ ದೊಡà³à²¡à²¦à²¿à²¦à³† ಎಂದೠ"
+"ಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²¿."
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"ನೀವೠà²à²°à²¿à²¸à²¿à²¦ ಕಡತವೠ%s "
+"ಬೈಟà³â€à²—ಳಿಗಿಂತ ಹೆಚà³à²šà²¿à²°à²¦ ಹಾಗೆ "
+"ನೋಡಿಕೊಳà³à²³à²¿."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "ಈ ಅಂಶದ ಸà³à²µà²°à³‚ಪವೠತಪà³à²ªà²¾à²—ಿದೆ"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "ಈ ಅಂಶವೠತಪà³à²ªà²¾à²—ಿದೆ"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+" %s ದಿಂದ à²à²¨à²¨à³à²¨à³‚ "
+"ಹೊರತೆಗೆದà³à²•à³Šà²³à³à²³à²²à²¾à²—ಲಿಲà³à²²."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+" %(url)s ಈ URL ತಪà³à²ªà³ ಒಳವಿಷಯ-ಬಗೆಯ "
+"ಶಿರೋâ€à²­à²¾à²— '%(contenttype)s' ಅನà³à²¨à³ "
+"ಮರಳಿಸಿತà³."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ %(line)s - ಸಾಲಿನಿಂದ "
+"ಮà³à²šà³à²šà²¿à²°à²¦ %(tag)s ಟà³à²¯à²¾à²—ೠಅನà³à²¨à³ "
+"ಮà³à²šà³à²šà²¿à²°à²¿ . (ಸಾಲೠ\"%(start)s\" ಎಂದೠ"
+"ಆರಂಭವಾಗà³à²¤à³à²¤à²¦à³†.)"
+
+#: core/validators.py:503
+#, 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:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+" %(line)sನೆ ಸಾಲಿನಲà³à²²à²¿à²°à³à²µ \"%(attr)s\" "
+"ತಪà³à²ªà³ ಗà³à²£à²§à²°à³à²®à²µà²¾à²—ಿದೆ . (ಸಾಲೠ"
+"\"%(start)s\" ಎಂದೠಆರಂಭವಾಗà³à²¤à³à²¤à²¦à³†.)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+" %(line)s ನೆ ಸಾಲಿನಲà³à²²à²¿à²°à³à²µ \"<%(tag)s>\" "
+"ತಪà³à²ªà³ ಟà³à²¯à²¾à²—ೠಆಗಿದೆ . (ಸಾಲೠ"
+"\"%(start)s\" ಎಂದೠಆರಂಭವಾಗà³à²¤à³à²¤à²¦à³†.)"
+
+#: core/validators.py:517
+#, 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:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+" %(line)s ನೆ ಸಾಲಿನಲà³à²²à²¿à²°à³à²µ \"%(attr)s\" ಗೆ "
+"ತಪà³à²ªà³ ಬೆಲೆ ಇದೆ. (ಸಾಲೠ\"%(start)s\" "
+"ಎಂದೠಆರಂಭವಾಗà³à²¤à³à²¤à²¦à³†.)"
+
+#: 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 ಅನà³à²¨à³ "
+"ತೆಗೆದà³à²¹à²¾à²•à²²à²¾à²¯à²¿à²¤à³"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"ಕೊಟà³à²Ÿà²¿à²°à³à²µ %(field)sಗೆ ಈ %(type)s "
+"ಹೊಂದಿರà³à²µ %(object)s ಈಗಾಗಲೇ ಇದೆ."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+"ಈ %(fieldname)s ಹೊಂದಿರà³à²µ %(optname)s ಈಗಾಗಲೇ "
+"ಇದೆ."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "ಈ ಅಂಶ ಅಗತà³à²¯."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr ""
+"ಈ ಬೆಲೆಯೠಪೂರà³à²£ ಸಂಖà³à²¯à³† ಇರಬೇಕà³."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr ""
+"ಈ ಬೆಲೆಯೠಹೌದೠಅಥವಾ ಇಲà³à²² "
+"ಇರಬೇಕà³."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr ""
+"ಈ ಅಂಶವನà³à²¨à³ ಖಾಲಿ ಬಿಡà³à²µà²‚ತಿಲà³à²²."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr ""
+"ಸರಿಯಾದ ಕಡತದ ಹೆಸರನà³à²¨à³ "
+"ಬರೆಯಿರಿ"
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "ಸರಿಯಾದ %s ಅನà³à²¨à³ ಬರೆಯಿರಿ ."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr ""
+"ಅನೇಕ à²à²¡à²¿à²—ಳನà³à²¨à³ "
+"ಅಲà³à²ªà²µà²¿à²°à²¾à²®(,)ಗಳಿಂದ "
+"ಬೇರà³à²ªà²¡à²¿à²¸à²¿à²°à²¿"
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"ಒಂದಕà³à²•à²¿à²‚ತ ಹೆಚà³à²šà²¨à³à²¨à³ "
+"ಆಯà³à²¦à³à²•à³Šà²³à³à²³à²²à³ ಮà³à²¯à²¾à²•à³ ಗಣಕದ "
+"ಮೇಲೆ \"ಕಂಟà³à²°à³‹à²²à³\", ಅಥವಾ "
+"\"ಕಮà³à²¯à²¾à²‚ಡà³\" ಅನà³à²¨à³ ಒತà³à²¤à²¿ "
+"ಹಿಡಿಯಿರಿ."
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr ""
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ %(self)s "
+"à²à²¡à²¿à²—ಳನà³à²¨à³ ಸೂಚಿಸಿರಿ . ಈಗ "
+"ಸೂಚಿಸಿದ %(value)r ತಪà³à²ªà²¾à²—ಿದೆ."
+"ದಯವಿಟà³à²Ÿà³ ಸರಿಯಾದ %(self)s "
+"à²à²¡à²¿à²—ಳನà³à²¨à³ ಸೂಚಿಸಿರಿ . ಈಗ "
+"ಸೂಚಿಸಿದ %(value)s ತಪà³à²ªà²¾à²—ಿವೆ"
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr ""
+"ನಿಮà³à²® ಗದà³à²¯ %s ಅಕà³à²·à²°à²•à³à²•à²¿à²‚ತ "
+"ಕಡಿಮೆ ಇರà³à²µà²‚ತೆ ಜಾಗà³à²°à²¤à³† ವಹಿಸಿ."
+"ನಿಮà³à²® ಗದà³à²¯ %s ಅಕà³à²·à²°à²—ಳಿಗಿಂತ "
+"ಕಡಿಮೆ ಇರà³à²µà²‚ತೆ ಜಾಗà³à²°à²¤à³† ವಹಿಸಿ."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr ""
+" ಇಲà³à²²à²¿ "
+"ಸಾಲà³à²—ಳನà³à²¨à³à²¤à³à²‚ಡರಿಸà³à²µà²‚ತಿಲà³à²²"
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"ಸರಿಯಾದ ಆಯà³à²•à³†à²¯à²¨à³à²¨à³ "
+"ಆಯà³à²¦à³à²•à³Šà²³à³à²³à²¿à²°à²¿.'%(data)s' %(choices)s "
+"ನಲà³à²²à²¿à²²à³à²²."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "ಸಲà³à²²à²¿à²¸à²²à²¾à²¦ ಕಡತ ಖಾಲಿ ಇದೆ."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+"-೩೨,೭೬೮ ಹಾಗೂ ೩೨,೭೬೭ ರ ನಡà³à²µà²¿à²¨ "
+"ಪೂರà³à²£ ಸಂಖà³à²¯à³† ಕೊಡಿ."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "ಧನಾತà³à²®à²• ಸಂಖà³à²¯à³† ಕೊಡಿ."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+"೦ ಮತà³à²¤à³ ೩೨,೭೬೭ ರ ನಡà³à²µà²¿à²¨ ಒಂದೠ"
+"ಪೂರà³à²£à²¾à²‚ಕ ಕೊಡಿ"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "ಹೌದà³,ಇಲà³à²²,ಇರಬಹà³à²¦à³"
+
diff --git a/django/conf/locale/kn/LC_MESSAGES/djangojs.mo b/django/conf/locale/kn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..cbb9fb5ffc
--- /dev/null
+++ b/django/conf/locale/kn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/kn/LC_MESSAGES/djangojs.po b/django/conf/locale/kn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..38b4a6d341
--- /dev/null
+++ b/django/conf/locale/kn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django-kn 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-01-08 20:22+0530\n"
+"Last-Translator: Kannada Localization Team <translation@sampada.info>\n"
+"Language-Team: Kannada <translation@sampada.info>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: 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 "ಬೆಳಗಿನ ೬ ಗಂಟೆ "
+
+#: 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/conf/locale/ko/LC_MESSAGES/django.mo b/django/conf/locale/ko/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..58e97b496e
--- /dev/null
+++ b/django/conf/locale/ko/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ko/LC_MESSAGES/django.po b/django/conf/locale/ko/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..476f7316ba
--- /dev/null
+++ b/django/conf/locale/ko/LC_MESSAGES/django.po
@@ -0,0 +1,2797 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-24 12:33+0900\n"
+"PO-Revision-Date: 2007-04-06 11:04+0900\n"
+"Last-Translator: Sung-Jin Hong <serialx.net@gmail.com>\n"
+"Language-Team: Korean\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 "%(field)s ì— ìž…ë ¥ëœ ê°’ì€ %(type)s ì˜ %(object)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/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s ì˜ %(optname)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
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463 newforms/models.py:178 oldforms/__init__.py:357
+msgid "This field is required."
+msgstr "필수 항목입니다."
+
+#: 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 "ì´ í•„ë“œëŠ” null ê°’ì€ ì‚¬ìš©í•  수 없습니다. "
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "날짜는 YYYY-MM-DD 형ì‹ìœ¼ë¡œ 입력하세요."
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "날짜/ì‹œê°ì„ YYYY-MM-DD HH:MM 형ì‹ìœ¼ë¡œ 입력하세요."
+
+#: 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 ê°’ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+
+#: 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\" 키를 누른 ìƒíƒœì—ì„œ ì„ íƒí•´ 주세요.(Macì€ "
+"\"Command\" 키)"
+
+#: 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] ""
+"올바른 %(self)s ID를 입력해 주세요. %(value)r (ì€)는 ì ì ˆì¹˜ 않습니다."
+
+#: 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 "Korean"
+msgstr "한국어"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "칸나다어"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "ë¼íŠ¸ë¹„ì•„ì–´"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "마케ë„니아어"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "네ëœëž€ë“œì–´"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "노르웨ì´ì–´"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "í´ëž€ë“œì–´"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "í¬ë¥´íˆ¬ê°ˆì–´"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "브ë¼ì§ˆì–´"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "루마니아어"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "러시아어"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "슬로바키아어"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "슬로베니아어"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "세르비아어"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "스웨ë´ì–´"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "타밀어"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "텔루구어"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "터키어"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "ìš°í¬ë¼ì´ë‚˜ì–´"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "중국어 간체"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "중국어 번체"
+
+#: 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 "콤마로 êµ¬ë¶„ëœ ì´ë©”ì¼ ì£¼ì†Œë§Œ 입력하세요."
+
+#: 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:120 newforms/fields.py:128
+msgid "Enter a whole number."
+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 "ì‹œê°ì€ HH:MM 형ì‹ìœ¼ë¡œ 입력하세요."
+
+#: core/validators.py:162 newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "올바른 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하세요."
+
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "등ë¡ëœ 파ì¼ì´ 없습니다. ì¸ì½”딩 형ì‹ì„ 확ì¸í•˜ì„¸ìš”."
+
+#: 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 videoê°€ 아닙니다."
+
+#: 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 "10진수를 사용해 주세요."
+
+#: 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 ìžë¦¬ ì´í•˜ì˜ 10진수를 입력하세요."
+msgstr[1] "ì „ì²´ %s ìžë¦¬ ì´í•˜ì˜ 10진수를 입력하세요."
+
+#: 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 ìžë¦¬ ì´í•˜ì¸ 10진수를 입력하세요."
+msgstr[1] "ì •ìˆ˜ë¶€ë¶„ì´ %s ìžë¦¬ ì´í•˜ì¸ 10진수를 입력하세요."
+
+#: 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 ìžë¦¬ ì´í•˜ì¸ 10진수를 입력하세요."
+msgstr[1] "ì†Œìˆ˜ë¶€ë¶„ì´ %s ìžë¦¬ ì´í•˜ì¸ 10진수를 입력하세요."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "업로드 파ì¼ì€ %s bytes ì´ìƒìž…니다."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "업로드 파ì¼ì€ %s bytes ì´í•˜ìž…니다."
+
+#: 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 heade '%(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 ""
+"%(line)s ì¤„ì˜ %(tag)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 ""
+"%(line)s ì¤„ì˜ \"%(attr)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 ""
+"%(line)s ì¤„ì˜ \"<%(tag)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 ""
+"%(line)s ì¤„ì˜ \"%(attr)s\" ì†ì„±ì˜ ê°’ì´ ë¶€ì ì ˆí•©ë‹ˆë‹¤.(시작줄 : \"%(start)s\")"
+
+#: 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 (ì´)ê°€ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: 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 "1ì›”"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "2ì›”"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "3ì›”"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "4ì›”"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "5ì›”"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "6ì›”"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "7ì›”"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "8ì›”"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "9ì›”"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "10ì›”"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "11ì›”"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "12ì›”"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "1ì›”"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "2ì›”"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "3ì›”"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "4ì›”"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "5ì›”"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "6ì›”"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "7ì›”"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "8ì›”"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "9ì›”"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "10ì›”"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "11ì›”"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "12ì›”"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "1ì›”"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "2ì›”"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "8ì›”"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "9ì›”"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "10ì›”"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "11ì›”"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "12ì›”"
+
+#: 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/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d밀리초"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d%(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d%(type)s"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "오후"
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "오전"
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "오후"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "오전"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "ìžì •"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "정오"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: 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: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: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:364 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 (ì´)ê°€ ì„ íƒê°€ëŠ¥í•­ëª©ì— 없습니다."
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:577
+msgid "Unknown"
+msgstr "알 수 없습니다."
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "Yes"
+msgstr "예"
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "No"
+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/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"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "1"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "2"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "3"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "4"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "5"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "6"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "7"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "8"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "9"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "로그 아웃"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
+msgid "name"
+msgstr "ì´ë¦„"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "코드명"
+
+#: contrib/auth/models.py:43
+msgid "permission"
+msgstr "허가"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
+msgid "permissions"
+msgstr "허가"
+
+#: contrib/auth/models.py:62
+msgid "group"
+msgstr "그룹"
+
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
+msgid "groups"
+msgstr "그룹"
+
+#: contrib/auth/models.py:93
+msgid "username"
+msgstr "사용ìžëª…"
+
+#: contrib/auth/models.py:93
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "필수항목입니다. 30ìž ì´ë‚´ë¡œ 입력하세요.(알파벳, 숫ìž, '_' 만 가능)"
+
+#: contrib/auth/models.py:94
+msgid "first name"
+msgstr "ì´ë¦„"
+
+#: contrib/auth/models.py:95
+msgid "last name"
+msgstr "성"
+
+#: contrib/auth/models.py:96
+msgid "e-mail address"
+msgstr "ì´ë©”ì¼ ì£¼ì†Œ"
+
+#: contrib/auth/models.py:97
+msgid "password"
+msgstr "비밀번호"
+
+#: contrib/auth/models.py:97
+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:98
+msgid "staff status"
+msgstr "스태프 권한"
+
+#: contrib/auth/models.py:98
+msgid "Designates whether the user can log into this admin site."
+msgstr "사용ìžê°€ 관리사ì´íŠ¸ì— 로그ì¸ì´ 가능한지를 나타냅니다."
+
+#: contrib/auth/models.py:99
+msgid "active"
+msgstr "활성"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "사용ìžê°€ 'Django 관리'ì— ë¡œê·¸ì¸ì´ 가능한지를 나타냅니다."
+
+#: contrib/auth/models.py:100
+msgid "superuser status"
+msgstr "최ìƒìœ„ ì‚¬ìš©ìž ê¶Œí•œ"
+
+#: contrib/auth/models.py:100
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "해당 사용ìžì—게 모든 ê¶Œí•œì„ í—ˆê°€í•©ë‹ˆë‹¤."
+
+#: contrib/auth/models.py:101
+msgid "last login"
+msgstr "마지막 로그ì¸"
+
+#: contrib/auth/models.py:102
+msgid "date joined"
+msgstr "등ë¡ì¼"
+
+#: contrib/auth/models.py:104
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "해당 사용ìžì—게 ì†í•´ìžˆëŠ” ê·¸ë£¹ì˜ ëª¨ë“  ê¶Œí•œì„ í—ˆê°€í•©ë‹ˆë‹¤."
+
+#: contrib/auth/models.py:105
+msgid "user permissions"
+msgstr "ì‚¬ìš©ìž ê¶Œí•œ"
+
+#: contrib/auth/models.py:109
+msgid "user"
+msgstr "사용ìž"
+
+#: contrib/auth/models.py:110
+msgid "users"
+msgstr "사용ìž(들)"
+
+#: contrib/auth/models.py:116
+msgid "Personal info"
+msgstr "ê°œì¸ì •ë³´"
+
+#: contrib/auth/models.py:117
+msgid "Permissions"
+msgstr "권한"
+
+#: contrib/auth/models.py:118
+msgid "Important dates"
+msgstr "중요한 ì¼ì •"
+
+#: contrib/auth/models.py:119
+msgid "Groups"
+msgstr "그룹"
+
+#: contrib/auth/models.py:263
+msgid "message"
+msgstr "메시지"
+
+#: contrib/auth/models.py:276
+#, fuzzy
+msgid "AnonymousUser"
+msgstr "ìµëª…사용ìž"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "해당 사용ìžëª…ì€ ì´ë¯¸ 존재합니다."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"사용하시는 브ë¼ìš°ì €ê°€ 쿠키를 허용하지 않습니다.로그ì¸í•˜ê¸° 위해서는 쿠키 사용"
+"ì´ í•„ìš”í•©ë‹ˆë‹¤."
+
+#: contrib/auth/forms.py: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 ""
+"ì´ë©”ì¼ì£¼ì†Œì™€ ì¼ì¹˜í•˜ëŠ” 사용ìžê°€ 없습니다.ì´ ì´ë©”ì¼ì£¼ì†Œë¡œ 등ë¡í•˜ì…¨ìŠµë‹ˆê¹Œ?"
+
+#: 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/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/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 "rating #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "rating #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "rating #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "rating #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "rating #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "rating #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "rating #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "rating #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 "콘í…츠 오브ì íŠ¸"
+
+#: 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 "%(user)s (ì´)ê°€ %(score)d ì  ë¶€ì—¬í–ˆìŠµë‹ˆë‹¤."
+
+#: 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 ""
+
+#: 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 "해당 코멘트 í¼ì€ '미리보기'와 'post' ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다."
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "ì´ë¦„:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "코멘트:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "코멘트 미리보기"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "사용ìžëª…"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.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/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+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/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/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/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 "오브ì íŠ¸ ì•„ì´ë””"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "오브ì íŠ¸ 표현"
+
+#: 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/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+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 ""
+"사용하시는 브ë¼ìš°ì €ê°€ 쿠키 ì‚¬ìš©ì„ í—ˆê°€í•˜ê³  있지 않습니다.쿠키 ì‚¬ìš©ì„ ì²´í¬í•˜ì‹œ"
+"ê³  다시 ì‹œë„í•´ 주세요."
+
+#: 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 "ì´ë©”ì¼ ì£¼ì†Œì™€ 사용ìžëª…ì€ ë‹¤ë¦…ë‹ˆë‹¤. '%s'를 사용하세요."
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" (ì´)ê°€ 추가ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "계ì†í•´ì„œ 편집하실 수 있습니다."
+
+#: 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"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+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 "%(name)s ì— %(fieldname)s (ì´)ê°€ 하나 ì´ìƒ 있는 %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s ì— %(fieldname)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/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(ì°¸ ë˜ëŠ” 거짓)"
+
+#: 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 "ì´ë©”ì¼ ì£¼ì†Œ"
+
+#: 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 "10진수"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "boolean (ì°¸, 거짓 ë˜ëŠ” 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 (ì€)는 url íŒ¨í„´ì˜ ì˜¤ë¸Œì íŠ¸ê°€ 아닙니다."
+
+#: 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/admin/object_history.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/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "문서"
+
+#: contrib/admin/templates/admin/object_history.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/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "비밀번호 변경"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "홈"
+
+#: 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 "ë…„/ì›”/ì¼ ì‹œ:분:ì´ˆ"
+
+#: 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 ""
+"오브ì íŠ¸ì— ë³€ê²½ì‚¬í•­ì´ ì—†ìŠµë‹ˆë‹¤.ì´ admin 사ì´íŠ¸ë¥¼ 통해 ì¶”ê°€ëœ ì‚¬í•­ì´ ì•„ë‹™ë‹ˆë‹¤."
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s 추가"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s (으)로"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "서버 오류"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "서버 오류 (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "서버 오류 <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/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/pagination.html:10
+msgid "Show all"
+msgstr "ëª¨ë‘ í‘œì‹œ"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django 사ì´íŠ¸ 관리"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 관리"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+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/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:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "추가"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "변경"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "수정할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "최근 액션"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "ë‚˜ì˜ ì•¡ì…˜"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "ì´ìš©í•  수 없습니다."
+
+#: contrib/admin/templates/admin/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/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+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/submit_line.html:4
+msgid "Save as new"
+msgstr "새로 저장"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "저장 ë° ë‹¤ë¥¸ ì´ë¦„으로 추가"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "저장 ë° íŽ¸ì§‘ 계ì†"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "저장"
+
+#: contrib/admin/templates/admin/auth/user/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/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "비밀번호"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "비밀번호 (확ì¸)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "확ì¸ì„ 위해 위와 ë™ì¼í•œ 비밀번호를 입력하세요. "
+
+#: 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/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "비밀번호 변경"
+
+#: 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:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "비밀번호 초기화"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"비밀번호를 잊으셨나요? ì•„ëž˜ì— ë¹„ë°€ë²ˆí˜¸ë¥¼ 입력하시면비밀전호를 초기화 í•œ 후, "
+"새로운 비밀번호를 보내드리겠습니다."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ì´ë©”ì¼ ì£¼ì†Œ:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "비밀번호 초기화"
+
+#: contrib/admin/templates/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_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: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_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "비밀번호가 초기화 ë˜ì—ˆìŒì„ 알려드립니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(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/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ë¶ë§ˆí¬ë¦¿"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "문서 ë¶ë§ˆí¬ë¦¿"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\"> ë¶ë§ˆí¬ë¦¿ì„ 설치하시려면 ë§í¬ë¥¼ ë¶ë§ˆí¬ 툴바로 드래그 하거"
+"나,\n"
+"오른쪽 í´ë¦­ìœ¼ë¡œ 해당 ë§í¬ë¥¼ ë¶ë§ˆí¬ì— 추가하세요.\n"
+"ì´ì œ 사ì´íŠ¸ ë‚´ì˜ ëª¨ë“  페ì´ì§€ì—ì„œ ë¶ë§ˆí¬ë¦¿ ì„ íƒì´ 가능합니다.\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 "오브ì íŠ¸ ì•„ì´ë”” 표시"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "ë‹¨ì¼ ì˜¤ë¸Œì íŠ¸ 페ì´ì§€ì˜ 고유 ì•„ì´ë””와 컨í…츠 íƒ€ìž…ì„ í‘œì‹œí•©ë‹ˆë‹¤."
+
+#: 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/localflavor/au/forms.py:18
+#,
+msgid "Enter a 4 digit post code."
+msgstr "우편번호를 입력하세요. (xxxx)"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "우편번호를 입력하세요. (xxx xxx)"
+
+#: 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 "우편번호를 입력하세요.(xxx xxx)"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "우변번호를 입력하세요.(xxxxxx ë˜ëŠ” xxx-xxx)"
+
+#: 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/it/forms.py:16
+#,
+msgid "Enter a valid zip code."
+msgstr "올바른 우편번호를 입력하세요."
+
+#: contrib/localflavor/it/forms.py:41
+#,
+msgid "Enter a valid Social Security number."
+msgstr "올바른 Social Security number를 입력하세요."
+
+#: contrib/localflavor/it/forms.py:68
+#,
+msgid "Enter a valid VAT number."
+msgstr "올바른 VAT번호를 입력하세요."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+#,
+msgid "Enter a valid Finnish social security number."
+msgstr "올바른 핀란드 Social Security number를 입력하세요."
+
+#: 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
+#, fuzzy
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+"전화번호는 xx-xxxx-xxxx 형ì‹ìœ¼ë¡œ 입력하세요."
+
+#: contrib/localflavor/no/forms.py:15
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "우편번호를 입력하세요.(xxx xxx)"
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "10진수를 사용해 주세요."
+
+#: 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
+#, fuzzy
+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
+#, fuzzy
+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
+#, fuzzy
+msgid "Saarland"
+msgstr "카탈로니아어"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "우변번호를 입력하세요.(xxxxxx ë˜ëŠ” xxx-xxx)"
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "예, 아니오, 아마ë„"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: 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] "%s ìž ì´í•˜ë¡œ 입력해 주세요."
+
+#: 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:674
+msgid "The submitted file is empty."
+msgstr "입력하신 파ì¼ì€ 빈 파ì¼ìž…니다."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 ~ 32,767 사ì´ì˜ 정수를 입력하세요."
+
+#: 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 ~ 32,767 사ì´ì˜ 정수를 입력하세요."
diff --git a/django/conf/locale/ko/LC_MESSAGES/djangojs.mo b/django/conf/locale/ko/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..7b70530c1a
--- /dev/null
+++ b/django/conf/locale/ko/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/ko/LC_MESSAGES/djangojs.po b/django/conf/locale/ko/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..d76174c3a3
--- /dev/null
+++ b/django/conf/locale/ko/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-06 11:10+0900\n"
+"PO-Revision-Date: 2007-04-06 11:15+0900\n"
+"Last-Translator: Hyun Mi Ae <happyhyun@gmail.com>\n"
+"Language-Team: Korean\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "1ì›” 2ì›” 3ì›” 4ì›” 5ì›” 6ì›” 7ì›” 8ì›” 9ì›” 10ì›” 11ì›” 12ì›”"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ì¼ ì›” í™” 수 목 금 토"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ì¼ìš”ì¼ ì›”ìš”ì¼ í™”ìš”ì¼ ìˆ˜ìš”ì¼ ëª©ìš”ì¼ ê¸ˆìš”ì¼ í† ìš”ì¼"
+
+#: contrib/admin/media/js/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/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "보기"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "ê°ì¶”기"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "현재"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "시계"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "시간 ì„ íƒ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "ìžì •"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "오전 6시"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "정오"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "취소"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "오늘"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "달력"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "어제"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "ë‚´ì¼"
diff --git a/django/conf/locale/lv/LC_MESSAGES/django.mo b/django/conf/locale/lv/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..e3cd24cfb7
--- /dev/null
+++ b/django/conf/locale/lv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/lv/LC_MESSAGES/django.po b/django/conf/locale/lv/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..bf73a61615
--- /dev/null
+++ b/django/conf/locale/lv/LC_MESSAGES/django.po
@@ -0,0 +1,2865 @@
+# Django Latvian translation.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# ARVIS BICKOVSKIS <viestards.lists@gmail.com>, 2006.
+#
+# , fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-07 23:28+0300\n"
+"PO-Revision-Date: 2007-05-08 00:35+0300\n"
+"Last-Translator: Gatis Tomsons <gatis.tomsons@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: oldforms/__init__.py:357
+#: db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:612
+#: db/models/fields/__init__.py:623
+#: newforms/models.py:178
+#: newforms/fields.py:80
+#: newforms/fields.py:376
+#: newforms/fields.py:452
+#: newforms/fields.py:463
+msgid "This field is required."
+msgstr "Å is lauks ir obligÄts."
+
+#: 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] ""
+msgstr[1] ""
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "PÄrneÅ¡ana jaunÄ rindÄ Å¡eit nav atļauta."
+
+#: 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 ""
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "NezinÄms"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "JÄ"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "NÄ“"
+
+#: 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 "JÅ«su norÄdÄ«tais fails ir tukÅ¡s."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Ievadiet veselu skaitli intervÄlÄ no -32,768 lÄ«dz 32,767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Ievadiet pozitīvu skaitli."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Ievadiet veselu skaitli intervÄla starp 0 un 32,767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "un"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "VÄ“rtÄ«bai ir jÄbÅ«t veselam skaitlim."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "VÄ“rtÄ«bai jÄbÅ«t True vai False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Šis lauks nevar būt null"
+
+#: db/models/fields/__init__.py:459
+#: core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Ievadiet korektu datumu YYYY-MM-DD formÄtÄ."
+
+#: db/models/fields/__init__.py:528
+#: core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Ievadiet korektu datumu/laiku YYYY-MM-DD HH:MM formÄtÄ."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "Ievadiet korektu faila vÄrdu."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "Å ai vÄ“rtÄ«bai jÄbÅ«t None, True vai False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "LÅ«dzu ievadiet korektu %s"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Atdaliet vairÄkus ID ar komatiem."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ArÄbu"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "BengÄļu"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "ÄŒehu"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Velsas"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "DÄņu"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "VÄcu"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "GrieÄ·u"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Angļu"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Spaņu"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "ArgentÄ«nieÅ¡u SpÄņu"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Somu"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "FranÄu"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galīciešu"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "UngÄru"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandiešu"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "ItÄļu"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "JapÄņu"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Koreiešu"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "KanÄda"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Latviešu"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Maķedoniešu"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "DÄņu"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norvēģu"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Poļu"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "PortugÄļu"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brazīliešu"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "RumÄņu"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Krievu"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "SlovÄku"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Slovēņu"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbu"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Zviedru"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamiliešu"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Turku"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ukraiņu"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "VienkÄrÅ¡Ä Ä·Ä«nieÅ¡u"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "TradicionÄlÄ Ä·Ä«nieÅ¡u"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras."
+
+#: core/validators.py:68
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras, svītras vai šķērssvītras."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras vai šķērssvītras."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "AugÅ¡Ä“jÄ reÄ£istra burti nav atļauti."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "ApakÅ¡Ä“jÄ reÄ£istra burti nav atļauti."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Ievadiet tikai numurus, kas atdalīti ar komatiem."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Ievadiet korektas e-pasta adreses, kas atdalītas ar komatiem."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "LÅ«dzu ievadiet korektu IP adresi."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Tukšas vērtības nav atļautas."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ne ciparu simboli nav atļauti."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Šī vērtība nevar saturēt tikai ciparus."
+
+#: core/validators.py:120
+#: newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Ievadiet veselus skaitļus."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Atļauti tikai alfabētiskie simboli."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Gadam jabÅ«t 1900 vai vÄ“lÄkam."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Nekorekts datums: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Ievadiet korektu laiku HH:MM formÄtÄ"
+
+#: core/validators.py:162
+#: newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "Ievadiet korektu e-pasta adresi."
+
+#: core/validators.py:178
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "AugÅ¡upielÄdÄ“jiet korektu attÄ“lu. Fails, ko JÅ«s augÅ¡upielÄdÄ“jÄt nav attÄ“ls vai arÄ« bojÄts attÄ“la fails."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s nesatur korektu attēlu."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefona numuriem jÄbÅ«t XXX-XXX-XXXX formÄtÄ. \"%s\" is nekorekts."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s nenorÄda uz korektu QuickTime video."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "ReÄls URL obligÄts."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Korekts HTML ir obligÄts. SpecifiskÄs kļūdas:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Slikti formēts XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Nekorekts URL: %s"
+
+#: core/validators.py:244
+#: core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s ir salauzta saite."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Ievadiet korektu ASV štata abriviatūru."
+
+#: 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] "Seko saviem vÄrdiem! VÄrds %s nav atļauts Å¡eit."
+msgstr[1] "Seko saviem vÄrdiem! VÄrdi %s nav atļauts Å¡eit."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Laukam jÄsaskan ar %s lauku."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "LÅ«dzu ievadiet kaut ko vismaz vienÄ laukÄ."
+
+#: core/validators.py:301
+#: core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "LÅ«dzu ievadiet abus laukus vai atstÄjiet abus tukÅ¡us."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Å is lauks ir jÄaizpilda, ja %(field)s ir vienÄds %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Å is lauks ir jÄaizpilda, ja %(field)s nav vienÄds %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Duplicētas vērtības nav atļautas."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Å ai vÄ“rtÄ«bai jÄbÅ«t starp %(lower)s un %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Å ai vÄ“rtÄ«bai jÄbÅ«t vismaz %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Å ai vÄ“rtÄ«ba nedrÄ«kst pÄrsniegt %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Å ai vÄ“rtÄ«bai jÄbÅ«t %s pakÄpei."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "LÅ«dzu ievadiet korektu decimÄlu numuru."
+
+#: 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] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu %s."
+msgstr[1] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu %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] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu %s."
+msgstr[1] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu %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] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu aiz komata %s."
+msgstr[1] "LÅ«dzu ievadiet korektu decimÄlu numuru ar maksimÄlu ciparu skaitu aiz komata %s."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "PÄrliecinieties, ka jÅ«su augÅ¡upielÄdÄ“tais fails ir vismaz %s baiti liels."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "PÄrliecinieties, ka jÅ«su augÅ¡upielÄdÄ“tais fails ir maksimums %s baiti liels."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Å Ä« faila formÄts ir nekorekts."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Å is lauks ir nekorekts."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nevar neko no %s"
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s atgrieza nekorektu Content-Type headeri '%(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 "LÅ«dzu aiztaisiet neaiztaisÄ«to %(tag)s tagu no rindas nr %(line)s. (Rinda sÄkas ar \"%(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 ""
+
+#: core/validators.py:552
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:557
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s tika veiksmīgi izveidots."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s tika veiksmīgi dzēsts."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s tika dzēsts."
+
+#: newforms/models.py:165
+#: newforms/fields.py:364
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "IzvÄ“laties pareizu izvÄ“li. JÅ«su izvÄ“lÄ“tais objekts neietilpst pieejamo sarakstÄ."
+
+#: newforms/models.py:182
+#: newforms/fields.py:380
+#: newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "Ievadiet sarakstu ar vÄ“rtÄ«bÄm."
+
+#: newforms/models.py:188
+#: newforms/fields.py:389
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "IzvÄ“lieties pareizu izvÄ“li. %s nav pieejamo izvēļu sarakstÄ."
+
+#: newforms/fields.py:103
+#: newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "VÄ“rtÄ«bai jasatur ne vairÄk, kÄ %d rakstzÄ«mju."
+
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Vērtībai jasatur vismaz %d rakstzīmju."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Å ai vÄ“rtÄ«bai jabÅ«t mazÄkai vai vienÄdai ar %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "VÄ“rtÄ«bai jabÅ«t lielÄkai vai vienÄdai ar %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Ievadiet korektu datumu."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Ievadiet korektu laiku."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Ievadiet korektu datumu/laiku."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Ievadiet korektu vērtību."
+
+#: newforms/fields.py:289
+#: newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Ievadiet korektu adresi."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Å Ä« adrese ir bojÄta."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "saits"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "nd"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "viens"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "divi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "trīs"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "Äetri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "pieci"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seši"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "septiņi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "astoņi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "deviņi"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "novirzīt(redirect) no"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Tam jÄbÅ«t absolÅ«tajam ceļam, ieskaitot domÄ“na vÄrdu. PiemÄ“ram: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "novirzīt(redirect) uz"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Tas ir vai nu absolÅ«tais ceļš (kÄ pirms tam) vai pilnais URL, kas sÄkas ar 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "novirzīt"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "novirzījumi"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objekta ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "virsraksts"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentÄrs"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "reitings #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "reitings #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "reitings #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "reitings #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "reitings #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "reitings #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "reitings #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "reitings #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "korekts reitings"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "ievietošanas datums/laiks"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "publisks"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP adrese"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "idzēsts"
+
+#: 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 "AtÄ·eksÄ“jiet, ja komentÄrs ir neatbilstoÅ¡s. Paziņojums A \"Å is komentÄrs ir izdzÄ“sts\" tiks parÄdÄ«ts tai vietÄ."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentÄri"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Satura objekts"
+
+#: 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 ""
+"Pievienojis %(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 "personas vÄrds"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adrese"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "apstiprinÄjusi administrÄcija"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "brÄ«vais komentÄrs"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "brÄ«vie komentÄri"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "rezultÄts"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "rezultÄta datums"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karmas rezultÄts"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karmas rezultÄti"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d reitingu publicējis %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Å o komentÄru atzÄ«mÄ“jis %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "atzīmēšanas datums"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "lietotÄja atzÄ«me"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "lietotÄja atzÄ«mes"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Atzīmējis %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "dzēšanas datums"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderÄcijas dzÄ“Å¡ana"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderÄcijas dzÄ“Å¡anas"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "ModerÄcijas dzÄ“Å¡ana, veicis %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "AnonÄ«mie lietotÄji nedrÄ«kst balsot"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "InvalÄ«ds komentÄru ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nedrīkst balsot par sevi"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Å is reiting ir obligÄts jo JÅ«s ievietojÄt vismaz vienu citu reitingu."
+
+#: 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] ""
+"Å o komentÄru ir ievietojis lietotÄjs, kas ievietojis mazÄk kÄ %(count)s komentÄru:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Å o komentÄru ir ievietojis lietotÄjs, kas ievietojis mazÄk kÄ %(count)s komentÄrus:\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 ""
+"Å o komentÄru ieviejis pavirÅ¡s lietotÄjs:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Atļauti tikai POST izsaukumi"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Viens vai vairÄki pieprasÄ«tie lauki netika ievadÄ«ti"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "KÄds ir iejaucies komentÄru formÄ (droÅ¡Ä«bas traucÄ“jums)"
+
+#: 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 "KomentÄru forma ir nekorekts 'target' parametrs -- objekta ID bija nepareizs"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "KomentÄru forma nenodroÅ¡inÄja 'preview' vai 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "LietotÄja vÄrds:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Log out"
+msgstr "Izlogoties"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Parole:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esat aizmirsis savu paroli?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Reitings"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Pieprasīts"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "NeobligÄts"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Ievietojiet fotogrÄfiju"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "KomentÄrs:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "PirmsskatÄ«t komentÄru"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "JÅ«su vÄrds:"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domÄ“na vÄrds"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "izvadÄmais vÄrds"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "saits"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "saiti"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Visi"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Jebkuršs datums"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Å odien"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "PÄ“dÄ“jÄs 7 dienas"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Šomēnes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Å ogad"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "darbības laiks"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekta id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekta attēlojunms"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "darbības atzīme"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "momainīt paziņojumu"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "žurnÄla ieraksts"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "žurnÄla ieraksti"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Visi datumi"
+
+#: contrib/admin/views/auth.py:19
+#: contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" pievienots sekmīgi."
+
+#: contrib/admin/views/auth.py:24
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "JÅ«s varat labot to atkal zemÄk."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Pievienot lietotÄju"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Paroles maiņa notikusi veiksmīgi."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Paroles maiņa: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Saita administrÄcija"
+
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "JÅ«s varat pievienot vÄ“l vienu %s zemÄk."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Pievienot %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Pievienots %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Izmainīts %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Izdzēsts %s"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Neviens lauks nav izmainīts"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" nomainīts sekmīgi."
+
+#: 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\" pievienots sekmÄ«gi. JÅ«s to varat regiģēt zemÄk."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Izmainīt %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" sekmīgi izdzēsts."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Vai esat pÄrliecinÄts?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Izmainīt vēsturi: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Izvēlēties %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Izvēlēties %s lai izmainītu"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "DatubÄzes kļūda"
+
+#: contrib/admin/views/decorators.py:10
+#: contrib/auth/forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "LÅ«dzu ievadiet lietotÄjvÄrdu un paroli. Atceraties ka abi lauki ir reÄ£istrjÅ«tÄ«gi."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Pieslēdzieties"
+
+#: 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 "LÅ«dzu pieslÄ“dzieties vÄ“lreiz, jo jÅ«su sesija ir novecojusi. Neuztraucieties: JÅ«su ievadÄ«tie dati ir saglabÄti."
+
+#: 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 "IzskatÄs, ka JÅ«su pÄrlÅ«ks neatbalsta sÄ«kdatnes (cookies). LÅ«dzu ieslÄ“dziet sÄ«kdatņu atbalstu, pÄrlÄdÄ“jiet lapu un mÄ“Ä£iniet vÄ“lreiz."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "LietotÄjvÄrdi nevar saturÄ“t simbolu '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "JÅ«su e-pasta adrese nav jÅ«su lietotÄjvÄrds. Lietojiet '%s' tÄ vietÄ."
+
+#: 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 "filtrs:"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "skats:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "AplikÄcija %r netika atrasta"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modelis:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "saistītie `%(label)s.%(name)s` objekti"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "visi %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Vesels skaitlis"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Pareizs vai Nepareizs)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Virkne (līdz pat %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Ar komatu atdalīti veselie skaitļi"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Datums (bez laika)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Datums (ar laiku)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-pasta adrese"
+
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Faila ceļš"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "DecimÄls skaitlis"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Loģiskais (Pareizs vai Nepareizs)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "RelÄcija uz vecÄka modeli"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Telefona numurs"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Teksts"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Laiks"
+
+#: contrib/admin/views/doc.py:315
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "ASV Å¡tats (divi augÅ¡Ä“jÄ reÄ£istra burti)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML teksts"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Patreiz:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Nomainīt:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datums:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Laiks:"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "DokumentÄcija"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Change password"
+msgstr "Paroles maiņa"
+
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "SÄkums"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pievienot %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " PÄ“c %(filter_title)s "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "VÄ“sture"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datums/laiks"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "LietotÄjs"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "darbība"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Å im objektam nav izmaiņu vÄ“sture. Tas visdrÄ«zÄk nav pievienots izmantojot administrÄcijas saitu."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Aiziet!"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "RÄdÄ«t visu"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django saita administrÄcija"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administrēšana"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Servera kļūda"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Servera kļūda (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Servera kļūda <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 "Ir notikusi kļūda. Tas ir paziņots saita administratoriem ar e-pasta starpniecÄ«bu un visdrÄ«zÄkajÄ laikÄ tiks izlabots. Paldies par sapratni."
+
+#: 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 "Kaut kas nav kÄrtÄ«bÄ ar JÅ«su datubÄzes instalÄciju. PÄrliecinieties vai attiecÄ«gÄs tabulas ir izveidotas un attiecÄ«gajam lietotÄjam ir tiesÄ«bas lasÄ«t datubÄzi."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeļi, kas pieejami %(name)s aplikÄcijÄ."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Pievienot"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Izmainīt"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Jums nav tiesības jebko labot."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "NesenÄs darbÄ«bas"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Manas darbības"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nav pieejams"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Lapa nav atrasta"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "MÄ“s atvainojamies, bet pieprasÄ«tÄ lapa nevar tikt atrasta."
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtrs"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "ApskatÄ«t saitÄ"
+
+#: 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] "LÅ«dzu izlabojiet kļūdu zemÄk"
+msgstr[1] "LÅ«dzu izlabojiet kļūdas zemÄk"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "SakÄrtoÅ¡ana"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "SakÄrtojums:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Dzēst"
+
+#: 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 "Izdzēšot objektu %(object_name)s '%(escaped_object)s' tiks dzēsti visi saistītie objekti , bet Jums nav tiesību dzēst sekojošus objektu tipus:"
+
+#: 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 "Vai esat pÄrliecinÄts, ka vÄ“laties dzÄ“st %(object_name)s \"%(escaped_object)s\"? Tiks dzÄ“sti asrÄ« sekojoÅ¡i saistÄ«tie objekti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "JÄ, es esmu pÄrliecinÄts"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "SveicinÄti,"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "SaglabÄt kÄ jaunu"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "SaglabÄt un pievienot vÄ“l vienu"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "SaglabÄt un turpinÄt laboÅ¡anu"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "SaglabÄt"
+
+#: 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 "Ievadiet jaunu paroli lietotÄjam <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Parole"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Parole (vēlreiz)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Ievadot tÄdu paÅ¡u paroli, kÄ augstÄk, pÄrbaudei."
+
+#: 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 "LietotÄja vÄrds"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Paroles maiņa"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Paroles nomaiņa sekmīga"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Jūsu parole ir nomainīta."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Paroles pÄrstatÄ«Å¡ana(reset)"
+
+#: 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 "Esat aizmirsuÅ¡i savu paroli? Ievadiet e-pasta adresi zemÄk un mÄ“s pÄrstatÄ«sim JÅ«su paroli un aizsÅ«tÄ«sim jaunu pa e-pastu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-pasta adrese:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Paroles pÄrstatÄ«Å¡ana"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Paldies par pavadÄ«to laiku mÄja lapÄ."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Pieslēgties vēlreiz"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Paroles pÄrstatÄ«Å¡ana sekmÄ«ga"
+
+#: 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 "MÄ“s aizsÅ«tÄ«jÄm pa e-pastu jaunu paroli, ko JÅ«s esat apstiprinÄjis. JÅ«s to drÄ«zumÄ saņemsiet."
+
+#: 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 "DroÅ¡Ä«bas nolÅ«kos ievadiet veco paroli un pÄ“c tam ievadiet JÅ«su jauno paroli divreiz lai mÄ“s varÄ“tu pÄrbaudÄ«t, vai tÄ ir uzrakstÄ«ta pareizi."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "VecÄ parole:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "JaunÄ parole:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "ApstiprinÄt paroli:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Nomainīt manu paroli"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "JÅ«s esat saņēmuÅ¡i Å¡o e-pastu sakarÄ ar JÅ«su pieprasÄ«to paroles pÄrstatÄ«Å¡anu"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "JÅ«su lietotÄja kontam %(site_name)s saitÄ"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "JÅ«su jaunais parole ir: %(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 "Jūs vienmēr varat nomainīt šo paroli aizejot uz šo lapu:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "JÅ«su lietotÄjvÄrds, ja gadÄ«jumÄ JÅ«s esat to aizmirsis:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Paldies par mūsu saita lietošanu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komanda"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "GrÄmatzÄ«mes"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "DokumentÄcijas grÄmatzÄ«mes"
+
+#: 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 ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "DokumentÄcija Å¡ai lapai"
+
+#: 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 "PÄrvieto jÅ«s no jebkuras lapas dokumentÄcijÄ uz skatu, kas Ä£enerÄ“ Å¡o lapu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "ParÄdÄ«t objekta 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 "ParÄda content-type un unikÄlo ID lapÄm, kas atspoguļo vientuļu objektu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Labot Å¡o objektu (patreizÄ“jÄ logÄ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "PÄriet uz admininstrÄcijas lapu tÄm lapÄm, kas atspoguļo vientuļu objektu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Labot Å¡o lapu (jaunÄ logÄ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "TÄpat kÄ iepriekÅ¡, tikai atver administrÄcijas lapu jaunÄ logÄ."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python modeļa klases nosaukums"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "satura tips"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "satura tips"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Izlogojies"
+
+#: contrib/auth/models.py:44
+#: contrib/auth/models.py:64
+msgid "name"
+msgstr "nosaukums"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "kods"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "tiesība"
+
+#: contrib/auth/models.py:50
+#: contrib/auth/models.py:65
+msgid "permissions"
+msgstr "tiesības"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:69
+#: contrib/auth/models.py:109
+msgid "groups"
+msgstr "grupas"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "lietotÄja vÄrds"
+
+#: contrib/auth/models.py:99
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr ""
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "vÄrds"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "uzvÄrds"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "e-pasta adrese"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "parole"
+
+#: contrib/auth/models.py:103
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "personÄla statuss"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "AtzÄ«mÄ“jiet, ja vÄ“laties, lai lietotÄjs var pieslÄ“gties administrÄcijas lapÄ."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "aktīvs"
+
+#: contrib/auth/models.py:105
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Nosaka, ka lietotÄjs var pieslÄ“gties Django administrÄcijas lapai. Ieteicams atcelt Å¡o izvÄ“li nevis dzÄ“st lietotÄjus."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "superlietotÄja statuss"
+
+#: contrib/auth/models.py:106
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr ""
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "pēdējoreiz pieslēdzies"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "datums, kad pievienojies"
+
+#: contrib/auth/models.py:110
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Papildus manuÄli pieÅ¡Ä·irtajÄm atļaujÄm, Å¡is lietotÄjs papildus iegÅ«s visas atļaujas, kas pieÅ¡Ä·irtas grupÄm, kurÄs lietotÄjs atrodas."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "lietotÄja atļaujas"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "lietotÄjs"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "lietotÄji"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "PersonÄ«gÄ informÄcija"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "Atļaujas"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Svarīgi datumi"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Grupas"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "ziņojums"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "AnonÄ«ms lietotÄjs"
+
+#: 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 "LietotÄjs ar Å¡Ädu lietotÄja vÄrdu jau eksistÄ“."
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "IzskatÄs, ka JÅ«su pÄrlÅ«ks neatbalsta cookies. Cookies ir obligÄtas, lai pieslÄ“gtos."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Šis konts ir neaktīvs."
+
+#: contrib/auth/forms.py:85
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr ""
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Abi \"JaunÄ parole\" lauki nesakrÄ«t."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "JÅ«su iepriekÅ¡Ä“jÄ parole tika ievadÄ«ta nekorekti. LÅ«dzu ievadiet to atkÄrtoti."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Ievadiet pasta indeksu. Atstarpe ir nepiecieÅ¡ama starp abÄm pasta indeksa daļÄm."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Ievadiet pasta indeksu XXXXX-XXX formÄtÄ."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefona numuriem jÄbÅ«t XXX-XXXX-XXXX formÄtÄ."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Šis lauks drīkst saturēt tikai skaitļus."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Šī lauka vērtībai jabūt vismaz 11 cipariem vai 14 simboliem."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Å im laukam jasastÄv vismaz no 14 cipariem."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Ievadiet pasta indeksu, kurÅ¡ sastÄv no 4 cipariem."
+
+#: contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Ievadiet pasta indeksu formÄtÄ XXXXX."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/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 "Hamburga"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "sesija"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Ievadiet korektu vÄcieÅ¡u identifikÄcijas nummuru XXXXXXXXXXX-XXXXXXX-XXXXXXX-X formÄtÄ."
+
+#: 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
+#, fuzzy
+msgid "Iwate"
+msgstr "Datums:"
+
+#: 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 "Tokija"
+
+#: 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
+#, fuzzy
+msgid "Shimane"
+msgstr "Izmainīt"
+
+#: 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
+#, fuzzy
+msgid "Ehime"
+msgstr "Laiks"
+
+#: 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 "Okinava"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Ievadiet pasta indeksu XXXXXXX vai XXX-XXXX formÄtÄ."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr "lietotÄja vÄrds"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr "Grupas"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr "lietotÄja vÄrds"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr "Ceturdiena"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr "aug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Ievadiet pasta indeksu formÄtÄ XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "LÅ«dzu ievadiet korektu Å¡veicieÅ¡u identifikÄcijas vai pases nummuru X1234567<0 vai 1234567890 formÄtÄ."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "LÅ«dzu ievadiet korektu islandieÅ¡u identifikÄcijas nummuru XXXXXX-XXXX formÄtÄ."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "IslandieÅ¡u identifikÄcijas nummurs nav korekts."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Ievadiet korektu pasta indeksu."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Ievadiet korektu sociÄlÄs droÅ¡Ä«bas nummuru."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Ievadiet korektu VAT nummuru."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "LÅ«dzu ievadiet korektu norvÄ“Ä£u sociÄlÄs droÅ¡Ä«bas nummuru."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Ievadiet korektu ÄÄ«lieÅ¡u RUT XX.XXX.XXX-X formÄtÄ."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Ievadiet korektu ÄÄ«lieÅ¡u RUT"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Ievadiet korektu somu sociÄlÄs droÅ¡Ä«bas nummuru."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "sesijas atslēga"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "sesijas dati"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "beigu datums"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesija"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesijas"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "PiemÄ“ram: '/about/contact/'. PÄrliecinieties, ka esat ievietojuÅ¡i sÄkuma un beigu slÄ«psvÄ«tras."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "virsraksts"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "saturs"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ieslÄ“gt komentÄrus"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Å¡ablona nosaukums"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "PiemÄ“ram: 'flatpages/contact_page.html'. Ja tas nav norÄdÄ«ts, sistÄ“ma lietos 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "reÄ£istrÄcija obligÄta"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ja tas ir atzÄ«mÄ“ts, tikai lietotÄji, kas ir pieslÄ“guÅ¡ies sistÄ“mÄs redzÄ“s Å¡o lapu."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "vienkÄrÅ¡a lapa"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "vienkÄrÅ¡as lapas"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pirmdiena"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Otrdiena"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Trešdiena"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Ceturdiena"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Piektdiena"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sestdiena"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Svētdiena"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "JanvÄris"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "FebruÄris"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "Marts"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "Aprīlis"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "Maijs"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "JÅ«nijs"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "JÅ«lijs"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Augusts"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembris"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktobris"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembris"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Decembris"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jūn"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jūl"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "gads"
+msgstr[1] "gadi"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mēnesis"
+msgstr[1] "mēneši"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "nedēļa"
+msgstr[1] "nedēļas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diena"
+msgstr[1] "dienas"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "stunda"
+msgstr[1] "stundas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minūte"
+msgstr[1] "minūtes"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d millisekundes"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:40
+#, fuzzy
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+#, fuzzy
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+#, fuzzy
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+#, fuzzy
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "pusnakts"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "dienas vidus"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "jÄ,nÄ“,varbÅ«t"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
diff --git a/django/conf/locale/lv/LC_MESSAGES/djangojs.mo b/django/conf/locale/lv/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..1835996a67
--- /dev/null
+++ b/django/conf/locale/lv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/lv/LC_MESSAGES/djangojs.po b/django/conf/locale/lv/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..4c904ab068
--- /dev/null
+++ b/django/conf/locale/lv/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-02-15 10:46+1100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Gatis Tomsons <gatis.tomsons@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "Pieejams %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izvēlēties visu"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Pievienot"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Izņemt"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izvēlies %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izvēlies un klikšķini"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Attīrīt visu"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "JanvÄris FebruÄris Marts AprÄ«lis Maijs JÅ«nijs JÅ«lijs Augusts Septembris Oktobris Novembris"
+"Decembris"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Svētdiena Pirmdiena Otrdiena Trešdiena Ceturtdiena Piektdiena Sestdiena"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Tagad"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Pulkstens"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Izvēlieties laiku"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Pusnakts"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Pusdienas laiks"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Atcelt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Å odien"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "KalendÄrs"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Vakar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "RÄ«t"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "ParÄdÄ«t"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Slēpt"
diff --git a/django/conf/locale/mk/LC_MESSAGES/django.mo b/django/conf/locale/mk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..e67d94fae1
--- /dev/null
+++ b/django/conf/locale/mk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/mk/LC_MESSAGES/django.po b/django/conf/locale/mk/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..b0a9c92c08
--- /dev/null
+++ b/django/conf/locale/mk/LC_MESSAGES/django.po
@@ -0,0 +1,2755 @@
+# translation of django.po to Macedonian
+#
+# Georgi Stanojevski <glisha@gmail.com>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-07 19:51+0200\n"
+"PO-Revision-Date: 2007-04-07 20:29+0200\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\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."
+
+#: 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 "Одвојте ги идентификационите броеви Ñо запирки."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно."
+
+#: 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 идентификацион број. Оваа вредноÑÑ‚ %"
+"(value)r е неправилна."
+msgstr[1] ""
+"Ве молам внеÑете правилен %(self)s идентификацион број. ВредноÑтите %(value)"
+"r Ñе неправилни."
+
+#: 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 "Оваа вредноÑÑ‚ мора да биде или точно или неточно."
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "Оваа вредноÑÑ‚ неможе да биде null."
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "ВнеÑете правилен датум во форматот ГГГГ-ММ-ДД."
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "ВнеÑете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ."
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "ВнеÑите правилно име на датотека."
+
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "Оваа вредноÑÑ‚ мора да биде празна, точно или неточно."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ÐрапÑки"
+
+#: 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 "Традиционален кинеÑки"
+
+#: 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 "ВнеÑете валидни адреÑи за е-пошта одделени Ñо запирки."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Ве молам внеÑете валидна ИП адреÑа."
+
+#: 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:120 newforms/fields.py:128
+msgid "Enter a whole number."
+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 "ВнеÑете правилно време во форматот HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "ВнеÑeте правилна адреÑа за е-пошта."
+
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ðе беше пратена датотека. Проверете го типот на енкодирање на формата."
+
+#: 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 "ÐдреÑата %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 "ÐдреÑата „%s“ не покажува кон QuickTime видео."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Задолжителна е правилна адреÑа."
+
+#: 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 "Ðеправилна адреÑа: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "ÐдреÑата %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 цифрa."
+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)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“)."
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Двете полиња Ñо лозинките не Ñе Ñовпаѓаат."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Веќе поÑтои кориÑник Ñо тоа кориÑничко име."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Ðе изгледа дека вашиот прелиÑтувач има овозможено колачиња. Колачињата Ñе "
+"потребни за да Ñе најавите."
+
+#: contrib/auth/forms.py: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 ""
+"Ðема региÑтрирано кориÑник Ñо оваа адреÑа за е-пошта. Сигурни ли Ñте дека "
+"Ñте региÑтрирани?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Двете нови лозинки не Ñе Ñовпаѓаат."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ðе ја внеÑовте точно вашата Ñтара лозинка. Ве молам внеÑете ја повторно."
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
+msgid "name"
+msgstr "име"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "кодно име"
+
+#: contrib/auth/models.py:43
+msgid "permission"
+msgstr "привилегија"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
+msgid "permissions"
+msgstr "привилегии"
+
+#: contrib/auth/models.py:62
+msgid "group"
+msgstr "група"
+
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
+msgid "groups"
+msgstr "групи"
+
+#: contrib/auth/models.py:93
+msgid "username"
+msgstr "кориÑничко име"
+
+#: contrib/auth/models.py:93
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Дозволени Ñе најмногу 30 знаци. Дозволени Ñе Ñамо алфанумерички знаци "
+"(букви, цифри и долна црта)."
+
+#: contrib/auth/models.py:94
+msgid "first name"
+msgstr "име"
+
+#: contrib/auth/models.py:95
+msgid "last name"
+msgstr "презиме"
+
+#: contrib/auth/models.py:96
+msgid "e-mail address"
+msgstr "е-пошта"
+
+#: contrib/auth/models.py:97
+msgid "password"
+msgstr "лозинка"
+
+#: contrib/auth/models.py:97
+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:98
+msgid "staff status"
+msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° админиÑтраторите"
+
+#: contrib/auth/models.py:98
+msgid "Designates whether the user can log into this admin site."
+msgstr "Означува дали кориÑникот може да Ñе логира во Ñајтот за админиÑтрација."
+
+#: contrib/auth/models.py:99
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Означува дали кориÑникот може да Ñе логира. Одштиклирајте го ова намеÑто да "
+"бришете кориÑници."
+
+#: contrib/auth/models.py:100
+msgid "superuser status"
+msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° ÑуперкориÑник"
+
+#: contrib/auth/models.py:100
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Означува дека овој кориÑник ги има Ñите привилегии без екÑплицитно да Ñе "
+"доделуваат Ñите."
+
+#: contrib/auth/models.py:101
+msgid "last login"
+msgstr "поÑледна најава"
+
+#: contrib/auth/models.py:102
+msgid "date joined"
+msgstr "датум на зачленување"
+
+#: contrib/auth/models.py:104
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Како дополнување на рачно доделени привилегии, овој кориÑник ќе ги добие "
+"автоматÑки и Ñите привилегии за Ñекоја група во која тој/таа членува."
+
+#: contrib/auth/models.py:105
+msgid "user permissions"
+msgstr "кориÑнички привилегии"
+
+#: contrib/auth/models.py:109
+msgid "user"
+msgstr "кориÑник"
+
+#: contrib/auth/models.py:110
+msgid "users"
+msgstr "кориÑници"
+
+#: contrib/auth/models.py:116
+msgid "Personal info"
+msgstr "Лични информации"
+
+#: contrib/auth/models.py:117
+msgid "Permissions"
+msgstr "Привилегии"
+
+#: contrib/auth/models.py:118
+msgid "Important dates"
+msgstr "Важни датуми"
+
+#: contrib/auth/models.py:119
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:263
+msgid "message"
+msgstr "порака"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Одјавен"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "време на акција"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "идентификационен број на објект"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "object 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/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/filterspecs.py:143 oldforms/__init__.py:577
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "Да"
+
+#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:577
+#: newforms/widgets.py:174
+msgid "No"
+msgstr "Ðе"
+
+#: contrib/admin/filterspecs.py:150 oldforms/__init__.py:577
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "Ðепознато"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+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 ""
+"Изгледа дека вашиот прелиÑтувач не е конфигуриран да прифаќа колачиња. Ве "
+"молам овозможете ги колачињата, превчитајте ја Ñтрата и пробајте повторно."
+
+#: 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 "Вашата е-пошта не е вашето кориÑничко име. Пробајте Ñо „%s“."
+
+#: 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/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 "Логичка (или точно или неточно)"
+
+#: 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 "ÐдреÑа на е-пошта"
+
+#: 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:304 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "ИП адреÑа"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Логичка (точно,неточно или празно)"
+
+#: 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:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: 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 не изгледа дека е url објект"
+
+#: 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"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Сите датуми"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Прикажи ги Ñите"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: 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/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: 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/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Одјава"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Home"
+msgstr "Дома"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+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/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/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Додади"
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+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/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Од %(filter_title)s "
+
+#: 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/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додади %(name)s"
+
+#: 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/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 M Y, H:i"
+
+#: 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/500.html:4
+msgid "Server error"
+msgstr "Грешка Ñо Ñерверот"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Грешка Ñо Ñерверот (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Грешка Ñо Ñерверот <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/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/filters.html:4
+msgid "Filter"
+msgstr "Филтер"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "КориÑник:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Лозинка:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+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/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Обележувачи"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Обележувачи на документација"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">За да инÑталирате обележувачи, влечете ја врÑката до "
+"вашата\n"
+"лента Ñо алатки, или кликнете Ñо деÑното копче и додадете го во вашите \n"
+"обележувачи. Сега може да го изберете обележувачот од било која Ñтраница "
+"на \n"
+"Ñајтот. Имајте на ум дека за некои од овие обележувачи е потребно да го "
+"гледате \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 "Прикажи идентификационен број на објектот"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Го прикажува типот на Ñодржината и уникатниот идентификационен број за "
+"Ñтраници кои претÑтавуваат единечен објект."
+
+#: 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/widget/date_time.html:3
+msgid "Date:"
+msgstr "Датум:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Време:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Моментално:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Измена:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "РеÑетирање на лозинка"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Сте ја заборавиле вашата лозинка? ВнеÑете ја вашата е-пошта подолу, ќе ја "
+"реÑетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Е-пошта:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "РеÑетирај ја мојата лозинка"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ја добивата оваа порака бидејќи побаравте да Ñе реÑетира вашата лозинка"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "за кориÑничката Ñметка на %(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/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_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/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/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: 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 трилион"
+
+#: 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/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ðа пр. „/za/kontakt/“. ОÑигурајте Ñе да имате коÑа црта и на крајот и на "
+"почетокот."
+
+#: 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/kontakt.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/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 ""
+"Ова треба да биде апÑолутна патека без името на домејнот. Ðа пр. „/nastani/"
+"prebaraj/“."
+
+#: 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 ""
+"Ова може да биде или апÑолутна патека (како погоре) или цела адреÑа "
+"почувајќи Ñо „http://“."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "пренаÑочување"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "пренаÑочувања"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "object 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: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 "ип адреÑа"
+
+#: 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/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ðнонимните кориÑници неможе да глаÑаат"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ðевалидно ИД на коментарот"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Ðема глаÑање за Ñамиот Ñебе"
+
+#: contrib/comments/views/comments.py:27
+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“ параметар - идентификациониот "
+"број на објектот беше неправилен"
+
+#: 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/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/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/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "ВнеÑете правилен поштенÑки број во формат XXXXXX."
+
+#: contrib/localflavor/de/forms.py:60
+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/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "ВнеÑте правилен финÑки матичен број."
+
+#: 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/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/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "ВнеÑете поштенÑки број. Задолжително е празно меÑто помеѓу двата дела на поштенÑкиот број."
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "ВнеÑете поштенÑки број во форматот 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/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "има на клаÑата на питон моделите"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "content type"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "content types"
+
+#: 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] "ОÑигурајте Ñе дека вашиот текÑÑ‚ има помалку од %s знаци."
+
+#: 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:674
+msgid "The submitted file is empty."
+msgstr "Пратената датотека е празна."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "ВнеÑете цел број помеѓу -32,768 и 32,767."
+
+#: 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 и 32,767."
+
+#: 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 беше избришан."
+
+#: 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/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/dateformat.py:40
+msgid "p.m."
+msgstr "попладне"
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "наутро"
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "попладне"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "наутро"
+
+#: 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 M Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "j M 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 "F j"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "да, не, можеби"
+
+#: 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: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:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "ВнеÑете правилна адреÑа."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Оваа адреÑа изгледа дека не е доÑтапна."
+
+#: 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 не е еден од доÑтапните вредноÑти."
+
diff --git a/django/conf/locale/mk/LC_MESSAGES/djangojs.mo b/django/conf/locale/mk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..64971dc55e
--- /dev/null
+++ b/django/conf/locale/mk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/mk/LC_MESSAGES/djangojs.po b/django/conf/locale/mk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..0c06326fd5
--- /dev/null
+++ b/django/conf/locale/mk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# translation of djangojs.po to Macedonian
+#
+# Georgi Stanojevski <glisha@gmail.com>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-02-15 10:53+1100\n"
+"PO-Revision-Date: 2007-02-24 13:49+0100\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: 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:32
+#: 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:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Ðедела Понеделник Вторник Среда Четврток Петок Сабота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "РП В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Сега"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "ЧаÑовник"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Избери време"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Полноќ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 наутро"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Пладне"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Откажи"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "ДенеÑка"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Календар"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Утре"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Прикажи"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Скриј"
+
diff --git a/django/conf/locale/nl/LC_MESSAGES/django.mo b/django/conf/locale/nl/LC_MESSAGES/django.mo
index abc387aeea..4c70c28ff4 100644
--- a/django/conf/locale/nl/LC_MESSAGES/django.mo
+++ b/django/conf/locale/nl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/nl/LC_MESSAGES/django.po b/django/conf/locale/nl/LC_MESSAGES/django.po
index bba721b56a..9aaeef8af9 100644
--- a/django/conf/locale/nl/LC_MESSAGES/django.po
+++ b/django/conf/locale/nl/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 17:21+0200\n"
+"POT-Creation-Date: 2006-12-09 15:51+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Johan C. Stöver <johan@nilling.nl>\n"
"Language-Team: \n"
@@ -17,29 +17,34 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: db/models/manipulators.py:302
+#: db/models/manipulators.py:305
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr ""
"%(object)s van het type %(type)s bestaat al voor het gegeven %(field)s."
-#: db/models/fields/related.py:43
+#: db/models/manipulators.py:306 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "en"
+
+#: db/models/fields/related.py:51
#, python-format
msgid "Please enter a valid %s."
-msgstr "Geef een geldig IP adres."
+msgstr "Geef een geldig %s veld."
-#: db/models/fields/related.py:579
+#: db/models/fields/related.py:618
msgid "Separate multiple IDs with commas."
msgstr "Scheid meerdere ID's door komma's."
-#: db/models/fields/related.py:581
+#: db/models/fields/related.py:620
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Houd \"Control\", of \"Command\" op een Mac, ingedrukt om meerdere te "
"selecteren."
-#: db/models/fields/related.py:625
+#: db/models/fields/related.py:664
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@@ -47,150 +52,178 @@ msgid_plural ""
msgstr[0] "Geef een geldig %(self)s IDs. De waarde %(value)r is ongeldig."
msgstr[1] "Geef een geldig %(self)s IDs. De waarden %(value)r zijn ongeldig."
-#: db/models/fields/__init__.py:40
+#: db/models/fields/__init__.py:41
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(optname)s met deze %(fieldname)s bestaat al."
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
+#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266
+#: db/models/fields/__init__.py:560 db/models/fields/__init__.py:571
+#: forms/__init__.py:352 newforms/fields.py:60 newforms/fields.py:288
msgid "This field is required."
msgstr "Dit veld is verplicht."
-#: db/models/fields/__init__.py:337
+#: db/models/fields/__init__.py:349
msgid "This value must be an integer."
msgstr "De waarde moet een geheel getal zijn."
-#: db/models/fields/__init__.py:369
+#: db/models/fields/__init__.py:381
msgid "This value must be either True or False."
msgstr "De waarde moet of True (waar) of False (onwaar) zijn."
-#: db/models/fields/__init__.py:385
+#: db/models/fields/__init__.py:397
msgid "This field cannot be null."
msgstr "Dit veld mag niet leeg zijn."
-#: db/models/fields/__init__.py:468 core/validators.py:132
+#: db/models/fields/__init__.py:424 core/validators.py:147
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Geef een geldige datum in JJJJ-MM-DD formaat."
+
+#: db/models/fields/__init__.py:486 core/validators.py:156
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "Geef geldige datum/tijd in JJJJ-MM-DD UU:MM formaat."
-#: db/models/fields/__init__.py:562
+#: db/models/fields/__init__.py:580
msgid "Enter a valid filename."
msgstr "Geef een geldige bestandsnaam."
-#: conf/global_settings.py:37
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: conf/global_settings.py:40
msgid "Bengali"
msgstr "Bengaals"
-#: conf/global_settings.py:38
+#: conf/global_settings.py:41
msgid "Czech"
msgstr "Tjechisch"
-#: conf/global_settings.py:39
+#: conf/global_settings.py:42
msgid "Welsh"
msgstr "Wels"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:43
msgid "Danish"
msgstr "Deens"
-#: conf/global_settings.py:41
+#: conf/global_settings.py:44
msgid "German"
msgstr "Duits"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:45
msgid "Greek"
msgstr "Grieks"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:46
msgid "English"
msgstr "Engels"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:47
msgid "Spanish"
msgstr "Spaans"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "Argentijns Spaans"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "Fins"
+
+#: conf/global_settings.py:50
msgid "French"
msgstr "Frans"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:51
msgid "Galician"
msgstr "Galicisch"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:52
msgid "Hungarian"
msgstr "Hongaars"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:53
msgid "Hebrew"
msgstr "Hebreews"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:54
msgid "Icelandic"
msgstr "IJslands"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:55
msgid "Italian"
msgstr "Italiaans"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:56
msgid "Japanese"
msgstr "Japans"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:57
msgid "Dutch"
msgstr "Nederlands"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:58
msgid "Norwegian"
msgstr "Noors"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:59
+msgid "Polish"
+msgstr "Pools"
+
+#: conf/global_settings.py:60
msgid "Brazilian"
msgstr "Braziliaans"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:61
msgid "Romanian"
msgstr "Roemeens"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:62
msgid "Russian"
msgstr "Russisch"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:63
msgid "Slovak"
msgstr "Slovaaks"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:64
msgid "Slovenian"
msgstr "Sloveens"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:65
msgid "Serbian"
msgstr "Servisch"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:66
msgid "Swedish"
msgstr "Zweeds"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:67
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:68
+msgid "Turkish"
+msgstr "Turks"
+
+#: conf/global_settings.py:69
msgid "Ukrainian"
msgstr "Oekraïens"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:70
msgid "Simplified Chinese"
msgstr "Vereenvoudigd Chinees"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:71
msgid "Traditional Chinese"
msgstr "Traditioneel Chinees"
-#: core/validators.py:60
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "Deze waarde mag alleen letters, getallen en liggende strepen bevatten."
-#: core/validators.py:64
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
@@ -199,58 +232,73 @@ msgstr ""
"bevatten."
#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Deze waarde mag alleen letters, cijfers, liggende strepen en verbindingsstrepen "
+"bevatten."
+
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "Hoofdletters zijn hier niet toegestaan."
-#: core/validators.py:76
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "Kleine letters zijn hier niet toegestaan."
-#: core/validators.py:83
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "Geef alleen cijfers op, gescheiden door komma's."
-#: core/validators.py:95
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Geef geldige e-mailadressen op, gescheiden door komma's."
-#: core/validators.py:99
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "Geef een geldig IP adres op."
-#: core/validators.py:103
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "Lege waarden zijn hier niet toegestaan."
-#: core/validators.py:107
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "Niet-numerieke karakters zijn hier niet toegestaan."
-#: core/validators.py:111
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "Deze waarde kan niet alleen uit cijfers bestaan."
-#: core/validators.py:116
+#: core/validators.py:120 newforms/fields.py:103
msgid "Enter a whole number."
msgstr "Geef een geheel getal op."
-#: core/validators.py:120
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "Alleen alfabetische karakters zijn toegestaan"
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Geef een geldige datum in JJJJ-MM-DD formaat."
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Het jaartal moet 1900 of nieuwer zijn."
-#: core/validators.py:128
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s."
+msgstr "Ongeldige datum: %s"
+
+#: core/validators.py:152
msgid "Enter a valid time in HH:MM format."
msgstr "Geef een geldige tijd in UU:MM formaat."
-#: core/validators.py:136
+#: core/validators.py:161 newforms/fields.py:207
msgid "Enter a valid e-mail address."
msgstr "Geef een geldig e-mailadres op."
-#: core/validators.py:148
+#: core/validators.py:173 core/validators.py:442 forms/__init__.py:667
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Er was geen bestand verstuurd. Controleer de encoding van het formulier."
+
+#: core/validators.py:177
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@@ -258,28 +306,28 @@ msgstr ""
"Bestand ongeldig. Het bestand dat is gegeven is geen afbeelding of was "
"beschadigd."
-#: core/validators.py:155
+#: core/validators.py:184
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "De URL %s wijst niet naar een afbeelding."
-#: core/validators.py:159
+#: core/validators.py:188
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
"Telefoonnummers moeten volgens het XXX-XXX-XXXX formaat zijn. \"%s\" is "
"ongeldig."
-#: core/validators.py:167
+#: core/validators.py:196
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "De URL %s wijst niet naar een QuickTime video."
-#: core/validators.py:171
+#: core/validators.py:200
msgid "A valid URL is required."
msgstr "Een geldige URL is vereist."
-#: core/validators.py:185
+#: core/validators.py:214
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -288,69 +336,84 @@ msgstr ""
"Geldige HTML is vereist. De specifieke fouten zijn:\n"
"%s"
-#: core/validators.py:192
+#: core/validators.py:221
#, python-format
msgid "Badly formed XML: %s"
msgstr "Foute XML: %s"
-#: core/validators.py:202
+#: core/validators.py:238
#, python-format
msgid "Invalid URL: %s"
msgstr "Ongeldige URL: %s"
-#: core/validators.py:206 core/validators.py:208
+#: core/validators.py:243 core/validators.py:245
#, python-format
msgid "The URL %s is a broken link."
msgstr "De URL %s is een niet werkende link."
-#: core/validators.py:214
+#: core/validators.py:251
msgid "Enter a valid U.S. state abbreviation."
msgstr "Geef een geldige afkorting van een VS staat."
-#: core/validators.py:229
+#: core/validators.py:265
#, 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] "Pas op uw taalgebruik! Gebruik van %s niet toegestaan."
msgstr[1] "Pas op uw taalgebruik! Gebruik van de woorden %s niet toegestaan."
-#: core/validators.py:236
+#: core/validators.py:272
#, python-format
msgid "This field must match the '%s' field."
msgstr "Dit veld moet overeenkomen met het '%s' veld."
-#: core/validators.py:255
+#: core/validators.py:291
msgid "Please enter something for at least one field."
msgstr "Voer tenminste één veld in."
-#: core/validators.py:264 core/validators.py:275
+#: core/validators.py:300 core/validators.py:311
msgid "Please enter both fields or leave them both empty."
msgstr "Voer waarden in in beide velden of laat beide leeg."
-#: core/validators.py:282
+#: core/validators.py:318
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Dit veld moet opgegeven worden indien %(field)s %(value)s is"
-#: core/validators.py:294
+#: core/validators.py:330
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Dit veld moet worden opgegeven indien %(field)s niet %(value)s is"
-#: core/validators.py:313
+#: core/validators.py:349
msgid "Duplicate values are not allowed."
msgstr "Dubbele waarden zijn niet toegestaan."
-#: core/validators.py:336
+#: core/validators.py:364
+#, python-format
+msgid "This value must be between %s and %s."
+msgstr "De waarde moet tussen %s en %s zijn."
+
+#: core/validators.py:366
+#, python-format
+msgid "This value must be at least %s."
+msgstr "De waarde moet minimaal %s zijn."
+
+#: core/validators.py:368
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "De waarde mag niet meer zijn dan %s."
+
+#: core/validators.py:404
#, python-format
msgid "This value must be a power of %s."
msgstr "De waarde moet een macht van %s zijn."
-#: core/validators.py:347
+#: core/validators.py:415
msgid "Please enter a valid decimal number."
msgstr "Geef een geldig decimaal getal."
-#: core/validators.py:349
+#: core/validators.py:419
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
@@ -358,7 +421,16 @@ msgid_plural ""
msgstr[0] "Geef een geldig decimaal getal met hooguit %s cijfer."
msgstr[1] "Geef een geldig decimaal getal met hooguit %s cijfers."
-#: core/validators.py:352
+#: core/validators.py:422
+#, 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] "Geef een geldig decimaal getal waarbij het gehele getal minimaal %s cijfer heeft."
+msgstr[1] "Geef een geldig decimaal getal waarbij het gehele getal minimaal %s cijfers heeft."
+
+#: core/validators.py:425
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -366,30 +438,30 @@ msgid_plural ""
msgstr[0] "Geef een decimaal getal met hooguit %s cijfer achter de komma."
msgstr[1] "Geef een decimaal getal met hooguit %s cijfers achter de komma."
-#: core/validators.py:362
+#: core/validators.py:435
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "Zorg ervoor dat het bestand minstens %s bytes groot is."
-#: core/validators.py:363
+#: core/validators.py:436
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "Zorg ervoor dat het bestand hoogstens %s bytes groot is."
-#: core/validators.py:376
+#: core/validators.py:453
msgid "The format for this field is wrong."
msgstr "Het formaat van dit veld is fout."
-#: core/validators.py:391
+#: core/validators.py:468
msgid "This field is invalid."
msgstr "Dit veld is ongeldig."
-#: core/validators.py:426
+#: core/validators.py:504
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Kan niks ophalen van %s."
-#: core/validators.py:429
+#: core/validators.py:507
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
@@ -397,7 +469,7 @@ msgstr ""
"De geretourneerde URL %(url)s bevat een ongeldige Content-Type '%"
"(contenttype)s."
-#: core/validators.py:462
+#: core/validators.py:540
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
@@ -406,7 +478,7 @@ msgstr ""
"Sluit de niet gesloten %(tag)s tag op regel %(line)s. (Regel start met \"%"
"(start)s\".)"
-#: core/validators.py:466
+#: core/validators.py:544
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -415,7 +487,7 @@ msgstr ""
"Tekst beginnend op regel %(line)s is in deze context niet toegestaan. (Regel "
"start met \"%(start)s\".)"
-#: core/validators.py:471
+#: core/validators.py:549
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -424,7 +496,7 @@ msgstr ""
"\"%(attr)s\" op regel %(line)s is een ongeldig attribuut. (Regel start met "
"\"%(start)s\".)"
-#: core/validators.py:476
+#: core/validators.py:554
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -433,7 +505,7 @@ msgstr ""
"\"<%(tag)s>\" op regel %(line)s is een ongeldige tag. (Regel start met \"%"
"(start)s\".)"
-#: core/validators.py:480
+#: core/validators.py:558
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@@ -442,7 +514,7 @@ msgstr ""
"Een of meerdere attributen ontbreken bij een tag op regel %(line)s. (Regel "
"start met \"%(start)s\".)"
-#: core/validators.py:485
+#: core/validators.py:563
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -451,7 +523,15 @@ msgstr ""
"De \"%(attr)s\" attribuut op regel %(line)s heeft een ongeldige waarde. "
"(Regel start met \"%(start)s\".)"
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:16
+msgid "The two password fields didn't match."
+msgstr "De twee ingevulde wachtwoorden zijn niet gelijk."
+
+#: contrib/auth/forms.py:24
+msgid "A user with that username already exists."
+msgstr "Een gebruiker met deze gebruikersnaam bestaat al."
+
+#: contrib/auth/forms.py:52
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -459,8 +539,7 @@ msgstr ""
"Het lijkt erop dat uw browser geen cookies accepteerd. Om aan te melden "
"moeten cookies worden geaccepteerd."
-#: contrib/auth/forms.py:36 contrib/auth/forms.py:41
-#: contrib/admin/views/decorators.py:9
+#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -468,79 +547,115 @@ msgstr ""
"Voer een correcte gebruikersnaam en wachtwoord in. Let op, de velden zijn "
"hoofdletter-gevoelig."
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "Dit account is inactief."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "Dat e-mailadres heeft geen gerelateerd gebruikersaccount. Weet u zeker dat u zich heeft geregistreerd?"
+
+#: contrib/auth/forms.py:116
+msgid "The two 'new password' fields didn't match."
+msgstr "De twee 'nieuw wachtwoord' velden zijn niet gelijk."
+
+#: contrib/auth/forms.py:123
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Uw oude wachtwoord was niet correct ingevoerd. Voert u het alstublieft opnieuw in."
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
msgid "name"
msgstr "naam"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "codenaam"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:42
msgid "permission"
msgstr "recht"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
msgid "permissions"
msgstr "rechten"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:60
msgid "group"
msgstr "groep"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
msgid "groups"
msgstr "groepen"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:90
msgid "username"
msgstr "gebruikersnaam"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Verplicht. 30 tekens of minder. Alleen alfanumerieke tekens (letters, cijfers en liggende strepen)."
+
+#: contrib/auth/models.py:91
msgid "first name"
msgstr "voornaam"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:92
msgid "last name"
msgstr "achternaam"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:93
msgid "e-mail address"
msgstr "e-mailadres"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "password"
msgstr "wachtwoord"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "Use '[algo]$[salt]$[hexdigest]'"
msgstr "Gebruik '[algo]$[salt]$[hexdigest]'"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "staff status"
msgstr "staf status"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "Designates whether the user can log into this admin site."
msgstr "Bepaalt of de gebruiker kan inloggen op deze admin site."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:96
msgid "active"
msgstr "actief"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Bepaalt of de gebruiker kan inloggen op deze admin site. U kunt dit uitvinken in plaats van een gebruiker te verwijderen."
+
+#: contrib/auth/models.py:97
msgid "superuser status"
msgstr "supergebruiker status"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Bepaald dat deze gebruiker alle rechten heeft, zonder deze expliciet toe te wijzen."
+
+#: contrib/auth/models.py:98
msgid "last login"
msgstr "laatste aanmelding"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:99
msgid "date joined"
msgstr "datum toegetreden"
-#: contrib/auth/models.py:66
+#: 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."
@@ -548,38 +663,42 @@ msgstr ""
"Bovenop de rechten welke handmatig zijn toegekend, krijgt deze gebruiker ook "
"alle rechten van de groepen waar hij of zij deel van uitmaakt."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:102
msgid "user permissions"
msgstr "gebruikersrechten"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:105
msgid "user"
msgstr "gebruiker"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:106
msgid "users"
msgstr "gebruikers"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:111
msgid "Personal info"
msgstr "Persoonlijke informatie"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:112
msgid "Permissions"
msgstr "Rechten"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:113
msgid "Important dates"
msgstr "Belangrijke data"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:114
msgid "Groups"
msgstr "Groepen"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:258
msgid "message"
msgstr "bericht"
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Afmelden"
+
#: contrib/admin/models.py:16
msgid "action time"
msgstr "actie tijd"
@@ -618,7 +737,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Alle"
@@ -654,12 +773,12 @@ msgstr "Nee"
msgid "Unknown"
msgstr "Onbekend"
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Aanmelden"
-#: contrib/admin/views/decorators.py:61
+#: contrib/admin/views/decorators.py:62
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -667,7 +786,7 @@ msgstr ""
"Uw sessie is verlopen, meldt u opnieuw aan. Maakt u geen zorgen: Uw bijdrage "
"is opgeslagen."
-#: contrib/admin/views/decorators.py:68
+#: 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."
@@ -675,196 +794,265 @@ msgstr ""
"Het lijkt erop dat uw browser geen cookies accepteerd. Zet het gebruik van "
"cookies aan in uw browser, laad deze pagina nogmaals en probeer het opnieuw."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Gebruikersnamen mogen geen '@' bevatten."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr "Uw e-mailadres is niet uw gebruikersnaam. Probeer '%s' eens."
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:223
msgid "Site administration"
msgstr "Site beheer"
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:18
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "De %(name)s \"%(obj)s\" is toegevoegd."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:23
msgid "You may edit it again below."
msgstr "U kunt dit hieronder weer bewerken."
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
msgstr "U kunt hieronder de volgende %s toevoegen."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Toevoegen %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "%s toegevoegd."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "en"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Gewijzigd %s"
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "%s verwijderd."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Geen velden gewijzigd."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "Het wijzigen van %(name)s \"%(obj)s\" is geslaagd."
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/main.py:353
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr "De %(name)s \"%(obj)s\" was toegevoegd. U kunt het hieronder wijzigen."
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "Wijzig %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:473
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Een of meer %(fieldname)s in %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:478
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Een of meer %(fieldname)s in %(name)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:511
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "De verwijdering van %(name)s \"%(obj)s\" is geslaagd."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:514
msgid "Are you sure?"
msgstr "Weet u het zeker?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:536
#, python-format
msgid "Change history: %s"
msgstr "Wijzigingsgeschiedenis: %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s"
msgstr "Selecteer %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s to change"
msgstr "Selecteer %s om te wijzigen"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "Database fout"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "App %r niet gevonden"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "Model %r niet gevonden in app %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "the related `%s.%s` object"
+
+#: 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 "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "related `%s.%s` objects"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "alle %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "nummer van %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Velden van %s objects"
+
+#: 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 "Geheel getal"
-#: contrib/admin/views/doc.py:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "Boolean (True of False)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Karakterreeks (hooguit %(maxlength)s)"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Komma-gescheiden gehele getallen"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Datum (zonder tijd)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Datum (met tijd)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "E-mailadres"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Bestandspad"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "Decimaal getal"
-#: contrib/admin/views/doc.py:289 contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
msgid "IP address"
msgstr "IP adres"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Boolean (True, False of None)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "Relatie tot ouder model"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Telefoonnummer"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Tekst"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "Tijd"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "Staat van de VS (twee hoofdletters)"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "XML Tekst"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s lijkt geen urlpattern object te zijn"
+
+#: contrib/admin/views/auth.py:29
+msgid "Add user"
+msgstr "Gebruiker toevoegen"
+
+#: contrib/admin/templatetags/admin_list.py:230
msgid "All dates"
msgstr "Alle data"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Alles tonen"
+
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
@@ -875,7 +1063,7 @@ msgstr "Documentatie"
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_tag_index.html:5
@@ -895,7 +1083,7 @@ msgstr "Wachtwoord wijzigen"
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_tag_index.html:5
@@ -908,7 +1096,7 @@ msgstr "Wachtwoord wijzigen"
#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/comments/templates/comments/form.html:8
+#: contrib/comments/templates/comments/form.html:6
msgid "Log out"
msgstr "Afmelden"
@@ -917,7 +1105,8 @@ msgstr "Afmelden"
#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -935,21 +1124,21 @@ msgstr "Verwijderen"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"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 ""
-"Het verwijderen van %(object_name)s '%(object)s' zal ook gerelateerde "
+"Het verwijderen van %(object_name)s '%(escaped_object)s' zal ook gerelateerde "
"objecten verwijderen. Echter u heeft geen rechten om de volgende typen "
"objecten te verwijderen:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Weet u zeker dat u %(object_name)s \"%(object)s\" wilt verwijderen? Alle "
+"Weet u zeker dat u %(object_name)s \"%(escaped_object)s\" wilt verwijderen? Alle "
"volgende opjecten worden verwijderd:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
@@ -963,7 +1152,7 @@ msgstr "Pagina niet gevonden"
#: contrib/admin/templates/admin/404.html:10
msgid "We're sorry, but the requested page could not be found."
-msgstr "Onze excuses, maar de gevraagde pagina komt niet voor."
+msgstr "Onze excuses, maar de gevraagde pagina bestaat niet."
#: contrib/admin/templates/admin/change_form.html:15
#: contrib/admin/templates/admin/index.html:28
@@ -995,8 +1184,8 @@ msgstr "Sortering:"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid " By %(title)s "
-msgstr " Op %(title)s "
+msgid " By %(filter_title)s "
+msgstr " Op %(filter_title)s "
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -1024,6 +1213,11 @@ msgstr "%(name)s toevoegen"
msgid "Models available in the %(name)s application."
msgstr "Beschikbare modellen in de %(name)s toepassing."
+#: 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 "Wijzigen"
@@ -1096,10 +1290,33 @@ msgstr ""
"Er is een fout opgetreden. Dit is inmiddels doorgegeven aan de sitebeheerder "
"via e-mail en zal spoedig worden gerepareerd. Bedankt voor uw geduld."
+#: 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 "Er is iets mis met de database. Verzeker u ervan dat de benodigde tabellen zijn aangemaakt en dat de database toegankelijk is voor de juiste gebruiker."
+
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
msgstr "Zoek"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultaat"
+msgstr[1] "%(counter)s resultaten"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totaal"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
#: contrib/admin/templates/admin/login.html:17
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -1107,18 +1324,36 @@ msgid "Username:"
msgstr "Gebruikersnaam:"
#: contrib/admin/templates/admin/login.html:20
-#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
msgid "Password:"
msgstr "Wachtwoord:"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Wachtwoord <a href=\"/password_reset/\">vergeten</a>?"
-
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Welkom,"
+#: 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 "Vul allereerst een gebruikersnaam en wachtwoord in. Vervolgens kunt u de andere opties instellen."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Wachtwoord (nogmaals)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Vul hetzelfde wachtwoord als hierboven in, ter bevestiging."
+
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "Bookmarklets"
@@ -1291,8 +1526,9 @@ 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 ""
-"Vanwege de beveiliging moet u uw oude en twee keer een nieuw wachtwoord"
-"invoeren, zodat we kunnen controleren of er geen typefouten zijn gemaakt."
+"Vanwege de beveiliging moet u uw oude en twee keer een nieuw "
+"wachtwoordinvoeren, zodat we kunnen controleren of er geen typefouten zijn "
+"gemaakt."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -1338,8 +1574,7 @@ msgstr "sites"
#: contrib/flatpages/models.py:8
msgid ""
"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Voorbeeld: '/about/contact/'. Zorg voor slashes aan het begin en eind."
+msgstr "Voorbeeld: '/about/contact/'. Zorg voor slashes aan het begin en eind."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -1359,11 +1594,11 @@ msgstr "sjabloonnaam"
#: contrib/flatpages/models.py:13
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
"Voorbeeld: 'flatpages/contact_page'. Als deze niet is opgegeven, dan wordt "
-"'flatpages/default' gebruikt."
+"'flatpages/default.html' gebruikt."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -1407,11 +1642,11 @@ msgstr ""
"Dit kan een absoluut pad (zoals hierboven) zijn of een volledige URL "
"beginnend met 'http://'."
-#: contrib/redirects/models.py:12
+#: contrib/redirects/models.py:13
msgid "redirect"
msgstr "omleiding"
-#: contrib/redirects/models.py:13
+#: contrib/redirects/models.py:14
msgid "redirects"
msgstr "omleidingen"
@@ -1605,14 +1840,14 @@ msgstr "Ongeldige opmerkingen ID"
msgid "No voting for yourself"
msgstr "Niet op uzelf stemmen"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
"Deze waardering is verplicht omdat u tenminste één andere waardering hebt "
"ingevoerd."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -1635,7 +1870,7 @@ msgstr[1] ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -1646,22 +1881,22 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Alleen POSTs zijn toegestaan"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Een of meerdere verplichte velden zijn niet ingevuld"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
msgstr "Iemand heeft het opmerkingenformulier gewijzigd (Beveilingsinbreuk)"
-#: contrib/comments/views/comments.py:207
+#: 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 "
@@ -1675,7 +1910,7 @@ msgstr ""
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr "Het opmerkingenformulier heeft geen 'voorbeeld' of 'post'"
-#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
msgstr "Uw wachtwoord vergeten?"
@@ -1697,13 +1932,13 @@ msgstr "Optioneel"
msgid "Post a photo"
msgstr "Plaats een foto"
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
#: contrib/comments/templates/comments/freeform.html:5
msgid "Comment:"
msgstr "Opmerking:"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
msgid "Preview comment"
msgstr "Concept opmerking"
@@ -1711,70 +1946,85 @@ msgstr "Concept opmerking"
msgid "Your name:"
msgstr "Uw gebruikersnaam:"
-#: contrib/sessions/models.py:35
+#: contrib/sessions/models.py:51
msgid "session key"
msgstr "sessiesleutel"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:52
msgid "session data"
msgstr "sessiegegevens"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:53
msgid "expire date"
msgstr "verloopdatum"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:57
msgid "session"
msgstr "sessie"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:58
msgid "sessions"
msgstr "sessies"
-#: contrib/contenttypes/models.py:25
+#: contrib/contenttypes/models.py:20
msgid "python model class name"
msgstr "python model-class-naam"
-#: contrib/contenttypes/models.py:28
+#: contrib/contenttypes/models.py:23
msgid "content type"
msgstr "inhoudstype"
-#: contrib/contenttypes/models.py:29
+#: contrib/contenttypes/models.py:24
msgid "content types"
msgstr "inhoudstypen"
-#: forms/__init__.py:380
+#: forms/__init__.py:387
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Zorg ervoor dat uw tekst korter is dan %s karakter."
msgstr[1] "Zorg ervoor dat uw tekst korter is dan %s karakters."
-#: forms/__init__.py:385
+#: forms/__init__.py:392
msgid "Line breaks are not allowed here."
msgstr "Regeleindes zijn niet toegestaan."
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: forms/__init__.py:493 forms/__init__.py:566 forms/__init__.py:605
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr "Selecteer een geldige keuze; '%(data)s is niet in %(choices)s."
-#: forms/__init__.py:645
+#: forms/__init__.py:669
msgid "The submitted file is empty."
msgstr "Het gegeven bestand is leeg."
-#: forms/__init__.py:699
+#: forms/__init__.py:725
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Geef een geheel getal op tussen -32.768 en 32.767."
-#: forms/__init__.py:708
+#: forms/__init__.py:735
msgid "Enter a positive number."
msgstr "Geef een geheel getal op."
-#: forms/__init__.py:717
+#: forms/__init__.py:745
msgid "Enter a whole number between 0 and 32,767."
msgstr "Geef een geheel getal op tussen 0 en 32.767."
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "De %(verbose_name)s is succesvol aangemaakt."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "De %(verbose_name)s is succesvol aangepast."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "De %(verbose_name)s is verwijderd."
+
#: utils/dates.py:6
msgid "Monday"
msgstr "maandag"
@@ -1927,18 +2177,6 @@ msgstr "nov."
msgid "Dec."
msgstr "dec."
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "d-n-Y"
-
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "d-n-Y H:i"
-
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "H:i"
-
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
@@ -1964,10 +2202,11 @@ msgstr[0] "dag"
msgstr[1] "dagen"
#: utils/timesince.py:16
+# In the timesince context it is stilistically wrong to use the plural for hour in Dutch.
msgid "hour"
msgid_plural "hours"
msgstr[0] "uur"
-msgstr[1] "uren"
+msgstr[1] "uur"
#: utils/timesince.py:17
msgid "minute"
@@ -1975,7 +2214,65 @@ msgid_plural "minutes"
msgstr[0] "minuut"
msgstr[1] "minuten"
-#: template/defaultfilters.py:379
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "j-n-Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "j-n-Y H:i"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: template/defaultfilters.py:401
msgid "yes,no,maybe"
msgstr "ja,nee,misschien"
+#: newforms/fields.py:82
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Zorg ervoor de waarde korter is dan %d tekens."
+
+#: newforms/fields.py:84
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Zorg ervoor dat uw tekst langer is dan %d tekens."
+
+#: newforms/fields.py:135
+msgid "Enter a valid date."
+msgstr "Geef een geldige datum op."
+
+#: newforms/fields.py:171
+msgid "Enter a valid date/time."
+msgstr "Geef een geldige datum/tijd op."
+
+#: newforms/fields.py:184
+msgid "Enter a valid value."
+msgstr "Geef een geldige waarde."
+
+#: newforms/fields.py:225 newforms/fields.py:245
+msgid "Enter a valid URL."
+msgstr "Geef een geldige URL op."
+
+#: newforms/fields.py:247
+msgid "This URL appears to be a broken link."
+msgstr "Deze URL schijnt niet te werken."
+
+#: newforms/fields.py:276 newforms/fields.py:301
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Selecteer een geldige keuze. %s is niet onderdeel van de beschikbare keuzes ."
+
+#: newforms/fields.py:292
+msgid "Enter a list of values."
+msgstr "Geef een lijst op met waardes."
diff --git a/django/conf/locale/no/LC_MESSAGES/django.mo b/django/conf/locale/no/LC_MESSAGES/django.mo
index ee2152b5e1..7048e3079d 100644
--- a/django/conf/locale/no/LC_MESSAGES/django.mo
+++ b/django/conf/locale/no/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/no/LC_MESSAGES/django.po b/django/conf/locale/no/LC_MESSAGES/django.po
index 427879a8f3..ea388cfd81 100644
--- a/django/conf/locale/no/LC_MESSAGES/django.po
+++ b/django/conf/locale/no/LC_MESSAGES/django.po
@@ -1,4 +1,4 @@
-# SOME DESCRIPTIVE TITLE.
+# translation of django.po to
# Copyright (C) 2005 and beyond
# This file is distributed under the same license as the PACKAGE package.
# Espen Grindhaug <espen@grindhaug.org>, Nov 2005.
@@ -6,74 +6,73 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:12+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Espen Grndhaug <espen@grindhaug.org>\n"
-"Language-Team: Norwegian\n"
+"PO-Revision-Date: 2007-04-27 06:48+0200\n"
+"Last-Translator: \n"
+"Language-Team: <en@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
#: contrib/comments/models.py:67 contrib/comments/models.py:166
-#, fuzzy
msgid "object ID"
-msgstr "Vis objekt ID"
+msgstr "objekt ID"
#: contrib/comments/models.py:68
msgid "headline"
-msgstr ""
+msgstr "overskrift"
#: contrib/comments/models.py:69 contrib/comments/models.py:90
#: contrib/comments/models.py:167
-#, fuzzy
msgid "comment"
-msgstr "innhold"
+msgstr "kommentar"
#: contrib/comments/models.py:70
msgid "rating #1"
-msgstr ""
+msgstr "rangering #1 "
#: contrib/comments/models.py:71
msgid "rating #2"
-msgstr ""
+msgstr "rangering #2"
#: contrib/comments/models.py:72
msgid "rating #3"
-msgstr ""
+msgstr "rangering #3"
#: contrib/comments/models.py:73
msgid "rating #4"
-msgstr ""
+msgstr "rangering #4"
#: contrib/comments/models.py:74
msgid "rating #5"
-msgstr ""
+msgstr "rangering #5"
#: contrib/comments/models.py:75
msgid "rating #6"
-msgstr ""
+msgstr "rangering #6"
#: contrib/comments/models.py:76
msgid "rating #7"
-msgstr ""
+msgstr "rangering #7"
#: contrib/comments/models.py:77
msgid "rating #8"
-msgstr ""
+msgstr "rangering #8"
#: contrib/comments/models.py:82
msgid "is valid rating"
-msgstr ""
+msgstr "er gyldig rangering"
#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
-msgstr ""
+msgstr "dato/tid for innsendelse"
#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
-msgstr ""
+msgstr "er tilgjengelig for alle"
#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
msgid "IP address"
@@ -81,23 +80,21 @@ msgstr "IP adresse"
#: contrib/comments/models.py:86
msgid "is removed"
-msgstr ""
+msgstr "er fjernet"
#: 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 ""
+msgstr "Aktiver denne avkryssningsboksen hvis kommentaren er upasende. Beskjeden \"Denne kommentaren er blitt fjernet\" vil bli vist istedet."
#: contrib/comments/models.py:91
-#, fuzzy
msgid "comments"
-msgstr "innhold"
+msgstr "kommentarer"
#: contrib/comments/models.py:131 contrib/comments/models.py:207
-#, fuzzy
msgid "Content object"
-msgstr "innholds type"
+msgstr "innholdsobjekt"
#: contrib/comments/models.py:159
#, python-format
@@ -108,101 +105,97 @@ msgid ""
"\n"
"http://%(domain)s%(url)s"
msgstr ""
+"Sendt av %(user)s på %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
#: contrib/comments/models.py:168
-#, fuzzy
msgid "person's name"
-msgstr "fornavn"
+msgstr "personens navn"
#: contrib/comments/models.py:171
-#, fuzzy
msgid "ip address"
msgstr "IP adresse"
#: contrib/comments/models.py:173
msgid "approved by staff"
-msgstr ""
+msgstr "godkjent av moderator"
#: contrib/comments/models.py:176
-#, fuzzy
msgid "free comment"
-msgstr "tillat kommentarer"
+msgstr "Ã¥pen kommentar"
#: contrib/comments/models.py:177
-#, fuzzy
msgid "free comments"
-msgstr "tillat kommentarer"
+msgstr "Ã¥pne kommentarer"
#: contrib/comments/models.py:233
msgid "score"
-msgstr ""
+msgstr "poeng"
#: contrib/comments/models.py:234
-#, fuzzy
msgid "score date"
-msgstr "utløpsdato"
+msgstr "poeng dato"
#: contrib/comments/models.py:237
msgid "karma score"
-msgstr ""
+msgstr "karma poeng"
#: contrib/comments/models.py:238
msgid "karma scores"
-msgstr ""
+msgstr "karma poeng"
#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
-msgstr ""
+msgstr "%(score)d rangering av %(user)s"
#: contrib/comments/models.py:258
-#, fuzzy, python-format
+#, python-format
msgid ""
"This comment was flagged by %(user)s:\n"
"\n"
"%(text)s"
msgstr ""
-"Denne kommentaren er skrevet med lite omtanke:\n"
+"Denne kommentaren er flagget av %(user)s:\n"
"\n"
"%(text)s"
#: contrib/comments/models.py:265
-#, fuzzy
msgid "flag date"
-msgstr "flatside"
+msgstr "flagg dato"
#: contrib/comments/models.py:268
-#, fuzzy
msgid "user flag"
-msgstr "Bruker"
+msgstr "brukerflag"
#: contrib/comments/models.py:269
-#, fuzzy
msgid "user flags"
-msgstr "Brukere"
+msgstr "brukerflag"
#: contrib/comments/models.py:273
#, python-format
msgid "Flag by %r"
-msgstr ""
+msgstr "Flagg med %r"
#: contrib/comments/models.py:278
-#, fuzzy
msgid "deletion date"
-msgstr "sesjon data"
+msgstr "fjernet dato"
#: contrib/comments/models.py:280
msgid "moderator deletion"
-msgstr ""
+msgstr "fjernet av moderator"
#: contrib/comments/models.py:281
msgid "moderator deletions"
-msgstr ""
+msgstr "fjernet av moderator"
#: contrib/comments/models.py:285
#, python-format
msgid "Moderator deletion by %r"
-msgstr ""
+msgstr "Fjernet av moderator med %r"
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
@@ -214,16 +207,14 @@ msgstr "Ikke gyldig kommentar ID"
#: contrib/comments/views/karma.py:25
msgid "No voting for yourself"
-msgstr "Du kan ikke stemme selv"
+msgstr "Du kan ikke stemme på deg selv"
#: contrib/comments/views/comments.py:28
-#, fuzzy
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr "Denne bla bla.."
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Denne rangeringen er påkrevd fordi du har rangert en eller flere ting fra før "
#: contrib/comments/views/comments.py:112
-#, fuzzy, python-format
+#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
"comment:\n"
@@ -246,13 +237,13 @@ msgstr[1] ""
"%(text)s"
#: contrib/comments/views/comments.py:117
-#, fuzzy, python-format
+#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
-"Denne kommentaren er skrevet med lite omtanke:\n"
+"Denne kommentaren er skrevet av en upålitelig bruker:\n"
"\n"
"%(text)s"
@@ -281,8 +272,7 @@ msgstr "Skjemaet hadde en ugyldig verdi - objekt IDen var ugyldig"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr ""
-"Kommentar skjemaet returnerte ikke et 'forhåndsvisning' eller 'post' objekt"
+msgstr "Kommentar skjemaet returnerte ikke et 'forhåndsvisning' eller 'post' objekt"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -296,9 +286,8 @@ msgid "Password:"
msgstr "Passord:"
#: contrib/comments/templates/comments/form.html:6
-#, fuzzy
msgid "Forgotten your password?"
-msgstr "Endre passord"
+msgstr "Har du glemt passordet ditt ?"
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
@@ -323,38 +312,35 @@ msgstr "Log ut"
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
-msgstr ""
+msgstr "Rangeringer"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Required"
-msgstr ""
+msgstr "PÃ¥krevd"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Optional"
-msgstr ""
+msgstr "Valgfri"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
-msgstr ""
+msgstr "Send et foto"
#: contrib/comments/templates/comments/form.html:27
#: contrib/comments/templates/comments/freeform.html:5
-#, fuzzy
msgid "Comment:"
-msgstr "tillat kommentarer"
+msgstr "Kommentar:"
#: contrib/comments/templates/comments/form.html:32
#: contrib/comments/templates/comments/freeform.html:9
-#, fuzzy
msgid "Preview comment"
-msgstr "tillat kommentarer"
+msgstr "Forhåndvis kommentar"
#: contrib/comments/templates/comments/freeform.html:4
-#, fuzzy
msgid "Your name:"
-msgstr "brukernavn"
+msgstr "Ditt navn:"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -416,7 +402,7 @@ msgstr "objekt repr"
#: contrib/admin/models.py:21
msgid "action flag"
-msgstr "handlings flagg"
+msgstr "handlingsflagg"
#: contrib/admin/models.py:22
msgid "change message"
@@ -424,11 +410,11 @@ msgstr "endre melding"
#: contrib/admin/models.py:25
msgid "log entry"
-msgstr "logg notis"
+msgstr "logg post"
#: contrib/admin/models.py:26
msgid "log entries"
-msgstr "logg innlegg"
+msgstr "logg poster"
#: contrib/admin/templatetags/admin_list.py:228
msgid "All dates"
@@ -440,8 +426,8 @@ msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
msgstr ""
-"Vær snill å angi korrekt brukernavn og passord. La merke til at små og "
-"store bokstaver er betraktet ulik."
+"Vennligst angi korrekt brukernavn og passord. Merk at små og "
+"store bokstaver er betraktet ulikt."
#: contrib/admin/views/decorators.py:23
#: contrib/admin/templates/admin/login.html:25
@@ -452,18 +438,15 @@ msgstr "Logg inn"
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
-msgstr ""
-"Du må logge inn igjen, fordi sesjonen din har gått ut på dato, men ikke ikke "
-"bekjymr deg informasjonen du sendte ble lagret."
+msgstr "Du må logge inn igjen, fordi økten din har gått ut, men innlegget ditt ble lagret."
#: contrib/admin/views/decorators.py:68
msgid ""
"Looks like your browser isn't configured to accept cookies. Please enable "
"cookies, reload this page, and try again."
msgstr ""
-"Det ser ut som om nettleseren din ikke vill ta i mot informasjonskapsler "
-"('cookies'). Vennligst omkonfigurer nettleseren din, last siden på ny og "
-"prøv igjen."
+"Det ser ut som om nettleseren din ikke støtter informasjonskapsler "
+"('cookies'). Vennligst konfigurer nettleseren din, og prøv igjen."
#: contrib/admin/views/decorators.py:82
msgid "Usernames cannot contain the '@' character."
@@ -500,7 +483,7 @@ msgstr "Ny %s"
#: contrib/admin/views/main.py:336
#, python-format
msgid "Added %s."
-msgstr "Lagt til %s"
+msgstr "La til %s"
#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
#: contrib/admin/views/main.py:340
@@ -528,8 +511,7 @@ msgstr "%(name)s \"%(obj)s\" ble endret."
#: contrib/admin/views/main.py:354
#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr "%(name)s \"%(obj)s\" ble endret. Du kan endre det igjen under."
#: contrib/admin/views/main.py:392
@@ -742,8 +724,8 @@ 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 ""
-"Det har vært en feil. Feilen er blitt rapportert til administrator via e-"
-"mail, og vill bli fikset snart. Takk for din tålmodighet."
+"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-"
+"post, og vil bli fikset snart. Takk for din tålmodighet."
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -909,7 +891,7 @@ msgstr "Tilbakestill mitt passord"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Takk for å bruke tid på internett siden i dag."
+msgstr "Takk for at du valgte å bruke kvalitetstid på nettstedet idag."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
@@ -954,8 +936,7 @@ msgstr "Endre passord"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr ""
-"Du har mottatt denne e-posten fordi du ba om å tilbakestille passordet ditt"
+msgstr "Du har mottatt denne e-posten fordi du ba om å tilbakestille passordet ditt"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1002,6 +983,12 @@ msgid ""
"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\">For å installere bokmerker, dra linken til verktøylinja\n"
+"for bokmerker, eller høyreklikk og legg til i bokmerker. Nå kan du du velge\n"
+"bokmerket fra hvilken som helst side på nettstedet. Noen av disse\n"
+"bokmerkene krever at datamaskinen du bruker er markert som \"intern\"\n"
+"(kontakt din systemadministrator hvis du er usikker på om maskinen din er \"intern\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
@@ -1033,8 +1020,7 @@ msgstr "Endre dette objektet (Ã¥pnes i dette vinduet)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr ""
-"Hopp til administrasjonsiden for sidene som representerer et enkelt objekt."
+msgstr "Hopp til administrasjonsiden for sidene som representerer et enkelt objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
@@ -1069,7 +1055,7 @@ msgid ""
"This should be an absolute path, excluding the domain name. Example: '/"
"events/search/'."
msgstr ""
-"Denne burde vær en fullstendig sti, uten domene navnet. Foreksempel: '/"
+"Dette burde vært en fullstendig sti, uten domene navnet. Foreksempel: '/"
"nyheter/les/"
#: contrib/redirects/models.py:9
@@ -1081,7 +1067,7 @@ msgid ""
"This can be either an absolute path (as above) or a full URL starting with "
"'http://'."
msgstr ""
-"Denne kan enten være en fullstendig sti (som over), eller en hel "
+"Dette kan enten være en fullstendig sti (som over), eller en hel "
"internettadresse som starter med 'http://'"
#: contrib/redirects/models.py:12
@@ -1093,10 +1079,8 @@ msgid "redirects"
msgstr "omadresserelser"
#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Eksempel: '/om/kontakt/'. Vær sikker på at du har en skråstrek forran og bak."
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Eksempel: '/om/kontakt/'. Vær sikker på at du har en skråstrek forran og bak."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -1186,7 +1170,7 @@ msgstr "passord"
#: contrib/auth/models.py:59
msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr ""
+msgstr "Bruk '[algo]$[salt]$[hexdigest]'"
#: contrib/auth/models.py:60
msgid "staff status"
@@ -1256,7 +1240,7 @@ msgstr "Melding"
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
-msgstr ""
+msgstr "Din nettleser ser ikkeut til å støtte informasjonskapsler (cookies). Informasjonskapsler er påkrevd for å logge inn."
#: contrib/contenttypes/models.py:25
msgid "python model class name"
@@ -1698,8 +1682,7 @@ msgstr "Internettadressen %s peker ikke til et godkjent bilde."
#: core/validators.py:159
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Telefon nummeret må være i XXX-XXX-XXXX format. \"%s\" er ikke godkjent."
+msgstr "Telefon nummeret må være i XXX-XXX-XXXX format. \"%s\" er ikke godkjent."
#: core/validators.py:167
#, python-format
@@ -1732,7 +1715,7 @@ msgstr "Ikke godkjent URL: %s"
#: core/validators.py:206 core/validators.py:208
#, python-format
msgid "The URL %s is a broken link."
-msgstr "Internettadresse fører til en side som ikke virker."
+msgstr "Internettadresse %s fører til en side som ikke virker."
#: core/validators.py:214
msgid "Enter a valid U.S. state abbreviation."
@@ -1784,30 +1767,26 @@ msgstr "Vennligst skriv inn et godkjent desimal tall."
#: core/validators.py:349
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s total digits."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
msgstr[0] "Skriv inn et desimal tall med maksimum %s total antall tall."
msgstr[1] "Skriv inn et desimal tall med maksimum %s total antall tall."
#: core/validators.py:352
#, 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."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
msgstr[0] "Skriv inn et desimal tall med maksimum %s tall bak komma. "
msgstr[1] "Skriv inn et desimal tall med maksimum %s tall bak komma. "
#: core/validators.py:362
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr ""
-"Vær sikker på at fila du prøver å laste opp er minimum %s bytes stor."
+msgstr "Vær sikker på at fila du prøver å laste opp er minimum %s bytes stor."
#: core/validators.py:363
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr ""
-"Vær sikker på at fila du prøver å laste opp er maksimum %s bytes stor."
+msgstr "Vær sikker på at fila du prøver å laste opp er maksimum %s bytes stor."
#: core/validators.py:376
msgid "The format for this field is wrong."
@@ -1824,8 +1803,7 @@ msgstr "Klarte ikke å motta noe fra %s."
#: core/validators.py:429
#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
"Internettadressen %(url)s returnerte en ikke godkjent Content-Type '%"
"(contenttype)s'."
@@ -1881,7 +1859,7 @@ msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"\"%(attr)s\" tillegg på linje $(line)s har en ikke godkjent verdi. (Linjen "
+"\"%(attr)s\" tillegg på linje %(line)s har en ikke godkjent verdi. (Linjen "
"starter med \"%(start)s\".)"
#: db/models/manipulators.py:302
@@ -1892,7 +1870,7 @@ msgstr "%(object)s med %(type)s finnes allerede for angitt %(field)s."
#: db/models/fields/__init__.py:40
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "$(optname)s med %(fieldname)s finnes allerede."
+msgstr "%(optname)s med %(fieldname)s finnes allerede."
#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
@@ -1926,16 +1904,13 @@ msgid "Separate multiple IDs with commas."
msgstr "Separer Id-ene med kommaer."
#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Hold nede \"Control\", eller \"Command\" på en Mac, for å velge mere enn en."
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Hold nede \"Control\", eller \"Command\" på en Mac, for å velge mere enn en."
#: db/models/fields/related.py:625
#, 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."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
msgstr[0] "Skriv inn gyldige %(self)s ID-er. Verdien %(value)r er ikke gyldig."
msgstr[1] "Skriv inn gyldige %(self)s ID-er. Verdiene %(value)r er ikke gyldige."
diff --git a/django/conf/locale/no/LC_MESSAGES/djangojs.mo b/django/conf/locale/no/LC_MESSAGES/djangojs.mo
index 4b23aba4e0..da2854f72e 100644
--- a/django/conf/locale/no/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/no/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/no/LC_MESSAGES/djangojs.po b/django/conf/locale/no/LC_MESSAGES/djangojs.po
index c6087646e0..ab3d3b965d 100644
--- a/django/conf/locale/no/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/no/LC_MESSAGES/djangojs.po
@@ -1,19 +1,20 @@
-# SOME DESCRIPTIVE TITLE.
+# translation of djangojs.po to
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Espen Grindhaug <espen.grindhaug@mail.com>, 2006.
#
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: djangojs\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-12-09 11:51+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Espen Grindhaug <espen.grindhaug@gmail.com>\n"
-"Language-Team: no\n"
+"PO-Revision-Date: 2007-04-27 06:51+0200\n"
+"Last-Translator: \n"
+"Language-Team: <en@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
@@ -21,7 +22,6 @@ msgid "Available %s"
msgstr "%s er tilgjengelige"
#: contrib/admin/media/js/SelectFilter2.js:41
-#, fuzzy
msgid "Choose all"
msgstr "Velg alle"
@@ -116,3 +116,4 @@ msgstr "I går"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
msgid "Tomorrow"
msgstr "I morgen"
+
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo
index d132fc114e..1aa7e08dd4 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.mo
+++ b/django/conf/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po
index 61fc4d0a90..7e7ccb850f 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.po
+++ b/django/conf/locale/pl/LC_MESSAGES/django.po
@@ -1,21 +1,775 @@
+# translation of django.po to Polish
# Polish .po file.
-# Copyright (C) 2006 Krzysztof Kajkowski
# This file is distributed under the same license as the django package.
-# Krzysztof Kajkowski <krzysztof.kajkowski@gmail.com>, 2006.
-# cayco <cayco@cayco.pl>, 2006.
-#
-#
msgid ""
msgstr ""
-"Project-Id-Version: 0.1\n"
+"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:13+0200\n"
-"PO-Revision-Date: 2006-02-21 11:10+0100\n"
-"Last-Translator: Piotr Maliński <admin@rk.edu.pl>\n"
+"POT-Creation-Date: 2007-05-08 20:19+0200\n"
+"PO-Revision-Date: 2007-05-08 20:29+0200\n"
+"Last-Translator: Michal Chruszcz <troll@pld-linux.org>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:612
+#: db/models/fields/__init__.py:623 newforms/models.py:178
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463
+msgid "This field is required."
+msgstr "To pole jest wymagane."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak."
+msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaków."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Znaki nowej linii sÄ… tutaj niedopuszczalne."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Wybierz poprawną opcję; '%(data)s' nie jest wśród %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Tak"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nie"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Wysłany plik jest pusty."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od -32 768 do 32 767"
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Proszę wpisać liczbę dodatnią."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od 0 do 32 767"
+
+#: db/models/manipulators.py:307
+#, fuzzy, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s z %(type)s już istnieje dla %(field)s."
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340 contrib/admin/views/main.py:342
+msgid "and"
+msgstr "i"
+
+#: db/models/fields/__init__.py:42
+#, fuzzy, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Już istnieje %(optname)s z %(fieldname)s."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Ta wartość musi być liczbą całkowitą."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Ta wartość musi być logiczna (True, False - prawda lub fałsz)."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "To pole nie może być puste."
+
+#: db/models/fields/__init__.py:459 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
+
+#: db/models/fields/__init__.py:528 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Wprowadź poprawną datę i godzinę w formacie RRRR-MM-DD GG:MM."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "Wpisz poprawnÄ… nazwÄ™ pliku."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "Ta wartość musi być jedną z None (żadne), True (prawda) lub False (fałsz)."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Proszę wpisać poprawne %s."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Oddziel identyfikatory przecinkami."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Przytrzymaj wciśnięty klawisz \"Ctrl\" lub \"Command\" na Mac'u aby "
+"zaznaczyć więcej niż jeden wybór."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartość %(value)r jest "
+"niepoprawna."
+msgstr[1] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
+"niepoprawne."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabski"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Kataloński"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Czeski"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Walijski"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Duński"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Niemiecki"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grecki"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Angielski"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Hiszpański"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Hiszpański argentyński"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Fiński"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galicyjski"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Węgierski"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebrajski"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandzki"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "WÅ‚oski"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japoński"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Koreański"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Åotewski"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Macedoński"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Holenderski"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norweski"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Polski"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portugalski"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brazylijski"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Rumuński"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Rosyjski"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "SÅ‚owacki"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Słoweński"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbski"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Szwedzki"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamilski"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Turecki"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ukraiński"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Uproszczony chiński"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Chiński tradycyjny"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "To pole może zawierać tylko litery, cyfry i podkreślenia."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"To pole może zawierać jedynie litery, cyfry, podkreślenia, myślniki i "
+"ukośniki."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i pauzy."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Wielkie litery nie sÄ… tutaj dozwolone."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Małe litery nie są tutaj dozwolone."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Wpisz tylko cyfry odddzielone przecinkami."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Wpisz poprawne adresy e-mail oddzielone przecinkami."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Proszę wpisać poprawny adres IP."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Proszę wypełnić te pola."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Tu mogą być tylko cyfry."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "To pole nie może zawierać jedynie cyfr."
+
+#: core/validators.py:120 newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Wpisz liczbę całkowitą."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tutaj sÄ… dozwolone tylko litery."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Rok nie może być wcześniejszy niż 1900."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Niepoprawna data: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Proszę wpisać poprawną godzinę w formacie GG:MM."
+
+#: core/validators.py:162 newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "Wprowadź poprawny adres e-mail."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Wgraj poprawny plik graficzny. Ten, który został wgrany, nie jest obrazem, "
+"albo jest uszkodzony."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
+"niepoprawny."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Odnośnik %s nie wskazuje na poprawne nagranie QuickTime video."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Wymagany jest poprawny URL."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Wymagany jest poprawny HTML. Błędy, które wystąpiły:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Nieprawidłowy format XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Niepoprawny odnośnik: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odnośnik %s jest nieprawidłowy."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Wpisz poprawny kod stanu U.S.A."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Nie wolno przeklinać! Słowo %s nie jest dozwolone."
+msgstr[1] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To pole musi pasować do pola '%s'."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Proszę uzupełnić przynajmniej jedno pole."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość inną niż %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Duplikaty nie sÄ… dozwolone."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Ta wartość musi być pomiędzy %(lower)s a %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Ta wartość nie może być mniejsza od %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Ta wartość nie może być większa od %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ta wartość musi być potęgą %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrze."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po "
+"przecinku."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
+"przecinku."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma conajmniej %s bajtów."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma co najwyżej %s bajtów."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Format tego pola jest nieprawidłowy."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "To pole jest nieprawidłowe."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nie można nic pobrać z %s."
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s zwrócił niepoprawny nagłówek Content-Type '%(contenttype)s'."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Proszę zamknąć tag %(tag)s z linii %(line)s. (Linia zaczyna się od \"%(start)"
+"s\".)"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Część tekstu od linii %(line)s nie jest dozwolony w tym kontekście. (Linia "
+"zaczyna siÄ™ od \"%(start)s\".)"
+
+#: 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\" w linii %(line)s jest niepoprawnym atrybutem. (Linia zaczyna "
+"siÄ™ od \"%(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>\" w linii %(line)s nie jest poprawnym tagiem. (Linia zaczyna siÄ™ "
+"od \"%(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 ""
+"Tag w linii %(line)s nie posiada jednego lub więcej wymaganych atrybutów. "
+"(Linia zaczyna siÄ™ od \"%(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 ""
+"Atrybut \"%(attr)s\" w linii %(line)s ma niepoprawną wartość. (Linia zaczyna "
+"siÄ™ od \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s zostało pomyślnie utworzone."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s zostało pomyślnie zmienione."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s zostało usunięte."
+
+#: newforms/models.py:165 newforms/fields.py:364
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów."
+
+#: newforms/models.py:182 newforms/fields.py:380 newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "Podaj listę wartości."
+
+#: newforms/models.py:188 newforms/fields.py:389
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Wybierz poprawną wartość. %s nie jest jednym z dostępnych wyborów."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Upewnij się, że tekst ma co najwyżej %d znaków."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Upewnij się, że tekst ma co najmniej %d znaków."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest większa lub równa %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Wpisz poprawnÄ… datÄ™."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Wpisz poprawnÄ… godzinÄ™."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Wpisz poprawnÄ… datÄ™/godzinÄ™."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Wpisz poprawną wartość."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Wpisz poprawny URL."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Odnośnik %s jest nieprawidłowy."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "-y"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "-szy"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "-gi"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "-ci"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milion"
+msgstr[1] "%(value).1f milionów"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliard"
+msgstr[1] "%(value).1f miliardów"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilion"
+msgstr[1] "%(value).1f bilionów"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "jeden"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dwa"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "trzy"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "cztery"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "pięć"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sześć"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "siedem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "osiem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "dziewięć"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "przekieruj z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "przekierowanie do"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Ścieżka jak wyżej lub pełny URL z http://"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "przekieruj"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "przekierowania"
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
@@ -74,7 +828,7 @@ msgstr "data/czas dodania"
msgid "is public"
msgstr "publicznie dostepny"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "Adres IP"
@@ -87,8 +841,8 @@ msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
msgstr ""
-"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie tekst \"Ten "
-"komentarz został usunięty\". "
+"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie "
+"tekst \"Ten komentarz został usunięty\". "
#: contrib/comments/models.py:91
msgid "comments"
@@ -96,7 +850,7 @@ msgstr "komentarze"
#: contrib/comments/models.py:131 contrib/comments/models.py:207
msgid "Content object"
-msgstr "Obiekt Treści"
+msgstr "Obiekt treści"
#: contrib/comments/models.py:159
#, python-format
@@ -109,7 +863,7 @@ msgid ""
msgstr ""
"Dodane przez %(user)s dnia %(date)s\n"
"\n"
-"%(comment)y\n"
+"%(comment)s\n"
"\n"
"http://%(domain)s%(url)s"
@@ -211,14 +965,11 @@ msgstr "Błędny ID komentarza"
msgid "No voting for yourself"
msgstr "Nie można głosować na siebie"
-#: contrib/comments/views/comments.py:28
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr ""
-"Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
-
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -231,9 +982,13 @@ msgid_plural ""
"\n"
"%(text)s"
msgstr[0] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarz:\n"
+"\n"
+"%(text)s"
msgstr[1] ""
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -244,27 +999,28 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Dozwolone tylko POSTy"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
msgstr "Ktoś próbował obejść zabezpieczenia formularza komentarzy"
-#: contrib/comments/views/comments.py:207
+#: 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 "Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
+msgstr ""
+"Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
"niepoprawne"
#: contrib/comments/views/comments.py:257
@@ -279,35 +1035,36 @@ msgid "Username:"
msgstr "Nazwa użytkownika:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Hasło:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Zapomniałeś hasło?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Log out"
msgstr "Wyloguj siÄ™"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Hasło:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zapomniałeś hasło?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Oceny"
@@ -326,13 +1083,13 @@ msgstr "Opcjonalne"
msgid "Post a photo"
msgstr "Wyślij zdjęcie"
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
#: contrib/comments/templates/comments/freeform.html:5
msgid "Comment:"
msgstr "Komentarz:"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
msgid "Preview comment"
msgstr "PodglÄ…d"
@@ -340,6 +1097,22 @@ msgstr "PodglÄ…d"
msgid "Your name:"
msgstr "Twoje imiÄ™:"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nazwa domeny"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "wyświetlana nazwa"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "strona"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "strony"
+
#: contrib/admin/filterspecs.py:40
#, python-format
msgid ""
@@ -350,13 +1123,13 @@ msgstr ""
"</ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Wszystko"
#: contrib/admin/filterspecs.py:109
msgid "Any date"
-msgstr "Jakolwiek data"
+msgstr "Dowolna data"
#: contrib/admin/filterspecs.py:110
msgid "Today"
@@ -374,18 +1147,6 @@ msgstr "Ten miesiÄ…c"
msgid "This year"
msgstr "Ten rok"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Tak"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Nie"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Nieznany"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "czas akcji"
@@ -414,12 +1175,34 @@ msgstr "log"
msgid "log entries"
msgstr "logi"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Wszystkie daty"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:264
+#: contrib/admin/views/main.py:350
+msgid "You may edit it again below."
+msgstr "Możesz ponownie edytować wpis poniżej."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Dodaj użytkownika"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Hasło zostało zmienione pomyślnie."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Zmień hasło: %s"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -427,243 +1210,313 @@ msgstr ""
"Proszę wpisać poprawną nazwę użytkownika i hasło. Uwaga: wielkość liter ma "
"znaczenie."
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Zaloguj siÄ™"
-#: contrib/admin/views/decorators.py:61
+#: 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 ""
-"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie "
-"zostało zapisane."
+"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie zostało "
+"zapisane."
-#: contrib/admin/views/decorators.py:68
+#: 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 ""
-"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień "
-"jej ustawienia i spróbuj ponownie."
+"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień jej ustawienia i "
+"spróbuj ponownie."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Nazwy użytkowników nie mogą zawierać znaków '@'."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr "Twój adres e-mail to nie jest twój login. Spróbuj '%s'."
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "Administracja stronÄ…"
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtr:"
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Możesz ponownie edytować wpis poniżej."
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "widok:"
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/doc.py:164
#, python-format
-msgid "You may add another %s below."
-msgstr "Możesz dodać nowy wpis %s poniżej."
+msgid "App %r not found"
+msgstr "Aplikacja %r nie została znaleziona"
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/doc.py:171
#, python-format
-msgid "Add %s"
-msgstr "Dodaj %s"
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Model %(name)r nie został znaleziony w aplikacji %(label)r"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/doc.py:183
#, python-format
-msgid "Added %s."
-msgstr "Dodano %s"
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "powiÄ…zany obiekt `%(label)s.%(type)s`"
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "i"
+#: 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 "model:"
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/doc.py:214
#, python-format
-msgid "Changed %s."
-msgstr "Zmieniono %s"
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "powiÄ…zane obiekty `%(label)s.%(name)s`"
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/doc.py:219
#, python-format
-msgid "Deleted %s."
-msgstr "Skasowano %s"
+msgid "all %s"
+msgstr "wszystkie %s"
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "Żadne pole nie zmienione."
-
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/doc.py:224
#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
+msgid "number of %s"
+msgstr "liczba %s"
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/doc.py:229
#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr ""
-"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
-
-
-#: contrib/admin/views/main.py:392
-#, python-format
-msgid "Change %s"
-msgstr "Zmień %s"
+msgid "Fields on %s objects"
+msgstr "Pola obiektów %s"
-#: contrib/admin/views/main.py:470
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:475
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Jedno lub więcej %(fieldname)s w %(name)s:"
-
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
-
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "JesteÅ› pewien?"
-
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "Historia zmian: %s"
-
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s"
-msgstr "Zaznacz %s"
-
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s to change"
-msgstr "Zaznacz %s aby zmienić"
-
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+#: 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 "Liczba całkowita"
-#: contrib/admin/views/doc.py:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "ÅaÅ„cuch (do %(maxlength)s znaków)"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Liczby całkowite rozdzielone przecinkami"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Data (bez godziny)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Data (z godzinÄ…)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "Adres e-mail"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Ścieżka do pliku"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "Numer dziesiętny"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Wartość logiczna (True, False, None - prawda, fałsz lub nic)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "Relacja do modelu rodzica"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Numer telefonu"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Tekst"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "Czas"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "Stan USA (dwie duże litery)"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "Tekst XML"
-#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nie jest obiektem urlpattern"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administracja stronÄ…"
+
+#: contrib/admin/views/main.py:274 contrib/admin/views/main.py:359
+#, python-format
+msgid "You may add another %s below."
+msgstr "Możesz dodać nowy wpis %s poniżej."
+
+#: contrib/admin/views/main.py:292
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Added %s."
+msgstr "Dodano %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Changed %s."
+msgstr "Zmieniono %s"
+
+#: contrib/admin/views/main.py:342
+#, python-format
+msgid "Deleted %s."
+msgstr "Skasowano %s"
+
+#: contrib/admin/views/main.py:345
+msgid "No fields changed."
+msgstr "Żadne pole nie zmienione."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
+
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
+
+#: contrib/admin/views/main.py:394
+#, python-format
+msgid "Change %s"
+msgstr "Zmień %s"
+
+#: contrib/admin/views/main.py:479
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:484
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s:"
+
+#: contrib/admin/views/main.py:517
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
+
+#: contrib/admin/views/main.py:520
+msgid "Are you sure?"
+msgstr "JesteÅ› pewien?"
+
+#: contrib/admin/views/main.py:542
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia zmian: %s"
+
+#: contrib/admin/views/main.py:576
+#, python-format
+msgid "Select %s"
+msgstr "Zaznacz %s"
+
+#: contrib/admin/views/main.py:576
+#, python-format
+msgid "Select %s to change"
+msgstr "Zaznacz %s aby zmienić"
+
+#: contrib/admin/views/main.py:771
+msgid "Database error"
+msgstr "BÅ‚Ä…d bazy danych"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Teraz:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Zmień:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Czas:"
+
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Dokumentacja"
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Change password"
msgstr "Zmiana hasła"
+#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -673,8 +1526,18 @@ msgstr "Zmiana hasła"
msgid "Home"
msgstr "PoczÄ…tek"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Używając %(filter_title)s "
+
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Historia"
@@ -699,8 +1562,28 @@ msgid ""
"This object doesn't have a change history. It probably wasn't added via this "
"admin site."
msgstr ""
-"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis te nie "
-"został dodany poprzez panel admina"
+"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis ten nie został "
+"dodany poprzez panel administracyjny."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Szukaj"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 wynik"
+msgstr[1] "%(counter)s wyników"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s trafień"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Pokaż wszystko"
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
@@ -727,23 +1610,29 @@ msgid ""
"There's been an error. It's been reported to the site administrators via e-"
"mail and should be fixed shortly. Thanks for your patience."
msgstr ""
-"Wystąpił niespodziewany błąd. Raport został wysłany emailem "
-"administratorowi strony."
+"Wystąpił niespodziewany błąd. Raport został wysłany emailem administratorowi "
+"strony."
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Strona nie znaleziona"
-
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Niestety nie można znaleźć rządanej strony."
+#: contrib/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 ""
+"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie "
+"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich "
+"odczytu."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
msgstr "Modele dostępne w aplikacji %(name)s."
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
@@ -769,75 +1658,70 @@ msgstr "Moje akcje"
msgid "None available"
msgstr "Brak"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Dodaj %(name)s"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr ""
-"Czy <a href=\"/password_reset/\">zapomniałeś/łaś</a> hasła?"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Niestety nie można znaleźć rządanej strony."
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-msgstr "Witaj,"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtr"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Pokaż na stronie"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Proszę popraw poniższy błąd"
+msgstr[1] "Proszę popraw poniższe błędy"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Sortowanie"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "PorzÄ…dek:"
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
-msgstr "Skasuj"
+msgstr "Usuń"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
msgstr ""
-"Skasowanie %(object_name)s '%(object)s' spowoduje kasację zależnych "
-"obiektów, lecz twoje uprawnienia nie pozwalają na usunięcie następujących "
+"Skasowanie %(object_name)s '%(escaped_object)s' spowoduje usunięcie "
+"zależnych obiektów, lecz nie posiadasz uprawnień do usunięcia następujących "
"typów obiektów:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Czy chcesz skasować %(object_name)s \"%(object)s\"? Wszystkie "
+"Czy chcesz skasować %(object_name)s \"%(escaped_object)s\"? Następujące "
"zależne obiekty zostaną skasowane:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Tak, usuń"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr "Używając %(title)s"
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Szukaj"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Pokaż na stronie"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Proszę popraw poniższy błąd"
-msgstr[1] "Proszę popraw poniższe błędy"
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Sortowanie"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "PorzÄ…dek:"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Witaj,"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -855,6 +1739,38 @@ msgstr "Zapisz i kontynuuj edycjÄ™"
msgid "Save"
msgstr "Zapisz"
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Podaj nowe hasło dla użytkownika <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Hasło"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Hasło (powtórz)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Podaj powyższe hasło w celu weryfikacji."
+
+#: contrib/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 ""
+"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować "
+"więcej opcji użytkownika."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nazwa użytkownika"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -883,8 +1799,8 @@ msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll reset "
"your password and e-mail the new one to you."
msgstr ""
-"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój "
-"adres email."
+"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój adres "
+"email."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -912,8 +1828,8 @@ msgid ""
"We've e-mailed a new password to the e-mail address you submitted. You "
"should be receiving it shortly."
msgstr ""
-"Nowe hasło zostało wysłane na podany adres email. Powinieneś "
-"otrzymać je niebawem."
+"Nowe hasło zostało wysłane na podany adres email. Powinieneś otrzymać je "
+"niebawem."
#: contrib/admin/templates/registration/password_change_form.html:12
msgid ""
@@ -986,6 +1902,14 @@ msgid ""
"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\">Aby zainstalować skryptozakładki, przeciągnij łącze do "
+"paska zakładek\n"
+"lub kliknij prawym klawiszem na łączu i dodaj je do zakładek. Teraz możesz\n"
+"wybrać skryptozakładkę na dowolnej stronie serwisu. Uwaga: niektóre z tych "
+"skryptozakładek wymagają przeglądania serwisu z komputera\n"
+"\"wewnętrznego\" (skontaktuj się z administratorem systemu, jeśli nie jesteś "
+"pewien, czy ten komputer jest \"wewnętrznym\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
@@ -996,6 +1920,8 @@ msgid ""
"Jumps you from any page to the documentation for the view that generates "
"that page."
msgstr ""
+"Przekierowuje z dowolnej strony do dokumentacji dla widoku, który ją "
+"generuje."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
@@ -1005,13 +1931,11 @@ msgstr "Pokaż ID obiektu"
msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
-msgstr ""
-"Pokazuje typ i unikalne ID dla stron, które reprezentują "
-"pojedynczy obiekt."
+msgstr "Pokazuje typ i unikalne ID dla stron, które reprezentują pojedynczy obiekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
-msgstr "Edytuj ten obiekt (bierzÄ…ce okno)"
+msgstr "Edytuj ten obiekt (bieżące okno)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
@@ -1025,172 +1949,123 @@ msgstr "Edytuj ten obiekt (nowe onko)"
msgid "As above, but opens the admin page in a new window."
msgstr "Jak wyżej, tyle że otwiera nowe okno."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Data:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Czas:"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Teraz:"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Zmień:"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "przekieruj z"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/"
-"events/search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "przekierowanie do"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr "Ścieżka jak wyżej lub pełny URL z http://"
-
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "przekieruj"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "przekierowania"
-
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i zamykający slash."
-
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "tytuł"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "zawartość"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "włącz komentarze"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nazwa szablonu"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Przykład: 'flatpages/contact_page'. Jeżeli nie podane system użyje "
-"'flatpages/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "wymagana rejestracja"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "nazwa pythonowa modelu klasy"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "typ zawartości"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "strona statyczna"
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "typy zawartości"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "strony statyczne"
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Wylogowany"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
msgid "name"
msgstr "nazwa"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:46
msgid "codename"
msgstr "nazwa kodowa"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:49
msgid "permission"
msgstr "uprawnienie"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
msgid "permissions"
msgstr "uprawnienia"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:68
msgid "group"
msgstr "grupa"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
msgid "groups"
msgstr "grupy"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:99
msgid "username"
msgstr "użytkownik"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Wymagane. 30 znaków lub mniej. Tylko znaki alfanumeryczne (litery, cyfry i "
+"podkreślenia)."
+
+#: contrib/auth/models.py:100
msgid "first name"
msgstr "ImiÄ™"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:101
msgid "last name"
msgstr "Nazwisko"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:102
msgid "e-mail address"
msgstr "adres e-mail"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:103
msgid "password"
msgstr "hasło"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Użyj '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Użyj '[algo]$[salt]$[hexdigest]' lub <a href=\"password/\">formularza zmiany "
+"hasła</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "staff status"
msgstr "w zespole"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "Designates whether the user can log into this admin site."
msgstr "Oznacza czy użytkownik może zalogować się do panelu admina."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:105
msgid "active"
msgstr "aktywny"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Oznacza czy użytkownik może zalogować się do panelu administratora. Odznacz "
+"to zamiast usuwać konta."
+
+#: contrib/auth/models.py:106
msgid "superuser status"
msgstr "Główny Administrator"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Oznacza, że ten użytkownik ma wszystkie uprawnienia bez jawnego "
+"przypisywania ich."
+
+#: contrib/auth/models.py:107
msgid "last login"
msgstr "ostatnio zalogowany"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:108
msgid "date joined"
msgstr "data przyłączenia"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:110
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -1198,106 +2073,607 @@ msgstr ""
"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on "
"uprawnienia grup, do których należy."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:111
msgid "user permissions"
msgstr "uprawnienia użytkownika"
-#kurwa
-#: contrib/auth/models.py:70
+# kurwa
+#: contrib/auth/models.py:115
msgid "user"
msgstr "użytkownik"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:116
msgid "users"
msgstr "użytkownicy"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:122
msgid "Personal info"
msgstr "Dane osobowe"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:123
msgid "Permissions"
msgstr "Uprawnienia"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:124
msgid "Important dates"
msgstr "Ważne daty"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:125
msgid "Groups"
msgstr "Grupy"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:269
msgid "message"
msgstr "wiadomość"
-#: contrib/auth/forms.py:30
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "UżytkownikAnonimowy"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Hasła się nie zgadzają."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Użytkownik o tej nazwie już istnieje."
+
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
msgstr ""
-"Twoja przeglądarka nie chce akceptować ciasteczek. Są one "
-"wymagane do zalogowania siÄ™."
+"Twoja przeglądarka nie chce akceptować ciasteczek. Są one wymagane do "
+"zalogowania siÄ™."
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "nazwa pythonowa modelu klasy"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "To konto jest nieaktywne."
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "typ zawartości"
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Ten adres e-mail nie ma przypisanego konta. Jesteś pewien, że "
+"zarejestrowałeś się?"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "typy zawartości"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Pola 'nowe hasło' nie zgadzają się."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Podane stare hasło jest niepoprawne. Proszę podać je jeszcze raz."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Wpisz kod pocztowy. Biały znak pomiędzy dwiema częściami kodu jest wymagany."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Numery telefoniczne muszą być w formacie XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "To pole może zawierać jedynie liczby."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "To pole nie może zawierać więcej niż 11 cyfr lub 14 znaków."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Błędny numer CPF."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "To pole musi zawierać co najmniej 14 cyfr."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Błędny numer CNPJ."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Wpisz czterocyfrowy kod pocztowy."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX. lub XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Wpisz poprawny numer U.S. Social Security w formacie XXX-XX-XXXX."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
-#: contrib/sessions/models.py:35
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Podaj poprawny niemiecki numer dowodu osobistego w formacie XXXXXXXXXXX-"
+"XXXXXXX-XXXXXXX-X."
+
+#: 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/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXXXX lub XXX-XXXX."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Wpisz poprawny kod pocztowy."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Wpisz poprawny numer ubezpieczenia socjalnego."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Wpisz poprawny numer VAT."
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
+msgid "Enter a zip code in the format XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXX."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Wpis poprawny numer norweskiego ubezpieczenia socjalnego."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Wpis poprawny numer fińskiego ubezpieczenia socjalnego."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr "Podaj poprawny numer szwajarskiego dowodu osobistego lub paszportu w formacie X1234567<0 lub 1234567890."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Podaj poprawny numer islandzkiego dowodu osobistego w formacie XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Numer islandzkiego dowodu osobistego jest błędny."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Podaj poprawny czilijski RUT w formacie XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Wpisz poprawny czilijski RUT"
+
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "klucz sesji"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "data sesji"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "data wygaśnięcia sesji"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "sesja"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "sesje"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nazwa domeny"
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i "
+"zamykający ukośnik."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "wyświetlana nazwa"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tytuł"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "strona"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "zawartość"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "strony"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "włącz komentarze"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "Y-m-d"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nazwa szablonu"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "Y-m-d H:i:s"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Przykład: 'flatpages/contact_page.html'. Jeżeli nie zostanie podane, system "
+"użyje 'flatpages/default.html'."
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "H:i:s"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "wymagana rejestracja"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "strona statyczna"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "strony statyczne"
#: utils/dates.py:6
msgid "Monday"
@@ -1487,475 +2863,89 @@ msgid_plural "minutes"
msgstr[0] "minuta"
msgstr[1] "minut"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengalski"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Czeski"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Walijski"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Duński"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Niemiecki"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Grecki"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Angielski"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Hiszpański"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Francuski"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galicyjnski"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr ""
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Hebrajski"
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandzki"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "WÅ‚oski"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "Japoński"
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "Holenderski"
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norweski"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brazylijski"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Rumuński"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Rosyjski"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "SÅ‚owacki"
-
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "SÅ‚owacki"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbski"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Szwedzki"
-
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "Ukraiński"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Uproszczony Chiński"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Chiński tradycyjny"
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "To pole możei zawierać tylko litery, cyfry i podkreślenia"
-
-#: core/validators.py:64
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i slasze."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Wielkie litery nie sÄ… tutaj dozwolone"
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Małe litery nie są tutaj dozwolone"
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Wpisz tylko cyfry odddzielone przecinkami"
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Wpisz poprawne adresy e-mai oddzielone przecinkamil"
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Proszę wpisać poprawny adres IP"
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Proszę wypełnić te pola"
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Tu mogą być tylko cyfry"
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "To pole nie może zawierać jedynie cyfr."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Wpisz całą liczbę"
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Tutaj sÄ… dozwolone tylko litery"
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Proszę wpisać poprawny czas w formacie GG:MM"
-
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Wprowadź poprawną datę i czas w formacie RRRR-MM-DD GG:MM"
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Wprowadź poprawny adres e-mail"
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Wgraj poprawny plik graficzny. Ten, który został wgrany jest niepoprawny "
-"albo uszkodzony."
-
-#: core/validators.py:155
+#: utils/timesince.py:40
#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
+msgid "%d milliseconds"
+msgstr "%d milisekund"
-#: core/validators.py:159
+#: utils/timesince.py:41
#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
-"niepoprawny."
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
-#: core/validators.py:167
+#: utils/timesince.py:47
#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Odnośnik %s nie wskazuje na poprawne plik QuickTime video."
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Wymagany jest poprawny URL."
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "popołudniu"
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Wymagany jest poprawny odnośnik. Błędy to:\n"
-"%s"
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "rano"
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Nieprawidłowy format XML: %s"
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "popołudniu"
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Niepoprawny odnośnik: %s"
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "rano"
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "Odnośnik %s jest nieprawidłowy."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Wpisz poprawny kod stanu U.S.A."
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "północ"
-#: core/validators.py:229
-#, python-format
-msgid "Watch your mouth! The word %s is not allowed here."
-msgid_plural "Watch your mouth! The words %s are not allowed here."
-msgstr[0] "Nie wolno przeklinać! Słowo %s jest niedozwolone."
-msgstr[1] "Nie wolno przeklinać! Słowa %s są niedozwolone."
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "południe"
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "To pole musi pasować do pola '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Proszę wpisać cokolwiek do chociaż jednego pola."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "To pole musi być uzupełnione jeśli %(field)s jest %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "To pole musi być wypełnione jeżeli %(field)s nie jest %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Duplikaty sÄ… niedozwolone."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr ""
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Proszę wpisać poprawną liczbę dziesiętną."
-
-#: core/validators.py:349
-#, python-format
-msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s total digits."
-msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
-
-#: core/validators.py:352
-#, python-format
-msgid "Please enter a valid decimal number with at most %s decimal place."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s decimal places."
-msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po przecinku."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po przecinku."
-
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Upewnij się, że wgrany plik ma conajmniej %s bajtów."
-
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Upewnij się, że wgrany plik nie zawiera więcej niż %s bajtów."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Format tego pola jest nieprawidłowy."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "To pole jest nieprawidłowe."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Nie można nic pobrać z %s."
-
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"URL %(url)s zwrócił niepoprawny Content-Type header '%(contenttype)s'."
-
-
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr ""
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "Y-m-d"
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "To pole jest wymagane"
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "Y-m-d H:i:s"
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "Ta wartość musi być liczbą całkowitą"
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "Ta wartość musi być logiczna (True, False - prawda lub fałsz)."
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y-m"
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "To pole nie może być puste."
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "m-d"
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Wpisz poprawnÄ… nazwÄ™ pliku."
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "tak,nie,może"
-#: db/models/fields/related.py:43
+#: template/defaultfilters.py:520
#, python-format
-msgid "Please enter a valid %s."
-msgstr "Proszę wpisać poprawne %s."
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajtów"
+msgstr[2] ""
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "Oddziel kilka pól ID przecinkami."
-
-#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-" Trzymaj przyciśnięty klawisz \"Ctrl\", lub \"Command\" na Macu aby "
-"zaznaczyć więcej niż jeden wybór."
-
-#: db/models/fields/related.py:625
+#: template/defaultfilters.py:522
#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural ""
-"Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] ""
-msgstr[1] ""
+msgid "%.1f KB"
+msgstr "%.1f kB"
-#: forms/__init__.py:380
+#: template/defaultfilters.py:524
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak."
-msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaków."
+msgid "%.1f MB"
+msgstr "%.1f MB"
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Znaki nowego wiersza sÄ… tutaj niedopuszczalne."
-
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: template/defaultfilters.py:525
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr ""
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Wgrany plik jest pusty."
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Proszę wpisać liczbę z zakresu od -32 768 do 32 767"
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Proszę wpisać liczbę dodatnią."
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Proszę wpisać liczbę z zakresu od 0 do 32 767"
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "tak,nie, może"
-
-#~ msgid "String (up to 50)"
-#~ msgstr "Ciąg znaków (do ilości 50 znaków)"
-
-#~ msgid "Comment"
-#~ msgstr "Komentarz"
-
-#~ msgid "Comments"
-#~ msgstr "Komentarze"
-
-#~ msgid "label"
-#~ msgstr "etykieta"
-
-#~ msgid "package"
-#~ msgstr "pakiet"
+msgid "%.1f GB"
+msgstr "%.1f GB"
-#~ msgid "packages"
-#~ msgstr "pakiety"
diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.mo b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..752211a454
--- /dev/null
+++ b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.po b/django/conf/locale/pl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..8b929f309d
--- /dev/null
+++ b/django/conf/locale/pl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,112 @@
+# translation of djangojs.po to Polish
+# Copyright (C) 2007 Michal Chruszcz
+# This file is distributed under the same license as the django package.
+#
+# Michal Chruszcz <troll@pld-linux.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-12 11:42+0100\n"
+"Last-Translator: Michal Chruszcz <troll@pld-linux.org>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostępne %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Wybierz wszystko"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Usuń"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Wybrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+#, fuzzy
+msgid "Select your choice(s) and click "
+msgstr "Zaznacz swój wybór i kliknij "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Wyczyść wszystko"
+
+#: 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 "Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień Październik Listopad Grudzień"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Niedziela Poniedziałek Wtorek Środa Czwartek Piątek Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N Pn Wt Åšr Cz Pt So"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Teraz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Zegar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Wybierz czas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Północ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 rano"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Południe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalendarz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Jutro"
+
diff --git a/django/conf/locale/pt/LC_MESSAGES/django.mo b/django/conf/locale/pt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..7adc41be5b
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pt/LC_MESSAGES/django.po b/django/conf/locale/pt/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..d99f51d78b
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/django.po
@@ -0,0 +1,2125 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz <nmariz@gmail.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 0.96pre\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 15:43+0200\n"
+"PO-Revision-Date: 2007-03-16 10:00+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: pt_PT <nmariz@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID do objecto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentário"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "avaliação #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "avaliação #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "avaliação #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "avaliação #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "avaliação #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "avaliação #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "avaliação #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "avaliação #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é uma avaliação válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora de submissão"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "Endereço IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "foi removido"
+
+#: 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 "Seleccione esta opção se o comentário não é apropriado. Uma mensagem \"Este comentário foi removido\" será mostrada no seu lugar."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentários"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objecto de conteúdo"
+
+#: 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 ""
+"Colocado pelo utilizador %(user)s em %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da pessoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "endereço ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprovado pela equipa"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentário livre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentários livres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "pontuação"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data da pontuação"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "pontuação do karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "pontuações do karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Avaliação %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"O utilizador %(user)s colocou uma flag neste comentário\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data da flag"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flag do utilizador"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flags do utilizador"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de remoção"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "remoção pelo moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "remoções pelo moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Remoção de moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Utilizadores anónimos não podem votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentário inválido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Não pode votar em si"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Esta avaliação é obrigatória porque introduziu pelo menos uma outra avaliação."
+
+#: 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] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentário:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentários:\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 ""
+"Este comentário foi colocado por um utilizador incompleto:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Apenas POSTs são autorizados"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Um ou mais campos obrigatórios não foram submetidos"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguém modificou o formulário de comentário (violação de segurança)"
+
+#: 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 "O formulário de comentário teve um parâmetro 'target' inválido -- o ID do objecto foi inválido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulário de comentário não forneceu nem 'preview' ou 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Utilizador:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Sair"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Palavra-passe:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esqueceu-se da palavra-passe?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Avaliações"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obrigatório"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Colocar uma foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pré-visualizar comentário"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "O seu nome:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %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 "Todos"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualquer data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mês"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sim"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Não"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da acção"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do objecto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do objecto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flag de acção"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "modificar mensagem"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de log"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Por favor introduza o utilizador e palavra-passe correctos. Note que ambos os casos diferenciam maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Entrar"
+
+#: 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 "Por favor autentique-se novamente, porque a sua sessão expirou. Não se preocupe: Os dados submetidos foram gravados."
+
+#: 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 "Aparentemente o seu browser não está configurado para aceitar cookies. Por favor active os cookies, carrege novamente a página e volte a tentar."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nomes de utilizador não podem conter o caracter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "O seu endereço de e-mail não é o seu nome de utilizador. Tente usar '%s'."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Administração do site"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "Pode editá-lo(a) outra vez abaixo."
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pode adicionar outro %s abaixo."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Foi adicionado %s"
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Foi modificado %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Foi removido %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Nenhum campo foi modificado."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado(a) com sucesso."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso. Pode voltar a editar novamente abaixo."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Um ou mais %(fieldname)s em %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Um ou mais %(fieldname)s em %(name)s:"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "Tem a certeza?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificações: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "Seleccionar %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s para modificar"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "Erro de base de dados"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "ver:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "A aplicação %r não encontrada"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "O Model %r não foi encontrado na aplicação %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "o objecto `%s.%s` relacionado"
+
+#: 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 "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "os objectos `%s.%s` relacionados"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "todos %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos nos objectos %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 "Inteiro"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Pode ser True ou False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "String (até %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Inteiros separados por virgula"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (sem hora)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (com hora)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Endereço de e-mail"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Caminho do ficheiro"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Número décimal"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Pode ser True, False ou None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Relação para o pai do model"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Número de telefone"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos E.U.A (duas letras em maiúsculas)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s não parece ser um objecto urlpattern"
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "Adicionar utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentação"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Modificar palavra-passe"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "História"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acção"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, 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 "Este objecto não tem histórico de modificações. Provavelmente não foi modificado via site de administração."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro do servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do servidor <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 "Ocorreu um erro. Foi reportado aos administradores do site via e-mail e deverá ser corrigido brevemente. Obrigado pela sua paciência."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pedimos desculpa, mas a página solicitada não foi encontrada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models disponíveis na aplicação %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Não tem permissão para modificar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acções Recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "As minhas Acções"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nenhum disponível"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Esqueceu-se a sua palavra-passe?</a>"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bem-vindo,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Remover"
+
+#: 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 "A remoção de %(object_name)s '%(escaped_objects)s' resultará na remoção dos objectos relacionados, mas a sua conta não tem permissão de remoção dos seguintes tipos de objectos:"
+
+#: 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 "Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? Todos os items relacionados seguintes irão ser removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho a certeza"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s no total"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver no site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor corrija o erro abaixo."
+msgstr[1] "Por favor corrija os erros abaixo."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gravar como novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gravar e adicionar outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gravar e continuar a editar"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gravar"
+
+#: 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 "Passa-se algo de errado com a instalação da sua base de dados. Verifique se as tabelas da base de dados foram criadas apropriadamente e verifique se a base de dados pode ser lida pelo utilizador definido."
+
+#: 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 "Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá editar mais opções do utilizador."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Palavra-passe"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Palavra-passe (novamente)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Introduza a palavra-passe como acima, para verificação."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Modificação de palavra-passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Palavra-passe modificada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "A sua palavra-passe foi modificada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Reinicializar palavra-passe"
+
+#: 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 "Esqueceu-se da palavra-passe? Introduza o seu email abaixo, e enviaremos a sua palavra-passe reinicializada para o seu e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por ter gasto tempo de qualidade no Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar novamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Palavra-passe reinicializada com sucesso"
+
+#: 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 "Foi enviada uma nova palavra-passe nova para o e-mail que submeteu. Deverá estar a recebê-la brevemente."
+
+#: 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 "Por razões de segurança, por favor introduza a sua palavra-passe antiga e depois introduza a nova duas vezes para que possamos verificar se introduziu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Palavra-passe antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmação da palavra-passe:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modificar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está a receber este e-mail porque requisitou a reinicialização da sua palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a sua conta de utilizador em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "A sua nova palavra-chave é: %(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 "Tenha a liberdade de modificar esta palavra-passe através desta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "O seu nome de utilizador, no caso de se ter esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado pela sua visita ao nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "A equipa do %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Itens do bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentação dos itens do bookmark"
+
+#: 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\">Para instalar itens no bookmark, arraste o link para sua barra \n"
+"de bookmarks, ou clique com o lado direito do rato no link e adicione ao seus bookmarks. Agora pode \n"
+"seleccionar o link do bookmark de qualquer página no site. Note que alguns destes \n"
+"itens do bookmark requerem que visualize o site de um computador designado \n"
+"por \"internal\" (entre em contacto com o seu administrador de sistema se \n"
+"não tiver a certeza se o seu computador é \"internal\".</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentação desta página"
+
+#: 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 "Vai de qualquer página para a documentação da view que gera essa página."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar o ID do objecto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Mostra o tipo de conteúdo e o ID único para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objecto (janela actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Vai para a página de admin para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objecto (nova janela)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Tal como acima, mas abre a página de admin numa nova janela."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redireccionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Isto deverá ser um caminho absoluto, excluindo o domínio. Exemplo: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redireccionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Isto poderá ser um caminho absoluto (como acima) ou um URL completo começado por 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redireccionar"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciona"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/about/contact/'. Verifique se possui as barras no inicio e no fim."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titulo"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "permitir comentários"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome da template"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Exemplo: 'flatpages/contact_page.html'. Se não for fornecido, o sistema usará: 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "é necessário registo"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver seleccionado, apenas utilizadores autenticados poderão ver esta página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página plana"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Saiu"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "nome de código"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "permissão"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "permissões"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Obrigatório. 30 caracteres ou menos. Apenas caracteres alfanúmericos (letras, números ou underscores)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "palavra-passe"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "status de equipa"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Define se o utilizador pode usar a administração do site."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Define se este utiliador pode usar a adminstração do site. Não seleccione em vez de remover as contas."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "Status de superuser"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Define se este utilizador tem todas as permissões sem explicitamente as atribuir."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "última entrada"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "data de registo"
+
+#: 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 "Em adição às permissões definidas manualmente, este utilizador também terá todas as permissões atribuídas a cada grupo a que partence."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "permissões do utilizador"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "utilizadores"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Informação pessoal"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "mensagem"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Aparentemente que o seu browser não está configurado para aceitar cookies. Os cookies são necessários para poder entrar."
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "Esta conta não está activa."
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "python model class name"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "tipos de conteúdos"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "mostrar nome"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "fev"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dez"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mês"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Ãrabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalês"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "Galês"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "Grego"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "Espanhol Argentino"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "Filandês"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "Galaciano"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "Holandês"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "Brasileiro"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor apenas poderá conter letras, números ou underscores."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Este valor apenas poderá conter letras, números, underscores ou traços."
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor apenas poderá conter letras, números, undercores ou hífenes."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculas não são permitidas aqui."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculas não são permitidas aqui."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "Introduza apenas números separados por vírgulas."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduza endereços de e-mail válidos separados por vírgulas."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduza um endereço IP válido."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos aqui."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não númericos não são permitidos aqui."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode ser constituido apenas por números."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "Introduza um número inteiro."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas letras são válidas aqui."
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "O ano deve ser 1900 ou superior."
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "Data inválida: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduza uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduza uma hora válida no formato HH:MM."
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduza uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "Introduza um endereço de e-mail válido."
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nenhum ficheiro foi submetido. Verifique o tipo de codificação do formulário."
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Introduza uma imagem válida. O ficheiro que introduziu ou não é uma imagem ou está corrompido."
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "O URL %s não aponta para uma imagem válida."
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Os números de telefone deverão ser no formato XXX-XXX-XXXX. \"%s\" é inválido."
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "O URL %s não aponta para um QuickTime video válido."
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "É obrigatório um URL válido"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"É obrigatório um HTML válido. Os erros específicos são:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formatado: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválido: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "O URL %s é um link quebrado."
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduza uma abreviação de um estado dos E.U.A. válido."
+
+#: core/validators.py:256
+#, 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] "Atenção à linguagem! A palavra %s não é permitida aqui."
+msgstr[1] "Atenção à linguagem! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve ser igual ao campo '%s'."
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "Por favor preencha pelo menos um campo."
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor preencha ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s for %(value)s"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s não é %(value)s"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deverá ser uma potência de %s."
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr "Por favor introduza um número décimal válido."
+
+#: core/validators.py:378
+#, 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] "Por favor introduza um número décimal com um máximo de %s digito."
+msgstr[1] "Por favor introduza um número décimal com um máximo de %s digitos."
+
+#: core/validators.py:381
+#, 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] "Por favor introduza um número décimal com o máximo de % digito na parte inteira."
+msgstr[1] "Por favor introduza um número décimal com o máximo de % digitos na parte inteira."
+
+#: core/validators.py:384
+#, 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] "Por favor introduza um número décimal com o máximo de %s digito na parte décimal."
+msgstr[1] "Por favor introduza um número décimal com o máximo de %s digitos na parte décimal."
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique que o ficheiro introduzido tem pelo menos %s bytes."
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o ficheiro introduzido tem no máximo %s bytes."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo é errado."
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível extrair nada de %s."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "O URL %(url)s devolveu um tipo de conteúdo inválido no header: '%s(contenttype)s'."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "Por favor feche a tag %(tag)s na linha %(line)s. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Algum texto começado na linha %(line)s não é permitido nesse contexto. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"%(attr)s\" na linha %(line)s é um atributo inválido. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"<%(tag)s>\" na linha %(line)s é um tag inválida. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Uma tag na linha %(line)s não tem um o mais atributos obrigatórios. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (A linha começa por \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "O(A) %(verbose_name)s foi criado(a) com sucesso."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "O(A) %(verbose_name)s foi actualizado(a) com sucesso."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "O(A) %(verbose_name)s foi removido(a)."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "O(A) %(object)s com este %(type)s já existe para o(a) %(field)s fornecido."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo é obrigatório."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "Este campo deverá ser inteiro."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "Este valor deverá ser True ou False."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "Este campo não pode ser nulo."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "Introduza um nome de ficheiro válido."
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor introduza um %s válido."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "Separe múltiplos IDs através de vírgulas."
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mantenha pressionado o \"Control\", or \"Command\" no Mac, para seleccionar mais do que um."
+
+#: db/models/fields/related.py:664
+#, 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] "Por favor introduza IDs de %(self)s válidos. O valor %(value)r é inválido."
+msgstr[1] "Por favor introduza IDs de %(self)s válidos. Os valores %(value)r são inválidos."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Verifique se o seu texto tem menos de %s caracter."
+msgstr[1] "Verifique se o seu texto tem menos de %s caracteres."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "Quebras de linha não são permitas aqui."
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione uma opção válida; '%(data)s' não se encontra em %(choices)s."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "O ficheiro submetido encontra-se vazio."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduza um número entre -32,768 e 32,767."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "Introduza um número positivo."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduza um número entre 0 e 32,767."
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "sim,não,talvez"
diff --git a/django/conf/locale/pt/LC_MESSAGES/djangojs.mo b/django/conf/locale/pt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..669dd9d119
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/pt/LC_MESSAGES/djangojs.po b/django/conf/locale/pt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..90f4b9de86
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,108 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz <nmariz@gmail.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 0.96pre\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 11:51+0100\n"
+"PO-Revision-Date: 2007-03-16 10:01+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: pt_PT <nmariz@gmail.com>\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 "Disponível %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Escolhido %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione a(s) sua(s) escolha(s) e clique "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Limpar tudo"
+
+#: 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 "Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Relógio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolha a hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Meia-noite"
+
+#: 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 "Meio-dia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendário"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Amanhã"
diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
index 7f506f972f..6e3af1681c 100644
--- a/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
+++ b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/django/conf/locale/pt_BR/LC_MESSAGES/django.po
index bc955f29c4..540d1b51bb 100644
--- a/django/conf/locale/pt_BR/LC_MESSAGES/django.po
+++ b/django/conf/locale/pt_BR/LC_MESSAGES/django.po
@@ -1,21 +1,1022 @@
# Português do Brasil translation of django.
# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-# João Marcus Christ <joaoma@gmail.com>, 2006.
-# Carlos Eduardo de Paula <carlosedp@gmail.com>, 2006.
#
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:11+0200\n"
-"PO-Revision-Date: 2006-11-01 17:45-0300\n"
-"Last-Translator: Carlos Eduardo de Paula <carlosedp@gmail.com>\n"
+"POT-Creation-Date: 2007-03-28 12:02-0300\n"
+"PO-Revision-Date: 2007-04-02 17:20+0200\n"
+"Last-Translator: Daniel Alves Barbosa de Oliveira Vaz <danielvaz@gmail.com>\n"
"Language-Team: Português do Brasil <pt-br@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:610
+#: db/models/fields/__init__.py:621 newforms/models.py:177
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461
+msgid "This field is required."
+msgstr "Este campo é requerido."
+
+#: oldforms/__init__.py:392
+#, fuzzy, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Certifique-se de que seu texto tenha menos que %s caractere."
+msgstr[1] "Certifique-se de que seu texto tenha menos que %s caracteres."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Não são permitidas quebras de linha aqui."
+
+#: 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 "Selecione uma escolha válida; '%(data)s' não está em %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sim"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Não"
+
+#: 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 "Nenhum arquivo enviado. Verifique o tipo de codificação do formulário."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "O arquivo enviado está vazio."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Informe um número inteiro entre -32.768 e 32.767"
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Informe um número positivo"
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Informe um número inteiro entre 0 e 32.767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s com este %(type)s já existe para o %(field)s dado."
+
+#: 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 "e"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com este %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:367
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Este valor deve ser um inteiro."
+
+#: db/models/fields/__init__.py:402
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Este valor deve ser Verdadeiro ou Falso."
+
+#: db/models/fields/__init__.py:423
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Este campo não pode ser nulo."
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Informe uma data válida no formato AAAA-MM-DD."
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Informe uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "Informe um nome de arquivo válido."
+
+#: db/models/fields/__init__.py:751
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Este valor deve ser Verdadeiro ou Falso."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor informe um %s válido."
+
+#: db/models/fields/related.py:642
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Separe IDs múltiplos com vírgulas."
+
+#: db/models/fields/related.py:644
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Mantenha pressionado \"Control\", ou \"Command\" no Mac para selecionar "
+"mais de uma opção."
+
+#: db/models/fields/related.py:691
+#, fuzzy, 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] ""
+"Por favor, entre IDs válidos para %(self)s. O valor %(value)r é inválido."
+msgstr[1] ""
+"Por favor, entre IDs válidos para %(self)s. Os valores %(value)r são "
+"inválidos."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arábico"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalês"
+
+#: conf/global_settings.py:41
+#, fuzzy
+msgid "Catalan"
+msgstr "Catalão"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Tcheco"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:44
+#, fuzzy
+msgid "Danish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grego"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Espanhol Argentino"
+
+#: conf/global_settings.py:50
+#, fuzzy
+msgid "Finnish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galiciano"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Macedônio"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Alemão"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:63
+#, fuzzy
+msgid "Polish"
+msgstr "Polônia"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "Português"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "Brasileiro"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:69
+#, fuzzy
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:75
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor deve conter apenas letras, números e sublinhados (_)."
+
+#: core/validators.py:68
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Este valor deve conter apenas letras, números, sublinhados (_), "
+"pontos e barras (/)."
+
+#: core/validators.py:72
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor deve conter apenas letras, números, sublinhados (_) e "
+"hífens (-)."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculo não são permitidas aqui."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculo não são permitidas aqui."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Informe apenas dígitos separados por vírgulas."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Informe endereços de email válidos separados por vírgulas."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Informe um endereço IP válido."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não numéricos não são permitidos."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode conter apenas dígitos."
+
+#: core/validators.py:120 newforms/fields.py:126
+msgid "Enter a whole number."
+msgstr "Informe um número completo."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas caracteres do alfabeto são permitidos aqui."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "O ano deve ser superior a 1900"
+
+#: core/validators.py:143
+#, fuzzy, python-format
+msgid "Invalid date: %s"
+msgstr "Data inválida: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Informe uma hora válida no formato HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:269
+msgid "Enter a valid e-mail address."
+msgstr "Informe um endereço de email válido."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está "
+"corrompido."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A URL %s não aponta para uma imagem válida."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Números de telefone devem estar no formato XXX-XXX-XXXX.\"%s\" é inválido."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A URL %s não aponta para um vídeo QuickTime válido."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Uma URL válida é exigida."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML válido é exigido. Os erros específicos são:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválida: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A URL %s é um link quebrado."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Informe uma abreviação válida de estado dos E.U.A."
+
+#: core/validators.py:266
+#, fuzzy, 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] "Olha sua boca! A palavra %s não é permitida aqui."
+msgstr[1] "Olha sua boca! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve casar com o campo '%s'."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Informe algo em pelo menos um campo."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Informe ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser informado se o campo %(field)s for %(value)s."
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser dado se o campo %(field)s não for %(value)s."
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:367
+#, fuzzy, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor deve estar entre %(lower)s e %(upper)s."
+
+#: core/validators.py:369
+#, fuzzy, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor deve ser no mínimo %s."
+
+#: core/validators.py:371
+#, fuzzy, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor não deve ser maior que %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Informe um número decimal válido."
+
+#: core/validators.py:422
+#, fuzzy, 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] "Por favor entre com um número decimal com no máximo %s dígito."
+msgstr[1] "Por favor entre com um número decimal com no máximo %s dígitos."
+
+#: core/validators.py:425
+#, fuzzy, 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] ""
+"Por favor informe um número decimal com a parte inteira de no máximo %s "
+"digito."
+msgstr[1] ""
+"Por favor informe um número decimal com a parte inteira de no máximo %s "
+"digitos."
+
+#: core/validators.py:428
+#, fuzzy, 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] "Por favor informe um número decimal com no máximo %s casa decimal."
+msgstr[1] "Por favor informe um número decimal com no máximo %s casas "
+"decimais."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique se o arquivo enviado tem pelo menos %s bytes."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o arquivo enviado tem no máximo %s bytes."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo está errado."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível receber dados de %s."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A URL %(url)s retornou um cabeçalho '%(contenttype)s' de Content-Type "
+"inválido."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, feche a tag %(tag)s na linha %(line)s. (A linha começa com \"%"
+"(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 ""
+"Algum texto começando na linha %(line)s não é permitido no contexto. (Linha "
+"começa com \"%(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\" na linha %(line)s não é um atributo válido. (Linha começa com "
+"\"%(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>\" na linha %(line)s é uma tag inválida. (Linha começa com \"%"
+"(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 ""
+"Uma tag na linha %(line)s não apresenta um ou mais atributos exigidos."
+"(Linha começa com \"%(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 ""
+"O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (Linha "
+"começa com \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "O(A) %(verbose_name)s foi criado com sucesso."
+
+#: views/generic/create_update.py:117
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "O(A) %(verbose_name)s foi modificado com sucesso."
+
+#: views/generic/create_update.py:184
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "O(A) %(verbose_name)s foi excluído."
+
+#: newforms/models.py:164 newforms/fields.py:360
+#, fuzzy
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Selecione uma escolha válida. Tal escolha não é uma das escolhas "
+"disponíveis."
+
+#: newforms/models.py:181 newforms/fields.py:378 newforms/fields.py:454
+#, fuzzy
+msgid "Enter a list of values."
+msgstr "Informe uma lista ou tupla de valores."
+
+#: newforms/models.py:187 newforms/fields.py:387
+#, fuzzy, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Selecione uma escolha válida. %s não é uma das escolhas disponíveis."
+
+#: newforms/fields.py:101 newforms/fields.py:254
+#, fuzzy, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Certifique-se de que seu texto tenha menos que %d caracteres."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Certifique-se de que seu texto tenha no mínimo %d caracteres."
+
+#: newforms/fields.py:128
+#, fuzzy, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Certifique-se que este valor seja menor ou igual a %s."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Certifique-se que este valor seja maior ou igual a %s."
+
+#: newforms/fields.py:163
+#, fuzzy
+msgid "Enter a valid date."
+msgstr "Informe uma data válida."
+
+#: newforms/fields.py:190
+#, fuzzy
+msgid "Enter a valid time."
+msgstr "Informe uma hora válida."
+
+#: newforms/fields.py:226
+#, fuzzy
+msgid "Enter a valid date/time."
+msgstr "Informe uma data/hora válida."
+
+#: newforms/fields.py:240
+#, fuzzy
+msgid "Enter a valid value."
+msgstr "Informe um valor válido."
+
+#: newforms/fields.py:287 newforms/fields.py:309
+#, fuzzy
+msgid "Enter a valid URL."
+msgstr "Informe uma URL válida."
+
+#: newforms/fields.py:311
+#, fuzzy
+msgid "This URL appears to be a broken link."
+msgstr "A URL %s parece ser um link quebrado."
+
+#: contrib/contenttypes/models.py:36
+#, fuzzy
+msgid "python model class name"
+msgstr "nome da classe model no python"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "tipos de conteúdo"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+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] "milhão"
+msgstr[1] "milhões"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilhão"
+msgstr[1] "%(value).1f bilhões"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilhão"
+msgstr[1] "%(value).1f trilhões"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "one"
+msgstr "um"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dois"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "three"
+msgstr "três"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "four"
+msgstr "quatro"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sete"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "oito"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "nine"
+msgstr "nove"
+
+#: contrib/auth/views.py:39
+#, fuzzy
+msgid "Logged out"
+msgstr "Sessão Encerrada"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "apelido"
+
+#: contrib/auth/models.py:42
+#, fuzzy
+msgid "permission"
+msgstr "permissão"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+#, fuzzy
+msgid "permissions"
+msgstr "permissões"
+
+#: contrib/auth/models.py:60
+#, fuzzy
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+#, fuzzy
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "usuário"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Obrigatório. 30 caracteres ou menos. Apenas caracteres alfanuméricos"
+"(letras, dígitos e sublinhados (_) )"
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "senha"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use '[algo]$[salt]$[hexdigest]' ou <a href=\"password/\"> Altere a senha"
+"</a>."
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "status da equipe"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Permite ao usuário o acesso a este site de administração."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "ativar"
+
+#: contrib/auth/models.py:96
+#, fuzzy
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Permite ao usuário acessar este site de administração. "
+"Ao invés de excluir contas de usuário, desmarque isso."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "status de superusuário"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Informa que este usuário tem todas as permissões sem atribuí-las "
+"explicitamente."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "último login"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "data de registro"
+
+#: 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 ""
+"Em adição às permissões atribuídas manualmente, este usuário também terá "
+"todas as permissões dadas a cada grupo que participar."
+
+#: contrib/auth/models.py:102
+#, fuzzy
+msgid "user permissions"
+msgstr "permissões do usuário"
+
+#: contrib/auth/models.py:105
+#, fuzzy
+msgid "user"
+msgstr "usuário"
+
+#: contrib/auth/models.py:106
+#, fuzzy
+msgid "users"
+msgstr "usuários"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Informações pessoais"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:258
+#, fuzzy
+msgid "message"
+msgstr "mensagem"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Os dois campos de senha não combinam."
+
+#: contrib/auth/forms.py:25
+#, fuzzy
+msgid "A user with that username already exists."
+msgstr "Um usuário com este username já existe."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Seu navegador Web não parece estar com os cookies habilitados. Cookies são "
+"requeridos para acessar."
+
+#: 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 ""
+"Por favor entre usuário e senha corretos. Note que ambos os campos "
+"diferenciam maiúsculas e minúsculas."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta conta está inativa."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "Este endereço de e-mail não está associado com uma conta de usuário."
+"Você tem certeza que está registrado?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Os dois campos 'nova senha' não conferem."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "A senha antiga foi digitada incorretamente. Por favor, informe a "
+"senha novamente."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirecionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Isso deve ser um caminho absoluto, excluindo o nome de domínio. Exemplo: '/"
+"eventos/busca/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirecionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Isto pode ser um caminho absoluto (como acima) ou uma URL completa, "
+"começando com 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirecionar"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecionamentos"
+
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "id do objeto"
@@ -73,7 +1074,7 @@ msgstr "data/hora de envio"
msgid "is public"
msgstr "é público"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "Endereço IP:"
@@ -86,8 +1087,8 @@ msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
msgstr ""
-"Selecione esta opção se o comentário é inapropriado. Uma mensagem \"Este "
-"comentário foi removido\" a mensagem será mostrada no lugar."
+"Selecione esta opção se o comentário é inapropriado. A mensagem \"Este "
+"comentário foi removido\" será mostrada no lugar."
#: contrib/comments/models.py:91
#, fuzzy
@@ -165,7 +1166,7 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"O usuário %(user)s colocou flags neste documento:\n"
+"O usuário %(user)s colocou flags neste comentário:\n"
"\n"
"%(text)s"
@@ -219,13 +1220,13 @@ msgstr "ID de comentário inválido"
msgid "No voting for yourself"
msgstr "Você não pode votar em si mesmo"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
"Esta avaliação é requerida porque você entrou com ao menos uma avaliação"
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, fuzzy, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -246,7 +1247,7 @@ msgstr[1] ""
"comentários:\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -257,34 +1258,51 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Somente POSTs são permitidos"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Um ou mais dos campos requeridos não foram enviados"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Alguém modificou o form de comentários (violação de segurança)"
+msgstr "Alguém modificou o formulário de comentários (violação de segurança)"
-#: contrib/comments/views/comments.py:207
+#: 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 ""
-"O form de comentários teve um parâmetro 'target' inválido -- o ID do objeto "
-"é inválido"
+"O formulário de comentários teve um parâmetro 'target' inválido -- o ID do "
+"objeto é inválido"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "O form de comentários não forneceu nem 'preview' nem 'post'"
+msgstr "O formulário de comentários não forneceu nem 'preview' nem 'post'"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "Seu nome:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+#, fuzzy
+msgid "Comment:"
+msgstr "Comentário"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+#, fuzzy
+msgid "Preview comment"
+msgstr "Pré visualizar comentário"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -293,21 +1311,12 @@ msgid "Username:"
msgstr "Usuário:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Senha:"
-
-#: contrib/comments/templates/comments/form.html:6
-#, fuzzy
-msgid "Forgotten your password?"
-msgstr "Esqueceu sua senha?"
-
-#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -323,6 +1332,16 @@ msgstr "Esqueceu sua senha?"
msgid "Log out"
msgstr "Encerrar sessão"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Senha:"
+
+#: contrib/comments/templates/comments/form.html:8
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Esqueceu sua senha?"
+
#: contrib/comments/templates/comments/form.html:12
#, fuzzy
msgid "Ratings"
@@ -342,22 +1361,91 @@ msgstr "Opcional"
msgid "Post a photo"
msgstr "Postar uma foto"
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-#, fuzzy
-msgid "Comment:"
-msgstr "Comentário"
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-#, fuzzy
-msgid "Preview comment"
-msgstr "Pré visualizar comentário"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final."
-#: contrib/comments/templates/comments/freeform.html:4
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "habilitar comentários"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome do modelo"
+
+#: contrib/flatpages/models.py:13
#, fuzzy
-msgid "Your name:"
-msgstr "Seu nome:"
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exemplo: 'flatpages/contact_page.html'. Se não for informado, será utilizado "
+"'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registro obrigatório"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver marcado, apenas usuários conectados poderão ver a página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome para exibição"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -369,7 +1457,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Todos"
@@ -393,18 +1481,6 @@ msgstr "Este mês"
msgid "This year"
msgstr "Este ano"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Sim"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Não"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Desconhecido"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "hora da ação"
@@ -433,25 +1509,16 @@ msgstr "entrada de log"
msgid "log entries"
msgstr "entradas de log"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Todas as datas"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Por favor entre usuário e senha corretos. Note que ambos os "
-"campos diferenciam maiúsculas e minúsculas."
-
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Acessar"
-#: contrib/admin/views/decorators.py:61
+#: contrib/admin/views/decorators.py:62
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -459,7 +1526,7 @@ msgstr ""
"Por favor acesse novamente, pois sua sessão expirou. Não se preocupe: Os "
"dados enviados foram salvos."
-#: contrib/admin/views/decorators.py:68
+#: 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."
@@ -467,68 +1534,79 @@ msgstr ""
"Parece que seu navegador não está configurado para aceitar cookies. Por "
"favor habilite os cookies, recarregue esta página, e tente novamente."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Nomes de usuário não podem conter o caractere '@'."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr "Seu endereço de e-mail não é seu nome de usuário. Tente usar '%s'"
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "Administração do Site"
-
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Você pode editá-lo(a) de novo abaixo."
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/auth.py:30
+#, fuzzy
+msgid "Add user"
+msgstr "Adicionar usuário"
+
+#: contrib/admin/views/auth.py:57
+#, fuzzy
+msgid "Password changed successfully."
+msgstr "Senha alterada com sucesso"
+
+#: contrib/admin/views/auth.py:64
+#, fuzzy, python-format
+msgid "Change password: %s"
+msgstr "Alterar senha: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Administração do Site"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
msgstr "Você pode adicionar outro(a) %s abaixo."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Adicionar %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Adicionado %s."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "e"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Modificado %s."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
-msgstr "Apagado %s."
+msgstr "Excluído %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Nenhum campo modificado."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "O(A) %(name)s \"%(obj)s\" foi modificado com sucesso."
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/main.py:353
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
@@ -634,10 +1712,6 @@ msgstr "Texto"
msgid "Time"
msgstr "Hora"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
#: contrib/admin/views/doc.py:301
msgid "U.S. state (two uppercase letters)"
msgstr "Estado dos EUA (duas letras maiúsculas)"
@@ -659,9 +1733,12 @@ msgstr "Documentação"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -678,11 +1755,13 @@ msgid "Change password"
msgstr "Alterar senha"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -693,7 +1772,7 @@ msgid "Home"
msgstr "Início"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Histórico"
@@ -721,13 +1800,15 @@ msgstr ""
"Este objeto não tem um histórico de alterações. Ele provavelmente não foi "
"adicionado por este site de administração."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Site de administração do Django"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administração do Django"
+#: contrib/admin/templates/admin/filter.html:2
+#, fuzzy, python-format
+msgid " By %(filter_title)s "
+msgstr "Por %(title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -746,8 +1827,50 @@ 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 ""
-"Houve um erro. Este foi reportado aos administradores do site através d e-"
-"mail e deve ser corrigido em breve. Obrigado pela compreensão."
+"Houve um erro. Este foi reportado aos administradores do site através do "
+"e-mail e deve ser corrigido em breve. Obrigado pela compreensão."
+
+#: 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 "Alguma coisa errada com a instalação do banco de dados. Certifique-se "
+"que as tabelas necessárias foram criadas e que o banco de dados pode ser "
+"acessado pelo usuário."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar tudo"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+#, fuzzy
+msgid "Filter"
+msgstr "Filtro"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -763,6 +1886,11 @@ msgstr "Desculpe, mas a página requisitada não pode ser encontrada."
msgid "Models available in the %(name)s application."
msgstr "Modelos disponíveis na aplicação %(name)s"
+#: contrib/admin/templates/admin/index.html:18
+#, fuzzy, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
@@ -788,16 +1916,27 @@ msgstr "Minhas Ações"
msgid "None available"
msgstr "Nenhuma disponível"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Adicionar %(name)s"
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Ver no site"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Você <a href=\"/password_reset/\">esqueceu sua senha</a>?"
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+#, fuzzy
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija o erro abaixo."
+msgstr[1] "Por favor, corrija os erros abaixo."
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bem vindo,"
@@ -807,57 +1946,29 @@ msgid "Delete"
msgstr "Apagar"
#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
+#, fuzzy, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"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 ""
-"A remoção de '%(object)s' %(object_name)s pode resultar na remoção de "
-"objetos relacionados, mas sua conta não tem a permissão para remoção dos "
+"A remoção de '%(object_name)s' %(escaped_object)s pode resultar na remoção "
+"de objetos relacionados, mas sua conta não tem a permissão para remoção dos "
"seguintes tipos de objetos:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
+#, fuzzy, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Você tem certeza que quer remover o \"%(object)s\" %(object_name)s? Todos os "
-"seguintes itens relacionados serão removidos:"
+"Você tem certeza que quer remover o %(object_name)s \"%(escaped_object)s\"? "
+"Todos os seguintes itens relacionados serão removidos:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Sim, tenho certeza"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr "Por %(title)s "
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Ir"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Ver no site"
-
-#: contrib/admin/templates/admin/change_form.html:30
-#, fuzzy
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Por favor, corrija o erro abaixo."
-msgstr[1] "Por favor, corrija os erros abaixo."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Ordenação"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Ordem:"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Salvar como novo"
@@ -874,6 +1985,40 @@ msgstr "Salvar e continuar editando"
msgid "Save"
msgstr "Salvar"
+#: 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 "Informe uma nova senha para o usuário <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#, fuzzy
+msgid "Password"
+msgstr "Senha:"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#, fuzzy
+msgid "Password (again)"
+msgstr "Senha (novamente)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Informe a mesma senha digitada acima, para verificação."
+
+#: 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 "Primeiro, informe um nome de usuário e senha. Então, você será capaz "
+"de editar mais opções do usuário."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+#, fuzzy
+msgid "Username"
+msgstr "Usuário:"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -940,7 +2085,7 @@ msgid ""
"password twice so we can verify you typed it in correctly."
msgstr ""
"Por favor, informe sua senha antiga, por segurança, e então informe sua nova "
-"senha duas vezes para que possamos verificar que se ela está correta."
+"senha duas vezes para que possamos verificar se você digitou corretamente."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -987,7 +2132,7 @@ msgstr "Obrigado por usar nosso site!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
-msgstr "Time do %(site_name)s"
+msgstr "Equipe do %(site_name)s"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
@@ -1045,9 +2190,7 @@ msgstr "Editar este objeto (janela atual)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr ""
-"Vai para a página de administração que representam um objeto "
-"único."
+msgstr "Vai para a página de administração que representam um objeto único."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
@@ -1057,286 +2200,213 @@ msgstr "Editar este objeto (nova janela)"
msgid "As above, but opens the admin page in a new window."
msgstr "Como acima, mas abre a página de administração em uma nova janela."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Data:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Hora:"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Atualmente:"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modificar:"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirecionar de"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
msgstr ""
-"Deve conter um caminho absoluto, excluindo o nome de domínio. Exemplo: '/"
-"eventos/busca/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirecionar para"
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
msgstr ""
-"Deve conter um caminho absoluto (como acima) ou uma URL completa, começando "
-"com 'http://'."
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "redirecionar"
+#: contrib/localflavor/fr/forms.py:17
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "redirecionamentos"
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final."
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "título"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "conteúdo"
+#: contrib/localflavor/jp/jp_prefectures.py:6
+#, fuzzy
+msgid "Iwate"
+msgstr ""
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "habilitar comentários"
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nome do modelo"
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
msgstr ""
-"Exemplo: 'flatfiles/contact_page'. Se não for informado, será utilizado "
-"'flatfiles/default'."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "registro obrigatório"
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Se estiver marcado, apenas usuários conectados poderão ver a página."
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "página plana"
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "páginas planas"
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
-msgid "name"
-msgstr "nome"
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
-#: contrib/auth/models.py:15
-msgid "codename"
-msgstr "nome código"
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
-#: contrib/auth/models.py:17
+#: contrib/localflavor/jp/jp_prefectures.py:16
#, fuzzy
-msgid "permission"
-msgstr "permissão"
+msgid "Tokyo"
+msgstr ""
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
-#, fuzzy
-msgid "permissions"
-msgstr "permissões"
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
-#: contrib/auth/models.py:29
-#, fuzzy
-msgid "group"
-msgstr "grupo"
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
-#, fuzzy
-msgid "groups"
-msgstr "grupos"
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
-#: contrib/auth/models.py:55
-msgid "username"
-msgstr "usuário"
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
-#: contrib/auth/models.py:56
-msgid "first name"
-msgstr "primeiro nome"
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
-#: contrib/auth/models.py:57
-msgid "last name"
-msgstr "último nome"
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
-#: contrib/auth/models.py:58
-msgid "e-mail address"
-msgstr "endereço de e-mail"
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
-#: contrib/auth/models.py:59
-msgid "password"
-msgstr "senha"
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Use '[algo]$[salt]$[hexdigest]'"
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
-#: contrib/auth/models.py:60
-msgid "staff status"
-msgstr "status da equipe"
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
-#: contrib/auth/models.py:60
-msgid "Designates whether the user can log into this admin site."
-msgstr "Informa se o usuário pode acessar este site de administração."
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
-#: contrib/auth/models.py:61
-msgid "active"
-msgstr "ativar"
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
-#: contrib/auth/models.py:62
-msgid "superuser status"
-msgstr "status de superusuário"
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
-#: contrib/auth/models.py:63
-msgid "last login"
-msgstr "último login"
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
-#: contrib/auth/models.py:64
-msgid "date joined"
-msgstr "data de registro"
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
-#: contrib/auth/models.py:66
-msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
msgstr ""
-"Em adição às permissões atribuídas manualmente, este usuário também terá "
-"todas as permissões dadas a cada grupo que participar."
-#: contrib/auth/models.py:67
-#, fuzzy
-msgid "user permissions"
-msgstr "permissões do usuário"
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
-#: contrib/auth/models.py:70
-#, fuzzy
-msgid "user"
-msgstr "usuário"
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
-#: contrib/auth/models.py:71
+#: contrib/localflavor/jp/jp_prefectures.py:35
#, fuzzy
-msgid "users"
-msgstr "usuários"
-
-#: contrib/auth/models.py:76
-msgid "Personal info"
-msgstr "Informações pessoais"
+msgid "Shimane"
+msgstr ""
-#: contrib/auth/models.py:77
-msgid "Permissions"
-msgstr "Permissões"
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
-#: contrib/auth/models.py:78
-msgid "Important dates"
-msgstr "Datas importantes"
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
-#: contrib/auth/models.py:79
-msgid "Groups"
-msgstr "Grupos"
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
-#: contrib/auth/models.py:219
-#, fuzzy
-msgid "message"
-msgstr "mensagem"
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
-#: contrib/auth/forms.py:30
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
msgstr ""
-"Seu navegador Web não parece estar com os cookies habilitados. Cookies são "
-"requeridos para acessar."
-#: contrib/contenttypes/models.py:25
+#: contrib/localflavor/jp/jp_prefectures.py:41
#, fuzzy
-msgid "python model class name"
-msgstr "nome do módulo python"
-
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "tipo de conteúdo"
-
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "tipos de conteúdo"
-
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "chave da sessão"
-
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "dados da sessão"
-
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "data de expiração"
+msgid "Ehime"
+msgstr ""
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "sessão"
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "sessões"
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nome do domínio"
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nome para exibição"
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "site"
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sites"
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
msgstr ""
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
msgstr ""
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
msgstr ""
#: utils/dates.py:6
@@ -1534,483 +2604,60 @@ msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengalês"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Tcheco"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
+#: utils/dateformat.py:40
+msgid "p.m."
msgstr ""
-#: conf/global_settings.py:40
-#, fuzzy
-msgid "Danish"
-msgstr "Dinamarquês"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Alemão"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Grego"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Inglês"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Espanhol"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Francês"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galiciano"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "Húngaro"
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Hebraico"
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandês"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italiano"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "Japonês"
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "Alemão"
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norueguês"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brasileiro"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Romeno"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Russo"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Eslovaco"
-
-#: conf/global_settings.py:58
-#, fuzzy
-msgid "Slovenian"
-msgstr "Esloveno"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Sérvio"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Sueco"
-
-#: conf/global_settings.py:61
-#, fuzzy
-msgid "Ukrainian"
-msgstr "Ucraniano"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Chinês Simplificado"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Chinês Tradicional"
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Deve conter apenas letras, números e sublinhados (_)."
-
-#: core/validators.py:64
-#, fuzzy
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr "Deve conter apenas letras, números, sublinhados (_) e barras (/)."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Letras em maiúsculo não são permitidas aqui."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Letras em minúsculo não são permitidas aqui."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Informe apenas dígitos separados por vírgulas."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Informe endereços de email válidos separados por vírgulas."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Informe um endereço IP válido."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Valores em branco não são permitidos."
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Caracteres não numéricos não são permitidos."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Este valor não pode conter apenas dígitos."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Informe um número completo."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Apenas caracteres do alfabeto são permitidos aqui."
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Informe uma data válida no formato AAAA-MM-DD."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Informe uma hora válida no formato HH:MM."
-
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Informe uma data/hora válida no formato AAAA-MM-DD HH:MM."
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Informe um endereço de email válido."
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
+#: utils/dateformat.py:41
+msgid "a.m."
msgstr ""
-"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está "
-"corrompido."
-#: core/validators.py:155
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "A URL %s não aponta para um imagem válida."
-
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+#: utils/dateformat.py:46
+msgid "PM"
msgstr ""
-"Números de telefone deves estar no formato XXX-XXX-XXXX.\"%s\" é inválido."
-
-#: core/validators.py:167
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "A URL %s não aponta para um vídeo QuickTime válido."
-
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Uma URL válida é exigida."
-
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"HTML válido é exigido. Estes são os erros específicos:\n"
-"%s"
-
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "XML mal formado: %s"
-
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "URL inválida: %s"
-
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "A URL %s é um link quebrado."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Informe uma abreviação válida de nome de um estado dos EUA."
-
-#: core/validators.py:229
-#, fuzzy, 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] "Lave sua boca! A palavra %s não é permitida aqui."
-msgstr[1] "Lave sua boca! As palavras %s não são permitidas aqui."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Este campo deve ser igual ao campo '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Informe algo em pelo menos um campo."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "Informe ambos os campos ou deixe ambos vazios."
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Este campo deve ser informado se o campo %(field)s for %(value)s."
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Este campo deve ser dado se o campo %(field)s não for %(value)s."
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Valores duplicados não são permitidos."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Este valor deve ser uma potência de %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Informe um número decimal válido."
-
-#: core/validators.py:349
-#, fuzzy, 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] "Por favor entre com um número decimal com no máximo %s digito."
-msgstr[1] "Por favor entre com um número decimal com no máximo %s digitos."
-#: core/validators.py:352
-#, fuzzy, 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] "Informe um número decimal com no máximo %s casa decimal."
-msgstr[1] "Informe um número decimal com no máximo %s casas decimais."
-
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Verifique se o arquivo enviado tem pelo menos %s bytes."
-
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Verifique se o arquivo enviado tem no máximo %s bytes."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "O formato deste campo está errado."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Este campo é inválido."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Não foi possível receber dados de %s."
-
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+#: utils/dateformat.py:47
+msgid "AM"
msgstr ""
-"A URL %(url)s retornou um cabeçalho '%(contenttype)s' de Content-Type "
-"inválido."
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Por favor, feche a tag %(tag)s na linha %(line)s. (A linha começa com \"%"
-"(start)s\".)"
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "meia noite"
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Algum texto começando na linha %(line)s não é permitido no contexto. (Linha "
-"começa com \"%(start)s\".)"
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "meio dia"
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
msgstr ""
-"\"%(attr)s\" na linha %(line)s não é um atributo válido. (Linha começa com "
-"\"%(start)s\".)"
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
msgstr ""
-"\"<%(tag)s>\" na linha %(line)s é uma tag inválida. (Linha começa com \"%"
-"(start)s\".)"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
msgstr ""
-"Uma tag na linha %(line)s está não apresenta um ou mais atributos exigidos."
-"(Linha começa com \"%(start)s\".)"
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
msgstr ""
-"O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (Linha "
-"começa com \"%(start)s\".)"
-
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s com este %(type)s já existe para o %(field)s dado."
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s com este %(fieldname)s já existe."
-
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Este campo é requerido."
-
-#: db/models/fields/__init__.py:337
-#, fuzzy
-msgid "This value must be an integer."
-msgstr "Este valor deve ser um inteiro."
-
-#: db/models/fields/__init__.py:369
-#, fuzzy
-msgid "This value must be either True or False."
-msgstr "Este valor deve ser Verdadeiro ou Falso."
-
-#: db/models/fields/__init__.py:385
-#, fuzzy
-msgid "This field cannot be null."
-msgstr "Este campo não pode ser nulo."
-
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Informe um nome de arquivo válido."
-
-#: db/models/fields/related.py:43
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Por favor informe um %s válido."
-
-#: db/models/fields/related.py:579
-#, fuzzy
-msgid "Separate multiple IDs with commas."
-msgstr "Separe IDs múltiplos com vírgulas."
-#: db/models/fields/related.py:581
-#, fuzzy
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
msgstr ""
-" Mantenha pressionado \"Control\", ou \"Command\" no Mac para selecionar "
-"mais de uma opção."
-#: db/models/fields/related.py:625
-#, fuzzy, 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] ""
-"Por favor, entre IDs válidos para %(self)s. O valor %(value)r é inválido."
-msgstr[1] ""
-"Por favor, entre IDs válidos para %(self)s. Os valores %(value)r são inválidos."
-
-#: forms/__init__.py:380
-#, fuzzy, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Certifique-se de que seu texto tenha menos que %s caractere."
-msgstr[1] "Certifique-se de que seu texto tenha menos que %s caracteres."
-
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Não são permitidas quebras de linha aqui."
-
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Selecione uma escolha válida; '%(data)s' não está em %(choices)s."
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "O arquivo enviado está vazio."
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Informe um número inteiro entre -32.768 e 32.767"
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Informe um número positivo"
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Informe um número inteiro entre 0 e 32.767."
-
-#: template/defaultfilters.py:379
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
msgstr "sim,não,talvez"
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Você <a href=\"/password_reset/\">esqueceu sua senha</a>?"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
#~ msgid "Comment"
#~ msgstr "Comentário"
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.mo b/django/conf/locale/ru/LC_MESSAGES/django.mo
index 12e240529f..5718d58bcb 100644
--- a/django/conf/locale/ru/LC_MESSAGES/django.mo
+++ b/django/conf/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.po b/django/conf/locale/ru/LC_MESSAGES/django.po
index f329efe24f..cbd995c81f 100644
--- a/django/conf/locale/ru/LC_MESSAGES/django.po
+++ b/django/conf/locale/ru/LC_MESSAGES/django.po
@@ -1,26 +1,810 @@
# Translation of django.po to russian.
# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-# Dmitry Sorokin <ds@dial.com.ru>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: django 0.95\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"POT-Creation-Date: 2007-05-04 16:07+1300\n"
"PO-Revision-Date: 2006-09-07 15:28+0300\n"
-"Last-Translator: Alexander Yakovlev <AYakovlev@rambler.ru>\n"
+"Last-Translator: Vasiliy Stavenko <stavenko@gmail.com>\n"
"Language-Team: Dialcom Services <greg@dial.com.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Poedit-Language: Russian\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-SourceCharset: utf-8\n"
-#: contrib/comments/models.py:67
-#: contrib/comments/models.py:166
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:615
+#: db/models/fields/__init__.py:626 newforms/models.py:178
+#: newforms/fields.py:80 newforms/fields.py:378 newforms/fields.py:454
+#: newforms/fields.py:465
+msgid "This field is required."
+msgstr "ОбÑзательное поле."
+
+#: 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] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
+msgstr[2] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
+
+#: 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 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "ÐеизвеÑтно"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Да"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+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 "Ðе получен файл. Проверьте кодирование формы (encoding)."
+
+#: 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."
+
+#: 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."
+
+#: 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/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s Ñ %(fieldname)s уже ÑущеÑтвует."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Это значение должно быть целым чиÑлом."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Значение должно либо True, либо False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Это поле не может быть нулевым."
+
+#: db/models/fields/__init__.py:462 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Вводите правильную дату в формате YYYY-MM-DD."
+
+#: db/models/fields/__init__.py:531 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Введите правильные дату/Ð²Ñ€ÐµÐ¼Ñ Ð² формате YYYY-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:635
+msgid "Enter a valid filename."
+msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: db/models/fields/__init__.py:756
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Значение должно либо True, либо False."
+
+#: 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] ""
+"ПожалуйÑта, введите корректный ID Ð´Ð»Ñ %(self)s. Значение %(value)r "
+"недопуÑтимо."
+msgstr[1] ""
+"ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r "
+"недопуÑтимы."
+msgstr[2] ""
+"ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r "
+"недопуÑтимы."
+
+#: 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 "Korean"
+msgstr "КорейÑкий"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Каннада"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "ЛатвийÑкий"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "МакедоÑкий"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "ГолландÑкий"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "ÐорвежÑкий"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "ПольÑкий"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "ПортугальÑкий"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "БразильÑкий"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "РумынÑкий"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "РуÑÑкий"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Словацкий"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "СловенÑкий"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "СербÑкий"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "ШведÑкий"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Тамиль"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Телугу"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Турецкий"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "УкраинÑкий"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Упрощенный китайÑкий"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Традиционный китайÑкий"
+
+#: 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 "Введите правильные адреÑа Ñлектронной почты, разделённые запÑтыми."
+
+#: 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:120 newforms/fields.py:128
+msgid "Enter a whole number."
+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
+msgid "Invalid date: %s"
+msgstr "Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð°: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Введите правильное Ð²Ñ€ÐµÐ¼Ñ Ð² формате HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:273
+msgid "Enter a valid e-mail address."
+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 здеÑÑŒ запрещены."
+msgstr[2] "Следите за Ñвоими Ñловами! Слова %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 знаками."
+msgstr[2] ""
+"ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %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 знаков."
+msgstr[2] ""
+"ПожалуйÑта, введите корректное деÑÑтичное чиÑло Ñ Ñ†ÐµÐ»Ð¾Ð¹ чаÑтью из %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 знаками "
+"поÑле запÑтой."
+msgstr[2] ""
+"ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %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\".)"
+
+#: 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 был уÑпешно удален."
+
+#: newforms/models.py:165 newforms/fields.py:366
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Выберите корректный вариант. Вашего варианта нет Ñреди допуÑтимых"
+
+#: newforms/models.py:182 newforms/fields.py:382 newforms/fields.py:458
+msgid "Enter a list of values."
+msgstr "Укажите ÑпиÑок занчений."
+
+#: newforms/models.py:188 newforms/fields.py:391
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Выберите корректный вариант. %s нет Ñреди допуÑтимых значений."
+
+#: newforms/fields.py:103 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "УбедитеÑÑŒ, что значение Ñодержит менее %d Ñимволов."
+
+#: newforms/fields.py:105 newforms/fields.py:260
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "УбедитеÑÑŒ, что значение Ñодержит более %d Ñимволов."
+
+#: 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:166
+msgid "Enter a valid date."
+msgstr "Укажите дату правильно."
+
+#: newforms/fields.py:194
+msgid "Enter a valid time."
+msgstr "Укажите Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾."
+
+#: newforms/fields.py:230
+msgid "Enter a valid date/time."
+msgstr "Укажите дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾."
+
+#: newforms/fields.py:244
+msgid "Enter a valid value."
+msgstr "Укажите значение правильно"
+
+#: newforms/fields.py:291 newforms/fields.py:313
+msgid "Enter a valid URL."
+msgstr "Укажите правильный URL"
+
+#: newforms/fields.py:315
+msgid "This URL appears to be a broken link."
+msgstr "Этот URL похоже ÑÐ»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÑÑылка."
+
+#: 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 миллиона"
+msgstr[2] "%(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 миллиарда"
+msgstr[2] "%(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 триллиона"
+msgstr[2] "%(value).1f триллионов"
+
+#: 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/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/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "ID объекта"
@@ -28,8 +812,7 @@ msgstr "ID объекта"
msgid "headline"
msgstr "Заголовок"
-#: contrib/comments/models.py:69
-#: contrib/comments/models.py:90
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
#: contrib/comments/models.py:167
msgid "comment"
msgstr "Комментарий"
@@ -70,18 +853,15 @@ msgstr "рейтинг №8"
msgid "is valid rating"
msgstr "ДопуÑтимый рейтинг"
-#: contrib/comments/models.py:83
-#: contrib/comments/models.py:169
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
msgstr "Дата/Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ"
-#: contrib/comments/models.py:84
-#: contrib/comments/models.py:170
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
msgstr "Публичный"
-#: contrib/comments/models.py:85
-#: contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "IP-адреÑ"
@@ -90,15 +870,18 @@ 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 "Отметьте, еÑли комментарий нежелателен. Сообщение \"Этот комментарий был удалён\" будет показано взамен."
+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
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
msgid "Content object"
msgstr "Объект Ñодержимого"
@@ -215,34 +998,41 @@ msgstr "Ðеверный ID комментариÑ"
msgid "No voting for yourself"
msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð³Ð¾Ð»Ð¾Ñовать за ÑебÑ"
-#: contrib/comments/views/comments.py:28
-msgid "This rating is required because you've entered at least one other rating."
-msgstr "Этот рейтинг обÑзателен, так как вы уже ввели как минимум еще один рейтинг."
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Этот рейтинг обÑзателен, так как вы уже ввели как минимум еще один рейтинг."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
-"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
"\n"
"%(text)s"
msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
"\n"
"%(text)s"
msgstr[0] ""
-"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариÑ:\n"
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s "
+"комментариÑ:\n"
"\n"
"%(text)s"
msgstr[1] ""
-"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариев:\n"
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s "
+"комментариев:\n"
"\n"
"%(text)s"
msgstr[2] ""
-"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариев:\n"
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s "
+"комментариев:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -253,31 +1043,48 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Разрешены только POSTы"
-#: contrib/comments/views/comments.py:193
+#: 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:197
+#: 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:207
+#: 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 объекта неверен"
+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/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "ПредпроÑмотр комментариÑ"
+
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/login.html:17
@@ -285,20 +1092,12 @@ msgid "Username:"
msgstr "ИмÑ:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Пароль:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Забыли Ñвой пароль?"
-
-#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -314,6 +1113,15 @@ msgstr "Забыли Ñвой пароль?"
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 "Рейтинги"
@@ -332,19 +1140,21 @@ msgstr "ÐеобÑзательное"
msgid "Post a photo"
msgstr "Добавить фотографию"
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Комментарий:"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "Доменное имÑ"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-msgid "Preview comment"
-msgstr "ПредпроÑмотр комментариÑ"
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "Выводимое имÑ"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your 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
@@ -355,9 +1165,8 @@ 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:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Ð’Ñе"
@@ -381,18 +1190,6 @@ msgstr "Ð’ Ñтом меÑÑце"
msgid "This year"
msgstr "Ð’ Ñтом году"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Да"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Ðет"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "ÐеизвеÑтно"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑтвиÑ"
@@ -421,219 +1218,312 @@ msgstr "Ð–ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
msgid "log entries"
msgstr "Журнальные запиÑи"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Ð’Ñе даты"
-#: contrib/admin/views/decorators.py:9
-#: contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "ПожалуйÑта, введите верные Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Помните, оба Ð¿Ð¾Ð»Ñ Ñ‡ÑƒÐ²Ñтвительны к региÑтру."
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"ПожалуйÑта, введите верные Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Помните, оба Ð¿Ð¾Ð»Ñ "
+"чувÑтвительны к региÑтру."
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Вход"
-#: contrib/admin/views/decorators.py:61
-msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-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:68
-msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "Похоже, ваш броузер не наÑтроен на прием cookies. ПожалуйÑтва, включите cookie, перезагрузите Ñтраницу и попытайтеÑÑŒ Ñнова."
+#: 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. ПожалуйÑтва, включите "
+"cookie, перезагрузите Ñтраницу и попытайтеÑÑŒ Ñнова."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ может включать Ñимвол '@'."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не ÑвлÑетÑÑ Ð²Ð°ÑˆÐ¸Ð¼ именем пользователÑ. Попробуйте '%s' взамен."
-
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "ÐдминиÑтрирование Ñайта"
+msgstr ""
+"Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не ÑвлÑетÑÑ Ð²Ð°ÑˆÐ¸Ð¼ именем пользователÑ. "
+"Попробуйте '%s' взамен."
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "%(name)s \"%(obj)s\" был уÑпешно добавлен."
-#: contrib/admin/views/main.py:264
-#: contrib/admin/views/main.py:348
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Ðиже можно Ñнова редактировать его"
-#: contrib/admin/views/main.py:272
-#: contrib/admin/views/main.py:357
+#: 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
+msgid "Change password: %s"
+msgstr "Изменение паролÑ: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+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:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Добавить %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Добавлен %s."
-#: contrib/admin/views/main.py:336
-#: contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "и"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Изменен %s."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "Удален %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Ðи одно поле не изменено."
-#: contrib/admin/views/main.py:346
+#: 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:354
+#: 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\" был уÑпешно добавлен. Ðиже можно Ñнова редактировать его."
+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:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "Изменить %s"
-#: contrib/admin/views/main.py:470
+#: 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:475
+#: 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:508
+#: 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:511
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "Вы уверены?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹: %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "Выберите %s"
-#: contrib/admin/views/main.py:565
-#, python-format
+#: contrib/admin/views/main.py:573
msgid "Select %s to change"
msgstr "Выберите %s Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"
-#: contrib/admin/views/doc.py:277
-#: contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288
-#: contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295
-#: contrib/admin/views/doc.py:297
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Ошибка базы данных"
+
+#: 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 "view:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Приложение %r не найдено"
+
+#: contrib/admin/views/doc.py:171
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Модель %(name) не найдена в приложении %(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
+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:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "ЛогичеÑкое (True или False)"
-#: contrib/admin/views/doc.py:279
-#: contrib/admin/views/doc.py:296
+#: 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:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Целые, разделенные запÑтыми"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Дата (без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Дата (Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ времени)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
-#: contrib/admin/views/doc.py:284
-#: contrib/admin/views/doc.py:287
+#: 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:285
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "ДеÑÑтичное чиÑло"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "ЛогичеÑкое (True, False или None)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "СвÑзь Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой моделью"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Ðомер телефона"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "ТекÑÑ‚"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "ВремÑ"
-#: contrib/admin/views/doc.py:300
-#: contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "Штат СШР(две заглавные буквы)"
-#: contrib/admin/views/doc.py:302
+#: 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/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/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
@@ -642,9 +1532,12 @@ msgstr "ДокументациÑ"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -661,11 +1554,13 @@ msgid "Change password"
msgstr "Изменение паролÑ"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -676,7 +1571,7 @@ msgid "Home"
msgstr "Ðачало"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "ИÑториÑ"
@@ -697,16 +1592,22 @@ msgid "DATE_WITH_TIME_FULL"
msgstr "j N Y H:i"
#: 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 "Данный обьект не имеет иÑтории изменений. Возможно, он был добавлен не через данный админиÑтративный Ñайт."
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Данный обьект не имеет иÑтории изменений. Возможно, он был добавлен не через "
+"данный админиÑтративный Ñайт."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "ÐдминиÑтративный Ñайт Django"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добавить %(name)s"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "ÐдминиÑтрирование Django"
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " По %(filter_title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -721,8 +1622,56 @@ msgid "Server Error <em>(500)</em>"
msgstr "Ошибка Ñервера <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 "Произошла ошибка. Отчет об ошибке отправлен админиÑтраторам Ñайта по Ñлектронной почте, ошибка должна быть вÑкоре иÑправлена. Благодарим Ð²Ð°Ñ Ð½Ð° терпение и помощь."
+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/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 результата"
+msgstr[2] "%(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/pagination.html:10
+msgid "Show all"
+msgstr "Показать вÑÑ‘"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ÐдминиÑтративный Ñайт Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ÐдминиÑтрирование Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Фильтр"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -738,6 +1687,11 @@ msgstr "К Ñожалению, Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²Ð°Ð¼Ð¸ ÑтраниÑ
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:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
@@ -763,16 +1717,27 @@ msgstr "Мои дейÑтвиÑ"
msgid "None available"
msgstr "ÐедоÑтупно"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Добавить %(name)s"
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Смотреть Ñайт"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Вы <a href=\"/password_reset/\">забыли пароль</a>?"
+#: 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] "ПожалуйÑта, иÑправьте ошибки ниже."
+msgstr[2] "ПожалуйÑта, иÑправьте ошибки ниже."
+
+#: 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:23
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Добро пожаловать,"
@@ -782,59 +1747,29 @@ msgid "Delete"
msgstr "Удалить"
#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid "Deleting the %(object_name)s '%(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 '%(object)s' привело бы к удалению ÑвÑзанных Ñлементов, но предоÑтавленных вам прав недоÑтаточно Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñледующих типов объектов:"
+#, 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 \"%(object)s\"? All of the following related items will be deleted:"
-msgstr "Ð’Ñ‹ уверены, что хотите удалить %(object_name)s \"%(object)s\"? Ð’Ñе Ñледующие ÑвÑзанные объекты также будут удалены:"
+#, 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/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " По %(title)s "
-
-#: 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 результата"
-msgstr[2] "%(counter)s результатов"
-
-#: contrib/admin/templates/admin/search_form.html:10
-msgid "%(full_result_count)s total"
-msgstr "%(full_result_count)s вÑего"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Смотреть Ñайт"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "ПожалуйÑта, иÑправьте ошибку ниже."
-msgstr[1] "ПожалуйÑта, иÑправьте ошибки ниже."
-msgstr[2] "ПожалуйÑта, иÑправьте ошибки ниже."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "ОчерёдноÑÑ‚ÑŒ"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "ПорÑдок:"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Сохранить как новое"
@@ -851,6 +1786,38 @@ msgstr "Сохранить и продолжить редактирование"
msgid "Save"
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/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Пароль"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Пароль (еще раз)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Введите тот же пароль что и Ñверху, Ð´Ð»Ñ Ð²ÐµÑ€Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸"
+
+#: 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/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -875,8 +1842,12 @@ msgid "Password reset"
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 новый."
+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:"
@@ -900,12 +1871,20 @@ 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 "Мы отправили новый пароль по указанному вами адреÑу Ñлектронной почты. Ð’Ñкоре вы его получите."
+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: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 "Ð’ целÑÑ… безопаÑноÑти, пожалуйÑта, введите Ñвой Ñтарый пароль, затем - новый пароль дважды, Ñ Ñ‚ÐµÐ¼, чтобы мы могли убедитьÑÑ Ð² правильноÑти напиÑаниÑ."
+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:"
@@ -974,10 +1953,13 @@ msgid ""
msgstr ""
"\n"
"<p class=\"help\">Ð”Ð»Ñ ÑƒÑтановки закладок перетащите ÑÑылку к Ñебе на панель\n"
-"закладок или щелкните правой кнопкой мыши по ÑÑылке и добавьте ее в закладки. Теперь у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ\n"
-"выбрать закладку Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы Ñайта. Обратите внимание: некоторые из Ñтих\n"
+"закладок или щелкните правой кнопкой мыши по ÑÑылке и добавьте ее в "
+"закладки. Теперь у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ\n"
+"выбрать закладку Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы Ñайта. Обратите внимание: некоторые из "
+"Ñтих\n"
"закладок требуют, чтобы вы проÑматривали Ñайт Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°, определенного\n"
-"как \"внутренний\" (уточните у Ñвоего ÑиÑтемного админиÑтратора, еÑли не уверены, ÑвлÑетÑÑ Ð»Ð¸\n"
+"как \"внутренний\" (уточните у Ñвоего ÑиÑтемного админиÑтратора, еÑли не "
+"уверены, ÑвлÑетÑÑ Ð»Ð¸\n"
"ваш компьютер \"внутренним\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
@@ -985,16 +1967,24 @@ 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 "ПеренаправлÑет Ð²Ð°Ñ Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы к документации view, который генерирует Ñту Ñтраницу."
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"ПеренаправлÑет Ð²Ð°Ñ Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы к документации view, который генерирует "
+"Ñту Ñтраницу."
#: 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 Ð´Ð»Ñ Ñтраниц, предÑтавлÑющих один объект."
+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)"
@@ -1002,7 +1992,9 @@ msgstr "Редактировать данный обьект (в текущем
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "Перейдет на админиÑтративную Ñтраницу Ð´Ð»Ñ Ñтраниц, предÑтавлÑющих один объект."
+msgstr ""
+"Перейдет на админиÑтративную Ñтраницу Ð´Ð»Ñ Ñтраниц, предÑтавлÑющих один "
+"объект."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
@@ -1012,260 +2004,739 @@ msgstr "Редактировать данный обьект (в новом ок
msgid "As above, but opens the admin page in a new window."
msgstr "То же что и выше, но откроет админиÑтративную Ñтраницу в новом окне."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Дата:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "ВремÑ:"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Современно:"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Изменить:"
-
-#: contrib/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:12
-msgid "redirect"
-msgstr "Перенаправление"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "ПеренаправлениÑ"
-
-#: 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'. If this isn't provided, the system will use 'flatpages/default'."
-msgstr "Пример: 'flatpages/contact_page'. ЕÑли Ñтот файл не приÑутÑтвует, ÑиÑтема будет иÑпользовать 'flatpages/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ñзательна"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа python модулÑ"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "ЕÑли отмечено, только вошедшие пользователи Ñмогут видеть Ñтраницу."
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "Тип Ñодержимого"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "ПроÑÑ‚Ð°Ñ Ñтраница"
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "Типы Ñодержимого"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "ПроÑтые Ñтраницы"
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Ðе авторизован"
-#: contrib/auth/models.py:13
-#: contrib/auth/models.py:26
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
msgid "name"
msgstr "ИмÑ"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:46
msgid "codename"
msgstr "Кодовое название"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:49
msgid "permission"
msgstr "Право"
-#: contrib/auth/models.py:18
-#: contrib/auth/models.py:27
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
msgid "permissions"
msgstr "Права"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:68
msgid "group"
msgstr "Группа"
-#: contrib/auth/models.py:30
-#: contrib/auth/models.py:65
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
msgid "groups"
msgstr "Группы"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:99
msgid "username"
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Ðеобходимое поле. 30 Ñимволов или менее. ИÑпользуйте только цифры, буквы "
+"и нижнее подчеркивание."
+
+#: contrib/auth/models.py:100
msgid "first name"
msgstr "ИмÑ"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:101
msgid "last name"
msgstr "ФамилиÑ"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:102
msgid "e-mail address"
msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:103
msgid "password"
msgstr "Пароль"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "ИÑпользуйте '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"ИÑпользуйте '[algo]$[salt]$[hexdigest]' или <a href=\"password/\">change "
+"форма Ñмены паролÑ</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "staff status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€Ñонала"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "Designates whether the user can log into this admin site."
msgstr "Отметьте, еÑли пользователь может входить в админ. чаÑÑ‚ÑŒ Ñайта."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:105
msgid "active"
msgstr "Ðктивный"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Отметьте, еÑли пользователь может входить в админ. чаÑÑ‚ÑŒ Ñайта. Убирайте Ñту "
+"отметку вмеÑто ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°."
+
+#: contrib/auth/models.py:106
msgid "superuser status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑуперпользователÑ"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Указывает, что пользователь имеет вÑе права без Ñвного их назначениÑ"
+
+#: contrib/auth/models.py:107
msgid "last login"
msgstr "ПоÑледний вход"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:108
msgid "date joined"
msgstr "Дата региÑтрации"
-#: contrib/auth/models.py:66
-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:110
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Ð’ добавление к правам, приÑвоенным вручную, Ñтот пользователь получит вÑе "
+"права групп, к которым он принадлежит."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:111
msgid "user permissions"
msgstr "права пользователÑ"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:115
msgid "user"
msgstr "Пользователь"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:116
msgid "users"
msgstr "Пользователи"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:122
msgid "Personal info"
msgstr "ПерÑÐ¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:123
msgid "Permissions"
msgstr "Права"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:124
msgid "Important dates"
msgstr "Важные даты"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:125
msgid "Groups"
msgstr "Группы"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:269
msgid "message"
msgstr "Сообщение"
-#: contrib/auth/forms.py:30
-msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+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. Cookies необходимы Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°."
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа python модулÑ"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Это ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не активна"
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-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 ""
+"Этот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не ÑвÑзан ни Ñ Ð¾Ð´Ð½Ð¾Ð¹ учетной запиÑью. Ð’Ñ‹ уверены "
+"что вы зарегиÑтрированы?"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "Типы Ñодержимого"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Два Ð¿Ð¾Ð»Ñ 'Ðовый пароль' не одинаковы."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ваш Ñтарый пароль введен неправильно. пожалуйÑта введите правильно."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Укажите почтовый код. Ðеобходим пробел между Ð´Ð²ÑƒÐ¼Ñ Ñ‡Ð°ÑÑ‚Ñми почтового кода"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Введите Zip код в формате XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Телефонные номера должен быть в формате XX-XXXX-XXXX. "
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Это поле требует только чиÑла."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Это поле требует 11 цифр или 14 Ñимволов."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "неправильный CPF номер"
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Это поле требует не меньше 14 цифр."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Ðеправильный CNPJ номер."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Укажите zip код в формате 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/sessions/models.py:35
+#: 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 "КагоÑима"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Окинава"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Укажите 4 цифровой почтовый код."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/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
+#, fuzzy
+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
+#, fuzzy
+msgid "Hamburg"
+msgstr "авг"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "Сообщение"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Укажите правильный zip код"
+
+#: contrib/localflavor/it/forms.py:41
+#, fuzzy
+msgid "Enter a valid Social Security number."
+msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: contrib/localflavor/it/forms.py:68
+#, fuzzy
+msgid "Enter a valid VAT number."
+msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "Введите правильное Ð²Ñ€ÐµÐ¼Ñ Ð² формате HH:MM."
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "ПожалуйÑта, введите корректное деÑÑтичное чиÑло."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+#, fuzzy
+msgid "Enter a valid Finnish social security number."
+msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Укажите правильный иÑландÑкий идентификатор. Формат XXXXXX-XXXX"
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "ИÑландÑкий идентификационный номер не правилен"
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:26
+#, fuzzy
+msgid "Enter valid a Chilean RUT"
+msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr "Группы"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr "Четверг"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr "авг"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "Ключ ÑеÑÑии"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "Данные ÑеÑÑии"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "Дата окончаниÑ"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "СеÑÑиÑ"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "СеÑÑии"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "Доменное имÑ"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Пример: '/about/contact/'. УбедитеÑÑŒ что вÑтавили завершающий ÑлÑш."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "Выводимое имÑ"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "Заголовок"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "Сайт"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "Содержимое"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "Сайты"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Ðктивировать комментарии"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "d.m.Y"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Ð˜Ð¼Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "d.m.Y H:i"
+#: 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'. ЕÑли Ñтот файл не приÑутÑтвует, ÑиÑтема "
+"будет иÑпользовать 'flatpages/default.html'."
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "H:i"
+#: 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 "ПроÑтые Ñтраницы"
#: utils/dates.py:6
msgid "Monday"
@@ -1303,28 +2774,23 @@ msgstr "Январь"
msgid "February"
msgstr "Февраль"
-#: utils/dates.py:14
-#: utils/dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "March"
msgstr "Март"
-#: utils/dates.py:14
-#: utils/dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "April"
msgstr "Ðпрель"
-#: utils/dates.py:14
-#: utils/dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "May"
msgstr "Май"
-#: utils/dates.py:14
-#: utils/dates.py:27
+#: utils/dates.py:14 utils/dates.py:27
msgid "June"
msgstr "Июнь"
-#: utils/dates.py:15
-#: utils/dates.py:27
+#: utils/dates.py:15 utils/dates.py:27
msgid "July"
msgstr "Июль"
@@ -1466,441 +2932,94 @@ msgstr[0] "минута"
msgstr[1] "минуты"
msgstr[2] "минут"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "БенгальÑкий"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "ЧешÑкий"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "УÑльÑкий"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "ДатÑкий"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Ðемецкий"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "ГречеÑкий"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "ÐнглийÑкий"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "ИÑпанÑкий"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "ФранцузÑкий"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "ГалльÑкий"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "ВенгерÑкий"
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Иврит"
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "ИÑландÑкий"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "ИтальÑнÑкий"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "ЯпонÑкий"
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "ГолландÑкий"
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "ÐорвежÑкий"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "БразильÑкий"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "РумынÑкий"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "РуÑÑкий"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Словацкий"
-
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "СловенÑкий"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "СербÑкий"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "ШведÑкий"
-
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "УкраинÑкий"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Упрощенный китайÑкий"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Традиционный китайÑкий"
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Значение должно ÑоÑтоÑÑ‚ÑŒ только из букв, цифр и знаков подчеркиваниÑ."
-
-#: core/validators.py:64
-msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
-msgstr "Значение должно ÑоÑтоÑÑ‚ÑŒ только из букв, цифр, знаков подчеркиваниÑ, тире или наклонной черты вправо."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Заглавные буквы недопуÑтимы."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Строчные буквы здеÑÑŒ недопуÑтимы."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Введите цифры, разделённые запÑтыми."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Введите правильные адреÑа Ñлектронной почты, разделённые запÑтыми."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "ПожалуйÑта, введите правильный IP-адреÑ."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "ПуÑтое значение здеÑÑŒ недопуÑтимо."
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Ðецифровые Ñимволы здеÑÑŒ недопуÑтимы."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Это значение не может быть ÑоÑтавлено только из цифр."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Введите целое чиÑло."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "ЗдеÑÑŒ разрешены только алфавитные Ñимволы."
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Вводите правильную дату в формате YYYY-MM-DD."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Введите правильное Ð²Ñ€ÐµÐ¼Ñ Ð² формате HH:MM."
-
-#: core/validators.py:132
-#: db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Введите правильные дату/Ð²Ñ€ÐµÐ¼Ñ Ð² формате YYYY-MM-DD HH:MM."
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Укажите правильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
-
-#: core/validators.py:148
-msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
-msgstr "Загрузите реальное изображение. Файл, который вы загрузили, не ÑвлÑетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ или был поврежден."
-
-#: core/validators.py:155
+#: utils/timesince.py:40
#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "URL %s не указывает на реальное изображение."
-
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr "Телефонные номера должен быть в формате XXX-XXX-XXXX. \"%s\" неверен."
+msgid "%d milliseconds"
+msgstr "%d милиÑекунд"
-#: core/validators.py:167
+#: utils/timesince.py:41
#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "URL %s не указывает на реальное видео QuickTime."
-
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Правильный URL обÑзателен."
-
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
+msgid "%(number)d %(type)s"
msgstr ""
-"Правильный HTML обÑзателен. Специфичные ошибки:\n"
-"%s"
-
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Ðеверный формат XML: %s"
-
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Ðеверный URL: %s"
-
-#: core/validators.py:206
-#: core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "URL %s - ÑÐ»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÑÑылка."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Введите правильную аббревиатуру штата СШÐ."
-#: core/validators.py:229
+#: utils/timesince.py:47
#, 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 здеÑÑŒ запрещены."
-msgstr[2] "Следите за Ñвоими Ñловами! Слова %s здеÑÑŒ запрещены."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Это поле должно Ñовпадать Ñ Ð¿Ð¾Ð»ÐµÐ¼ '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "ПожалуйÑта, заполните Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно поле."
-
-#: core/validators.py:264
-#: core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "ПожалуйÑта, заполните оба Ð¿Ð¾Ð»Ñ Ð¸Ð»Ð¸ оÑтавьте их оба пуÑтыми."
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Это поле должно быть заполнено, еÑли %(field)s равно %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Это поле должно быть заполнено, еÑли %(field)s не равно %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Двойные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ñ‹."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Это значение должно быть Ñтепенью %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "ПожалуйÑта, введите корректное деÑÑтичное чиÑло."
-
-#: core/validators.py:349
-#, 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 знаками."
-msgstr[2] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками."
-
-#: core/validators.py:352
-#, 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 знаками поÑле запÑтой."
-msgstr[2] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками поÑле запÑтой."
-
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "УбедитеÑÑŒ, что загруженный файл не меньше %s байт."
-
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "УбедитеÑÑŒ, что загруженный файл не больше %s байт."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Формат Ñтого Ð¿Ð¾Ð»Ñ Ð½ÐµÐ²ÐµÑ€ÐµÐ½."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Это поле неверно."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Ðевозможно получить ничего Ñ %s."
-
-#: core/validators.py:429
-#, 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:462
-#, 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\".)"
+msgid ", %(number)d %(type)s"
+msgstr ""
-#: core/validators.py:466
-#, 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\".)"
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
-#: core/validators.py:471
-#, 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\".)"
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
-#: core/validators.py:476
-#, 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\".)"
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
-#: core/validators.py:480
-#, 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\".)"
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
-#: core/validators.py:485
-#, 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\".)"
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "полночь"
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ %(type)s уже ÑущеÑтвует Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ %(field)s."
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "полдень"
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s Ñ %(fieldname)s уже ÑущеÑтвует."
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
-#: db/models/fields/__init__.py:114
-#: db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542
-#: db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "ОбÑзательное поле."
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "d.m.Y H:i"
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "Это значение должно быть целым чиÑлом."
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "Значение должно либо True, либо False."
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "Это поле не может быть нулевым."
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "да,нет,может быть"
-#: db/models/fields/related.py:43
+#: template/defaultfilters.py:520
#, python-format
-msgid "Please enter a valid %s."
-msgstr "ПожалуйÑта, введите правильный %s."
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d байт"
+msgstr[1] "%(size)d байта"
+msgstr[2] "%(size)d байт"
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "ÐеÑколько значений ID разделите запÑтыми."
-
-#: db/models/fields/related.py:581
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "Удерживайте \"Control\" (или \"Command\" на Mac) Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° неÑкольких."
-
-#: db/models/fields/related.py:625
+#: template/defaultfilters.py:522
#, 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] "ПожалуйÑта, введите корректный ID Ð´Ð»Ñ %(self)s. Значение %(value)r недопуÑтимо."
-msgstr[1] "ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r недопуÑтимы."
-msgstr[2] "ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r недопуÑтимы."
+msgid "%.1f KB"
+msgstr "%.1f Кб"
-#: forms/__init__.py:380
+#: template/defaultfilters.py:524
#, 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] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
-msgstr[2] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
-
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "ПереноÑÑ‹ Ñтрок здеÑÑŒ не допуÑкаютÑÑ."
+msgid "%.1f MB"
+msgstr "%.1f Мб"
-#: forms/__init__.py:480
-#: forms/__init__.py:551
-#: forms/__init__.py:589
+#: template/defaultfilters.py:525
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Выберите корректный вариант; '%(data)s' нет в %(choices)s."
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Указанный файл пуÑÑ‚."
+msgid "%.1f GB"
+msgstr "%.1f Гб"
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Введите целое чиÑло в диапазоне от -32768 до 32767."
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Введите положительное чиÑло."
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Введите целое чиÑло в диапазоне от 0 до 32767."
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "да,нет,может быть"
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Вы <a href=\"/password_reset/\">забыли пароль</a>?"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "ИÑпользуйте '[algo]$[salt]$[hexdigest]'"
diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo
index c6ac1c9612..2789e1518f 100644
--- a/django/conf/locale/sk/LC_MESSAGES/django.mo
+++ b/django/conf/locale/sk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po
index 4e1dba2a49..f1a3cd77a2 100644
--- a/django/conf/locale/sk/LC_MESSAGES/django.po
+++ b/django/conf/locale/sk/LC_MESSAGES/django.po
@@ -1,200 +1,746 @@
-# Translation of django.po to.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Vladimir Labath <vlado@labath.org>, 2005.
-#
-#, fuzzy
+#
+#
+#
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-27 07:31-0400\n"
-"PO-Revision-Date: 2005-11-10 23:22-0500\n"
-"Last-Translator: Vladimir Labath <vlado@labath.org>\n"
-"Language-Team: Slovak <sk@li.org>\n"
+"POT-Creation-Date: 2007-03-31 14:02+0200\n"
+"PO-Revision-Date: 2007-04-03 21:49+0200\n"
+"Last-Translator: <>\n"
+"Language-Team: Slovak\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:610
+#: db/models/fields/__init__.py:621 newforms/models.py:178
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461
+msgid "This field is required."
+msgstr "Toto pole je povinné."
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "pythonové meno triedy modelu"
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "Uisite sa, že text je kratší ako %s znakov."
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "typ obsahu"
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Zalomenia riadkov nie sú povolené."
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "typy obsahu"
+#: 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 "Vyberte platnú možnosť; '%(data)s' nie je v %(choices)s."
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
-msgid "name"
-msgstr "meno"
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Neznámy"
-#: contrib/auth/models.py:15
-msgid "codename"
-msgstr "codename"
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ãno"
-#: contrib/auth/models.py:17
-msgid "permission"
-msgstr "povolenie"
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nie"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
-msgid "permissions"
-msgstr "povolenia"
+#: 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 "Súbor nebol odoslaný. Skontrolujte atribút 'enctype' encoding vo formulári."
-#: contrib/auth/models.py:29
-msgid "group"
-msgstr "skupina"
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Odoslaný súbor je prázdný."
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
-msgid "groups"
-msgstr "skupiny"
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Zadajte celé Äíslo s hodnotou medzi -32768 a 32767."
-#: contrib/auth/models.py:55
-msgid "username"
-msgstr "užívateľské meno"
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Zadajte celé kladné Äíslo."
-#: contrib/auth/models.py:56
-msgid "first name"
-msgstr "krstné meno"
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Zadajte celé Äíslo s hodnotou medzi 0 a 32767."
-#: contrib/auth/models.py:57
-msgid "last name"
-msgstr "priezvisko"
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s %(type)s už existuje pre prvok %(field)s."
-#: contrib/auth/models.py:58
-msgid "e-mail address"
-msgstr "e-mailová adresa"
+#: 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 "a"
-#: contrib/auth/models.py:59
-msgid "password"
-msgstr "heslo"
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s %(fieldname)s už existuje."
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Použi '[algo]$[salt]$[hexdigest]'"
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "Táto hodnota musí byÅ¥ celé Äíslo."
-#: contrib/auth/models.py:60
-msgid "staff status"
-msgstr "štatút zamestnanca"
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "Táto hodnota musí byť True alebo False."
-#: contrib/auth/models.py:60
-msgid "Designates whether the user can log into this admin site."
-msgstr "OznaÄenie, ak užívateľ má oprávnenie vstúpiÅ¥ ako administrátor."
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "Toto pole nemôže obsahovať null."
-#: contrib/auth/models.py:61
-msgid "active"
-msgstr "aktívny"
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Zadajte platný dátum vo formáte RRRR-MM-DD."
-#: contrib/auth/models.py:62
-msgid "superuser status"
-msgstr "štatút superužívateľa"
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Zadajte platný dátum a Äas vo formáte RRRR-MM-DD HH:MM."
-#: contrib/auth/models.py:63
-msgid "last login"
-msgstr "posledné prihlásenie"
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "Zadajte platný názov súboru."
-#: contrib/auth/models.py:64
-msgid "date joined"
-msgstr "dátum registrácie"
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "Táto hodnota musí byť None, True alebo False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosím, zadajte platné %s."
-#: contrib/auth/models.py:66
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Oddeľte viacnásobné ID Äiarkami."
+
+#: db/models/fields/related.py:644
msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
-msgstr ""
-"Okrem ruÄne vložených povolení, tento uživateľ dostane vÅ¡etky povolenia "
-"skupin, v ktorých sa nachádza."
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Ak chcete vybrať viacero možností, podržte \"Control\" alebo \"Command\" na Mac-u."
-#: contrib/auth/models.py:67
-msgid "user permissions"
-msgstr "pridelené povolenia"
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr "Prosím, vložte platné %(self)s ID-Äka. Hodnota %(value)r je neplatná."
+"Prosím, vložte platné %(self)s ID-Äka. Hodnoty %(value)r sú neplatné."
-#: contrib/auth/models.py:70
-msgid "user"
-msgstr "uživateľ"
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabsky"
-#: contrib/auth/models.py:71
-msgid "users"
-msgstr "užívatelia"
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengálsky"
-#: contrib/auth/models.py:76
-msgid "Personal info"
-msgstr "Osobné údaje"
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalánsky"
-#: contrib/auth/models.py:77
-msgid "Permissions"
-msgstr "Povolenia"
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "ÄŒesky"
-#: contrib/auth/models.py:78
-msgid "Important dates"
-msgstr "Dôležité údaje"
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Welšsky"
-#: contrib/auth/models.py:79
-msgid "Groups"
-msgstr "Skupiny"
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dánsky"
-#: contrib/auth/models.py:219
-msgid "message"
-msgstr "zpráva"
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Nemecky"
-#: contrib/auth/forms.py:30
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grécky"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Anglicky"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Å panielsky"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Argentínska Å¡panielÄina"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Fínsky"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Francúzsky"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galicijsky"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "MaÄarsky"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebrejsky"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandsky"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Taliansky"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonsky"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "Lotyšsky"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Mecedónsky"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Holandsky"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Nórsky"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "Poľsky"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "Portugalsky"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "Brazílsky"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "Rumunsky"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "Rusky"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "Slovensky"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "Slovinsky"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "Srbsky"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "Švédsky"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "Tamilsky"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "Turecky"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "Ukrajinsky"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "Čínsky (zjednodušene)"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "Čínsky (tradiÄne)"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Táto hodnota môže obsahovaÅ¥ len písmená, Äíslice a podÄiarkovníky."
+
+#: core/validators.py:68
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Vyzerá, že tvoj web prehliadaÄ nedovoľuje prístup ku cookies. Cookies sú "
-"nevýhnutné aby si sa mohol prihlásiť."
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Táto hodnota môže obsahovaÅ¥ len písmena, Äíslice, podÄiarkovniky, pomlÄky a lomítka."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Táto hodnota môže obsahovaÅ¥ len písmená, Äíslice, poÄiarkovníky a pomlÄky."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Veľké písmená nie sú povolené."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Malé písmena nie sú povolené."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Zadávajte len Äíslice oddelené Äiarkami."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Zadajte platné e-mailové adresy oddelené Äiarkami."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Prosím, zadajte platnú IP adresu."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Prázdne hodnoty tu nie sú povolené."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Iné ako numerické znaky tu nie sú povolené."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Táto hodnota nemôže byÅ¥ Äisto numerická."
+
+#: core/validators.py:120 newforms/fields.py:126
+msgid "Enter a whole number."
+msgstr "Zadajte celé Äíslo."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tu sú povolené len alfanumerické znaky."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Rok musí byť 1900 alebo neskôr."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Neplatný dátum: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Zadajte platný Äas vo formáte HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:269
+msgid "Enter a valid e-mail address."
+msgstr "Zadajte platnú e-mailovú adresu."
-#: contrib/auth/forms.py:36 contrib/auth/forms.py:41
-#: contrib/admin/views/decorators.py:9
+#: core/validators.py:178
msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Prosím, vlož spávne meno užvateľa ako aj heslo. Pripomínam, že obe polia "
-"rozlišujú malé a veľké písmena"
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Nahrajte platný obrázok. Súbor, ktorý ste odoslali nebol obrázkový formát alebo bol poškodený."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neodkazuje na platný obrázok."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefónne Äíslo musí maÅ¥ formát XXX-XXX-XXXX. Číslo \"%s\" je neplatné."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neodkazuje na platné QuickTime video."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Je požadovaná platná adresa URL."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr "HTML kód musí zodpovedať špecifikácii. Zistené chyby sú:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Chybné XML nezodpovedajúce definícii: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatná adresa URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s je neplatný."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Zadajte platnú skratku štátu USA."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr "Vyjadrujte sa slušne! Slovo %s tu nie je dovolené použivať."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole sa musí zhodovať s poľom '%s'. "
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Prosím, vyplňte aspoň jedno pole."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosím, vyplňte buÄ obidve polia, alebo ich nechajte prázdne."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí byť vyplnené ak, %(field)s je %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Toto pole musí byť vyplnené, ak %(field)s nie je %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Duplicitné hodnoty nie sú povolené."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Táto hodnota musí byť medzi %(lower)s a %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Táto hodnota musí byť prinajmenšom %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Táto hodnota musí byÅ¥ väÄÅ¡ia ako %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Táto hodnota musí byť mocninou %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Prosím, vložte platné desatinné Äíslo. "
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr "Prosím vlož platné desatinné Äíslo s najviac %s Äíslicou."
+"Prosím vlož platné desatinné Äíslo s najviac %s Äíslicami."
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr "Prosím, zadajte platné desatinné Äíslo s najviac %s Äíslicou pred desatinnou Äiarkou."
+"Prosím, zadajte platné desatinné Äíslo s najviac %s Äíslicami pred desatinnou Äiarkou."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr "Prosím, zadajte platné desatinné Äíslo s najviac %s desatinným miestom."
+"Prosím, zadajte platné desatinné Äíslo s najviac %s desatinnými miestami."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Uistite sa, že posielaný súbor nemá menej ako %s bajtov."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Uistite sa, že posielaný súbor nemá viac ako %s bajtov."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Formát pre toto pole je chybný."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Toto pole nie je platné."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Z %s niÄ nepriÅ¡lo."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Adresa URL %(url)s vrátila v hlaviÄke neplatný 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 "Prosím, uzatvorte tag %(tag)s na riadku %(line)s. (Riadok zaÄína "
+"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 "Text zaÄínajúci na riadku %(line)s nie je povolený v tomto kontexte. (Riadok zaÄína 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\" na riadku %(line)s je neplatný atribút. (Riadok zaÄína 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>\" na riadku %(line)s je neplatný tag. (Riadok zaÄína 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 "V tagu na riadku %(line)s chýba jeden alebo viac atribútov. (Riadok "
+"zaÄína 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 "Atribút \"%(attr)s\" na riadku %(line)s má neplatnú hodnotu. (Riadok zaÄína "
+"s \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Objekt %(verbose_name)s bol úspešne vytvorený."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Objekt %(verbose_name)s bol úspešne zmenený."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Objekt %(verbose_name)s bol zmazaný."
+
+#: newforms/models.py:165 newforms/fields.py:360
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Vyberte platnú možnosť. Vybraná položka nepatrí medzi platné možnosti."
+
+#: newforms/models.py:182 newforms/fields.py:378 newforms/fields.py:454
+msgid "Enter a list of values."
+msgstr "Vložte zoznam hodnôt."
+
+#: newforms/models.py:188 newforms/fields.py:387
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Vyberte platnú možnost. %s nepatrí medzi dostupné možnosti."
+
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Uistite sa, že hodnota má najviac %d znakov."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Uistite sa, že zadaná hodnota má menej ako %d znakov."
+
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Uistite sa, že táto hodnota je menšia alebo rovná %s."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Uistite sa, že hodnota je väÄÅ¡ia alebo rovná %s."
+
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "Zadajte platný dátum."
+
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr "Zadajte platný Äas."
+
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr "Zadajte platný dátum a Äas."
+
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "Zadajte platnú hodnotu."
+
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "Zadajte platnú adresu URL."
+
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "Odkaz na URL neexistuje."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgstr "%(value).1f milión"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f miliarda"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f bilión"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "jeden"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dva"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "Å¡tyri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "päť"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "šesť"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sedem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "osem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "deväť"
#: contrib/redirects/models.py:7
msgid "redirect from"
-msgstr "presmerovaný z"
+msgstr "presmerovať z"
#: contrib/redirects/models.py:8
msgid ""
"This should be an absolute path, excluding the domain name. Example: '/"
"events/search/'."
-msgstr ""
-"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'."
+msgstr "Tu by sa mala použiť absolútna cesta bez názvu domény. Napríklad: '/events/search/'."
#: contrib/redirects/models.py:9
msgid "redirect to"
-msgstr "presmerovaný na "
+msgstr "presmerovať na "
#: contrib/redirects/models.py:10
msgid ""
"This can be either an absolute path (as above) or a full URL starting with "
"'http://'."
-msgstr ""
-"Tu môže byÅ¥ buÄ absolútna cesta (ako hore) alebo plné URL zaÄínajúce s "
-"'http://'."
+msgstr "Tu môže byÅ¥ buÄ absolútna cesta (ako je uvedené vyÅ¡Å¡ie) alebo úplná adresa URL zaÄínajúca s 'http://'."
-#: contrib/redirects/models.py:12
+#: contrib/redirects/models.py:13
msgid "redirect"
msgstr "presmerovanie"
-#: contrib/redirects/models.py:13
+#: contrib/redirects/models.py:14
msgid "redirects"
msgstr "presmerovania"
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
-msgstr "objekt ID"
+msgstr "ID objektu"
#: contrib/comments/models.py:68
msgid "headline"
-msgstr "titulok"
+msgstr "nadpis"
#: contrib/comments/models.py:69 contrib/comments/models.py:90
#: contrib/comments/models.py:167
@@ -239,13 +785,13 @@ msgstr "je platné hodnotenie"
#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
-msgstr "dátum/Äas poslania"
+msgstr "dátum a Äas odoslania"
#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
-msgstr "je zveréjnený"
+msgstr "je verejný"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "IP adresa"
@@ -257,9 +803,7 @@ msgstr "je vymazaný"
msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
-msgstr ""
-"Ak je tento komentár nevhodný, tu ho poznaÄ. \"Tento komentár bol vymazaný"
-"\" táto správa sa objaví namiesto neho."
+msgstr "Zaškrtnite toto pole, ak je komentár nevhodný. Správa \"Tento komenár bol zmazaný\" sa bude zobrazovať namiesto neho."
#: contrib/comments/models.py:91
msgid "comments"
@@ -278,7 +822,7 @@ msgid ""
"\n"
"http://%(domain)s%(url)s"
msgstr ""
-"Od %(user)s dňa %(date)s\n"
+"Pridaný užívateľom %(user)s dňa %(date)s\n"
"\n"
"%(comment)s\n"
"\n"
@@ -286,7 +830,7 @@ msgstr ""
#: contrib/comments/models.py:168
msgid "person's name"
-msgstr "osobné meno"
+msgstr "meno osoby"
#: contrib/comments/models.py:171
msgid "ip address"
@@ -306,24 +850,24 @@ msgstr "voľné komentáre"
#: contrib/comments/models.py:233
msgid "score"
-msgstr "stav"
+msgstr "stav skóre"
#: contrib/comments/models.py:234
msgid "score date"
-msgstr "údaje stavu"
+msgstr "dátum stavu skóre"
#: contrib/comments/models.py:237
msgid "karma score"
-msgstr "karma údaj"
+msgstr "karma"
#: contrib/comments/models.py:238
msgid "karma scores"
-msgstr "karma údaje"
+msgstr "karma"
#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
-msgstr "%(score)d hodnotiteľ %(user)s"
+msgstr "%(score)d od hodnotiteľa %(user)s"
#: contrib/comments/models.py:258
#, python-format
@@ -331,22 +875,21 @@ msgid ""
"This comment was flagged by %(user)s:\n"
"\n"
"%(text)s"
-msgstr ""
-"Tento komentár bol oznaÄený užívateľom %(user)s:\n"
+msgstr "Tento komentár bol oznaÄený užívateľom %(user)s:\n"
"\n"
"%(text)s"
#: contrib/comments/models.py:265
msgid "flag date"
-msgstr "dátumové návestie"
+msgstr "dátumové príznak"
#: contrib/comments/models.py:268
msgid "user flag"
-msgstr "návestie uživateľa"
+msgstr "uživateľský príznak"
#: contrib/comments/models.py:269
msgid "user flags"
-msgstr "návestia užívateľa"
+msgstr "užívateľské príznaky"
#: contrib/comments/models.py:273
#, python-format
@@ -355,20 +898,20 @@ msgstr " %r návestie"
#: contrib/comments/models.py:278
msgid "deletion date"
-msgstr "odstránené dátumy"
+msgstr "dátum zmazania"
#: contrib/comments/models.py:280
msgid "moderator deletion"
-msgstr "moderátor odstránenia"
+msgstr "zmazania moderátorom"
#: contrib/comments/models.py:281
msgid "moderator deletions"
-msgstr "moderátor odstránení"
+msgstr "Zmazané moderátorom"
#: contrib/comments/models.py:285
#, python-format
msgid "Moderator deletion by %r"
-msgstr "Moderátor odstránenia %r"
+msgstr "Zmazanané moderátorom %r"
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
@@ -380,89 +923,71 @@ msgstr "Chybné ID komentára"
#: contrib/comments/views/karma.py:25
msgid "No voting for yourself"
-msgstr "Nemôžeš hlasovať za seba"
+msgstr "Nemôžete hlasovať za samého seba"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr "Toto hlasovanie je nevyhnutné, lebo súvisí s predchádzjúcou voľbou."
-#: contrib/comments/views/comments.py:112
+#: 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] ""
-"Tento komentár je od užívateľa, ktorý doteraz poslal minimálne %(count)s "
+msgstr ""
+"Tento komentár je od užívateľa, ktorý doteraz poslal menej ako %(count)s "
"komentár:\n"
"\n"
"%(text)s"
-msgstr[1] ""
-"Tento komentár je od užívateľa, ktorý doteraz poslal najmenej %(count)s "
+"Tento komentár je od užívateľa, ktorý doteraz poslal menej ako %(count)s "
"komentárov:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
-msgstr ""
-"Tento komentár je od veľmi náznakového užívateľa:\n"
+msgstr "Tento komentár je od užívateľa, ktorý sa rád vyjadruje v náznakoch:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Dovolené sú len POST"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Jedno alebo viac povinných polí nebolo vložených"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Niekto skúšal manipulovaÅ¥ s formulárom komentára (poruÅ¡ená bezpeÄnosÅ¥)"
+msgstr "Niekto sa pokúšal manipulovaÅ¥ s formulárom komentára (poruÅ¡enie bezpeÄnosti)"
-#: contrib/comments/views/comments.py:207
+#: 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 ""
-"Formulár komentára ma chybný 'cieľový' parameter -- the objekt ID bol "
-"poškodený"
+"Formulár komentára ma chybný 'target' parameter -- ID objektu je neplatné"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Formulár komentára neposkytuje odpoveÄ buÄ 'prezri' alebo 'poÅ¡li'"
-
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Tvoje meno:"
-
-#: contrib/comments/templates/comments/freeform.html:5
-#: contrib/comments/templates/comments/form.html:27
-msgid "Comment:"
-msgstr "Komentár:"
-
-#: contrib/comments/templates/comments/freeform.html:9
-#: contrib/comments/templates/comments/form.html:32
-msgid "Preview comment"
-msgstr "Pozri komentár"
+msgstr "Formulár komentára neobsahuje ani jednu z možností 'náhľad' alebo 'odoslať'."
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -471,35 +996,36 @@ msgid "Username:"
msgstr "Meno:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Heslo:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Zabudol si svoje heslo?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Log out"
msgstr "Odhlásenie"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zabudli ste heslo?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Hodnotenia"
@@ -512,87 +1038,29 @@ msgstr "Požadované"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Optional"
-msgstr "Voliteľné"
+msgstr "Nepovinné"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
msgstr "Pošli foto"
-#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303
-msgid "URL"
-msgstr "URL"
-
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Príklad: '/about/contact/'. Uisti sa, že máš vložené ako úvodné tak aj "
-"závereÄné lomítka."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "názov"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "obsah"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "povolené komentáre"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "meno predlohy"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo, systém použije "
-"'flatpages/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "musíte byť zaregistrovaný"
-
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Ak je toto oznaÄené, potom len prihlásený užívateľ môže vidieÅ¥ túto stránku."
-
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "plochá stránka"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "ploché stránky"
-
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "kÄ¾ÃºÄ sedenia"
-
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "údaje sedenia"
-
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "dátum konca platnosti"
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentár:"
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "sedenie"
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Náhľad komentára"
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "sedenia"
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Tvoje meno:"
#: contrib/sites/models.py:10
msgid "domain name"
-msgstr "meno domény"
+msgstr "názov domény"
#: contrib/sites/models.py:11
msgid "display name"
@@ -616,7 +1084,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "VÅ¡etko"
@@ -640,25 +1108,13 @@ msgstr "Tento mesiac"
msgid "This year"
msgstr "Tento rok"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Ãno"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Nie"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Neznámy"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "Äas udalosti"
#: contrib/admin/models.py:19
msgid "object id"
-msgstr "objekt id"
+msgstr "id objektu"
#: contrib/admin/models.py:20
msgid "object repr"
@@ -666,11 +1122,11 @@ msgstr "objekt repr"
#: contrib/admin/models.py:21
msgid "action flag"
-msgstr "návestie udalosti"
+msgstr "príznak udalosti"
#: contrib/admin/models.py:22
msgid "change message"
-msgstr "zmeň zprávu"
+msgstr "zmeniť zprávu"
#: contrib/admin/models.py:25
msgid "log entry"
@@ -680,93 +1136,72 @@ msgstr "záznam priebehu"
msgid "log entries"
msgstr "záznamy priebehu"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Všetky dátumy"
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Prihlásenie"
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne pridaný."
-#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Prosím prihlas sa znovu, lebo Äas tvojho sedenia vyprÅ¡al. Nemaj obavy: tvoje "
-"údaje su uchované."
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Môžete pokraÄovaÅ¥ v zmenách."
-#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Vyzerá, že tvoj prehliadaÄ nemá povolené cookies. Prosím, povoľ cookies, "
-"znovu naÄítaj túto stránku a skús ÄinnosÅ¥ znovu."
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Pridať užívateľa"
-#: contrib/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "Meno užívateľa nemože obsahovať znak '@' ."
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Heslo bolo úspešne zmenené."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/auth.py:64
#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Tvoja e-mailova adresa nie je tvoje užívateľské meno. Skús '%s'."
+msgid "Change password: %s"
+msgstr "Zmeniť heslo: %s"
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:223
msgid "Site administration"
-msgstr "Administrácia webu"
-
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne pridaný."
+msgstr "Administrácia"
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Môžeš urobiť zmeny zase nižšie."
-
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
-msgstr "MôžeÅ¡ pridaÅ¥ Äalší %s nižšie."
+msgstr "Môžete pokraÄovaÅ¥ v pridávaní Äaľších %s."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Pridaj %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Bol pridaný %s."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "a"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Bol zmenený %s"
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "Bol vymazaný %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Polia neboli zmenené."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "Objekt %(name)s \"%(obj)s\" boli úspešne zmenený."
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/main.py:353
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
@@ -774,120 +1209,221 @@ msgstr ""
"Objekt %(name)s \"%(obj)s\" bol úspešne zmenený. Ďalšie zmeny môžeš urobiť "
"zase nižšie."
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
-msgstr "Zmeň %s"
+msgstr "Zmeniť %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Jeden alebo viac %(fieldname)s v %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Jeden alebo viac %(fieldname)s v %(name)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
-msgstr "Si si istý?"
+msgstr "Ste si istý?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
-msgstr "Zmeň históriu: %s"
+msgstr "Zmeniť históriu: %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "Výber %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
msgstr "Ktorý %s sa má zmeniť?"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Chyba databázy"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Prosím, zadajte užívateľské meno a heslo. Pozor na malé a veľké písmená."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prihlásenie"
+
+#: 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 "Vaša session vypršala. Prosím, príhlaste sa znovu. Nemusíte sa obávať, vaše údaje boli uchované."
+
+#: 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 "Vyzerá to tak, že váš prehliadaÄ nemá povolené cookies. Prosím, povoľte si cookies a skúste znova naÄítaÅ¥ stránku."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Užívateľské meno nemože obsahovať znak '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaša e-mailová adresa nie je užívateľským menom. Skúste použiť meno '%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 "Aplikáciu %r sa nepodarilo nájsť."
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Model %(name)r sa nenachádza v aplikácii %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "Prepojenie na objekt `%(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 "súvisiace objekty `%(label)s.%(name)s`"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "všetky %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "poÄet %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Polia objektu %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 "CeloÄíselná hodnota"
+msgstr "Celé Äíslo"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
-msgstr "Logická hodnota (buÄ True alebo False)"
+msgstr "Logická hodnota (True alebo False)"
-#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
-msgstr "Dĺžka reťazca (maximálne do %(maxlength)s)"
+msgstr "Dĺžka reťazca (maximálne do %(maxlength)s znakov)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
-msgstr "ÄŒiarka oddeľuje celé Äísla"
+msgstr "Celé Äísla oddelené Äiarkou"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Dátum (bez Äasu)"
-#: contrib/admin/views/doc.py:284
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
-msgstr "Dátum ( a Äas)"
+msgstr "Dátum (a Äas)"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "E-mailová adresa"
-#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
-#: contrib/admin/views/doc.py:290
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Cesta k súboru"
-#: contrib/admin/views/doc.py:288
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
-msgstr "Desiatkové Äíslo"
+msgstr "Desatinné Äíslo"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
-msgstr "Logická hodnota (buÄ True, False alebo None)"
+msgstr "Logická hodnota (True, False alebo None)"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
-msgstr "Má vzÅ¥ah na rodiÄovský model"
+msgstr "Má vzťah k nadradenému modelu"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Číslo telefónu"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Text"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "ÄŒas"
-#: contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
-msgstr "U.S. štát (dve veľké písmena)"
+msgstr "Štát USA (dve veľké písmena)"
-#: contrib/admin/views/doc.py:305
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "XML text"
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nie je urlpattern objekt"
+
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
-msgstr "Aktuálny:"
+msgstr "Aktuálne:"
#: contrib/admin/templates/widget/file.html:3
msgid "Change:"
-msgstr "Zmeň:"
+msgstr "Zmeniť:"
#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
@@ -897,43 +1433,49 @@ msgstr "Dátum:"
msgid "Time:"
msgstr "ÄŒas:"
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Dokumentácia"
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Change password"
-msgstr "Zmeň heslo"
+msgstr "Zmeniť heslo"
-#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/base.html:28
#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -943,14 +1485,24 @@ msgstr "Zmeň heslo"
msgid "Home"
msgstr "ZaÄiatok"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pridať %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Podľa %(filter_title)s "
+
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "História"
#: contrib/admin/templates/admin/object_history.html:18
msgid "Date/time"
-msgstr "Dátum/Äas"
+msgstr "Dátum a Äas"
#: contrib/admin/templates/admin/object_history.html:19
msgid "User"
@@ -962,25 +1514,40 @@ msgstr "Udalosť"
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
-msgstr "PLNY_DATUM_AJ_CAS"
+msgstr "DATE_WITH_TIME_FULL"
#: 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 ""
-"Tento object nemá históriu zmien. Možno nebol pridaný prostredníctvom tohoto "
-"web admina"
+"Tento object nemá históriu vykonaných zmien. Možno nebol pridaný prostredníctvom tohoto administraÄného rozhrania."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "ChoÄ"
-#: contrib/admin/templates/admin/change_list.html:11
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid "Add %(name)s"
-msgstr "Pridaj %(name)s"
+msgid "1 result"
+msgstr "1 výsledok"
-#: contrib/admin/templates/admin/filter.html:2
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid " By %(title)s "
-msgstr " Od %(title)s "
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s spolu"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zobraziť všetky"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administrácia"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administrácia Django"
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -998,39 +1565,37 @@ msgstr "Chyba servera <em>(500)</em>"
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 ""
-"Vznikla chyba. Prostredníctvom e-mailu bol o nej informovaný správca a táto "
-"by mala byť o chviľu odstránená. Ďakujeme za tvoju trpezlivosť."
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "ChoÄ"
+msgstr "Vznikla neoÄakávaná chyba. Prostredníctvom e-mailu bol o nej informovaný správca a dá sa predpokladaÅ¥, že bude v krátkej dobe odstránená. ÄŽakujeme za pochopenie."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Django web admin"
-
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administrácia Django"
+#: 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 "S inÅ¡taláciou alebo nastavením vaÅ¡ej databázy nie je nieÄo v poriadku. Uistite sa, že ste vytvorili potrebné databázové tabuľky. Taktiež skontrolujte, Äi má systémový užívateľ, pod ktorým beží aplikácia, právo na prístup k databáze a Äítanie súborov databázy."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr "Model je prístupný v %(name)s aplikácií."
+msgstr "Modely dostupné v aplikácii %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
-msgstr "Pridaj"
+msgstr "Pridať"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
-msgstr "Zmeň"
+msgstr "Zmeniť"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
-msgstr "Nemáš povolenie na zmeny ."
+msgstr "Nemáte právo na vykonávanie zmien."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
@@ -1042,7 +1607,7 @@ msgstr "Moje udalosti"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
-msgstr "Nepovolené"
+msgstr "Nedostupné"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -1053,32 +1618,27 @@ msgstr "Stránka nebola nájdená"
msgid "We're sorry, but the requested page could not be found."
msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená."
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Zabudol si<a href=\"/password_reset/\"> svoje heslo</a>?"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
-msgstr "Pozri na webe"
+msgstr "Pozrieť na stránke"
-#: contrib/admin/templates/admin/change_form.html:30
+#: 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] "Oprav chybu, Äo je nižšie, prosím."
-msgstr[1] "Oprav chyby, Äo sú nižšie, prosím."
+msgstr "Prosím, opravte chyby uvedené nižšie."
-#: contrib/admin/templates/admin/change_form.html:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
-msgstr "UrÄenie"
+msgstr "Radenie"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Poradie:"
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-msgstr "Vítajte,"
-
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
@@ -1087,49 +1647,79 @@ msgstr "Vymazať"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-"Vymazaním objektu %(object_name)s '%(object)s' môžeš spôsobiť vymazanie "
-"súvisiacich objektov, ale tvoj úÄet nemá povolenie na mazanie nasledujúcich "
-"typov objektov:"
+"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 "Zmazanie objektu %(object_name)s '%(escaped_object)s' by spôsobilo zmazanie súvisiacich objektov, avšak vaše užívateľské práva vám neumožňujú zmazať nasledujúce typy objektov:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
-msgstr ""
-"Si si istý, že chceš vymazať %(object_name)s \"%(object)s\"? Všetky "
-"nasledujúce objekty budú tiež vymazané :"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr "Ste si istý, že chcete zmazať objekt %(object_name)s \"%(escaped_object)s\"? "
+"Zmazané budú aj všetky tieto súvisiace objekty:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
-msgstr "Ano, som si istý"
+msgstr "Ãno, som si istý"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Vitajte,"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
-msgstr "Zapísať ako nový"
+msgstr "Uložiť ako nový"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "ZapísaÅ¥ a pridaÅ¥ Äaší"
+msgstr "UložiÅ¥ a pridaÅ¥ Äaľší"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
-msgstr "ZapísaÅ¥ a pokraÄovaÅ¥ v zmenách"
+msgstr "UložiÅ¥ a pokraÄovaÅ¥ v zmenách"
#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
-msgstr "Zápis"
+msgstr "Uložiť"
+
+#: 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 "Zadajte nové heslo pre užívateľa <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Heslo"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Heslo (potvrdiť)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Znova zadajte heslo kvôli overeniu."
+
+#: 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 "Najskôr zadajte užívateľské meno a heslo. Neskôr budete môcť upraviť ostatné užívateľské nastavnia."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Užívateľské meno"
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
#: contrib/admin/templates/registration/password_change_form.html:10
msgid "Password change"
-msgstr "Zmeň heslo"
+msgstr "Zmena heslo"
#: contrib/admin/templates/registration/password_change_done.html:6
#: contrib/admin/templates/registration/password_change_done.html:10
@@ -1138,22 +1728,20 @@ msgstr "Heslo bolo úspešne zmenené"
#: contrib/admin/templates/registration/password_change_done.html:12
msgid "Your password was changed."
-msgstr "Tvoje heslo bolo zmenené."
+msgstr "Vaše heslo bolo zmenené."
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/password_reset_form.html:6
#: contrib/admin/templates/registration/password_reset_form.html:10
#: contrib/admin/templates/registration/password_reset_done.html:4
msgid "Password reset"
-msgstr "Generácia nového hesla"
+msgstr "Obnovenie hesla"
#: 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 ""
-"Zabudol si svoje heslo? Vlož nižšie tvoju e-mail adresu, a nové heslo ti "
-"bude na ňu zaslané ."
+msgstr "Zabudli ste svoje heslo? Zadajte svoju e-mailovú adresu, na ktorú vám bude zaslané nové heslo."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -1165,32 +1753,28 @@ msgstr "Obnova môjho hesla"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "ÄŽakujeme ti, za stráveny Äas na naÅ¡ej stránke."
+msgstr "ÄŽakujeme vám, za Äas strávený na naÅ¡ich stránkach."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
-msgstr "Prihlás sa znovu"
+msgstr "Prihlásiť sa znovu"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Heslo bolo úspešne vygenerované"
+msgstr "Heslo bolo úspešne obnovené"
#: 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 ""
-"Poslali sme ti, nové heslo na tebou uvedenú emailovú adresu. Mal by si ho "
-"dostaÅ¥ Äo najskôr."
+msgstr "Bolo vám zaslané nové heslo na uvedenú adresu. Mali by ste ho obdržať v najbližšej dobe."
#: 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 ""
-"Kvôli bezpeÄnosti vlož prosím tvoje staré heslo, a potom dvakrát tvoje nové "
-"heslo, tým môžeme skontrolovať jeho správnosť."
+msgstr "Z bezpeÄnostných dôvodov zadajte najskôr staré heslo a potom dva krát nové heslo, tak aby sa mohlo overiÅ¥, Äi nevznikol preklep."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -1210,34 +1794,34 @@ msgstr "Zmeň svoje heslo"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Dostal si túto správu preto, lebo si požadoval vygenerovať tvoje heslo"
+msgstr "Dostali ste túto správu, lebo ste si vyžiadali obnovu hesla."
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
msgid "for your user account at %(site_name)s"
-msgstr "pre tvoj užívateľský úÄet na %(site_name)s"
+msgstr "pre váš užívateľský úÄet na %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "Tvoje nové heslo je: %(new_password)s"
+msgstr "Vaše nové heslo je: %(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 "Môžeš zmeniť toto heslo na nasledujúcej stránke:"
+msgstr "Heslo si kľudne môžete zmeniť na tejto stránke:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "Tvoje užívateľské meno, ak si ho zabudol:"
+msgstr "Vaše užívateľské meno, pre prípad, že ste zabudli:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
-msgstr "Ďakujeme, že používaš naše stránky!"
+msgstr "Ďakujeme vám, že využívate služby našej stránky!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
-msgstr "Skupina %(site_name)s"
+msgstr "Tím %(site_name)s"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
@@ -1256,70 +1840,509 @@ msgid ""
"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\">Na inštaláciu záložiek, potiahni linku do tvojho "
-"bookmarks\n"
-"toolbar, alebo klikni pravou myšou na linku a pridaj ju do tvojho "
-"bookmarks.\n"
-"Teraz si môžeš vybrať záložku pre ľubovoľnú stránku na webe. Poznámka:\n"
-"niektoré záložky vyžadujú aby si prezeral web z poÄítaÄa oznaÄeného \n"
-"ako \"internal\" (opýtaj sa vášho systémového administrátora ak si si nie "
-"istý/á, \n"
-"že tvoj poÄítaÄ je oznaÄený ako \"internal\").</p>\n"
+msgstr "\n"
+"<p class=\"help\">Ak chete nainštalovať záložky, pretiahnite linku do vášho panela so záložkami\n"
+"alebo kliknite pravým tlaÄidlom myÅ¡i na linku a pridajte ju do svojich záložiek.\n"
+"Následne môžete záložky použiÅ¥ na stránkach. VÅ¡imnite si, že použitie niektorých záložiek vyžaduje, aby bol váš poÄítaÄ pridaný do zoznamu INTERNAL_IPS. Ak nie ste si istý, že ste v tomto zozname, oslovte vášho administrátora.</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
-msgstr "Dokumnentácia tejto stránky"
+msgstr "Dokumentácia k tejto stránke"
#: 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 ""
-"SkoÄ z ľubovoľnej stránky do dokumentácie, kde je popísaná generácia tejto "
-"stránky."
+"SkoÄte z ľubovoľnej stránky do dokumentácie, kde je popísané, ako sa táto stránka generuje."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
-msgstr "Ukáž objekt ID"
+msgstr "Zobraziť ID objektu."
#: contrib/admin/templates/admin_doc/bookmarklets.html:23
msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
-msgstr ""
-"Ukáž typ obsahu a jednoznaÄné ID pre stránky, ktoré zatupujú jednoduché "
-"objekty."
+msgstr "Zobrazuje content-type a ID stránok, ktoré reprezentujú jediný objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
-msgstr "Edituj tento object (aktuálne okno)"
+msgstr "Editácia tohoto objektu (v aktuálnom okne)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "SkoÄ na stránku admina, ktorá zastupuje jednoduchý objekt"
+msgstr "SkoÄiÅ¥ na stránku admina, ktorá reprezentuje tento jeden objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
-msgstr "Edituj tento objekt (nové okno)"
+msgstr "Editácia tohoto objektu (v novom okne)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
-msgstr "Ako vyššie, ale stranka admina sa otvorí v novom okne."
+msgstr "To isté ako predtým, akurát otvorí administraÄnú stránku v novom okne."
-#: utils/translation.py:363
-msgid "DATE_FORMAT"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "pythonové meno triedy modelu"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "typ obsahu"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "typy obsahu"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Odhlásený"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "meno"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "povolenie"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "práva"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "skupiny"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "užívateľské meno"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Povinná položka s dĺžkou 30 znakov alebo menej. Povolené sú len alfanumerické znaky (písmená, Äísla a podtržník)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "krstné meno"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "priezvisko"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "heslo"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr "Použite '[algo]$[salt]$[hexdigest]' alebo <a href=\"password/\">formulár na zmenu hesla</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "zamestnanec"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "UrÄuje, Äi má užívateľ oprávnenie prihlásiÅ¥ sa do administraÄnej Äasti."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "aktívny"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "UrÄuje, Äi je úÄet aktívny. OdÅ¡krtnite, ak chcete deaktivovaÅ¥ užívateľský úÄet."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "superužívateľ"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "UrÄuje, Äi užívateľ získava automaticky vÅ¡etky práva aj bez priameho priradenia."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "naposledy prihlásený"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "dátum registrácie"
+
+#: 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 "Okrem ruÄne zadaných práv bude maÅ¥ užívateľ aj vÅ¡etky práva prislúchajúce skupinám, v ktorých sa nachádza."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "užívateľské práva"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "uživateľ"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "užívatelia"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Osobné údaje"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Práva"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Dôležité dátumy"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Skupiny"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "správa"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Pole hesla a jeho potvrdenie sa nezhodujú."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Užívateľ s týmto užívateľským menom už existuje."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Váš prehliadaÄ nemá povolené cookies. Cookies sú potrebné pre úspeÅ¡né prihlásenie."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "ÚÄet je deaktivovaný."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "K danej e-mailovej adrese neexistuje užívateľský úÄet. Ste si istý, že ste sa zaregistrovali?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Pole nového hesla a jeho potvrdenie sa nezhodujú."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaše staré heslo nebolo zadané správne. Prosím, zadajte heslo znova."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Zadajte britský poÅ¡tový kód (PSÄŒ). Medzera medzi dvomi ÄasÅ¥ami kódu je povinná."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:15
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Vložte poÅ¡tové smerovacie Äíslo v tvare XXXXX."
+
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Zadajte americký poštový kód (ZIP) vo formáte XXXXX alebo XXXXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
msgstr ""
-#: utils/translation.py:364
-msgid "DATETIME_FORMAT"
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
msgstr ""
-#: utils/translation.py:365
-msgid "TIME_FORMAT"
+#: 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/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Zadajte poÅ¡tové smerovacie Äíslo v tvare XXXXXXX alebo XXX-XXXX."
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Vložte poÅ¡tové smerovacie Äíslo v tvare XXXX."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Vložte platné nórske Äíslo sociálneho poistenia (social security number)."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "Vložte platné fínske Äíslo sociálneho poistenia (social security number)."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "kÄ¾ÃºÄ session"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "údaje session"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "dátum vypršania platnosti"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Príklad: '/about/contact/'. Uistite sa, že adresa obsahuje na zaÄiatku a na konci.lomítka."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "názov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "obsah"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "povoliť komentáre"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "názov šablóny"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Príklad: 'flatpages/contact_page'. Ak táto šablóna neexistuje, systém použije "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "je vyžadovaná registrácia"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ak je zaškrtnuté, tak sa stránka zobrazí len prihlásenému užívateľovi."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "statická stránka"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "statické stránky"
+
#: utils/dates.py:6
msgid "Monday"
msgstr "Pondelok"
@@ -1398,19 +2421,19 @@ msgstr "December"
#: utils/dates.py:19
msgid "jan"
-msgstr ""
+msgstr "jan"
#: utils/dates.py:19
msgid "feb"
-msgstr ""
+msgstr "feb"
#: utils/dates.py:19
msgid "mar"
-msgstr ""
+msgstr "mar"
#: utils/dates.py:19
msgid "apr"
-msgstr ""
+msgstr "apr"
#: utils/dates.py:19
msgid "may"
@@ -1426,11 +2449,11 @@ msgstr "júl"
#: utils/dates.py:20
msgid "aug"
-msgstr ""
+msgstr "aug"
#: utils/dates.py:20
msgid "sep"
-msgstr ""
+msgstr "sep"
#: utils/dates.py:20
msgid "oct"
@@ -1438,11 +2461,11 @@ msgstr "okt"
#: utils/dates.py:20
msgid "nov"
-msgstr ""
+msgstr "nov"
#: utils/dates.py:20
msgid "dec"
-msgstr ""
+msgstr "dec"
#: utils/dates.py:27
msgid "Jan."
@@ -1474,529 +2497,73 @@ msgstr "Dec."
#: utils/timesince.py:12
msgid "year"
-msgid_plural "years"
-msgstr[0] "rok"
-msgstr[1] "rokov"
+msgstr "rok"
#: utils/timesince.py:13
msgid "month"
-msgid_plural "months"
-msgstr[0] "mesiac"
-msgstr[1] "mesiacov"
+msgstr "mesiac"
#: utils/timesince.py:14
msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr "týždeň"
#: utils/timesince.py:15
msgid "day"
-msgid_plural "days"
-msgstr[0] "Äeň"
-msgstr[1] "dní"
+msgstr "deň"
#: utils/timesince.py:16
msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hodina"
-msgstr[1] "hodín"
+msgstr "hodina"
#: utils/timesince.py:17
msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minúta"
-msgstr[1] "minút"
+msgstr "minúta"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengálsky"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Český"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Waleský"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Dánsky"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Nemecký"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Grécký"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Anglický"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Å panielsky"
-
-#: conf/global_settings.py:45
-msgid "Argentinean Spanish"
-msgstr "Argentínska Å¡panielÄina"
-
-#: conf/global_settings.py:46
-msgid "French"
-msgstr "Francúzsky"
-
-#: conf/global_settings.py:47
-msgid "Galician"
-msgstr "Galicijský"
-
-#: conf/global_settings.py:48
-msgid "Hungarian"
-msgstr "MaÄarský"
-
-#: conf/global_settings.py:49
-msgid "Hebrew"
-msgstr "Hebrejský"
-
-#: conf/global_settings.py:50
-msgid "Icelandic"
-msgstr "Islandský"
-
-#: conf/global_settings.py:51
-msgid "Italian"
-msgstr "Taliansky"
-
-#: conf/global_settings.py:52
-msgid "Japanese"
-msgstr "Japónsky"
-
-#: conf/global_settings.py:53
-msgid "Dutch"
-msgstr "Holándsky"
-
-#: conf/global_settings.py:54
-msgid "Norwegian"
-msgstr "Nórsky"
-
-#: conf/global_settings.py:55
-msgid "Brazilian"
-msgstr "Brazílsky"
-
-#: conf/global_settings.py:56
-msgid "Romanian"
-msgstr "Rumúnsky"
-
-#: conf/global_settings.py:57
-msgid "Russian"
-msgstr "Ruský"
-
-#: conf/global_settings.py:58
-msgid "Slovak"
-msgstr "Slovenský"
-
-#: conf/global_settings.py:59
-msgid "Slovenian"
-msgstr "Slovinský"
-
-#: conf/global_settings.py:60
-msgid "Serbian"
-msgstr "Srbský"
-
-#: conf/global_settings.py:61
-msgid "Swedish"
-msgstr "Švédsky"
-
-#: conf/global_settings.py:62
-msgid "Ukrainian"
-msgstr "Ukrajínsky"
-
-#: conf/global_settings.py:63
-msgid "Simplified Chinese"
-msgstr "ZjednoduÅ¡ená ÄinÅ¡tina "
-
-#: conf/global_settings.py:64
-msgid "Traditional Chinese"
-msgstr "TradiÄná ÄínÅ¡tina"
-
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s s %(type)s už existuje pre prvok %(field)s."
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s s %(fieldname)s už existuje."
-
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Toto pole je nevyhnutné."
-
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "Táto hodnota musí byť integer."
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "Táto hodnota musí byÅ¥ buÄ True alebo False."
-
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "Toto pole nemôže obsahovať null."
-
-#: db/models/fields/__init__.py:468 core/validators.py:132
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Vlož platný dátum/Äas vo formáte RRRR-MM-DD HH:MM"
-
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Vlož platné meno súboru."
-
-#: db/models/fields/related.py:43
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Prosím vlož platné %s."
-
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "Oddeľ viacnásobné ID Äiarkami."
-
-#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-" Podržte \"Control\", alebo \"Command\" na Mac_u, na výber viac ako jednej "
-"položky."
-
-#: db/models/fields/related.py:625
-#, 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] "Prosím vlož platné %(self)s IDs. Hodnota %(value)r je neplatná."
-msgstr[1] "Prosím vlož platné %(self)s IDs. Hodnoty %(value)r sú neplatné."
-
-#: forms/__init__.py:380
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "ZabezpeÄ aby tvoj text bol menší ako %s znak."
-msgstr[1] "ZabezpeÄ aby tvoj text bol menší ako %s znakov."
-
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Nový riadok tu nieje povolený."
-
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Vyber si platnú voľbu; '%(data)s' nie je v %(choices)s."
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Poslaný súbor je prázdný."
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Vlož celé Äíslo s hodnotou medzi -32768 a 32767."
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Vlož celé kladné Äíslo."
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Vlož celé Äíslo s hodnotou medzi 0 a 32767."
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Toto môže obsahovaÅ¥ len písmená, Äíslice a podÄiarkovníky."
-
-#: core/validators.py:64
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Toto môže obsahovaÅ¥ len písmena, Äíslice, podÄiarkovniky, pomlÄky a lomítka."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Veľké písmená tu nie sú povolené."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Malé písmena tu nie sú povolené."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Vlož len Äíslice, oddelené Äiarkami."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Vlož platné e-mail adresy oddelené Äiarkami."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Prosím vlož platnú IP adresu."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Prázdne hodnoty tu nie sú povolené."
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Znaky, ktoré nie sú Äíslicami, tu nie sú povolené."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Tento údaj nemôže byÅ¥ vytvorený len z Äíslic."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Vlož celé Äíslo."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Tu sú povolené len alfanumerické znaky."
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Vlož platný dátum vo formáte RRRR-MM-DD."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Vlož platný Äas vo formáte HH:MM."
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Vlož platnú e-mail adresu."
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
+#: utils/dateformat.py:46
+msgid "PM"
msgstr ""
-"Nahraj platný obrázok. Súbor, ktorý si nahral buÄ nebol obrázok alebo je "
-"nahratý poškodený obrázok."
-#: core/validators.py:155
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "URL %s neukazuje na platný obrázok."
-
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Telefónne Äíslo musí maÅ¥ formát XXX-XXX-XXXX. Číslo \"%s\" je neplatné."
-
-#: core/validators.py:167
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "URL %s neukazuje na platné QuickTime video."
-
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Platné URL je požadované."
-
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Je požadovaná bezchybná stránka HTML. Zistené chyby sú:\n"
-"%s"
-
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Chybne formované XML: %s"
-
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Neplatné URL: %s"
-
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "Odkaz na URL %s je neplatný."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Vlož platnú skratku U.S. štátu."
-
-#: core/validators.py:229
-#, 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] "Vyjadruj sa slušne! Slovo %s tu nie je dovolené použivať."
-msgstr[1] "Vyjadruj sa slušne! Slová %s tu nie je dovolené použivať."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Toto pole sa musí zhodovať s poľom '%s'. "
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Prosím vlož nieÄo aspoň pre jedno pole."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "Prosím vlož obidve polia, alebo nechaj ich obe prázdne. "
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Toto pole musí byť vyplnené tak, že %(field)s obsahuje %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
+#: utils/dateformat.py:47
+msgid "AM"
msgstr ""
-"Toto pole musí byť vyplnené tak, že %(field)s nesmie obsahovať %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Duplicitné hodnoty nie sú povolené."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Táto hodnota musí byť mocninou %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Prosím vlož platné desiatkové Äíslo. "
-#: core/validators.py:349
-#, 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] "Prosím vlož platné desiatkové Äíslo s najviac %s Äíslicou."
-msgstr[1] "Prosím vlož platné desiatkové Äíslo s najviac %s Äíslicami."
-
-#: core/validators.py:352
-#, 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] "Prosím vlož platné desatinné Äíslo s najviac %s desatinným miestom."
-msgstr[1] ""
-"Prosím vlož platné desatinné Äíslo s najviac %s desatinnými miestami."
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "polnoc"
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "PresvedÄ sa, že posielaný súbor nemá menej ako %s bytov."
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "poludnie"
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "PresvedÄ sa, že posielaný súbor nemá viac ako %s bytov."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Formát pre toto pole je chybný."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Toto pole nie je platné."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "NiÄ som nemohol získaÅ¥ z %s."
-
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-" URL %(url)s vrátilo neplatnú hlaviÄku Content-Type '%(contenttype)s'."
-
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Prosím zavri nezavretý %(tag)s popisovaÄ v riadku %(line)s. (Riadok zaÄína "
-"s \"%(start)s\".)"
-
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
msgstr ""
-"Nejaký text zaÄínajúci na riadku %(line)s nie je povolený v tomto kontexte. "
-"(Riadok zaÄína s \"%(start)s\".)"
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
msgstr ""
-"\"%(attr)s\" na riadku %(line)s je neplatný atribút. (Riadok zaÄína s \"%"
-"(start)s\".)"
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
msgstr ""
-"\"<%(tag)s>\" na riadku %(line)s je neplatný popisovaÄ. (Riadok zaÄína s \"%"
-"(start)s\".)"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
msgstr ""
-"PopisovaÄu na riadku %(line)s chýba jeden alebo viac atribútov. (Riadok "
-"zaÄína s \"%(start)s\".)"
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
msgstr ""
-"Atribút \"%(attr)s\" na riadku %(line)s má neplatnú hodnotu. (Riadok zaÄína "
-"s \"%(start)s\".)"
-#: template/defaultfilters.py:383
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
-msgstr "ano,nie,možno"
-
-#~ msgid "Comment"
-#~ msgstr "Komentár"
-
-#~ msgid "Comments"
-#~ msgstr "Komentáre"
-
-#~ msgid "Delete this file."
-#~ msgstr "Vymaž tento súbor."
-
-#~ msgid "label"
-#~ msgstr "popis"
-
-#~ msgid "package"
-#~ msgstr "balík"
-
-#~ msgid "packages"
-#~ msgstr "balíky"
+msgstr "áno,nie,možno"
-#~ msgid "String (up to 50)"
-#~ msgstr "Reťazec (do 50 )"
diff --git a/django/conf/locale/sk/LC_MESSAGES/djangojs.mo b/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
index a4f5b84a53..1a168078c6 100644
--- a/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/sk/LC_MESSAGES/djangojs.po b/django/conf/locale/sk/LC_MESSAGES/djangojs.po
index df24a19442..f442a15ff1 100644
--- a/django/conf/locale/sk/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/sk/LC_MESSAGES/djangojs.po
@@ -1,20 +1,15 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# VLADO LABATH <vlado@labath.org>, 2005.
-#
-#, fuzzy
+#
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-12-18 19:38-0500\n"
-"PO-Revision-Date: 2005-12-18 19:26-0500\n"
-"Last-Translator: VLADO LABATH <vlado@labath.org>\n"
-"Language-Team: LANGUAGE <sk@li.org>\n"
+"POT-Creation-Date: 2007-04-01 19:21+0200\n"
+"PO-Revision-Date: 2007-04-03 21:48+0200\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
@@ -23,15 +18,15 @@ msgstr "Možný %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
-msgstr "Vyber všetko"
+msgstr "Vybrať všetko"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
-msgstr "Pridaj"
+msgstr "Pridať"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
-msgstr "Vymaž"
+msgstr "Vymazať"
#: contrib/admin/media/js/SelectFilter2.js:53
#, perl-format
@@ -40,13 +35,13 @@ msgstr "Vybrané %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
-msgstr "Vyber si svoju voľbu a klikni"
+msgstr "Vyberte položku a kliknite"
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
-msgstr "VyÄisti vÅ¡etko"
+msgstr "Odstrániť vybrané"
-#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/dateparse.js:32
#: contrib/admin/media/js/calendar.js:24
msgid ""
"January February March April May June July August September October November "
@@ -55,7 +50,7 @@ msgstr ""
"Január Február Marec Apríl Máj Jún Júl August September Október November "
"December"
-#: contrib/admin/media/js/dateparse.js:27
+#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "Nedeľa Pondelok Utorok Streda Štvrtok Piatok Sobota"
@@ -63,49 +58,59 @@ msgstr "Nedeľa Pondelok Utorok Streda Štvrtok Piatok Sobota"
msgid "S M T W T F S"
msgstr "N P U S Å  P S"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Zobraziť"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skryť"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "Práve teraz"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Hodiny"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
-msgstr "Vyber Äas"
+msgstr "VybraÅ¥ Äas"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Polnoc"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 ráno"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "Poludnie"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
-msgstr "Zruš"
+msgstr "Zrušiť"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "Dnes"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Kalendár"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "VÄera"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "Zajtra"
+
diff --git a/django/conf/locale/sl/LC_MESSAGES/django.mo b/django/conf/locale/sl/LC_MESSAGES/django.mo
index 12253610c4..a96fd554ef 100644
--- a/django/conf/locale/sl/LC_MESSAGES/django.mo
+++ b/django/conf/locale/sl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sl/LC_MESSAGES/django.po b/django/conf/locale/sl/LC_MESSAGES/django.po
index 5a9b6d6b46..b0617a5bd8 100644
--- a/django/conf/locale/sl/LC_MESSAGES/django.po
+++ b/django/conf/locale/sl/LC_MESSAGES/django.po
@@ -1,7 +1,9 @@
# translation of django.po to Slovenian
# Igor Kolar <ike@email.si), 2006.
# Nena Kojadin <nena@kiberpipa.org), 2006.
-# Jure Cuhalev <gandalf@owca.info>, 2006.
+# Jure Cuhalev <gandalf@owca.info>, 2006, 2007.
+# Gasper Koren <gasper@fdvinfo.net>, 2007.
+# Jozko Skrablin <jozko.skrablin@gmail.com>, 2007.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
msgid ""
@@ -9,8 +11,8 @@ msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:13+0200\n"
-"PO-Revision-Date: 2006-07-29 11:52+0100\n"
-"Last-Translator: Jure ÄŒuhalev <gandalf@owca.info>\n"
+"PO-Revision-Date: 2007-02-15 21:47+0100\n"
+"Last-Translator: Gasper Koren <gasper@fdvinfo.net>\n"
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -90,7 +92,7 @@ msgstr "je odstranjen/-a"
#: 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 "Odkljukaj, Äe je komntar neprimeren. Namesto komentarja bo vidno obvestilo \"Ta komentar je bil odstranjen\"."
+msgstr "Odkljukaj, Äe je komentar neprimeren. Namesto komentarja bo vidno obvestilo \"Ta komentar je bil odstranjen\"."
#: contrib/comments/models.py:91
msgid "comments"
@@ -126,7 +128,7 @@ msgstr "ip naslov"
#: contrib/comments/models.py:173
msgid "approved by staff"
-msgstr "potrjeno s strani osebja"
+msgstr "osebje je potrdilo"
#: contrib/comments/models.py:176
msgid "free comment"
@@ -174,7 +176,7 @@ msgstr "datum oznaÄitve (zastavice)"
#: contrib/comments/models.py:268
msgid "user flag"
-msgstr "uporabnikova zastavica"
+msgstr "uporabniška zastavica"
#: contrib/comments/models.py:269
msgid "user flags"
@@ -204,7 +206,7 @@ msgstr "Izbris opravil moderator %r"
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
-msgstr "Anonimni upirabniki ne morejo glasovati"
+msgstr "Anonimni uporabniki ne morejo glasovati"
#: contrib/comments/views/karma.py:23
msgid "Invalid comment ID"
@@ -216,7 +218,7 @@ msgstr "Ni mogoÄe glasovati zase"
#: contrib/comments/views/comments.py:28
msgid "This rating is required because you've entered at least one other rating."
-msgstr "Moraš podati tole oceno, ker si podal vsaj še eno drugo oceno."
+msgstr "To oceno moraš podati, ker si podal vsaj še eno drugo oceno."
#: contrib/comments/views/comments.py:112
#, python-format
@@ -233,15 +235,15 @@ msgstr[0] ""
"\n"
"%(text)s"
msgstr[1] ""
-"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentar:\n"
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarja:\n"
"\n"
"%(text)s"
msgstr[2] ""
-"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarja:\n"
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarje:\n"
"\n"
"%(text)s"
msgstr[3] ""
-"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarje:\n"
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarjev:\n"
"\n"
"%(text)s"
@@ -259,7 +261,7 @@ msgstr ""
#: contrib/comments/views/comments.py:189
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
-msgstr "Dovoljena je le metoda POST"
+msgstr "Dovoljena je le POST metoda"
#: contrib/comments/views/comments.py:193
#: contrib/comments/views/comments.py:284
@@ -398,7 +400,7 @@ msgstr "Neznano"
#: contrib/admin/models.py:16
msgid "action time"
-msgstr "Äas oprave dejanja"
+msgstr "Äas dejanja"
#: contrib/admin/models.py:19
msgid "object id"
@@ -410,7 +412,7 @@ msgstr "predstavitev objekta"
#: contrib/admin/models.py:21
msgid "action flag"
-msgstr "zastavica za doloÄeno dejanje"
+msgstr "zastavica dejanja"
#: contrib/admin/models.py:22
msgid "change message"
@@ -432,7 +434,7 @@ msgstr "Vsi datumi"
#: contrib/auth/forms.py:36
#: contrib/auth/forms.py:41
msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "Prosimo, vnesite veljavno uporabniÅ¡ko ime in geslo. Opomba: obe polji sta obÄutljivi na velikost Ärk"
+msgstr "Prosimo, vnesite veljavno uporabniÅ¡ko ime in geslo. Opomba: obe polji upoÅ¡tevata velikost Ärk."
#: contrib/admin/views/decorators.py:23
#: contrib/admin/templates/admin/login.html:25
@@ -441,11 +443,11 @@ msgstr "Prijavite se"
#: contrib/admin/views/decorators.py:61
msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-msgstr "Vaša seja je pretekla; prosimo, prijavite se znova. Ne skrbite, vaše objave so varno shranjene."
+msgstr "Vaša seja je pretekla; prosimo da se ponovno prijavite. Brez skrbi, vaše objave so varno shranjene."
#: contrib/admin/views/decorators.py:68
msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "Izgleda, da vaÅ¡ brskalnik nima podpore za piÅ¡kotke. Prosimo, vkljuÄite piÅ¡kotke, znova naložite to stran in poskusite Å¡e enkrat."
+msgstr "Izgleda, da vaÅ¡ brskalnik nima podpore za piÅ¡kotke. Prosimo, vkljuÄite piÅ¡kotke, osvežite stran in poskusite Å¡e enkrat."
#: contrib/admin/views/decorators.py:82
msgid "Usernames cannot contain the '@' character."
@@ -454,7 +456,7 @@ msgstr "Uporabniška imena ne smejo vsebovati znaka '@'."
#: contrib/admin/views/decorators.py:84
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Vaš e-mail naslov ne morete uporabljati kot uporabniško ime. Namesto tega uporabite '%s'."
+msgstr "Vaš e-main naslov ni vaše uporabniško ime. Poskusite uporabiti '%s'."
#: contrib/admin/views/main.py:226
msgid "Site administration"
@@ -484,7 +486,7 @@ msgstr "Dodaj %s"
#: contrib/admin/views/main.py:336
#, python-format
msgid "Added %s."
-msgstr "Dodal %s."
+msgstr "Dodan %s."
#: contrib/admin/views/main.py:336
#: contrib/admin/views/main.py:338
@@ -495,12 +497,12 @@ msgstr "in"
#: contrib/admin/views/main.py:338
#, python-format
msgid "Changed %s."
-msgstr "Spremenil %s."
+msgstr "Spremenjen %s."
#: contrib/admin/views/main.py:340
#, python-format
msgid "Deleted %s."
-msgstr "Izbrisal %s."
+msgstr "Izbrisn %s."
#: contrib/admin/views/main.py:343
msgid "No fields changed."
@@ -509,12 +511,12 @@ msgstr "Nobeno polje ni bilo spremenjeno."
#: contrib/admin/views/main.py:346
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" je bilo uspešno spremenjeno."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno spremenjeno."
#: contrib/admin/views/main.py:354
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" je bilo uspešno dodano. Znova ga lahko urejate spodaj."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno dodano. Ponovno ga lahko urejdite spodaj."
#: contrib/admin/views/main.py:392
#, python-format
@@ -534,7 +536,7 @@ msgstr "Eden ali veÄ %(fieldname)s v %(name)s:"
#: contrib/admin/views/main.py:508
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" je bilo uspešno izbrisano."
+msgstr "%(name)s \"%(obj)s\" je bilo uspešno izbrisan."
#: contrib/admin/views/main.py:511
msgid "Are you sure?"
@@ -562,11 +564,11 @@ msgstr "Izberite %s, ki ga želite spremeniti"
#: contrib/admin/views/doc.py:295
#: contrib/admin/views/doc.py:297
msgid "Integer"
-msgstr "Å tevilo (integer)"
+msgstr "Celo Å¡tevilo (integer)"
#: contrib/admin/views/doc.py:278
msgid "Boolean (Either True or False)"
-msgstr "Boolean (ali True ali False)"
+msgstr "Boolean (True ali False)"
#: contrib/admin/views/doc.py:279
#: contrib/admin/views/doc.py:296
@@ -576,19 +578,19 @@ msgstr "Niz (vse do %(maxlength)s)"
#: contrib/admin/views/doc.py:280
msgid "Comma-separated integers"
-msgstr "Z vejico loÄeni integerji"
+msgstr "Z vejico loÄena cela Å¡tevila (integer)"
#: contrib/admin/views/doc.py:281
msgid "Date (without time)"
-msgstr "Datum (brez Äasa)"
+msgstr "Datum (brez ure)"
#: contrib/admin/views/doc.py:282
msgid "Date (with time)"
-msgstr "Datum (s Äasom)"
+msgstr "Datum (z uro)"
#: contrib/admin/views/doc.py:283
msgid "E-mail address"
-msgstr "E-naslov"
+msgstr "E-mail naslov"
#: contrib/admin/views/doc.py:284
#: contrib/admin/views/doc.py:287
@@ -601,7 +603,7 @@ msgstr "Decimalno Å¡tevilo"
#: contrib/admin/views/doc.py:291
msgid "Boolean (Either True, False or None)"
-msgstr "Boolean (ali True ali False ali None)"
+msgstr "Boolean (True, False ali None)"
#: contrib/admin/views/doc.py:292
msgid "Relation to parent model"
@@ -701,11 +703,11 @@ msgstr "N j, Y, H:i"
#: 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 "Ta objekt nima zgodovine. Verjetno ni bil dodan preko te administratorske strani."
+msgstr "Ta objekt nima zgodovine sprememb. Verjetno ni bil dodan preko te strani za administracijo."
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
-msgstr "Django site admin"
+msgstr "Vmesnik za administracijo Django strani"
#: contrib/admin/templates/admin/base_site.html:7
msgid "Django administration"
@@ -717,7 +719,7 @@ msgstr "Napaka strežnika"
#: contrib/admin/templates/admin/500.html:6
msgid "Server error (500)"
-msgstr "Django napaka (500)"
+msgstr "Napaka strežnika (500)"
#: contrib/admin/templates/admin/500.html:9
msgid "Server Error <em>(500)</em>"
@@ -725,7 +727,7 @@ msgstr "Napaka strežnika <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 "PriÅ¡lo je do nepriÄakovane napake. Administratorji strani so že obveÅ¡Äeni prekoe-poÅ¡te in naj bi jo v kratkem odpravili. Hvala za vaÅ¡e potrpljenje."
+msgstr "PriÅ¡lo je do nepriÄakovane napake. Administrator je preko e-poÅ¡te prejel obvestilo o napaki in jo bo v kratkem odpravil. Hvala za potrpljenje."
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -734,7 +736,7 @@ msgstr "Strani ni mogoÄe najti"
#: contrib/admin/templates/admin/404.html:10
msgid "We're sorry, but the requested page could not be found."
-msgstr "Se opraviÄujemo, a zahtevane strani ni mogoÄe najti."
+msgstr "OpraviÄujemo se, a zahtevane strani ni mogoÄe najti."
#: contrib/admin/templates/admin/index.html:17
#, python-format
@@ -773,7 +775,7 @@ msgstr "Dodaj %(name)s"
#: contrib/admin/templates/admin/login.html:22
msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Ste <a href=\"/password_reset/\">pozabili geslo</a>"
+msgstr "Ste <a href=\"/password_reset/\">pozabili geslo</a>?"
#: contrib/admin/templates/admin/base.html:23
msgid "Welcome,"
@@ -787,7 +789,7 @@ msgstr "Izbriši"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
-msgstr "Izbris %(object_name)s '%(object)s' bi pomenil izbris povezanih objektov, vendarvi nimate dovoljenja za izbris naslednjih tipov objektov:"
+msgstr "Izbris %(object_name)s '%(object)s' bi pomenil izbris povezanih objektov, vendar nimate dovoljenja za izbris naslednjih tipov objektov:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
@@ -815,17 +817,17 @@ msgstr "Poglej na strani"
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
msgstr[0] "Prosimo, odpravite sledeÄo napako."
-msgstr[1] "Prosimo, odpravite sledeÄe napake."
-msgstr[2] "Prosimo, odpravite sledeÄi napaki."
+msgstr[1] "Prosimo, odpravite sledeÄi napaki."
+msgstr[2] "Prosimo, odpravite sledeÄe napake."
msgstr[3] "Prosimo, odpravite sledeÄe napake."
#: contrib/admin/templates/admin/change_form.html:48
msgid "Ordering"
-msgstr "Urejanje"
+msgstr "RazvrÅ¡Äanje"
#: contrib/admin/templates/admin/change_form.html:51
msgid "Order:"
-msgstr "Uredi:"
+msgstr "Razvrsti:"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -853,7 +855,7 @@ msgstr "Sprememba gesla"
#: contrib/admin/templates/registration/password_change_done.html:6
#: contrib/admin/templates/registration/password_change_done.html:10
msgid "Password change successful"
-msgstr "Geslo uspešno spremenjeno"
+msgstr "Sprememba gesla je uspela"
#: contrib/admin/templates/registration/password_change_done.html:12
msgid "Your password was changed."
@@ -864,23 +866,23 @@ msgstr "Vaše geslo je bilo spremenjeno."
#: contrib/admin/templates/registration/password_reset_form.html:10
#: contrib/admin/templates/registration/password_reset_done.html:4
msgid "Password reset"
-msgstr "Obnova gesla"
+msgstr "Ponastavitev gesla"
#: 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 "Ste pozabili geslo? Vnesite vaš e-naslov spodaj in mi vam bomo poslali novo geslo."
+msgstr "Ste pozabili geslo? Vnesite vaš e-mail naslov in poslali vam bomo novo geslo."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "E-naslov"
+msgstr "Naslov e-pošte:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
-msgstr "Obnova gesla"
+msgstr "Ponastavi moje geslo"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Hvala, ker ste si vzeli nekaj Äasa za to spletno stran."
+msgstr "Hvala, ker ste si danes vzeli nekaj Äasa za to spletno stran."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
@@ -889,15 +891,15 @@ msgstr "Ponovna prijava"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Geslo je bilo uspešno obnovljeno"
+msgstr "Ponastavitev gesla je uspela"
#: 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 "Po e-pošti smo vam poslali novo geslo.Morali bi ga prejeti v kratkem"
+msgstr "Po e-pošti smo vam poslali novo geslo. Morali bi ga prejeti v kratkem"
#: 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 "Prosim, vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo(da preverimo, da se niste zatipkali)"
+msgstr "Prosim, vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo (da preverimo, da se niste zatipkali)"
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -913,16 +915,16 @@ msgstr "Potrditev gesla:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Sprememba gesla"
+msgstr "Spremeni moje geslo"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "To pošto ste dobili, ker ste zahtevali spremembo gesla"
+msgstr "Ta e-mail ste dobili, ker ste zahtevali ponastavitev gesla"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
msgid "for your user account at %(site_name)s"
-msgstr "za vaÅ¡ uporabniÅ¡ki raÄun pri %(site_name)s"
+msgstr "za vaÅ¡ uporabniÅ¡ki raÄun na %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
@@ -935,7 +937,7 @@ msgstr "Geslo lahko spremenite z obiskom strani:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "Vaše uporabniško ime (za vsak primer)"
+msgstr "Vaše uporabniško ime (za vsak primer):"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
@@ -955,6 +957,7 @@ msgid "Documentation bookmarklets"
msgstr "Dokumentacijske zaznamkice"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+#, fuzzy
msgid ""
"\n"
"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
@@ -966,11 +969,11 @@ msgid ""
msgstr ""
"\n"
"<p class=\"help\">Za inÅ¡talacijo zaznamkic povleÄite povezavo v orodno vrstico\n"
-"z zaznamki, ali kliknite z desno miÅ¡kino tipko na povezavo in jo dodajte med zaznamkeZdaj lahko uporabite zaznamek s katere koli strani. Opomba: nekatere teh stranilahko gledate le z internega raÄunalnika (preverite s sistemskim administratorjem)</p>\n"
+"z zaznamki, ali kliknite z desno miÅ¡kino tipko na povezavo in jo dodajte med zaznamke. Zdaj lahko izberete zaznamkico s katerekoli strani. Opomba: nekatere izmed teh strani lahko gledate le z raÄunalnika, ki je oznaÄen kot \"notranji\" (v kolikor niste prepriÄani, Äe je vaÅ¡ raÄunalnik oznaÄen kot \"notranji\"se obrnite na sistemskega administratorja).</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
-msgstr "Dokumentacija za to stran"
+msgstr "Dokumentacija te strani"
#: contrib/admin/templates/admin_doc/bookmarklets.html:20
msgid "Jumps you from any page to the documentation for the view that generates that page."
@@ -986,7 +989,7 @@ msgstr "Pokaže content-type in unikatni ID za strani, ki predstavljajo en objek
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
-msgstr "Uredi trenutni objekt (v trenutnem oknu)"
+msgstr "Uredi objekt (v trenutnem oknu)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
@@ -1006,7 +1009,7 @@ msgstr "Datum:"
#: contrib/admin/templates/widget/date_time.html:4
msgid "Time:"
-msgstr "ÄŒas:"
+msgstr "Ura:"
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
@@ -1022,7 +1025,7 @@ msgstr "preusmeritev iz"
#: contrib/redirects/models.py:8
msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
-msgstr "To mora biti absolutna pot, izkljuÄujoÄ domeno. Primer: '/events/search'-"
+msgstr "Ta pot mora biti absolutna, brez imena domene. Primer: '/events/search'"
#: contrib/redirects/models.py:9
msgid "redirect to"
@@ -1030,7 +1033,7 @@ msgstr "preusmeri na"
#: contrib/redirects/models.py:10
msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
-msgstr "To je ali absolutna pot (kot zgoraj) ali popoln URL naslov (zaÄne se z 'http://')"
+msgstr "To je lahko absolutna pot (kot zgoraj) ali popoln URL naslov (ki se zaÄne s 'http://')"
#: contrib/redirects/models.py:12
msgid "redirect"
@@ -1042,7 +1045,7 @@ msgstr "preusmeritve"
#: contrib/flatpages/models.py:8
msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr "Primer: '/about/contact/'. Mora vsebovati / (poÅ¡evnico) na zaÄetku in koncu."
+msgstr "Primer: '/about/contact/'. Preverite ali vsebuje / (poÅ¡evnico) na zaÄetku in koncu vnosa."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -1070,7 +1073,7 @@ msgstr "obvezna registracija"
#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "ÄŒe je to polje odkljukano, si lahko to stran ogledajo le registrirani uporabniki."
+msgstr "ÄŒe je to polje izbrano, si bodo to stran lahko ogledali le prijavljeni uporabniki."
#: contrib/flatpages/models.py:18
msgid "flat page"
@@ -1121,7 +1124,7 @@ msgstr "priimek"
#: contrib/auth/models.py:58
msgid "e-mail address"
-msgstr "e-naslov"
+msgstr "e-mail naslov"
#: contrib/auth/models.py:59
msgid "password"
@@ -1157,7 +1160,7 @@ msgstr "Älan od"
#: contrib/auth/models.py:66
msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
-msgstr "Polek roÄno doloÄenih dovoljenj bo ta uporabnik dobil tudi vsa dovoljenja,ki pripadajo vsem skupinah, v katerih je."
+msgstr "Poleg roÄno doloÄenih dovoljenj bo ta uporabnik dobil tudi vsa dovoljenja, ki pripadajo skupinam, katerih Älan je."
#: contrib/auth/models.py:67
msgid "user permissions"
@@ -1201,19 +1204,19 @@ msgstr "python ime razreda modela"
#: contrib/contenttypes/models.py:28
msgid "content type"
-msgstr "content type"
+msgstr "tip vsebine"
#: contrib/contenttypes/models.py:29
msgid "content types"
-msgstr "content types"
+msgstr "tipi vsebine"
#: contrib/sessions/models.py:35
msgid "session key"
-msgstr "sejni kljuÄ"
+msgstr "kljuÄ seje"
#: contrib/sessions/models.py:36
msgid "session data"
-msgstr "podatki v seji"
+msgstr "podatki seje"
#: contrib/sessions/models.py:37
msgid "expire date"
@@ -1415,50 +1418,50 @@ msgstr "dec."
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
-msgstr[0] "let"
-msgstr[1] "leto"
-msgstr[2] "leti"
-msgstr[3] "leta"
+msgstr[0] "leto"
+msgstr[1] "leti"
+msgstr[2] "leta"
+msgstr[3] "let"
#: utils/timesince.py:13
msgid "month"
msgid_plural "months"
-msgstr[0] "mesecev"
-msgstr[1] "mesec"
-msgstr[2] "meseca"
-msgstr[3] "meseci"
+msgstr[0] "mesec"
+msgstr[1] "meseca"
+msgstr[2] "meseci"
+msgstr[3] "mesecev"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] "tednov"
-msgstr[1] "teden"
-msgstr[2] "tedna"
+msgstr[0] "teden"
+msgstr[1] "tedna"
+msgstr[2] "tedni"
msgstr[3] "tednov"
#: utils/timesince.py:15
msgid "day"
msgid_plural "days"
-msgstr[0] "dni"
-msgstr[1] "dan"
-msgstr[2] "dneva"
+msgstr[0] "dan"
+msgstr[1] "dneva"
+msgstr[2] "dnevi"
msgstr[3] "dni"
#: utils/timesince.py:16
msgid "hour"
msgid_plural "hours"
-msgstr[0] "ur"
-msgstr[1] "ura"
-msgstr[2] "uri"
-msgstr[3] "ure"
+msgstr[0] "ura"
+msgstr[1] "uri"
+msgstr[2] "ure"
+msgstr[3] "ur"
#: utils/timesince.py:17
msgid "minute"
msgid_plural "minutes"
-msgstr[0] "minut"
-msgstr[1] "minuta"
-msgstr[2] "minuti"
-msgstr[3] "minute"
+msgstr[0] "minuta"
+msgstr[1] "minuti"
+msgstr[2] "minute"
+msgstr[3] "minut"
#: conf/global_settings.py:37
msgid "Bengali"
@@ -1562,7 +1565,7 @@ msgstr "Ukrajinski"
#: conf/global_settings.py:62
msgid "Simplified Chinese"
-msgstr "Poenostavljen kitajski"
+msgstr "Poenostavljeni kitajski"
#: conf/global_settings.py:63
msgid "Traditional Chinese"
@@ -1570,27 +1573,27 @@ msgstr "Tradicionalni kitajski"
#: core/validators.py:60
msgid "This value must contain only letters, numbers and underscores."
-msgstr "To polje lahko vsebuje le Ärke, Å¡tevila in podÄrtaje (_)."
+msgstr "Ta vrednost mora vsebovati le Ärke, Å¡tevila in podÄrtaje (_)."
#: core/validators.py:64
msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
-msgstr "To polje lahko vsebuje le Ärke, Å¡tevila, podÄrtaje, poÅ¡evnice ali pomiÅ¡ljaje."
+msgstr "Ta vrednost mora vsebovati le Ärke, Å¡tevila, podÄrtaje, poÅ¡evnice ali pomiÅ¡ljaje."
#: core/validators.py:72
msgid "Uppercase letters are not allowed here."
-msgstr "Velike tiskane Ärke tu niso dovoljene."
+msgstr "Velike tiskane Ärke niso dovoljene."
#: core/validators.py:76
msgid "Lowercase letters are not allowed here."
-msgstr "Majhne tiskane Ärke tu niso dovoljene."
+msgstr "Majhne tiskane Ärke niso dovoljene."
#: core/validators.py:83
msgid "Enter only digits separated by commas."
-msgstr "Vnesite Å¡tevila, loÄena z vejicami."
+msgstr "Vnesite samo Å¡tevila, loÄena z vejicami."
#: core/validators.py:95
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Vnesite veljavne e-poÅ¡ne naslove, loÄene z vejicami."
+msgstr "Vnesite veljavne e-mail naslove, loÄene z vejicami."
#: core/validators.py:99
msgid "Please enter a valid IP address."
@@ -1602,11 +1605,11 @@ msgstr "Prazne vrednosti tu niso dovoljene."
#: core/validators.py:107
msgid "Non-numeric characters aren't allowed here."
-msgstr "NenumeriÄne vrednosti tukaj niso dovoljne."
+msgstr "NenumeriÄni znaki tukaj niso dovoljne."
#: core/validators.py:111
msgid "This value can't be comprised solely of digits."
-msgstr "To polje ne sme vsebovati le Å¡tevk."
+msgstr "Ta vrednost ne sme vsebovati le Å¡tevk."
#: core/validators.py:116
msgid "Enter a whole number."
@@ -1614,7 +1617,7 @@ msgstr "Vnesite celo Å¡tevilo."
#: core/validators.py:120
msgid "Only alphabetical characters are allowed here."
-msgstr "Le Ärke iz abecede so dovoljene tukaj."
+msgstr "Tukaj so dovoljene samo Ärke."
#: core/validators.py:124
msgid "Enter a valid date in YYYY-MM-DD format."
@@ -1631,11 +1634,11 @@ msgstr "Vnesite veljavni datum/Äas v zapisu YYYY-MM-DD HH:MM (leto-mesec-dan ur
#: core/validators.py:136
msgid "Enter a valid e-mail address."
-msgstr "Vnesite veljavni e-naslov."
+msgstr "Vnesite veljaven e-mail."
#: core/validators.py:148
msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
-msgstr "Uploadjate veljavno sliko. Trenutna datoteka ni bila niti slika niti okvarjena slika."
+msgstr "Naložite veljavno sliko. Naložena datoteka ni bila slika ali pa je bila le-ta okvarjena."
#: core/validators.py:155
#, python-format
@@ -1654,7 +1657,7 @@ msgstr "URL %s ne kaže na veljavni QuickTime video."
#: core/validators.py:171
msgid "A valid URL is required."
-msgstr "Potreben je veljavni URL naslov."
+msgstr "Potreben je veljaven URL naslov."
#: core/validators.py:185
#, python-format
@@ -1662,24 +1665,24 @@ msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Potreben je veljavni HTML. Trenutni ima sledeÄe napake:\n"
+"Potreben je veljaven HTML. Trenutni ima sledeÄe napake:\n"
"%s"
#: core/validators.py:192
#, python-format
msgid "Badly formed XML: %s"
-msgstr "Pokvarjen XML: %s"
+msgstr "Nepravilen XML: %s"
#: core/validators.py:202
#, python-format
msgid "Invalid URL: %s"
-msgstr "Neveljavni URL naslov: %s"
+msgstr "Neveljaven URL naslov: %s"
#: core/validators.py:206
#: core/validators.py:208
#, python-format
msgid "The URL %s is a broken link."
-msgstr "URL povezava %s je polomljena."
+msgstr "URL povezava %s ne deluje."
#: core/validators.py:214
msgid "Enter a valid U.S. state abbreviation."
@@ -1690,7 +1693,7 @@ msgstr "Vnesi veljavno okrajšavo za ameriško zvezno državo."
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] "Pazite na jezik! Beseda %s tu ni dovoljena."
-msgstr[1] "Pazite na jezik! Besede %s tu niso dovoljene."
+msgstr[1] "Pazite na jezik! Besedi %s tu nista dovoljeni."
msgstr[2] "Pazite na jezik! Besede %s tu niso dovoljene."
msgstr[3] "Pazite na jezik! Besede %s tu niso dovoljene."
@@ -1701,22 +1704,22 @@ msgstr "To polje mora ustrezati polju '%s'."
#: core/validators.py:255
msgid "Please enter something for at least one field."
-msgstr "Prosim, vnesite nekaj v vsaj eno od polj."
+msgstr "Prosim, vnesite nekaj v vsaj eno izmed polj."
#: core/validators.py:264
#: core/validators.py:275
msgid "Please enter both fields or leave them both empty."
-msgstr "Prosimo, izpolnite obe polji ali ju pustite obe prazni."
+msgstr "Prosimo, izpolnite obe polji ali pa pustite obe prazni."
#: core/validators.py:282
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "To polje mora biti izpolnjeno, Äe je %(field)s %(value)s"
+msgstr "To polje mora biti podano, Äe je %(field)s %(value)s"
#: core/validators.py:294
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "To polje mora biti izpolnjeno, Äe ni %(field)s %(value)s"
+msgstr "To polje mora biti podano, Äe ni %(field)s %(value)s"
#: core/validators.py:313
msgid "Duplicate values are not allowed."
@@ -1729,7 +1732,7 @@ msgstr "Ta vrednost mora biti potenca od %s."
#: core/validators.py:347
msgid "Please enter a valid decimal number."
-msgstr "Prosim vnesite decimalno Å¡tevilo."
+msgstr "Prosim vnesite veljavno decimalno Å¡tevilo."
#: core/validators.py:349
#, python-format
@@ -1745,19 +1748,19 @@ msgstr[3] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s Å¡tevkami."
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] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s decimalnim mestom."
-msgstr[1] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s decimalnimi mesti."
+msgstr[1] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s decimalnima mestoma."
msgstr[2] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s decimalnimi mesti."
msgstr[3] "Prosimo, vnesite veljavno decimalno Å¡tevilo z najveÄ %s decimalnimi mesti."
#: core/validators.py:362
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Prosimo, poskrbite, da bo prenesena datoteka velika vsaj %s bajtov."
+msgstr "Prosimo, poskrbite, da bo naložena datoteka velika vsaj %s bajtov."
#: core/validators.py:363
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Poskrbite, da bo prenesena datoteka velika najveÄ %s bajtov."
+msgstr "Poskrbite, da bo naložena datoteka velika najveÄ %s bajtov."
#: core/validators.py:376
msgid "The format for this field is wrong."
@@ -1770,7 +1773,7 @@ msgstr "To polje ni veljavno."
#: core/validators.py:426
#, python-format
msgid "Could not retrieve anything from %s."
-msgstr "Iz %s nisem mogel izloÄiti niÄesar."
+msgstr "Iz %s nisem mogel pridobiti niÄesar."
#: core/validators.py:429
#, python-format
@@ -1780,7 +1783,7 @@ msgstr "URL %(url)s je vrnil neveljavni Content-Type '%(contenttype)s'."
#: core/validators.py:462
#, python-format
msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
-msgstr "Prosimo, zaprite nezaprto %(tag)s oznako v vrstici %(line)s. (Vrstica se zaÄne z \"%(start)s\".)"
+msgstr "Prosimo, zaprite %(tag)s oznako v vrstici %(line)s. (Vrstica se zaÄne z \"%(start)s\".)"
#: core/validators.py:466
#, python-format
@@ -1790,7 +1793,7 @@ msgstr "Tekst z zaÄetka vrstice %(line)s ni dovoljen v tem kontekstu. (Vrstica
#: core/validators.py:471
#, python-format
msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
-msgstr "\"%(attr)s\" v vrstici %(line)s je neveljavna oznaka. (Vrstica se zaÄne z \"%(start)s\".)"
+msgstr "\"%(attr)s\" v vrstici %(line)s je neveljaven atribut. (Vrstica se zaÄne z \"%(start)s\".)"
#: core/validators.py:476
#, python-format
@@ -1800,12 +1803,12 @@ msgstr "\"<%(tag)s>\" v vrstici %(line)s je neveljavna oznaka. (Vrstica se zaÄn
#: core/validators.py:480
#, python-format
msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
-msgstr "Oznaki na vrstici %(line)s manjka eden ali veÄ zahtevanih parametrov. (Vrstica se zaÄne z \"%(start)s\".)"
+msgstr "Oznaki v vrstici %(line)s manjka eden ali veÄ zahtevanih parametrov. (Vrstica se zaÄne z \"%(start)s\".)"
#: core/validators.py:485
#, python-format
msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
-msgstr "Atribut \"%(attr)s\" v vrstici %(line)s vsebuje neveljavno vrednost. (Vrstica se zaÄne z \"%(start)s\".)"
+msgstr "Parameter \"%(attr)s\" v vrstici %(line)s vsebuje neveljavno vrednost. (Vrstica se zaÄne z \"%(start)s\".)"
#: db/models/manipulators.py:302
#, python-format
@@ -1827,7 +1830,7 @@ msgstr "To polje je obvezno"
#: db/models/fields/__init__.py:337
msgid "This value must be an integer."
-msgstr "Ta vrednost mora biti Å¡tevilo."
+msgstr "Ta vrednost mora biti celo Å¡tevilo."
#: db/models/fields/__init__.py:369
msgid "This value must be either True or False."
@@ -1858,8 +1861,8 @@ msgstr "Držite \"Control\" (ali \"Command\" na Mac-u), za izbiro veÄ kot enega
#, 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] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednost %(value)r ni veljavna."
-msgstr[1] "Prosimo, vnesite veljavni %(self)s ID. Vrednosti %(value)r niso veljavne."
+msgstr[0] "Prosimo, vnesite veljavne %(self)s ID-e. Vrednost %(value)r ni veljavna."
+msgstr[1] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r nista veljavni."
msgstr[2] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r niso veljavne."
msgstr[3] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r niso veljavne."
@@ -1867,8 +1870,8 @@ msgstr[3] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r niso ve
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Poskrbite, da bo tekst krajši od %s znakov."
-msgstr[1] "Poskrbite, da bo tekst krajši od %s znaka."
+msgstr[0] "Poskrbite, da bo tekst krajši od %s znaka."
+msgstr[1] "Poskrbite, da bo tekst krajši od %s znakov."
msgstr[2] "Poskrbite, da bo tekst krajši od %s znakov."
msgstr[3] "Poskrbite, da bo tekst krajši od %s znakov."
@@ -1885,11 +1888,11 @@ msgstr "Izberite veljavno možnost; '%(data)s' ni v %(choices)s."
#: forms/__init__.py:645
msgid "The submitted file is empty."
-msgstr "Poslano polje je prazno."
+msgstr "Poslana datoteka je prazna."
#: forms/__init__.py:699
msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Vnesite celo Å¡tevilo med -32,768 in 32,767."
+msgstr "Vnesite celo Å¡tevilo med -32.768 in 32.767."
#: forms/__init__.py:708
msgid "Enter a positive number."
@@ -1897,11 +1900,11 @@ msgstr "Vnesite pozitivno Å¡tevilo."
#: forms/__init__.py:717
msgid "Enter a whole number between 0 and 32,767."
-msgstr "Vnesite celo Å¡tevilo med 0 in 32,767."
+msgstr "Vnesite celo Å¡tevilo med 0 in 32.767."
#: template/defaultfilters.py:379
msgid "yes,no,maybe"
-msgstr "ja,ne,morda"
+msgstr "da,ne,morda"
msgid "Comment"
msgstr "Komentar"
diff --git a/django/conf/locale/sl/LC_MESSAGES/djangojs.mo b/django/conf/locale/sl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..9288529a3f
--- /dev/null
+++ b/django/conf/locale/sl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/sl/LC_MESSAGES/djangojs.po b/django/conf/locale/sl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..ef5edccda4
--- /dev/null
+++ b/django/conf/locale/sl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,107 @@
+# Copyright (C) 2007
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DJANGO-JS\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-31 21:29+0100\n"
+"Last-Translator: Gasper Koren <skrat@owca.info>\n"
+"Language-Team: SLOVENIAN <lugos-slo@lugos.si>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Slovenian\n"
+"X-Poedit-Country: SLOVENIA\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Možne %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izberi vse"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Odstrani"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izberite %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izberite in kliknite"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Izbriši vse"
+
+#: 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 "Januar Februar Marec April Maj Junij Julij Avgust September Oktober November December"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedelja Ponedeljek Torek Sreda ÄŒetrtek Petek Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P T S Č P S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Sedaj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "URA"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Izberite Äas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "PolnoÄ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "Ob 6h"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Opoldne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "PrekliÄi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Danes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Koledar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "VÄeraj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Jutri"
+
diff --git a/django/conf/locale/sr/LC_MESSAGES/django.mo b/django/conf/locale/sr/LC_MESSAGES/django.mo
index 06ac3cde5a..c942838b09 100644
--- a/django/conf/locale/sr/LC_MESSAGES/django.mo
+++ b/django/conf/locale/sr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sr/LC_MESSAGES/django.po b/django/conf/locale/sr/LC_MESSAGES/django.po
index ad45c28457..3d7cef4f2b 100644
--- a/django/conf/locale/sr/LC_MESSAGES/django.po
+++ b/django/conf/locale/sr/LC_MESSAGES/django.po
@@ -3,101 +3,99 @@ msgstr ""
"Project-Id-Version: Django Serbian (latin) translation v1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:11+0200\n"
-"PO-Revision-Date: 2006-01-15 11:21+0100\n"
-"Last-Translator: NebojÅ¡a ÄorÄ‘ević <nesh@studioquattro.co.yu>\n"
-"Language-Team: Nesh <nesh@studioquatro.co.yu> & Petar <petar.maric@gmail."
-"com>\n"
+"PO-Revision-Date: 2007-02-20 18:50+0100\n"
+"Last-Translator: Petar Marić <petar.maric@gmail.com>\n"
+"Language-Team: Nesh <nesh@studioquatro.co.yu> & Petar <petar.maric@gmail.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Poedit-Language: Serbian\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Poedit-Country: YUGOSLAVIA\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: ../../../../\n"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
msgid "object ID"
-msgstr "id objekta"
+msgstr "ID objekta"
#: contrib/comments/models.py:68
msgid "headline"
msgstr "naslov"
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
#: contrib/comments/models.py:167
msgid "comment"
msgstr "komentar"
#: contrib/comments/models.py:70
msgid "rating #1"
-msgstr "rejting #1"
+msgstr "ocena #1"
#: contrib/comments/models.py:71
msgid "rating #2"
-msgstr "rejting #2"
+msgstr "ocena #2"
#: contrib/comments/models.py:72
msgid "rating #3"
-msgstr "rejting #3"
+msgstr "ocena #3"
#: contrib/comments/models.py:73
msgid "rating #4"
-msgstr "rejting #4"
+msgstr "ocena #4"
#: contrib/comments/models.py:74
msgid "rating #5"
-msgstr "rejting #5"
+msgstr "ocena #5"
#: contrib/comments/models.py:75
msgid "rating #6"
-msgstr "rejting #6"
+msgstr "ocena #6"
#: contrib/comments/models.py:76
msgid "rating #7"
-msgstr "rejting #7"
+msgstr "ocena #7"
#: contrib/comments/models.py:77
msgid "rating #8"
-msgstr "rejting #8"
+msgstr "ocena #8"
#: contrib/comments/models.py:82
msgid "is valid rating"
-msgstr "da li je rejting validan"
+msgstr "da li je ocena validna"
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
msgid "date/time submitted"
msgstr "datum/vreme slanja"
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
msgid "is public"
msgstr "da li je javni"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:289
msgid "IP address"
msgstr "IP adresa"
#: contrib/comments/models.py:86
msgid "is removed"
-msgstr "obrisan je"
+msgstr "da li je obrisan"
#: 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 ""
-"Selektujte ako je komentar neodgovarajući. Biće ispisano \"Ovaj komentar je "
-"obrisan\" umesto teksta komentara."
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Izaberite ako je komentar neodgovarajući. Biće ispisano \"Ovaj komentar je obrisan\" umesto teksta komentara."
#: contrib/comments/models.py:91
-#, fuzzy
msgid "comments"
-msgstr "komentar"
+msgstr "komentari"
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
msgid "Content object"
-msgstr "Objekt sa sadržajem"
+msgstr "Objekat sa sadržajem"
#: contrib/comments/models.py:159
#, python-format
@@ -108,7 +106,7 @@ msgid ""
"\n"
"http://%(domain)s%(url)s"
msgstr ""
-"Poslao %(user)s u %(date)s\n"
+"Poslao %(user)s dana %(date)s\n"
"\n"
"%(comment)s\n"
"\n"
@@ -124,17 +122,15 @@ msgstr "ip adresa"
#: contrib/comments/models.py:173
msgid "approved by staff"
-msgstr "odobreno od moderatora"
+msgstr "odobreno od strane moderatora"
#: contrib/comments/models.py:176
-#, fuzzy
msgid "free comment"
-msgstr "Slobodan komentar"
+msgstr "slobodan komentar"
#: contrib/comments/models.py:177
-#, fuzzy
msgid "free comments"
-msgstr "Slobodni komentari"
+msgstr "slobodni komentari"
#: contrib/comments/models.py:233
msgid "score"
@@ -145,19 +141,17 @@ msgid "score date"
msgstr "datum rezultata"
#: contrib/comments/models.py:237
-#, fuzzy
msgid "karma score"
-msgstr "\"Karma\" rezultat"
+msgstr "\"karma\" rezultat"
#: contrib/comments/models.py:238
-#, fuzzy
msgid "karma scores"
-msgstr "\"Karma\" rezultati"
+msgstr "\"karma\" rezultati"
#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
-msgstr "Rezultat %(score)d od %(user)s"
+msgstr "Ocena %(score)d od strane %(user)s"
#: contrib/comments/models.py:258
#, python-format
@@ -166,42 +160,38 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"Ovaj komentar je markiran od %(user)s:\n"
+"Ovaj komentar je oznaÄen od %(user)s:\n"
"\n"
"%(text)s"
#: contrib/comments/models.py:265
msgid "flag date"
-msgstr "datum markiranja"
+msgstr "datum oznaÄavanja"
#: contrib/comments/models.py:268
-#, fuzzy
msgid "user flag"
-msgstr "KorisniÄki marker"
+msgstr "korisniÄka oznaka"
#: contrib/comments/models.py:269
-#, fuzzy
msgid "user flags"
-msgstr "KorisniÄki markeri"
+msgstr "korisniÄke oznake"
#: contrib/comments/models.py:273
#, python-format
msgid "Flag by %r"
-msgstr "%r je markirao"
+msgstr "%r je oznaÄio"
#: contrib/comments/models.py:278
msgid "deletion date"
msgstr "datum brisanja"
#: contrib/comments/models.py:280
-#, fuzzy
msgid "moderator deletion"
-msgstr "Brisanje od strane moderatora"
+msgstr "brisanje od strane moderatora"
#: contrib/comments/models.py:281
-#, fuzzy
msgid "moderator deletions"
-msgstr "Brisanja od strane moderatora"
+msgstr "brisanja od strane moderatora"
#: contrib/comments/models.py:285
#, python-format
@@ -218,43 +208,39 @@ msgstr "Neispravan ID komentara"
#: contrib/comments/views/karma.py:25
msgid "No voting for yourself"
-msgstr "Ne možete da glasate sami za sebe"
+msgstr "Ne možete glasati sami za sebe"
# nesh: grrrrr, ala je rogobatno
+# petar: malo sam ga izmenio da bude jasniji
#: contrib/comments/views/comments.py:28
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr "Ovaj rejting je obavezan pošto ste uneli još najmanje jedan rejting."
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Ova ocena je obavezna pošto ste uneli bar jednu ocenu."
#: contrib/comments/views/comments.py:112
#, python-format
msgid ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comment:\n"
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
"\n"
"%(text)s"
msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
"\n"
"%(text)s"
msgstr[0] ""
-"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
-"komentara:\n"
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
"\n"
"%(text)s"
msgstr[1] ""
-"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
-"komentara:\n"
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
"\n"
"%(text)s"
msgstr[2] ""
-"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
-"komentara:\n"
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
"\n"
"%(text)s"
# nesh: skethcy???
+# petar: Pojma nemam sta im to znaci
#: contrib/comments/views/comments.py:117
#, python-format
msgid ""
@@ -262,7 +248,7 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"Ovaj komentar je poslat od \"sketcy\" korisnika:\n"
+"Komentar je poslat od strane \"sketchy\" korisnika:\n"
"\n"
"%(text)s"
@@ -274,25 +260,22 @@ msgstr "Jedino je POST dozvoljen"
#: contrib/comments/views/comments.py:193
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
-msgstr "Jedno ili više obaveznih polja nije poslato."
+msgstr "Jedno ili više obaveznih polja nije poslato"
#: contrib/comments/views/comments.py:197
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Neko je menjao form za komentare (povreda sigurnosti)"
+msgstr "Neko je menjao formu za komentare (povreda sigurnosti)"
#: contrib/comments/views/comments.py:207
#: contrib/comments/views/comments.py:292
-msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
-msgstr ""
-"Form komentara ima neispravni 'target' parametar -- ID objekta nije ispravan"
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Forma komentara ima neispravni 'target' parametar -- ID objekta je neispravan"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Ovaj komentar nije koristio 'preview' ili 'post'"
+msgstr "Ovaj komentar nije koristio ni 'preview' ni 'post'"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -306,9 +289,8 @@ msgid "Password:"
msgstr "Lozinka:"
#: contrib/comments/templates/comments/form.html:6
-#, fuzzy
msgid "Forgotten your password?"
-msgstr "Izmeni moju lozinku"
+msgstr "Zaboravili ste lozinku?"
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
@@ -329,43 +311,39 @@ msgstr "Izmeni moju lozinku"
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
msgid "Log out"
-msgstr "Odjavi se"
+msgstr "Odjavite se"
#: contrib/comments/templates/comments/form.html:12
-#, fuzzy
msgid "Ratings"
-msgstr "rejting #1"
+msgstr "Ocene"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Required"
-msgstr ""
+msgstr "Obavezan unos"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Optional"
-msgstr ""
+msgstr "Opcioni unos"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
-msgstr ""
+msgstr "Pošaljite sliku"
#: contrib/comments/templates/comments/form.html:27
#: contrib/comments/templates/comments/freeform.html:5
-#, fuzzy
msgid "Comment:"
-msgstr "Komentar"
+msgstr "Komentar:"
#: contrib/comments/templates/comments/form.html:32
#: contrib/comments/templates/comments/freeform.html:9
-#, fuzzy
msgid "Preview comment"
-msgstr "Slobodan komentar"
+msgstr "Pregled komentara"
#: contrib/comments/templates/comments/freeform.html:4
-#, fuzzy
msgid "Your name:"
-msgstr "korisniÄko ime"
+msgstr "Vaše ime:"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -373,10 +351,11 @@ msgid ""
"<h3>By %s:</h3>\n"
"<ul>\n"
msgstr ""
-"<h3>Od %s:</h3>\n"
+"<h3>Po %s:</h3>\n"
"<ul>\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
#: contrib/admin/filterspecs.py:143
msgid "All"
msgstr "Sve"
@@ -391,15 +370,15 @@ msgstr "Danas"
#: contrib/admin/filterspecs.py:113
msgid "Past 7 days"
-msgstr "Zadnjih sedam dana"
+msgstr "U zadnjih 7 dana"
#: contrib/admin/filterspecs.py:115
msgid "This month"
-msgstr "Ovaj mesec"
+msgstr "Ovoga meseca"
#: contrib/admin/filterspecs.py:117
msgid "This year"
-msgstr "Ova godina"
+msgstr "Ove godine"
#: contrib/admin/filterspecs.py:143
msgid "Yes"
@@ -415,7 +394,7 @@ msgstr "Nepoznato"
#: contrib/admin/models.py:16
msgid "action time"
-msgstr "vreme akcije"
+msgstr "vreme aktivnosti"
#: contrib/admin/models.py:19
msgid "object id"
@@ -427,53 +406,42 @@ msgstr "opis objekta"
#: contrib/admin/models.py:21
msgid "action flag"
-msgstr "akcija"
+msgstr "oznaka aktivnosti"
#: contrib/admin/models.py:22
msgid "change message"
-msgstr "opis promene"
+msgstr "opis izmene"
#: contrib/admin/models.py:25
msgid "log entry"
-msgstr "unos u dnevnik izmena"
+msgstr "unos u dnevniku izmena"
#: contrib/admin/models.py:26
msgid "log entries"
-msgstr "unosi u dnevnik izmena"
+msgstr "unosi u dnevniku izmena"
#: contrib/admin/templatetags/admin_list.py:228
msgid "All dates"
msgstr "Svi datumi"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/admin/views/decorators.py:9
+#: contrib/auth/forms.py:36
#: contrib/auth/forms.py:41
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Unesite ispravno korisniÄko ime i Å¡ifru. Napomena: oba polja prave razliku "
-"između velikih i malih slova."
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Unesite ispravno korisniÄko ime i Å¡ifru. Napomena: oba polja prave razliku izmeÄ‘u velikih i malih slova."
#: contrib/admin/views/decorators.py:23
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
-msgstr "Prijavi se"
+msgstr "Prijavite se"
#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Ponovo se prijavite pošto je vaša sesija istekla. Ne brinite, vaši podaci su "
-"saÄuvani."
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Ponovo se prijavite poÅ¡to je vaÅ¡a sesija istekla. Ne brinite, vaÅ¡i podaci su saÄuvani."
#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Izgleda da vaÅ¡ browser ne podržava \"cookie\". UkljuÄite ih, ponovo uÄitajte "
-"stranu i pokušajte ponovo."
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "VaÅ¡ internet ÄitaÄ nije prihvatio \"cookie\". Nakon aktiviranja odgovarajuće opcije ponovo uÄitajte stranu."
#: contrib/admin/views/decorators.py:82
msgid "Usernames cannot contain the '@' character."
@@ -482,7 +450,7 @@ msgstr "KorisniÄka imena ne mogu sadržati karakter '@'."
#: contrib/admin/views/decorators.py:84
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "VaÅ¡a e-mail adresa nije koriniÄko ime. Probajte sa '%s'."
+msgstr "VaÅ¡e korisniÄko ime nije data e-mail adresa. PokuÅ¡ajte sa '%s'."
#: contrib/admin/views/main.py:226
msgid "Site administration"
@@ -493,26 +461,29 @@ msgstr "Administracija sajta"
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "Uspešno dodat %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/main.py:264
+#: contrib/admin/views/main.py:348
msgid "You may edit it again below."
-msgstr "Ispod ga možete ponovo izmeniti."
+msgstr "Možete ga ponovo izmeniti."
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/main.py:272
+#: contrib/admin/views/main.py:357
#, python-format
msgid "You may add another %s below."
-msgstr "Ispod možete dodati još jedan %s."
+msgstr "Možete dodati još jedan %s."
#: contrib/admin/views/main.py:290
#, python-format
msgid "Add %s"
-msgstr "Dodaj %s"
+msgstr "Dodajte %s"
#: contrib/admin/views/main.py:336
#, python-format
msgid "Added %s."
msgstr "Dodat %s"
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:338
#: contrib/admin/views/main.py:340
msgid "and"
msgstr "i"
@@ -525,11 +496,11 @@ msgstr "Izmenjen %s."
#: contrib/admin/views/main.py:340
#, python-format
msgid "Deleted %s."
-msgstr "Obrisan %s"
+msgstr "Obrisan %s."
#: contrib/admin/views/main.py:343
msgid "No fields changed."
-msgstr "Nijedno polje nije promenjeno."
+msgstr "Nijedno polje nije izmenjeno."
#: contrib/admin/views/main.py:346
#, python-format
@@ -538,9 +509,8 @@ msgstr "Uspešno izmenjen: %(name)s \"%(obj)s\"."
#: contrib/admin/views/main.py:354
#, python-format
-msgid ""
-"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" je uspešno dodat. Ispod ga možete ponovo menjati."
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" je uspešno dodat. Možete ga ponovo izmeniti."
#: contrib/admin/views/main.py:392
#, python-format
@@ -574,16 +544,19 @@ msgstr "Istorija izmena: %s"
#: contrib/admin/views/main.py:565
#, python-format
msgid "Select %s"
-msgstr "Izaberi %s"
+msgstr "Izaberite %s"
#: contrib/admin/views/main.py:565
#, python-format
msgid "Select %s to change"
-msgstr "Izaberi %s za izmenu"
-
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgstr "Izaberite %s za izmenu"
+
+#: contrib/admin/views/doc.py:277
+#: contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288
+#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:297
msgid "Integer"
msgstr "Ceo broj"
@@ -591,7 +564,8 @@ msgstr "Ceo broj"
msgid "Boolean (Either True or False)"
msgstr "LogiÄka vrednost (TaÄno ili NetaÄno)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:279
+#: contrib/admin/views/doc.py:296
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Niz karaktera (maksimalno %(maxlength)s karaktera)"
@@ -612,9 +586,10 @@ msgstr "Datum (sa vremenom)"
msgid "E-mail address"
msgstr "E-mail adresa"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:284
+#: contrib/admin/views/doc.py:287
msgid "File path"
-msgstr "Putanja do fajla"
+msgstr "Putanja do datoteke"
#: contrib/admin/views/doc.py:285
msgid "Decimal number"
@@ -626,7 +601,7 @@ msgstr "LogiÄka vrednost (TaÄno, NetaÄno ili prazno)"
#: contrib/admin/views/doc.py:292
msgid "Relation to parent model"
-msgstr "Relacija prema nadređenom objektu"
+msgstr "Relacija ka nadređenom objektu"
#: contrib/admin/views/doc.py:293
msgid "Phone number"
@@ -640,9 +615,8 @@ msgstr "Tekst"
msgid "Time"
msgstr "Vreme"
-# nesh: ovo se valjda ne prevodi
-# petar: ne prevodi se
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:300
+#: contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
@@ -683,7 +657,7 @@ msgstr "Dokumentacija"
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
msgid "Change password"
-msgstr "Izmeni lozinku"
+msgstr "Izmenite lozinku"
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
@@ -715,19 +689,15 @@ msgstr "Korisnik"
#: contrib/admin/templates/admin/object_history.html:20
msgid "Action"
-msgstr "Akcija"
+msgstr "Aktivnost"
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
msgstr "j. N Y, H:i"
#: contrib/admin/templates/admin/object_history.html:36
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
-msgstr ""
-"Ovaj objekat nema istoriju promena. Najverovatnije nije dodat korišćenjem "
-"administracije sajta."
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Ovaj objekat nema istoriju promena. Najverovatnije nije dodat korišćenjem administracije sajta."
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
@@ -750,12 +720,8 @@ msgid "Server Error <em>(500)</em>"
msgstr "Greška na serveru <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 ""
-"Dogodila se greška koja je prijavljena administratorima i biće popravljena "
-"uskoro. Hvala Vam na strpljenju."
+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 "Dogodila se greška koja je prijavljena administratorima."
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -769,16 +735,16 @@ msgstr "Tražena strana ne postoji."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr ""
+msgstr "Dostupni modeli u aplikaciji %(name)s."
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
-msgstr "Dodaj"
+msgstr "Dodajte"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
-msgstr "Izmena"
+msgstr "Izmenite"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
@@ -786,24 +752,24 @@ msgstr "Nemate prava da vršite izmene."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
-msgstr "Skorije akcije"
+msgstr "Poslednje aktivnosti"
#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
-msgstr "Moje akcije"
+msgstr "Moje aktivnosti"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
-msgstr "Nema dostupnih"
+msgstr "Bez aktivnosti"
#: contrib/admin/templates/admin/change_list.html:11
#, python-format
msgid "Add %(name)s"
-msgstr "Dodaj %(name)s"
+msgstr "Dodajte %(name)s"
#: contrib/admin/templates/admin/login.html:22
msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Da li ste <a href=\"/password_reset/\">zaboravili Vašu lozinku?</a>?"
+msgstr "Da li ste <a href=\"/password_reset/\">zaboravili vašu lozinku?</a>?"
#: contrib/admin/templates/admin/base.html:23
msgid "Welcome,"
@@ -812,26 +778,17 @@ msgstr "Dobrodošli,"
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
-msgstr "Obriši"
+msgstr "Obrišite"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-"Brisanjem %(object_name)s '%(object)s' došlo bi do brisanja dodatnih "
-"podataka, ali nemate prava da brišete sledeće tipove podataka:"
+msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Brisanjem %(object_name)s '%(object)s' došlo bi do brisanja pridruženih objekata, ali nemate prava da brišete sledeće objekte:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
-msgstr ""
-"Da li ste sigurni da želite da obrišete %(object_name)s \"%(object)s\"? Biće "
-"obrisani i sledeći pridruženi objekti:"
+msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
+msgstr "Da li ste sigurni da želite da obrišete %(object_name)s \"%(object)s\"? Takođe će biti obrisani sledeći pridruženi objekti:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
@@ -840,11 +797,11 @@ msgstr "Da, siguran sam"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
msgid " By %(title)s "
-msgstr "Po %(title)s "
+msgstr " Po %(title)s "
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
-msgstr "Uradi"
+msgstr "Nađi"
#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
@@ -867,26 +824,26 @@ msgstr "Red:"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
-msgstr "Snimi kao novi"
+msgstr "Snimite kao novi"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "Snimi i dodaj još jedan"
+msgstr "Snimite i dodaj još jedan"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
-msgstr "Snimi i nastavi sa izmenama"
+msgstr "Snimite i nastavite sa izmenama"
#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
-msgstr "Snimi"
+msgstr "Snimite"
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
#: contrib/admin/templates/registration/password_change_form.html:10
msgid "Password change"
-msgstr "Izmena lozinke"
+msgstr "Izmenite lozinku"
#: contrib/admin/templates/registration/password_change_done.html:6
#: contrib/admin/templates/registration/password_change_done.html:10
@@ -905,12 +862,8 @@ msgid "Password reset"
msgstr "Resetovanje lozinke"
#: 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 ""
-"Zaboravili ste svoju lozinku? Unesite vašu e-mail adresu i dobićete novu "
-"lozinku na dati e-mail."
+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 "Zaboravili ste svoju lozinku? Unesite vašu e-mail adresu i dobićete novu lozinku na dati e-mail."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -918,7 +871,7 @@ msgstr "E-mail adresa:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
-msgstr "Resetuj moju lozinku"
+msgstr "Resetujte moju lozinku"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
@@ -926,7 +879,7 @@ msgstr "Hvala Vam na poseti."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
-msgstr "Prijavi se ponovo"
+msgstr "Prijavite se ponovo"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
@@ -934,20 +887,12 @@ msgid "Password reset successful"
msgstr "Vaša lozinka je uspešno resetovana"
#: 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 ""
-"Nova lozinka poslata vam je na zadatu e-mail adresu. E-mail bi trebao da "
-"stigne u narednih nekoliko minuta."
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Nova lozinka vam je poslata na zadatu e-mail adresu. E-mail bi trebao da stigne u narednih nekoliko minuta."
#: 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 ""
-"Unesite staru lozinku, nakon toga unesite novu lozinku dva puta, radi "
-"provere ispravnosti unosa."
+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 "Unesite staru lozinku, nakon toga unesite novu lozinku dva puta, radi provere ispravnosti unosa."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -963,11 +908,11 @@ msgstr "Potvrdite novu lozinku:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Izmeni moju lozinku"
+msgstr "Izmenite moju lozinku"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Primili ste ovaj e-mail jer ste tražili resetovanje lozinke"
+msgstr "Primili ste ovaj e-mail jer ste zatražili resetovanje lozinke"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1015,36 +960,23 @@ msgid ""
"your computer is \"internal\").</p>\n"
msgstr ""
"\n"
-"<p class=\"help\">Da bi ste instalirali \"bookmarklet\", odvuÄite link u "
-"vaše \"bookmark\"-e, ili kliknite desnim tasterom i dodajte ga. Sada možete "
-"da izaberete \"bookmark\" sa bilo koje strane na sajtu. Napomena: pristup "
-"nekima od strana mora biti sa kompjutera Äija je IP adresa oznaÄena kao "
-"\"internal\" (kontaktirajte sistem administratora ako niste sigurni da li je "
-"vaÅ¡ IP oznaÄen kao \"internal\").</p>\n"
+"<p class=\"help\">Da bi ste instalirali \"bookmarklet\", odvucite link u vaÅ¡e \"bookmark\"-e, ili kliknite desnim tasterom i dodajte ga. Sada možete da izaberete \"bookmark\" sa bilo koje strane na sajtu. Napomena: pristup nekima od strana mora biti sa kompjutera Äija je IP adresa oznaÄena kao \"internal\" (kontaktirajte sistem administratora ako niste sigurni da li je vaÅ¡ IP oznaÄen kao \"internal\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
msgstr "Dokumentacija za ovu stranu"
#: 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 ""
-"SkaÄe sa bilo koje strane na stranu sa dokumentacijom za \"view\" koji "
-"generiše tu stranu."
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "SkaÄe sa bilo koje strane na stranu sa dokumentacijom za \"view\" koji generiÅ¡e tu stranu."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
-msgstr "Prikaži ID objekta"
+msgstr "Prikažite ID objekta"
#: contrib/admin/templates/admin_doc/bookmarklets.html:23
-msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
-msgstr ""
-"Prikazuje \"content-type\" i jedinstveni ID strane koje predstavlja jedan "
-"objekt."
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Prikazuje \"content-type\" i jedinstveni ID strane koje predstavlja jedan objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
@@ -1056,7 +988,7 @@ msgstr "SkaÄe na admin stranu za strane koje predstavljaju objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
-msgstr "Izmeni objekt (novi prozor)"
+msgstr "Izmeni objekat (novi prozor)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
@@ -1080,42 +1012,31 @@ msgstr "Izmenite:"
#: contrib/redirects/models.py:7
msgid "redirect from"
-msgstr "redirekcija od"
+msgstr "preusmeri od"
#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Ovde treba upisati apsolutnu putanju bez imena domena. Primer: '/events/"
-"search/'."
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Unesite apsolutnu putanju bez imena domena. Primer: '/dogadjaji/pretraga/'."
#: contrib/redirects/models.py:9
msgid "redirect to"
-msgstr "redirekcija na"
+msgstr "preusmeri ka"
#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Ovo može biti apsolutna putanja (kao gore) ili puni URL koji poÄinje sa "
-"'http://'."
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Može biti apsolutna putanja (kao gore) ili puni URL koji poÄinje sa 'http://'."
#: contrib/redirects/models.py:12
msgid "redirect"
-msgstr "redirekcija"
+msgstr "Preusmeravanje"
#: contrib/redirects/models.py:13
msgid "redirects"
-msgstr "redirekcije"
+msgstr "Preusmeravanja"
#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Primer: '/about/contact/'. Proverite da li ste uneli poÄetnu i kranju kosu "
-"crtu."
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Primer: '/o-nama/kontakt/'. Proverite da li ste uneli '/' na poÄetku i na kraju."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -1131,15 +1052,11 @@ msgstr "omogućite komentare"
#: contrib/flatpages/models.py:12
msgid "template name"
-msgstr "ime templejta"
+msgstr "naziv templejta"
#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Primer: 'flatpages/contact-page'. Ako nije dato sistem će koristiti "
-"flatpages/default'."
+msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
+msgstr "Primer: 'flatpages/kontakt-stranica'. Ako ne zadate sistem će koristiti 'flatpages/default'."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -1147,9 +1064,7 @@ msgstr "samo za registrovane korisnike"
#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Ako izaberete ovu opciju samo prijavljeni korisnici će imati pristup datoj "
-"strani."
+msgstr "Ako izaberete ovu opciju samo prijavljeni korisnici će imati pristup datoj strani."
#: contrib/flatpages/models.py:18
msgid "flat page"
@@ -1159,33 +1074,32 @@ msgstr "statiÄna strana"
msgid "flat pages"
msgstr "statiÄne strane"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:13
+#: contrib/auth/models.py:26
msgid "name"
msgstr "ime"
#: contrib/auth/models.py:15
msgid "codename"
-msgstr "kodno ime"
+msgstr "Å¡ifra dozvole"
#: contrib/auth/models.py:17
-#, fuzzy
msgid "permission"
-msgstr "Pravo"
+msgstr "dozvola"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
-#, fuzzy
+#: contrib/auth/models.py:18
+#: contrib/auth/models.py:27
msgid "permissions"
-msgstr "Prava"
+msgstr "dozvole"
#: contrib/auth/models.py:29
-#, fuzzy
msgid "group"
-msgstr "Grupa"
+msgstr "grupa"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
-#, fuzzy
+#: contrib/auth/models.py:30
+#: contrib/auth/models.py:65
msgid "groups"
-msgstr "Grupe"
+msgstr "grupe"
#: contrib/auth/models.py:55
msgid "username"
@@ -1213,11 +1127,11 @@ msgstr "Koristite '[algo]$[salt]$[hexdigest]'"
#: contrib/auth/models.py:60
msgid "staff status"
-msgstr "dozvoli pristup administraciji sajta"
+msgstr "dozvoljen pristup administraciji sajta"
#: contrib/auth/models.py:60
msgid "Designates whether the user can log into this admin site."
-msgstr "Određuje da li će korisnik imati pristup administratorskom delu sajta."
+msgstr "Da li korisnik ima pristup administratorskom delu sajta."
#: contrib/auth/models.py:61
msgid "active"
@@ -1236,26 +1150,20 @@ msgid "date joined"
msgstr "datum otvaranja naloga"
#: contrib/auth/models.py:66
-msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
-msgstr ""
-"Uz ruÄno dodata prava, korisnik će dobiti sva prava iz grupa kojima pripada."
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Uz ruÄno dodata prava, korisnik će dobiti sva prava iz grupa kojima pripada."
#: contrib/auth/models.py:67
-#, fuzzy
msgid "user permissions"
-msgstr "Prava"
+msgstr "korisniÄke dozvole"
#: contrib/auth/models.py:70
-#, fuzzy
msgid "user"
-msgstr "Korisnik"
+msgstr "korisnik"
#: contrib/auth/models.py:71
-#, fuzzy
msgid "users"
-msgstr "Korisnici"
+msgstr "korisnici"
#: contrib/auth/models.py:76
msgid "Personal info"
@@ -1263,7 +1171,7 @@ msgstr "LiÄne informacije"
#: contrib/auth/models.py:77
msgid "Permissions"
-msgstr "Prava"
+msgstr "Dozvole"
#: contrib/auth/models.py:78
msgid "Important dates"
@@ -1274,22 +1182,16 @@ msgid "Groups"
msgstr "Grupe"
#: contrib/auth/models.py:219
-#, fuzzy
msgid "message"
-msgstr "Poruka"
+msgstr "poruka"
#: contrib/auth/forms.py:30
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Vaš web brovser nema omogućenje \"cookie\". \"cookie\" podrška je potrebna "
-"da bi ste mogli da se prijavite."
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "VaÅ¡ internet ÄitaÄ nije prihvatio \"cookie\". \"Cookie\" podrÅ¡ka je potrebna da bi ste mogli da se prijavite."
#: contrib/contenttypes/models.py:25
-#, fuzzy
msgid "python model class name"
-msgstr "ime python modula"
+msgstr "naziv python modula"
#: contrib/contenttypes/models.py:28
msgid "content type"
@@ -1383,23 +1285,28 @@ msgstr "Januar"
msgid "February"
msgstr "Februar"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:14
+#: utils/dates.py:27
msgid "March"
msgstr "Mart"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:14
+#: utils/dates.py:27
msgid "April"
msgstr "April"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:14
+#: utils/dates.py:27
msgid "May"
msgstr "Maj"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:14
+#: utils/dates.py:27
msgid "June"
msgstr "Jun"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:15
+#: utils/dates.py:27
msgid "July"
msgstr "Jul"
@@ -1424,54 +1331,52 @@ msgid "December"
msgstr "Decembar"
#: utils/dates.py:19
-#, fuzzy
msgid "jan"
-msgstr "i"
+msgstr "jan"
#: utils/dates.py:19
msgid "feb"
-msgstr ""
+msgstr "feb"
#: utils/dates.py:19
msgid "mar"
-msgstr ""
+msgstr "mar"
#: utils/dates.py:19
msgid "apr"
-msgstr ""
+msgstr "apr"
#: utils/dates.py:19
-#, fuzzy
msgid "may"
-msgstr "dan"
+msgstr "maj"
#: utils/dates.py:19
msgid "jun"
-msgstr ""
+msgstr "jun"
#: utils/dates.py:20
msgid "jul"
-msgstr ""
+msgstr "jul"
#: utils/dates.py:20
msgid "aug"
-msgstr ""
+msgstr "avg"
#: utils/dates.py:20
msgid "sep"
-msgstr ""
+msgstr "sep"
#: utils/dates.py:20
msgid "oct"
-msgstr ""
+msgstr "okt"
#: utils/dates.py:20
msgid "nov"
-msgstr ""
+msgstr "nov"
#: utils/dates.py:20
msgid "dec"
-msgstr ""
+msgstr "dec"
#: utils/dates.py:27
msgid "Jan."
@@ -1518,9 +1423,9 @@ msgstr[2] "meseci"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "nedelja"
+msgstr[1] "nedelje"
+msgstr[2] "nedelja"
#: utils/timesince.py:15
msgid "day"
@@ -1565,7 +1470,7 @@ msgstr "NemaÄki"
#: conf/global_settings.py:42
msgid "Greek"
-msgstr ""
+msgstr "GrÄki"
#: conf/global_settings.py:43
msgid "English"
@@ -1585,11 +1490,11 @@ msgstr "Galski"
#: conf/global_settings.py:47
msgid "Hungarian"
-msgstr ""
+msgstr "Mađarski"
#: conf/global_settings.py:48
msgid "Hebrew"
-msgstr ""
+msgstr "Hebrejski"
#: conf/global_settings.py:49
msgid "Icelandic"
@@ -1628,9 +1533,8 @@ msgid "Slovak"
msgstr "SlovaÄki"
#: conf/global_settings.py:58
-#, fuzzy
msgid "Slovenian"
-msgstr "SlovaÄki"
+msgstr "SlovenaÄki"
#: conf/global_settings.py:59
msgid "Serbian"
@@ -1641,9 +1545,8 @@ msgid "Swedish"
msgstr "Å vedski"
#: conf/global_settings.py:61
-#, fuzzy
msgid "Ukrainian"
-msgstr "Brazilski"
+msgstr "Ukrajinski"
#: conf/global_settings.py:62
msgid "Simplified Chinese"
@@ -1659,24 +1562,20 @@ msgid "This value must contain only letters, numbers and underscores."
msgstr "Ovo polje može sadržati samo slova, brojeve i donju crtu (_)."
#: core/validators.py:64
-#, fuzzy
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Ovo polje može sadržati samo slova, brojeve, donju crtu (_) i kose crte."
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Ovo polje može sadržati samo slova, brojeve, donju crtu (_), crtu (-) i kose crte."
#: core/validators.py:72
msgid "Uppercase letters are not allowed here."
-msgstr "Velika slova ovde nisu dozvoljena."
+msgstr "Velika slova nisu dozvoljena."
#: core/validators.py:76
msgid "Lowercase letters are not allowed here."
-msgstr "Mala slova ovde nisu dozvoljena."
+msgstr "Mala slova nisu dozvoljena."
#: core/validators.py:83
msgid "Enter only digits separated by commas."
-msgstr "Unesite samo brojeve razdvojene zarezima."
+msgstr "Unesite brojeve razdvojene zarezima."
#: core/validators.py:95
msgid "Enter valid e-mail addresses separated by commas."
@@ -1688,7 +1587,7 @@ msgstr "Unesite ispravnu IP adresu."
#: core/validators.py:103
msgid "Empty values are not allowed here."
-msgstr "Prazne vrednosti ovde nisu dozvoljene."
+msgstr "Prazne vrednosti nisu dozvoljene."
#: core/validators.py:107
msgid "Non-numeric characters aren't allowed here."
@@ -1714,7 +1613,8 @@ msgstr "Unesite ispravan datum u YYYY-MM-DD formatu."
msgid "Enter a valid time in HH:MM format."
msgstr "Unesite ispravno vreme u HH:MM formatu."
-#: core/validators.py:132 db/models/fields/__init__.py:468
+#: core/validators.py:132
+#: db/models/fields/__init__.py:468
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "Unesite ispravan datum i vreme u YYYY-MM-DD HH:MM formatu."
@@ -1723,12 +1623,8 @@ msgid "Enter a valid e-mail address."
msgstr "Unesite ispravnu e-mail adresu."
#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Pošaljite ispravnu sliku. Fajl koji ste poslali ili nije slika ili je sam "
-"fajl oštećen."
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Pošaljite ispravnu sliku. Fajl koji ste poslali ili nije slika ili je sam fajl oštećen."
#: core/validators.py:155
#, python-format
@@ -1739,8 +1635,7 @@ msgstr "URL %s ne pokazuje na ispravnu sliku"
#: core/validators.py:159
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
+msgstr "Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
#: core/validators.py:167
#, python-format
@@ -1770,7 +1665,8 @@ msgstr "Neispravan XML: %s"
msgid "Invalid URL: %s"
msgstr "Neispravan URL: %s"
-#: core/validators.py:206 core/validators.py:208
+#: core/validators.py:206
+#: core/validators.py:208
#, python-format
msgid "The URL %s is a broken link."
msgstr "URL %s je neispravan link."
@@ -1797,7 +1693,8 @@ msgstr "Ovo polje mora biti jednako sa poljem '%s'."
msgid "Please enter something for at least one field."
msgstr "Morate popuniti barem jedno polje."
-#: core/validators.py:264 core/validators.py:275
+#: core/validators.py:264
+#: core/validators.py:275
msgid "Please enter both fields or leave them both empty."
msgstr "Popunite oba polja ili oba ostavite prazna."
@@ -1827,8 +1724,7 @@ msgstr "Unesite ispravan decimalni broj."
#: core/validators.py:349
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s total digits."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
msgstr[0] "Unesite ispravan decimalni broj sa %s cifrom."
msgstr[1] "Unesite ispravan decimalni broj sa %s cifre."
msgstr[2] "Unesite ispravan decimalni broj sa %s cifara."
@@ -1836,8 +1732,7 @@ msgstr[2] "Unesite ispravan decimalni broj sa %s cifara."
#: core/validators.py:352
#, 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."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
msgstr[0] "Unesite decimalni broj sa najviše %s decimalnim mestom."
msgstr[1] "Unesite decimalni broj sa najviše %s decimalna mesta."
msgstr[2] "Unesite decimalni broj sa najviše %s decimalnih mesta."
@@ -1867,63 +1762,38 @@ msgstr "Ništa nije moglo da se skine sa URL-a %s."
#: core/validators.py:429
#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"Sa URL-a %(url)s se vratio pogrešan Content-Type header '%(contenttype)s'."
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Sa URL-a %(url)s se vratio pogrešan Content-Type header '%(contenttype)s'."
#: core/validators.py:462
#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Zatvorite nezatvoren tag \"%(tag)s\" iz reda %(line)s. (Red poÄinje sa \"%"
-"(start)s\".)"
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Zatvorite nezatvoren tag \"%(tag)s\" iz reda %(line)s. (Red poÄinje sa \"%(start)s\".)"
#: core/validators.py:466
#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Tekst koji poÄinje u redu %(line)s nije dozvoljen u ovom kontekstu. (Red "
-"poÄinje sa \"%(start)s\".)"
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Tekst koji poÄinje u redu %(line)s nije dozvoljen u ovom kontekstu. (Red poÄinje sa \"%(start)s\".)"
#: core/validators.py:471
#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"Atribut \"%(attr)s\" u red %(line)s je neispravan. (Red poÄinje sa \"%(start)"
-"s\".)"
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "Atribut \"%(attr)s\" u red %(line)s je neispravan. (Red poÄinje sa \"%(start)s\".)"
#: core/validators.py:476
#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"Tag \"<%(tag)s>\" u redu %(line)s je neispravan. (Red poÄinje \"%(start)s\".)"
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "Tag \"<%(tag)s>\" u redu %(line)s je neispravan. (Red poÄinje \"%(start)s\".)"
#: core/validators.py:480
#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Tag-u u redu %(line)s nedostaje jedan ili viÅ¡e atributa. (Red poÄinje sa \"%"
-"(start)s\".)"
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Tag-u u redu %(line)s nedostaje jedan ili viÅ¡e atributa. (Red poÄinje sa \"%(start)s\".)"
#: core/validators.py:485
#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Atribut \"%(attr)s\" u redu %(line)s ima neispravnu vrednost. (Red poÄinje "
-"sa \"%(start)s\".)"
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Atribut \"%(attr)s\" u redu %(line)s ima neispravnu vrednost. (Red poÄinje sa \"%(start)s\".)"
#: db/models/manipulators.py:302
#, python-format
@@ -1935,26 +1805,25 @@ msgstr "%(object)s sa ovim tipom %(type)s već postoji za polje %(field)s."
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(optname)s sa ovim %(fieldname)s već postoji."
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542
+#: db/models/fields/__init__.py:553
#: forms/__init__.py:346
msgid "This field is required."
msgstr "Obavezno polje."
#: db/models/fields/__init__.py:337
-#, fuzzy
msgid "This value must be an integer."
-msgstr "Vrednost mora biti stepena %s."
+msgstr "Vrednost mora biti celi broj."
#: db/models/fields/__init__.py:369
-#, fuzzy
msgid "This value must be either True or False."
-msgstr "Vrednost mora biti stepena %s."
+msgstr "Vrednost mora biti True ili False."
#: db/models/fields/__init__.py:385
-#, fuzzy
msgid "This field cannot be null."
-msgstr "Neispravno polje."
+msgstr "Polje ne može sadržati praznu vrednost."
#: db/models/fields/__init__.py:562
msgid "Enter a valid filename."
@@ -1966,23 +1835,17 @@ msgid "Please enter a valid %s."
msgstr "Unesite ispravan %s."
#: db/models/fields/related.py:579
-#, fuzzy
msgid "Separate multiple IDs with commas."
-msgstr " Odvojite višestruke ID-ove zarezima."
+msgstr "Odvojite višestruke ID-ove zarezima."
#: db/models/fields/related.py:581
-#, fuzzy
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-" Koristite \"Ctrl\" (PC) ili \"Jabuku\" (Mek) da bi ste selektovali više "
-"stavki."
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Koristite \"Ctrl\" (PC) ili \"Jabuku\" (Mek) da bi ste selektovali više stavki."
#: db/models/fields/related.py:625
#, 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."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
msgstr[0] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
msgstr[1] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
msgstr[2] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
@@ -1999,7 +1862,9 @@ msgstr[2] "Tekst mora imati manje od %s slova."
msgid "Line breaks are not allowed here."
msgstr "Novi redovi ovde nisu dozvoljeni."
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: forms/__init__.py:480
+#: forms/__init__.py:551
+#: forms/__init__.py:589
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr "Izaberite validnu opciju: '%(data)s' nije u %(choices)s."
@@ -2026,25 +1891,18 @@ msgstr "da,ne,možda"
#~ msgid "Comment"
#~ msgstr "Komentar"
-
#~ msgid "Comments"
#~ msgstr "Komentari"
-
#~ msgid "String (up to 50)"
#~ msgstr "Niz karaktera (maksimalno 50 karaktera)"
-
#~ msgid "label"
#~ msgstr "labela"
-
#~ msgid "package"
#~ msgstr "paket"
-
#~ msgid "packages"
#~ msgstr "paketi"
-
#~ msgid "Error in Template"
#~ msgstr "Greška u templejtu"
-
#~ msgid ""
#~ "\n"
#~ "In template %(name)s, error at line %(line)s:\n"
@@ -2055,3 +1913,4 @@ msgstr "da,ne,možda"
#, fuzzy
#~ msgid "count"
#~ msgstr "sadržaj"
+
diff --git a/django/conf/locale/sr/LC_MESSAGES/djangojs.mo b/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
index 4ae94424df..d4036a893e 100644
--- a/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/sr/LC_MESSAGES/djangojs.po b/django/conf/locale/sr/LC_MESSAGES/djangojs.po
index ce23be3ee4..a70d878ea4 100644
--- a/django/conf/locale/sr/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/sr/LC_MESSAGES/djangojs.po
@@ -8,13 +8,12 @@ msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-12-09 11:51+0100\n"
-"PO-Revision-Date: 2006-01-15 11:24+0100\n"
-"Last-Translator: NebojÅ¡a ÄorÄ‘ević <nesh@studioquattro.co.yu>\n"
+"PO-Revision-Date: 2007-02-20 18:51+0100\n"
+"Last-Translator: Petar Marić <petar.maric@gmail.com>\n"
"Language-Team: Nesh <nesh@studioquatro.co.yu> & Petar <petar.maric@gmail.com> <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Serbian\n"
"X-Poedit-Country: YUGOSLAVIA\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
@@ -25,15 +24,15 @@ msgstr "Dostupno %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
-msgstr "Izaberi sve"
+msgstr "Izaberite sve"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
-msgstr "Dodaj"
+msgstr "Dodajte"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
-msgstr "Izbaci"
+msgstr "Izbacite"
#: contrib/admin/media/js/SelectFilter2.js:53
#, perl-format
@@ -72,7 +71,7 @@ msgstr "Sat"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
msgid "Choose a time"
-msgstr "Izaberi vreme"
+msgstr "Izaberite vreme"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Midnight"
diff --git a/django/conf/locale/sv/LC_MESSAGES/django.mo b/django/conf/locale/sv/LC_MESSAGES/django.mo
index 90035f7c87..5654541a4e 100644
--- a/django/conf/locale/sv/LC_MESSAGES/django.mo
+++ b/django/conf/locale/sv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sv/LC_MESSAGES/django.po b/django/conf/locale/sv/LC_MESSAGES/django.po
index 8fc67d4047..db542460e6 100644
--- a/django/conf/locale/sv/LC_MESSAGES/django.po
+++ b/django/conf/locale/sv/LC_MESSAGES/django.po
@@ -1,26 +1,833 @@
# Swedish translation of Django
# Copyright (C) 2005
# This file is distributed under the same license as the Django package.
-# Robin Sonefors <ozamosi@blinkenlights.se>, 2005.
#
msgid ""
msgstr ""
-"Project-Id-Version: Django\n"
+"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:13+0200\n"
-"PO-Revision-Date: 2005-12-04 16:20+0100\n"
-"Last-Translator: Robin Sonefors <ozamosi@blinkenlights.se>\n"
-"Language-Team: Django translators <djangoi18n@googlegroups.com>\n"
+"POT-Creation-Date: 2007-06-15 17:35+0200\n"
+"PO-Revision-Date: 2007-03-06 10:30+0100\n"
+"Last-Translator: Ludvig Ericson <ludvig.ericson@gmail.com>\n"
+"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-Language: Swedish\n"
"X-Poedit-Country: SWEDEN\n"
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:121
+#: db/models/fields/__init__.py:278 db/models/fields/__init__.py:675
+#: db/models/fields/__init__.py:686 newforms/models.py:185
+#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:520
+#: newforms/fields.py:531
+msgid "This field is required."
+msgstr "Det här fältet är obligatoriskt."
+
+#: 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] "Se till att din text är kortare än %s tecken."
+msgstr[1] "Se till att din text är kortare än %s tecken."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Radbrytningar är inte tillåtna här."
+
+#: 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 "Välj ett giltigt alternativ. '%(data)s' finns inte bland %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:182
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Okänt"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:182
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ja"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:182
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nej"
+
+#: oldforms/__init__.py:672 core/validators.py:175 core/validators.py:453
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ingen fil skickades. Kontrollera kodningnstypen i formen."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Den insända filen är tom."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Fyll i ett heltal mellan -32768 och 32767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Fyll i ett positivt heltal."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Fyll i ett heltal mellan 0 och 32767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s med typen %(type)s finns redan för %(field)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 "och"
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s med det här %(fieldname)s finns redan."
+
+#: db/models/fields/__init__.py:373
+msgid "This value must be an integer."
+msgstr "Det här värdet måste vara ett heltal."
+
+#: db/models/fields/__init__.py:408
+msgid "This value must be either True or False."
+msgstr "Det här värdet måste vara True eller False"
+
+#: db/models/fields/__init__.py:429
+msgid "This field cannot be null."
+msgstr "Det här fältet kan inte vara null."
+
+#: db/models/fields/__init__.py:463 core/validators.py:149
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Fyll i ett giltigt datum i Ã…Ã…Ã…Ã…-MM-DD format."
+
+#: db/models/fields/__init__.py:532 core/validators.py:158
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Fyll i en giltig tidpunkt i Ã…Ã…Ã…Ã…-MM-DD HH:MM format"
+
+#: db/models/fields/__init__.py:592
+#, fuzzy
+msgid "This value must be a decimal number."
+msgstr "Det här värdet måste vara ett heltal."
+
+#: db/models/fields/__init__.py:695
+msgid "Enter a valid filename."
+msgstr "Fyll i ett giltigt filnamn."
+
+#: db/models/fields/__init__.py:818
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Det här värdet måste vara antingen True eller False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Var god fyll i giltigt %s."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Separera flera ID:n med kommatecken."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Håll ner \"Control\", eller \"Command\" på en Mac, för att välja mer än en."
+
+#: 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] ""
+"Var god och fyll giltiga %(self)s ID-nummer. Värdet %(value)r är ogiltigt."
+msgstr[1] ""
+"Var god och fyll giltiga %(self)s ID-nummer. Värdena %(value)r är ogiltiga."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabiska"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengaliska"
+
+#: conf/global_settings.py:41
+#, fuzzy
+msgid "Bulgarian"
+msgstr "Ungerska"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Katalanska"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Tjeckiska"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Walesiska"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Danska"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Tyska"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grekiska"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Engelska"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Spanska"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Argentisk Spanska"
+
+#: conf/global_settings.py:51
+msgid "Finnish"
+msgstr "Finska"
+
+#: conf/global_settings.py:52
+msgid "French"
+msgstr "Franska"
+
+#: conf/global_settings.py:53
+msgid "Galician"
+msgstr "Galisiska"
+
+#: conf/global_settings.py:54
+msgid "Hungarian"
+msgstr "Ungerska"
+
+#: conf/global_settings.py:55
+msgid "Hebrew"
+msgstr "Hebreiska"
+
+#: conf/global_settings.py:56
+msgid "Icelandic"
+msgstr "Isländska"
+
+#: conf/global_settings.py:57
+msgid "Italian"
+msgstr "Italienska"
+
+#: conf/global_settings.py:58
+msgid "Japanese"
+msgstr "Japanska"
+
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "Koreanska"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr "Lettiska"
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "Makedonska"
+
+#: conf/global_settings.py:63
+msgid "Dutch"
+msgstr "Holländska"
+
+#: conf/global_settings.py:64
+msgid "Norwegian"
+msgstr "Norska"
+
+#: conf/global_settings.py:65
+msgid "Polish"
+msgstr "Polska"
+
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "Portugisiska"
+
+#: conf/global_settings.py:67
+msgid "Brazilian"
+msgstr "Brasilianska"
+
+#: conf/global_settings.py:68
+msgid "Romanian"
+msgstr "Rumänska"
+
+#: conf/global_settings.py:69
+msgid "Russian"
+msgstr "Ryska"
+
+#: conf/global_settings.py:70
+msgid "Slovak"
+msgstr "Slovakiska"
+
+#: conf/global_settings.py:71
+msgid "Slovenian"
+msgstr "Slovenska"
+
+#: conf/global_settings.py:72
+msgid "Serbian"
+msgstr "Serbiska"
+
+#: conf/global_settings.py:73
+msgid "Swedish"
+msgstr "Svenska"
+
+#: conf/global_settings.py:74
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:76
+msgid "Turkish"
+msgstr "Turkiska"
+
+#: conf/global_settings.py:77
+msgid "Ukrainian"
+msgstr "Ukrainska"
+
+#: conf/global_settings.py:78
+msgid "Simplified Chinese"
+msgstr "Förenklad Kinesiska"
+
+#: conf/global_settings.py:79
+msgid "Traditional Chinese"
+msgstr "Traditionell Kinesiska"
+
+#: core/validators.py:65
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Det här värdet får bara innehålla bokstäver, tal och understräck."
+
+#: core/validators.py:69
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Det här värdet får bara innehålla bokstäver, siffror, understräck, sträck "
+"och snedsträck"
+
+#: core/validators.py:73
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Det här värdet får bara innehålla bokstäver, siffror, understräck eller "
+"bindessträck."
+
+#: core/validators.py:77
+msgid "Uppercase letters are not allowed here."
+msgstr "Stora bokstäver är inte tillåtna här."
+
+#: core/validators.py:81
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bokstäver är inte tillåtna här."
+
+#: core/validators.py:88
+msgid "Enter only digits separated by commas."
+msgstr "Fyll enbart i siffror avskilda med kommatecken."
+
+#: core/validators.py:100
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Fyll i giltiga e-mailadresser avskilda med kommatecken."
+
+#: core/validators.py:104
+msgid "Please enter a valid IP address."
+msgstr "Var god fyll i en giltigt IP-adress."
+
+#: core/validators.py:108
+msgid "Empty values are not allowed here."
+msgstr "Tomma värden är inte tillåtna här."
+
+#: core/validators.py:112
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Icke-numeriska tecken är inte tillåtna här."
+
+#: core/validators.py:116
+msgid "This value can't be comprised solely of digits."
+msgstr "Det här värdet kan inte enbart bestå av siffror."
+
+#: core/validators.py:121 newforms/fields.py:135
+msgid "Enter a whole number."
+msgstr "Fyll i ett heltal."
+
+#: core/validators.py:125
+msgid "Only alphabetical characters are allowed here."
+msgstr "Endast bokstäver är tillåtna här."
+
+#: core/validators.py:140
+msgid "Year must be 1900 or later."
+msgstr "Årtal måste vara 1900 eller senare."
+
+#: core/validators.py:144
+#, fuzzy, python-format
+msgid "Invalid date: %s"
+msgstr "Felaktigt datum: %s"
+
+#: core/validators.py:154
+msgid "Enter a valid time in HH:MM format."
+msgstr "Fyll i en giltig tid i HH:MM format."
+
+#: core/validators.py:163 newforms/fields.py:339
+msgid "Enter a valid e-mail address."
+msgstr "Fyll i en giltig e-mailadress."
+
+#: core/validators.py:179
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Ladda upp en giltig bild. Filen du laddade upp var antingen ingen bild eller "
+"en korrupt bild."
+
+#: core/validators.py:186
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL:en %s pekar inte mot en giltig bild."
+
+#: core/validators.py:190
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummer måste vara i det amerikanska XXX-XXX-XXXX formated. \"%s\" är "
+"ogiltigt."
+
+#: core/validators.py:198
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL:en %s pekar inte på en giltig QuickTime-video."
+
+#: core/validators.py:202
+msgid "A valid URL is required."
+msgstr "En giltig URL krävs."
+
+#: core/validators.py:216
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Giltig HTML krävs. Specifika fel är:\n"
+"%s"
+
+#: core/validators.py:223
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Missformad XML: %s"
+
+#: core/validators.py:240
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Felaktig URL: %s"
+
+#: core/validators.py:245 core/validators.py:247
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL:en %s är en trasig länk."
+
+#: core/validators.py:253
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Fyll i en giltig förkortning för en amerikansk delstat."
+
+#: core/validators.py:267
+#, 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] "Akta din tunga! Ordet %s är inte tillåtet här."
+msgstr[1] "Akta din tunga! Orden %s är inte tillåtna här."
+
+#: core/validators.py:274
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Det här fältet måste matcha fältet '%s'."
+
+#: core/validators.py:293
+msgid "Please enter something for at least one field."
+msgstr "Var god fyll i minst ett fält."
+
+#: core/validators.py:302 core/validators.py:313
+msgid "Please enter both fields or leave them both empty."
+msgstr "Fyll antingen i båda fälten, eller lämna båda tomma."
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Det är fältet måste anges om %(field)s är %(value)s"
+
+#: core/validators.py:334
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Det här fältet måste anges om %(field)s inte är %(value)s"
+
+#: core/validators.py:353
+msgid "Duplicate values are not allowed."
+msgstr "Upprepade värden är inte tillåtna."
+
+#: core/validators.py:368
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Det här värdet måste vara mellan %(lower)s och %(upper)s."
+
+#: core/validators.py:370
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Det här värdet måste vara minst %s."
+
+#: core/validators.py:372
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Det här värdet får inte vara mer än %s."
+
+#: core/validators.py:408
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Det här värdet måste vara en potens av %s."
+
+#: core/validators.py:417
+msgid "Please enter a valid decimal number."
+msgstr "Fyll i ett giltigt decimaltal."
+
+#: core/validators.py:423
+#, 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] "Fyll i ett giltigt decimaltal med högst %s siffra totalt."
+msgstr[1] "Fyll i ett giltigt decimaltal med högst %s siffror totalt."
+
+#: core/validators.py:426
+#, 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] ""
+"Fyll i ett giltigt decimaltal med en heltalsdel som högst är %s siffra."
+msgstr[1] ""
+"Fyll i ett giltigt decimaltal med en heltalsdel som högst är %s siffror."
+
+#: core/validators.py:429
+#, 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] "Fyll i ett giltigt decimaltal med högst %s decimal."
+msgstr[1] "Fyll i ett giltigt decimaltal med högst %s decimaler."
+
+#: core/validators.py:437
+msgid "Please enter a valid floating point number."
+msgstr "Fyll i ett giltigt flyttal."
+
+#: core/validators.py:446
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Se till att filen du laddade upp är minst %s bytes stor."
+
+#: core/validators.py:447
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Se till att filen du laddade upp är som mest %s bytes stor."
+
+#: core/validators.py:464
+msgid "The format for this field is wrong."
+msgstr "Formatet på det här fältet är fel."
+
+#: core/validators.py:479
+msgid "This field is invalid."
+msgstr "Det här fältet är ogiltigt."
+
+#: core/validators.py:515
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kunde inte hämta något från %s."
+
+#: core/validators.py:518
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL:en %(url)s returnerade den ogiltiga Content-Type headern '%(contenttype)"
+"s'"
+
+#: core/validators.py:551
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Var god avsluta den oavslutade taggen %(tag)s på rad %(line)s. (Raden börjar "
+"med \"%(start)s\".)"
+
+#: core/validators.py:555
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En del text från rad %(line)s är inte tillåtet i det sammanhanget. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: core/validators.py:560
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på rad %(line)s är inte ett giltigt attribut. (Raden startar "
+"med \"%(start)s\".)"
+
+#: core/validators.py:565
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på rad %(line)s är en ogiltig tagg. (Raden börjar med \"%"
+"(start)s\".)"
+
+#: core/validators.py:569
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En tagg på rad %(line)s saknar en eller flera nödvändiga attribut. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: core/validators.py:574
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Attributet \"%(attr)s\" på rad %(line)s har ett ogiltigt värde. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+#, fuzzy
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s skapades framgångsrikt."
+
+#: views/generic/create_update.py:117
+#, python-format
+#, fuzzy
+msgid "The %(verbose_name)s was updated successfully."
+msgstr " %(verbose_name)s uppdaterades framgångsrikt."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s togs bort."
+
+#: newforms/models.py:172 newforms/fields.py:432
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga "
+"alternativ."
+
+#: newforms/models.py:189 newforms/fields.py:448 newforms/fields.py:524
+msgid "Enter a list of values."
+msgstr "Fyll i en lista med värden."
+
+#: newforms/models.py:195 newforms/fields.py:457
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+"Välj ett giltigt alternativ. '%s' finns inte bland tillgängliga alternativ."
+
+#: newforms/fields.py:110 newforms/fields.py:324
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Säkerställ att detta värdet har högst %d tecken."
+
+#: newforms/fields.py:112 newforms/fields.py:326
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Säkerställ att detta värdet har minst %d tecken."
+
+#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Säkerställ att detta värdet är mindre eller lika med %s."
+
+#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Säkerställ att detta värdet är mer eller lika med %s."
+
+#: newforms/fields.py:158 newforms/fields.py:186
+msgid "Enter a number."
+msgstr "Fyll i ett tal."
+
+#: newforms/fields.py:196
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Säkerställ att det inte finns mer än %s siffror totalt."
+
+#: newforms/fields.py:198
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Säkerställ att det inte finns mer än %s decimaler."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Säkerställ att det inte finns mer än %s siffror före kommatecknet."
+
+#: newforms/fields.py:233
+msgid "Enter a valid date."
+msgstr "Fyll i ett giltigt datum."
+
+#: newforms/fields.py:260
+msgid "Enter a valid time."
+msgstr "Fyll i en giltig tid."
+
+#: newforms/fields.py:296
+msgid "Enter a valid date/time."
+msgstr "Fyll i ett giltigt datum/tid."
+
+#: newforms/fields.py:310
+msgid "Enter a valid value."
+msgstr "Fyll i ett giltigt värde."
+
+#: newforms/fields.py:357 newforms/fields.py:379
+msgid "Enter a valid URL."
+msgstr "Fyll i ett giltigt URL."
+
+#: newforms/fields.py:381
+msgid "This URL appears to be a broken link."
+msgstr "Denna URL verkar vara en trasig länk."
+
+#: 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 miljon"
+msgstr[1] "%(value).1f miljoner"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+#, fuzzy
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value)1.f miljard"
+msgstr[1] "%(value)1.f miljarder"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+#, fuzzy
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value)1.f biljon"
+msgstr[1] "%(value)1.f biljoner"
+
+#: contrib/humanize/templatetags/humanize.py:68
+#, fuzzy
+msgid "one"
+msgstr "ett"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "två"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tre"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "fyra"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "fem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "sex"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sju"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "Ã¥tta"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nio"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omdirigera från"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Det här bör vara en absolut sökväg, förutom domännamnet. Exempel: '/"
+"handelser/sok/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omdirigera till"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Detta kan vara antingen en absolut sökväg (som ovan), eller en komplett URL "
+"som börjar med 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "omdirigera"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "omdirigeringar"
+
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
-msgstr "objektets id"
+msgstr "objektets ID"
#: contrib/comments/models.py:68
msgid "headline"
@@ -75,7 +882,7 @@ msgstr "datum/tid postat"
msgid "is public"
msgstr "är offentligt"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:305
msgid "IP address"
msgstr "IP-adress"
@@ -92,13 +899,12 @@ msgstr ""
"kommentaren har tagits bort\"-meddelande kommer visas istället"
#: contrib/comments/models.py:91
-#, fuzzy
msgid "comments"
-msgstr "kommentar"
+msgstr "kommentarer"
#: contrib/comments/models.py:131 contrib/comments/models.py:207
msgid "Content object"
-msgstr "innehållsobjekt"
+msgstr "Innehållsobjekt"
#: contrib/comments/models.py:159
#, python-format
@@ -128,14 +934,12 @@ msgid "approved by staff"
msgstr "godkänd av personal"
#: contrib/comments/models.py:176
-#, fuzzy
msgid "free comment"
-msgstr "Fri kommentar"
+msgstr "fri kommentar"
#: contrib/comments/models.py:177
-#, fuzzy
msgid "free comments"
-msgstr "Fria kommentarer"
+msgstr "fria kommentarer"
#: contrib/comments/models.py:233
msgid "score"
@@ -143,17 +947,15 @@ msgstr "poäng"
#: contrib/comments/models.py:234
msgid "score date"
-msgstr "poängens datum"
+msgstr "poängdatum"
#: contrib/comments/models.py:237
-#, fuzzy
msgid "karma score"
-msgstr "Karmapoäng"
+msgstr "karmapoäng"
#: contrib/comments/models.py:238
-#, fuzzy
msgid "karma scores"
-msgstr "Karmapoäng"
+msgstr "karmapoäng"
#: contrib/comments/models.py:242
#, python-format
@@ -176,14 +978,12 @@ msgid "flag date"
msgstr "flaggdatum"
#: contrib/comments/models.py:268
-#, fuzzy
msgid "user flag"
-msgstr "Användarflagga"
+msgstr "användares flagga"
#: contrib/comments/models.py:269
-#, fuzzy
msgid "user flags"
-msgstr "Användarflaggor"
+msgstr "användares flaggor"
#: contrib/comments/models.py:273
#, python-format
@@ -195,14 +995,12 @@ msgid "deletion date"
msgstr "borttagningsdatum"
#: contrib/comments/models.py:280
-#, fuzzy
msgid "moderator deletion"
-msgstr "Moderatorborttagning"
+msgstr "moderatorborttagning"
#: contrib/comments/models.py:281
-#, fuzzy
msgid "moderator deletions"
-msgstr "Moderatorborttagningar"
+msgstr "moderatorborttagningar"
#: contrib/comments/models.py:285
#, python-format
@@ -215,18 +1013,18 @@ msgstr "Anonyma användare kan inte rösta"
#: contrib/comments/views/karma.py:23
msgid "Invalid comment ID"
-msgstr "Kommentaren har ett ogiltigt ID"
+msgstr "Ogiltig kommentarsidentifikation"
#: contrib/comments/views/karma.py:25
msgid "No voting for yourself"
msgstr "Du får inte rösta på dig själv"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr "Det här betyget krävs eftersom du har fyllt i minst ett annat betyg."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -239,17 +1037,17 @@ msgid_plural ""
"\n"
"%(text)s"
msgstr[0] ""
-"Den här kommentaren postades av en användare som har postat färre än %(count)"
-"s kommentar:\n"
+"Den här kommentaren postades av en användare som har postat mindre än %"
+"(count)s kommentar:\n"
"\n"
"%(text)s"
msgstr[1] ""
-"Den här kommentaren postades av en användare som har postat färre än %(count)"
-"s kommentarer:\n"
+"Den här kommentaren postades av en användare som har postat mindre än %"
+"(count)s kommentarer:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -260,34 +1058,34 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
-msgstr "Endast POSTningar är tillåtna"
+msgstr "Endast POST tillåtet"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
-msgstr "Ett eller fler av fälten som krävs fylldes inte i"
+msgstr "Ett eller flera av de obligatoriska fälten var inte ifyllda"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Någon fifflade med kommenteringsformuläret (säkerhetsbrott)"
+msgstr "Någon fifflade med kommentarformuläret (säkerhetsbrott)"
-#: contrib/comments/views/comments.py:207
+#: 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 ""
-"Kommenteringsformuläret har en ogiltig 'target'-parameter -- objektets ID är "
+"Kommentars-formuläret hade en ogiltig 'mål'-parameter -- objektets ID var "
"ogiltigt"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Kommenteringsformuläret skickade varken 'förhandsgranska' eller 'post'"
+msgstr "Kommentars-formuläret skickade varken 'förhandsgranska' eller 'post'"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -296,71 +1094,83 @@ msgid "Username:"
msgstr "Användarnamn:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Lösenord:"
-
-#: contrib/comments/templates/comments/form.html:6
-#, fuzzy
-msgid "Forgotten your password?"
-msgstr "Ändra mitt lösenord"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Log out"
msgstr "Logga ut"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Glömt ditt lösenord?"
+
#: contrib/comments/templates/comments/form.html:12
-#, fuzzy
msgid "Ratings"
-msgstr "betyg #1"
+msgstr "Betyg"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Required"
-msgstr ""
+msgstr "Obligatorisk"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Optional"
-msgstr ""
+msgstr "Valfri"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
-msgstr ""
+msgstr "Lägg till foto"
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
#: contrib/comments/templates/comments/freeform.html:5
-#, fuzzy
msgid "Comment:"
-msgstr "Kommentar"
+msgstr "Kommentar:"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-#, fuzzy
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
msgid "Preview comment"
-msgstr "Fri kommentar"
+msgstr "Förhandsgranska kommentar"
#: contrib/comments/templates/comments/freeform.html:4
-#, fuzzy
msgid "Your name:"
-msgstr "användarnamn"
+msgstr "Ditt namn:"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domännamn"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "visat namn"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "siter"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -372,7 +1182,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Alla"
@@ -396,21 +1206,9 @@ msgstr "Den här månaden"
msgid "This year"
msgstr "Det här året"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Ja"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Nej"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Okänt"
-
#: contrib/admin/models.py:16
msgid "action time"
-msgstr "tid för händelse"
+msgstr "händelsetid"
#: contrib/admin/models.py:19
msgid "object id"
@@ -436,252 +1234,353 @@ msgstr "loggpost"
msgid "log entries"
msgstr "loggposter"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:249
msgid "All dates"
msgstr "Alla datum"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Logga in"
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" lades till."
-#: contrib/admin/views/decorators.py:61
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Du måste logga in igen, eftersom din session har tagit slut. Oroa dig inte: "
-"ditt bidrag har sparats."
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Du kan ändra det igen nedanför."
-#: contrib/admin/views/decorators.py:68
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Det ser ut som om din webbläsare inte är konfigurerad att acceptera kakor. "
-"Aktivera kakor, ladda om den här sidan, och försök igen."
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Lägg till användare"
-#: contrib/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "Användarnamn kan inte innehålla tecknet '@'."
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Lösenordet ändrades framgångsrikt."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/auth.py:64
#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Din e-postadress är inte ditt användarnamn. Försök med '%s' istället."
+msgid "Change password: %s"
+msgstr "Ändra lösenord: %s"
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:223
msgid "Site administration"
-msgstr "Hemsideadministration"
+msgstr "Site-administration"
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)set \"%(obj)s\" lades till."
-
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "Du kan ändra det igen här under."
-
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
-msgstr "Du kan lägga till en till %s här under"
+msgstr "Du kan lägga till en till %s nedanför."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Lägg till %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Lade till %s."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "och"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Ändrade %s."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "Tog bort %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Inga fält ändrade."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)set \"%(obj)s\" ändrades."
+msgstr "%(name)s \"%(obj)s\" ändrades."
-#: contrib/admin/views/main.py:354
+#: 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)set \"%(obj)s\" lades till. Du kan ändra det igen här under."
+msgstr "%(name)s \"%(obj)s\" lades till. Du kan ändra det igen nedanför."
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "Ändra %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Ett eller flera %(fieldname)s i %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Ett eller flera %(fieldname)s i %(name)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)set \"%(obj)s\" togs bort."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "Är du säker?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
-msgstr "Ändra historien: %s"
+msgstr "Ändra historik: %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "Välj %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
-msgstr "Välj vilken %s du vill ändra"
+msgstr "Välj %s att ändra"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Databasfel"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Var god ange ett korrekt användarnamn och lösenord. Observera att båda "
+"fälten är skiftlägeskänsliga."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Logga in"
+
+#: 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 ""
+"Var god logga in igen, eftersom din session har tagit slut. "
+"Oroa dig inte: Ditt bidrag har sparats."
+
+#: 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 ""
+"Det ser ut som om din webläsare inte är konfigurerad att acceptera cookies. "
+"Aktivera cookies, ladda om den här sidan, och försök igen."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Användarnamn kan inte innehålla '@' tecknet."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Din e-mailadress är inte ditt användarnamn. Försök med '%s' istället."
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tagg:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vy:"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Applikation %r hittades inte"
+
+#: contrib/admin/views/doc.py:171
+#, fuzzy, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modellen %(model_name)r hittades inte i applikation %(app_label)r"
+
+#: contrib/admin/views/doc.py:183
+#, fuzzy, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "det relaterade `%(app_label)s.%(data_type)s` objektet"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modell:"
+
+#: contrib/admin/views/doc.py:214
+#, fuzzy, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "relaterade `%(app_label)s.%(object_name)s` objekt"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "alla %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "antal %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Fält på %s objekt"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313
msgid "Integer"
msgstr "Heltal"
-#: contrib/admin/views/doc.py:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
-msgstr "Boolesk (antingen Sann eller Falsk)"
+msgstr "Boolesk (antingen True eller False)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Sträng (upp till %(maxlength)s)"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Komma-separerade heltal"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Datum (utan tid)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Datum (med tid)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
+msgid "Decimal number"
+msgstr "Decimaltal"
+
+#: contrib/admin/views/doc.py:298
msgid "E-mail address"
msgstr "E-postadress:"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300
+#: contrib/admin/views/doc.py:303
msgid "File path"
-msgstr "Sökväg"
+msgstr "Filsökväg"
-#: contrib/admin/views/doc.py:285
-msgid "Decimal number"
-msgstr "decemaltal"
+#: contrib/admin/views/doc.py:301
+msgid "Floating point number"
+msgstr "Flyttal"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:307
msgid "Boolean (Either True, False or None)"
-msgstr "Boolesk (antingen Sann, Falsk eller Inget)"
+msgstr "Boolesk (antingen True, False eller None)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:308
msgid "Relation to parent model"
-msgstr "Relation till förälder"
+msgstr "Relation till förälder-modell"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:309
msgid "Phone number"
msgstr "Telefonnummer"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:314
msgid "Text"
msgstr "Text"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:315
msgid "Time"
msgstr "Tid"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:317
msgid "U.S. state (two uppercase letters)"
-msgstr "Stat i USA (två stora bokstäver)"
+msgstr "Stat i USA (två versaler)"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:318
msgid "XML text"
msgstr "XML-text"
-#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/views/doc.py:344
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s verkar inte vara ett urlpattern-objekt"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Nuvarande:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Ändra:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Tid:"
+
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
msgstr "Dokumentation"
-#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Change password"
msgstr "Ändra lösenord"
+#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -691,8 +1590,18 @@ msgstr "Ändra lösenord"
msgid "Home"
msgstr "Hem"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lägg till %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Av %(filter_title)s "
+
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Historik"
@@ -718,15 +1627,35 @@ msgid ""
"admin site."
msgstr ""
"Det här objektet har ingen ändringshistorik. Det lades antagligen inte till "
-"i den här admin-sidan"
+"via denna administrationssite."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Kör"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultat"
+msgstr[1] "%(counter)s resultat"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Visa alla"
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
-msgstr "Djangos sidadministration"
+msgstr "Django site-administration"
#: contrib/admin/templates/admin/base_site.html:7
msgid "Django administration"
-msgstr "Administration för Django"
+msgstr "Django administration"
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -745,25 +1674,31 @@ 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 ""
-"Ett fel har uppstått. Sidadministratören har meddelats via e-post och felet "
-"bör åtgärdas snart. Tack för ditt tålamod."
-
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Sidan kunde inte hittas"
+"Ett fel har uppstått. Administratören har meddelats via e-mail och felet bör "
+"åtgärdas snart. Tack för ditt tålamod."
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Vi är ledsna, men den efterfrågade sidan kunde inte hittas."
+#: 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 ""
+"Någonting är fel med din databasinstallation. Se till att de rätta "
+"tabellerna har skapats och att databasen är läsbar av rätt användare."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr ""
+msgstr "Modeller tillgängliga i %(name)s applikationen."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
+#, fuzzy
msgid "Add"
msgstr "Lägg&nbsp;till"
@@ -773,32 +1708,51 @@ msgstr "Ändra"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
-msgstr "Du har inte rätt att ändra något."
+msgstr "Du har inte rättigheter att ändra något."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
-msgstr "Senaste händelserna"
+msgstr "Senaste Händelserna"
#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
-msgstr "Mina händelser"
+msgstr "Mina Händelser"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
msgstr "Inga tillgängliga"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Lägg till %(name)s"
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sidan kunde inte hittas"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Har du <a href=\"/password_reset/\">glömt ditt lösenord</a>?"
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi är ledsna, men den efterfrågade sidan kunde inte hittas."
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-msgstr "Välkommen,"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Visa på site"
+
+#: 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] "Rätta till felet nedan."
+msgstr[1] "Rätta till felen nedan."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Sortering"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Sortera:"
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
@@ -808,53 +1762,30 @@ msgstr "Ta bort"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"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 ""
-"Att ta bort %(object_name)s '%(object)s' skulle innebära att besläktade "
-"objekt togs bort, men ditt konto har inte rättigheter att ta bort följande "
-"objekttyper:"
+"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att "
+"besläktade objekt togs bort, men ditt konto har inte rättigheter att ta bort "
+"följande objekttyper:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Är du säker på att du vill ta bort %(object_name)s \"%(object)s\"? Följande "
-"besläktade föremål kommer att tas bort:"
+"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? "
+"Alla dessa sammanlänkade objekt kommer att tas bort:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Ja, jag är säker"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " Efter %(title)s "
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Utför"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Visa på hemsidan"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Rätta till felet nedan."
-msgstr[1] "Rätta till felen nedan."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Sortering"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Sortera:"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Välkommen,"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -872,6 +1803,38 @@ msgstr "Spara och fortsätt redigera"
msgid "Save"
msgstr "Spara"
+#: 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 "Ange nytt lösenord för användaren <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Lösenord"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Lösenord (igen)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Fyll i samma lösenord som ovan för verifiering."
+
+#: 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 ""
+"Ange först ett användarnamn och ett lösenord. Sedan kommer du att kunna "
+"ändra fler användaralternativ."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Användarnamn"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -893,14 +1856,14 @@ msgstr "Ditt lösenord har ändrats."
#: contrib/admin/templates/registration/password_reset_form.html:10
#: contrib/admin/templates/registration/password_reset_done.html:4
msgid "Password reset"
-msgstr "Nollställ lösenordet"
+msgstr "Nollställ lösenord"
#: 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 ""
-"Har du glömt ditt lösenord? Fyll i din e-postadress nedan, så nollställer vi "
+"Har du glömt ditt lösenord? Fyll i din e-mailadress nedan, så nollställer vi "
"ditt lösenord och mailar det nya till dig."
#: contrib/admin/templates/registration/password_reset_form.html:16
@@ -913,7 +1876,7 @@ msgstr "Nollställ mitt lösenord"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Tack för att du spenderade kvalitetstid med webbsidan idag."
+msgstr "Tack för att du spenderade kvalitetstid med web-siten idag."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
@@ -922,14 +1885,14 @@ msgstr "Logga in igen"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Nollställning av lösenordet lyckades"
+msgstr "Lösenordsnollställning lyckades."
#: 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 ""
-"Vi har skickat ett nytt lösenord till e-postadressen du fyllde i. Det bör "
+"Vi har skickat ett nytt lösenord till e-mailadressen du fyllde i. Det bör "
"anlända snarast."
#: contrib/admin/templates/registration/password_change_form.html:12
@@ -982,12 +1945,12 @@ msgstr "Ditt användarnamn, om du har glömt:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
-msgstr "Tack för att du använder vår sida!"
+msgstr "Tack för att du använder vår site!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
-msgstr "%(site_name)s-laget"
+msgstr "%(site_name)s-teamet"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
@@ -1011,9 +1974,10 @@ msgstr ""
"<p class=\"help\">För att installera smarta bokmärken, dra länken till din\n"
"verktygsrad med bokmärken, eller högerklicka på länken och lägg till den\n"
"till dina bokmärken. Nu kan du välja det smarta bokmärket från alla sidor\n"
-"på hemsidan. Notera att några av desa smarta bokmärken kräver att du tittar\n"
-"på sidan på en dator som är \"intern\" (prata med din systemadministratör\n"
-"om du inte är säker på om din dator är \"intern\")</p>\n"
+"på siten. Observera att några av dessa smarta bokmärken kräver att du "
+"besöker\n"
+"sidan från en dator som är \"intern\" (tala med din systemadministratör\n"
+"om du inte är säker på om din dator är \"intern\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
@@ -1029,14 +1993,15 @@ msgstr ""
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
-msgstr "Visa objektets id"
+msgstr "Visa objektets 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 ""
-"Visa innehållstypen och ID:t för sidor som representerar ett enskillt objekt."
+"Visa innehållstypen och det unika ID:t för sidor som representerar ett "
+"enskilt objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
@@ -1045,7 +2010,7 @@ msgstr "Redigera det här objektet (nuvarande fönster)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
msgstr ""
-"Hoppar till administrationssidan för sidor som representerar ett enskillt "
+"Hoppar till administrationssidan för sidor som representerar ett enskilt "
"objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
@@ -1054,181 +2019,125 @@ msgstr "Redigera det här objektet (nytt fönster)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
-msgstr "Som ovan, men öppnaradministrationssidan i ett nytt fönster."
-
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Datum:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Tid:"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr ""
-
-#: contrib/admin/templates/widget/file.html:3
-#, fuzzy
-msgid "Change:"
-msgstr "Ändra"
+msgstr "Som ovan, men öppnar administrationssidan i ett nytt fönster."
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "vidarebefodra från"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Det här bör vara en absolut sökväg, förutom domännamnet. Exempel: '/"
-"handelser/sok/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "vidarebefodra till"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Det här kan vara antingen en absolut sökväg (som ovan), eller en komplett "
-"adress som börjar med 'http://'."
-
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "vidarebefodra"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "vidarebefodringar"
-
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedsträck."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "titel"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "innehåll"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "aktivera kommentarer"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "mallnamn"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Exempel: 'flatpages/kontaktsida'. Om det här inte fylls i kommer systemet "
-"att använda 'flatpages/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "registrering krävs"
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python modell klassnamn"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Om det här bockas i kommer endast inloggade användare att kunna visa sidan"
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "innehållstyp"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "flatsida"
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "innehållstyper"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "flatsidor"
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Utloggad"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
msgid "name"
msgstr "namn"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:46
msgid "codename"
msgstr "kodnamn"
-#: contrib/auth/models.py:17
-#, fuzzy
+#: contrib/auth/models.py:49
msgid "permission"
-msgstr "Rättighet"
+msgstr "rättighet"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
-#, fuzzy
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
msgid "permissions"
-msgstr "Rättigheter"
+msgstr "rättigheter"
-#: contrib/auth/models.py:29
-#, fuzzy
+#: contrib/auth/models.py:68
msgid "group"
-msgstr "Grupp"
+msgstr "grupp"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
-#, fuzzy
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
msgid "groups"
-msgstr "Grupper"
+msgstr "grupper"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:99
msgid "username"
msgstr "användarnamn"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obligatorisk. 30 tecken eller mindre. Endast bokstäver, siffror eller "
+"understräck."
+
+#: contrib/auth/models.py:100
msgid "first name"
msgstr "förnamn"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:101
msgid "last name"
msgstr "efternamn"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:102
msgid "e-mail address"
-msgstr "e-postadress"
+msgstr "e-mailadress"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:103
msgid "password"
msgstr "lösenord"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Använd '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Använd '[algo]$[salt]$[hexdigest]' eller använd <a href=\"password/\">Ändra "
+"lösenord</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "staff status"
msgstr "personalstatus"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:104
msgid "Designates whether the user can log into this admin site."
-msgstr "Avgör om användaren kan logga in till den här administrationssidan."
+msgstr "Avgör om användaren kan logga in på den här admin-siten."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:105
msgid "active"
msgstr "aktiv"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Avgör om användaren kan logga in till Django admin. Avmarkera denna "
+"istället för att ta bort konton."
+
+#: contrib/auth/models.py:106
msgid "superuser status"
msgstr "superanvändare"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Avgör om användaren har alla rättigheter utan att uttryckligen tilldela "
+"dem"
+
+#: contrib/auth/models.py:107
msgid "last login"
msgstr "senaste inloggning"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:108
msgid "date joined"
msgstr "registreringsdatum"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:110
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -1236,234 +2145,736 @@ msgstr ""
"Förutom de rättigheterna som utdelas manuellt så kommer användaren dessutom "
"få samma rättigheter som de grupper där han/hon är medlem."
-#: contrib/auth/models.py:67
-#, fuzzy
+#: contrib/auth/models.py:111
msgid "user permissions"
-msgstr "Rättigheter"
+msgstr "användarättigheter"
-#: contrib/auth/models.py:70
-#, fuzzy
+#: contrib/auth/models.py:115
msgid "user"
-msgstr "Användare"
+msgstr "användare"
-#: contrib/auth/models.py:71
-#, fuzzy
+#: contrib/auth/models.py:116
msgid "users"
-msgstr "Användare"
+msgstr "användare"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:122
msgid "Personal info"
msgstr "Personlig information"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:123
msgid "Permissions"
msgstr "Rättigheter"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:124
msgid "Important dates"
msgstr "Viktiga datum"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:125
msgid "Groups"
msgstr "Grupper"
-#: contrib/auth/models.py:219
-#, fuzzy
+#: contrib/auth/models.py:269
msgid "message"
-msgstr "Meddelande"
+msgstr "meddelande"
+
+#: contrib/auth/models.py:282
+#, fuzzy
+msgid "AnonymousUser"
+msgstr "Anonym användare"
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "De båda lösenorden stämde inte överens."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "En användare med det användarnamnet finns redan."
+
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
msgstr ""
+"Din webläsare verkar inte stödja cookies. Cookie behövs för att kunna logga "
+"in."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Detta konto är inaktivt."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Den e-mailadressen har inte något konto associerat med sig. Är du säker på "
+"att du har registrerat dig?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "De två lösenordsfälten stämde inte överens."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ditt gamla lösenord var felaktigt ifyllt. Var vänlig fyll i det igen"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Fyll i ett postnummer. Du måste ha mellanslag mellan nummerdelarna."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Fyll i en fyra-sifrigt postkod."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Fyll i zipkod i XXXXX-XXX format."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummer måste vara i det amerikanska formatet XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Detta fält kräver enbart siffror."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Detta fält kräver högst 11 siffror eller 14 bokstäver."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Ogiltigt CPF-nummer."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Detta fält kräver minst 14 sifrror"
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Ogiltigt CNPJ-nummer."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Fyll i en zipkod i XXXXX format."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
-#: contrib/contenttypes/models.py:25
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bayern"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Nedre Sachsen"
+
+#: contrib/localflavor/de/de_states.py:14
#, fuzzy
-msgid "python model class name"
-msgstr "pythonmodulnamn"
+msgid "North Rhine-Westphalia"
+msgstr "Norra Rhen-Westphalia"
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "innehållstyp"
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhenlandet"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "innehållstyper"
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sachsen"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Sachsen-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Fyll i ett giltigt tyskt ID-kortnummer i XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
-#: contrib/sessions/models.py:35
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ischikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kuamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Fyll i zipkod i formatet XXXXXXX eller XXX-XXXX."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Fyll i en giltigt zipkod."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Fyll i ett giltigt personnummer."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Fyll i ett giltigt VAT-nummer."
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
+msgid "Enter a zip code in the format XXXX."
+msgstr "Fyll i zipkod i formatet XXXX."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Fyll i ett giltigt norskt personnummer."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Fyll i ett giltigt finskt personnummer."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Fyll i zipkod i formatet XXXXX eller XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Fyll i ett giltigt amerikanskt personnummer i XXX-XX-XXXX format."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Fyll i ett giltigt isländskt personnummer. Formatet är XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Det isländska personnumret är inte giltigt."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Fyll i ett giltigt chileanskt RUT. Formatet är XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Fyll i ett giltigt chileanskt RUT"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Fyll i ett giltigt Schweiziskt ID- eller passkortnummer i X1234567<0 eller "
+"1234567890 format."
+
+#: contrib/sessions/models.py:68
msgid "session key"
msgstr "sessionsnyckel"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:69
msgid "session data"
msgstr "sessionsdata"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:70
msgid "expire date"
msgstr "utgångsdatum"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:74
msgid "session"
msgstr "session"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "sessioner"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "domännamn"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedsträck."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "visat namn"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "hemsida"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innehåll"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "hemsidor"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "aktivera kommentarer"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "Y-m-d"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mallnamn"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "Y-m-d, H:i"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exempel: 'sidor/kontaktsida.html'. Om det här inte fylls i kommer systemet "
+"att använda 'sidor/default.html'."
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "H:i:s"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering krävs"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Om det här bockas i kommer endast inloggade användare att kunna visa sidan"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flatsida"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flatsidor"
#: utils/dates.py:6
msgid "Monday"
-msgstr "måndag"
+msgstr "MÃ¥ndag"
#: utils/dates.py:6
msgid "Tuesday"
-msgstr "tisdag"
+msgstr "Tisdag"
#: utils/dates.py:6
msgid "Wednesday"
-msgstr "onsdag"
+msgstr "Onsdag"
#: utils/dates.py:6
msgid "Thursday"
-msgstr "torsdag"
+msgstr "Torsdag"
#: utils/dates.py:6
msgid "Friday"
-msgstr "fredag"
+msgstr "Fredag"
#: utils/dates.py:7
msgid "Saturday"
-msgstr "lördag"
+msgstr "Lördag"
#: utils/dates.py:7
msgid "Sunday"
-msgstr "söndag"
+msgstr "Söndag"
#: utils/dates.py:14
msgid "January"
-msgstr "januari"
+msgstr "Januari"
#: utils/dates.py:14
msgid "February"
-msgstr "februari"
+msgstr "Februari"
#: utils/dates.py:14 utils/dates.py:27
msgid "March"
-msgstr "mars"
+msgstr "Mars"
#: utils/dates.py:14 utils/dates.py:27
msgid "April"
-msgstr "april"
+msgstr "April"
#: utils/dates.py:14 utils/dates.py:27
msgid "May"
-msgstr "maj"
+msgstr "Maj"
#: utils/dates.py:14 utils/dates.py:27
msgid "June"
-msgstr "juni"
+msgstr "Juni"
#: utils/dates.py:15 utils/dates.py:27
msgid "July"
-msgstr "juli"
+msgstr "Juli"
#: utils/dates.py:15
msgid "August"
-msgstr "augusti"
+msgstr "Augusti"
#: utils/dates.py:15
msgid "September"
-msgstr "september"
+msgstr "September"
#: utils/dates.py:15
msgid "October"
-msgstr "oktober"
+msgstr "Oktober"
#: utils/dates.py:15
msgid "November"
-msgstr "november"
+msgstr "November"
#: utils/dates.py:16
msgid "December"
-msgstr "december"
+msgstr "December"
#: utils/dates.py:19
-#, fuzzy
msgid "jan"
-msgstr "och"
+msgstr "jan"
#: utils/dates.py:19
msgid "feb"
-msgstr ""
+msgstr "feb"
#: utils/dates.py:19
msgid "mar"
-msgstr ""
+msgstr "mars"
#: utils/dates.py:19
msgid "apr"
-msgstr ""
+msgstr "apr"
#: utils/dates.py:19
-#, fuzzy
msgid "may"
-msgstr "dag"
+msgstr "maj"
#: utils/dates.py:19
msgid "jun"
-msgstr ""
+msgstr "juni"
#: utils/dates.py:20
msgid "jul"
-msgstr ""
+msgstr "juli"
#: utils/dates.py:20
msgid "aug"
-msgstr ""
+msgstr "aug"
#: utils/dates.py:20
msgid "sep"
-msgstr ""
+msgstr "sept"
#: utils/dates.py:20
msgid "oct"
-msgstr ""
+msgstr "okt"
#: utils/dates.py:20
msgid "nov"
-msgstr ""
+msgstr "nov"
#: utils/dates.py:20
msgid "dec"
-msgstr ""
+msgstr "dec"
#: utils/dates.py:27
msgid "Jan."
@@ -1508,8 +2919,8 @@ msgstr[1] "månader"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "vecka"
+msgstr[1] "veckor"
#: utils/timesince.py:15
msgid "day"
@@ -1529,500 +2940,87 @@ msgid_plural "minutes"
msgstr[0] "minut"
msgstr[1] "minuter"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Bengaliska"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Tjeckiska"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Walesiska"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Danska"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Tyska"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr ""
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Engelska"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Spanska"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Franska"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galisiska"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr ""
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr ""
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Isländska"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italienska"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr ""
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr ""
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norska"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brasilianska"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Rumänska"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Ryska"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Slovakiska"
-
-#: conf/global_settings.py:58
-#, fuzzy
-msgid "Slovenian"
-msgstr "Slovakiska"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbiska"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Svenska"
-
-#: conf/global_settings.py:61
-#, fuzzy
-msgid "Ukrainian"
-msgstr "Brasilianska"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Förenklad kinesiska"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr ""
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Det här värdet får bara innehålla bokstäver, tal och understräck."
-
-#: core/validators.py:64
-#, fuzzy
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Det här värdet får bara innehålla bokstäver, tal, understräck och snedsträck"
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Stora bokstäver är inte tillåtna här."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Små bokstäver är inte tillåtna här."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Fyll enbart i siffror avskillda med kommatecken."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Fyll i giltiga e-postadresser avskillda med kommatecken."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Var god fyll i ett giltigt IP-nummer."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Tomma värden är inte tillåtna här."
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Icke-numeriska tecken är inte tillåtna här."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Det här värdet kan inte enbart bestå av siffror."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Fyll i ett heltal."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Endast alfabetiska bokstäver är tillåtna här."
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Fyll i ett giltigt datum i formatet Ã…Ã…Ã…Ã…-MM-DD."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Fyll i en giltig tid i formatet TT:MM"
-
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Fyll i en giltig tidpunkt i formatet Ã…Ã…Ã…Ã…-MM-DD TT:MM"
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Fyll i en giltig e-postadress."
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Ladda upp en giltig bild. Filen du laddade upp var antingen inte en bild, "
-"eller så var det en korrupt bild."
-
-#: core/validators.py:155
+#: utils/timesince.py:40
#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "Adressen %s pekar inte till en giltig bild."
+msgid "%d milliseconds"
+msgstr "%d millisekunder"
-#: core/validators.py:159
+#: utils/timesince.py:41
#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Telefonnummer måste vara i det amerikanska formatet XXX-XXX-XXXX. \"%s\" är "
-"ogiltigt."
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
-#: core/validators.py:167
+#: utils/timesince.py:47
#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Adressen %s pekar inte till en giltig QuickTime-video."
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "En giltig adress krävs."
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Giltig HTML krävs. Specifika fel är:\n"
-"%s"
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Missformad XML: %s"
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "PM"
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Felaktig URL: %s"
-
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "URL:en %s är en trasig länk."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Fyll i en giltig förkortning för en amerikansk delstat"
-
-#: core/validators.py:229
-#, 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] "Håll i tungan! Ordet %s är inte tillåtet här."
-msgstr[1] "Håll i tungan! Orden %s är inte tillåtna här."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Det här fältet måste matcha fältet '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Fyll i något i minst ett fält."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr "Fyll antingen i båda fälten, eller lämna båda tomma"
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Det är fältet måste anges om %(field)s är %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Det här fältet måste anges om %(field)s inte är %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Upprepade värden är inte tillåtna."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Det här värdet måste vara en multipel av %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Fyll i ett giltigt decimaltal."
-
-#: core/validators.py:349
-#, 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] "Fyll i ett giltigt decimaltal med mindre än %s siffra totalt."
-msgstr[1] "Fyll i ett giltigt decimaltal med mindre än %s siffror totalt."
-
-#: core/validators.py:352
-#, 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] "Fyll i ett giltigt decimaltal med som mest %s decimalsiffra."
-msgstr[1] "Fyll i ett giltigt decimaltal med som mest %s decimalsiffror."
-
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Se till att filen du laddade upp är minst %s bytes stor."
-
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Se till att filen du laddade upp är max %s bytes stor."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Formatet på det här fältet är fel."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Det här fältet är ogiltigt."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Kunde inte hämta något från %s."
-
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"Adressen %(url)s returnerade det ogiltiga innehållstyphuvudet (Content-Type "
-"header) '%(contenttype)s'"
-
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Var god avsluta den oavslutade taggen %(tag)s på rad %(line)s. (Raden börjar "
-"med \"%(start)s\".)"
-
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"En del text från rad %(line)s är inte tillåtet i det sammanhanget. (Raden "
-"börjar med \"%(start)s\".)"
-
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"%(attr)s\" på rad %(line)s är inte ett gilltigt attribut. (Raden startar "
-"med \"%(start)s\".)"
-
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"<%(tag)s>\" på rad %(line)s är inte en giltig tagg. (Raden börjar med \"%"
-"(start)s\".)"
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "AM"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"En tagg på rad %(line)s saknar en eller flera nödvändiga attribut. (Raden "
-"börjar med \"%(start)s\".)"
-
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Attributet \"%(attr)s\" på rad %(line)s har ett ogiltigt värde. (Raden "
-"börjar med \"%(start)s\".)"
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "midnatt"
-#: db/models/manipulators.py:302
-#, fuzzy, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(optname)s med det här %(fieldname)s finns redan."
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "middag"
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s med det här %(fieldname)s finns redan."
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Det här fältet är obligatoriskt."
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
-#: db/models/fields/__init__.py:337
-#, fuzzy
-msgid "This value must be an integer."
-msgstr "Det här värdet måste vara en multipel av %s."
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
-#: db/models/fields/__init__.py:369
-#, fuzzy
-msgid "This value must be either True or False."
-msgstr "Det här värdet måste vara en multipel av %s."
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
-#: db/models/fields/__init__.py:385
-#, fuzzy
-msgid "This field cannot be null."
-msgstr "Det här fältet är ogiltigt."
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Fyll i ett giltigt filnamn."
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "ja,nej,kanske"
-#: db/models/fields/related.py:43
+#: template/defaultfilters.py:520
#, python-format
-msgid "Please enter a valid %s."
-msgstr "Var god fyll i ett giltigt %s."
-
-#: db/models/fields/related.py:579
-#, fuzzy
-msgid "Separate multiple IDs with commas."
-msgstr " Separera flera ID:n med kommatecken."
-
-#: db/models/fields/related.py:581
-#, fuzzy
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-" Håll ner \"Control\", eller \"Command\" på en Mac, för att välja mer än en."
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
-#: db/models/fields/related.py:625
+#: template/defaultfilters.py:522
#, 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] "Var god och fyll giltiga %(self)s ID. Värdet %(value)r är ogiltigt."
-msgstr[1] ""
-"Var god och fyll giltiga %(self)s ID. Värdena %(value)r är ogiltigt."
+msgid "%.1f KB"
+msgstr "%.1f KB"
-#: forms/__init__.py:380
+#: template/defaultfilters.py:524
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Se till att din text är kortare än %s tecken."
-msgstr[1] "Se till att din text är kortare än %s tecken."
-
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Radbrytningar är inte tillåtna här."
+msgid "%.1f MB"
+msgstr "%.1f MB"
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: template/defaultfilters.py:525
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Välj ett giltigt alternativ. '%(data)s' finns inte bland %(choices)s"
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Den insända filen är tom."
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Fyll i ett heltal mellan -32 768 och 32 767."
-
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Fyll i ett positivt heltal."
-
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Fyll i ett heltal mellan 0 och 32 767."
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "ja,nej,kanske"
-
-#~ msgid "Comment"
-#~ msgstr "Kommentar"
-
-#~ msgid "Comments"
-#~ msgstr "Kommentarer"
-
-#~ msgid "String (up to 50)"
-#~ msgstr "Sträng (upp till 50)"
-
-#~ msgid "label"
-#~ msgstr "etikett"
-
-#~ msgid "package"
-#~ msgstr "paket"
-
-#~ msgid "packages"
-#~ msgstr "paket"
-
-#, fuzzy
-#~ msgid "count"
-#~ msgstr "innehåll"
+msgid "%.1f GB"
+msgstr "%.1f GB"
diff --git a/django/conf/locale/sv/LC_MESSAGES/djangojs.mo b/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
index c73aa30560..5daac63424 100644
--- a/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/sv/LC_MESSAGES/djangojs.po b/django/conf/locale/sv/LC_MESSAGES/djangojs.po
index 4d0c1e9034..29fbe2eb15 100644
--- a/django/conf/locale/sv/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/sv/LC_MESSAGES/djangojs.po
@@ -1,112 +1,122 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Swedish translation of Django
+# Copyright (C) 2005
+# This file is distributed under the same license as the Django package.
#
msgid ""
msgstr ""
-"Project-Id-Version: Django\n"
+"Project-Id-Version: djangojs\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-12-09 11:51+0100\n"
-"PO-Revision-Date: 2005-12-04 14:12+0100\n"
-"Last-Translator: Robin Sonefors <ozamosi@blinkenlights.se>\n"
-"Language-Team: Django Translators <Django-I18N@googlegroups.com>\n"
+"POT-Creation-Date: 2007-03-06 02:29+0100\n"
+"PO-Revision-Date: 2007-03-06 10:30+0100\n"
+"Last-Translator: Mikko Hellsing <mikko@sorl.net>\n"
+"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-Language: Swedish\n"
"X-Poedit-Country: SWEDEN\n"
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
msgid "Available %s"
-msgstr ""
+msgstr "Tillgänglig %s"
#: contrib/admin/media/js/SelectFilter2.js:41
-#, fuzzy
msgid "Choose all"
-msgstr "Välj en tidpunkt"
+msgstr "Välj alla"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
-msgstr ""
+msgstr "Lägg till"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
-msgstr ""
+msgstr "Ta bort"
#: contrib/admin/media/js/SelectFilter2.js:53
#, perl-format
msgid "Chosen %s"
-msgstr ""
+msgstr "Vald %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
-msgstr ""
+msgstr "Gör dina val och klicka på "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
-msgstr ""
+msgstr "Ta bort alla"
-#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/dateparse.js:32
#: contrib/admin/media/js/calendar.js:24
msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
+"Januari Februari Mars April Maj Juni Juli Augusti September Oktober November "
+"December"
-#: contrib/admin/media/js/dateparse.js:27
+#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr ""
+msgstr "Söndag Mondag Tisdag Onsdag Torsdag Fredag Lördag"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
-msgstr ""
+msgstr "S M T O T F L"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Visa"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Göm"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "Nu"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Klocka"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr "Välj en tidpunkt"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Midnatt"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "06.00"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "Mitt på dagen"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
-msgstr "Ã…ngra"
+msgstr "Avbryt"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "Idag"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Kalender"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "Igår"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "Imorgon"
+
diff --git a/django/conf/locale/ta/LC_MESSAGES/django.mo b/django/conf/locale/ta/LC_MESSAGES/django.mo
index c85327d06b..c1d3cf26f5 100644
--- a/django/conf/locale/ta/LC_MESSAGES/django.mo
+++ b/django/conf/locale/ta/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ta/LC_MESSAGES/django.po b/django/conf/locale/ta/LC_MESSAGES/django.po
index 7637bb9cdb..e3c539a8a1 100644
--- a/django/conf/locale/ta/LC_MESSAGES/django.po
+++ b/django/conf/locale/ta/LC_MESSAGES/django.po
@@ -1,20 +1,21 @@
-# translation of django.po to
-# translation of django_aa.po to
-# translation of django_aa.po to tamil
-# Parthan <parthan@au-kbc.org>, 2006.
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
+# translation of django-new.po to tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# PONNUSAMY.A <ponnusamy.simpleman@gmail.com>, 2007.
+#
msgid ""
msgstr ""
-"Project-Id-Version: django\n"
+"Project-Id-Version: django-new\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:14+0200\n"
-"PO-Revision-Date: 2006-07-18 16:47+0530\n"
-"Last-Translator: R Hariram Aatreya <rha@localhost.localdomain>\n"
-"Language-Team: <en@li.org>\n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-03-15 16:48+0530\n"
+"Last-Translator: PONNUSAMY <ponnusamy.simpleman@gmail.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.9\n"
+"Language-Team: tamil <tamilinix@yahoogroups.com>\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n>1;"
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
@@ -67,15 +68,15 @@ msgstr "à®…à®™à¯à®•à¯€à®•à®°à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தரவரிசà¯
#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
-msgstr "தேதிநேரம௠சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯"
+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:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
-msgstr "ip விலாசமà¯"
+msgstr "IP விலாசமà¯"
#: contrib/comments/models.py:86
msgid "is removed"
@@ -85,7 +86,7 @@ msgstr "நீகà¯à®•à®ªà®Ÿà¯à®Ÿà®¤à¯"
msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
-msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯ செரியாக இலà¯à®²à¯ˆà®¯à¯†à®©à¯à®±à®¾à®²à¯ இநà¯à®¤à¯ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ கà¯à®±à®¿à®¯à®¿à®Ÿà®µà¯à®®à¯. இதறà¯à®•à¯ பதிலாக \"இநà¯à®¤ கà¯à®±à®¿à®ªà¯à®ªà¯ நீகà¯à®•à®ªà®Ÿà¯à®Ÿà®¤à¯\" காணà¯à®ªà®¿à®•à¯à®•à®ªà®Ÿà¯à®®à¯."
+msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯ சரியாக இலà¯à®²à¯ˆà®¯à¯†à®©à¯à®±à®¾à®²à¯ இநà¯à®¤ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ கà¯à®±à®¿à®¯à®¿à®Ÿà®µà¯à®®à¯. இதறà¯à®•à¯ பதிலாக \"இநà¯à®¤ கà¯à®±à®¿à®ªà¯à®ªà¯ நீகà¯à®•à®ªà®Ÿà¯à®Ÿà®¤à¯\" காணà¯à®ªà®¿à®•à¯à®•à®ªà®Ÿà¯à®®à¯."
#: contrib/comments/models.py:91
msgid "comments"
@@ -128,15 +129,15 @@ msgstr "சà¯à®¤à®¨à¯à®¤à®°à®®à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯"
#: contrib/comments/models.py:177
msgid "free comments"
-msgstr "சà¯à®¤à®¨à¯à®¤à®°à®®à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯"
+msgstr "சà¯à®¤à®¨à¯à®¤à®°à®®à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"
#: contrib/comments/models.py:233
msgid "score"
-msgstr "மதிபà¯à®ªà¯€à®Ÿà¯"
+msgstr "மதிபà¯à®ªà¯€à®Ÿà¯ "
#: contrib/comments/models.py:234
msgid "score date"
-msgstr "மதிபà¯à®ªà¯€à®Ÿà¯ தேதி"
+msgstr "மதிபà¯à®ªà¯€à®Ÿà¯à®Ÿà¯ தேதி"
#: contrib/comments/models.py:237
msgid "karma score"
@@ -189,7 +190,7 @@ msgstr "மடà¯à®Ÿà¯Šà®±à¯à®¤à¯à®¤à®¾à®²à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®
#: contrib/comments/models.py:281
msgid "moderator deletions"
-msgstr "மடà¯à®Ÿà¯Šà®±à¯à®¤à¯à®¤à®¾à®²à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
+msgstr "மடà¯à®Ÿà¯Šà®±à¯à®¤à¯à®¤à®°à¯à®•à®³à®¾à®²à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"
#: contrib/comments/models.py:285
#, python-format
@@ -198,7 +199,7 @@ msgstr "மடà¯à®Ÿà¯Šà®±à¯à®¤à¯à®¤à®¾à®²à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
-msgstr "அடயாளà¯à®®à¯ இலà¯à®²à®¾à®¤ பயனாளறால௠வாகà¯à®•à®³à®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯"
+msgstr "அடையாளம௠இலà¯à®²à®¾à®¤ பயனாளறால௠வாகà¯à®•à®³à®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯"
#: contrib/comments/views/karma.py:23
msgid "Invalid comment ID"
@@ -208,85 +209,82 @@ msgstr "செலà¯à®²à®¾à®¤ கà¯à®±à®¿à®ªà¯à®ªà¯ ID"
msgid "No voting for yourself"
msgstr "உஙà¯à®•à®³à¯ˆ நீஙà¯à®•à®³à¯‡ தேரà¯à®µà¯ செயà¯à®¤à¯ கொளà¯à®³ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid "This rating is required because you've entered at least one other rating."
-msgstr "மறà¯à®±à¯Šà®°à¯ தரவரிசை அளிகà¯à®•à¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®²à¯ இநà¯à®¤ தரவரிசை தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯."
+msgstr "இநà¯à®¤ தரவரிசை தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯ à®à®©à¯†à®©à®¿à®²à¯ மறà¯à®±à¯Šà®°à¯ தரவரிசை அளிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ விடà¯à®Ÿà®¤à®¾à®²à¯"
-#: contrib/comments/views/comments.py:112
+#: 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 ""
-"%(count)s கà¯à®±à¯ˆà®µà®¾à®• அளிதà¯à®¤ பயனாளரால௠இநà¯à®¤ கà¯à®°à®¿à®ªà¯à®ªà¯ˆ அளà¯à®¤à¯à®¤à®ªà®Ÿà®¤à¯:\n"
+msgstr[0] ""
+"இநà¯à®¤ கà¯à®±à®¿à®ªà¯à®ªà®¾à®©à®¤à¯ கà¯à®±à¯ˆà®µà®¾à®• அளிதà¯à®¤ பயனாளரால௠%(count)s "
+"அளிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯:\n"
"\n"
"%(text)s"
-"%(count)s கà¯à®±à¯ˆà®µà®¾à®• அளிதà¯à®¤ பயனாளரால௠இநà¯à®¤ கà¯à®°à®¿à®ªà¯à®ªà¯ˆ அளà¯à®¤à¯à®¤à®ªà®Ÿà®¤à¯:\n"
+msgstr[1] ""
+"இநà¯à®¤ கà¯à®±à®¿à®ªà¯à®ªà®¾à®©à®¤à¯ கà¯à®±à¯ˆà®µà®¾à®• அளிதà¯à®¤ பயனாளரà¯à®•à®³à®¾à®²à¯ %(count)s"
+" அளிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
-"à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© விவரஙகளை அளிகà¯à®•à®¾à®¤ பயனாளறால௠கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯:\n"
+"à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© விவரஙà¯à®•à®³à¯ˆ அளிகà¯à®•à®¾à®¤ பயனாளரால௠கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯:\n"
+"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "POSTகளà¯à®•à¯à®•à¯ மடà¯à®Ÿà¯à®®à¯ அனà¯à®®à®¤à®¿ உணà¯à®Ÿà¯"
-#: contrib/comments/views/comments.py:193
+#: 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:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "எவறோ கà¯à®°à®¿à®ªà¯à®ªà¯à®±à¯ˆà®¯à¯ˆ செதபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®µà®¿à®Ÿà¯à®Ÿà®¾à®±à¯à®•à®³à¯ (பாதà¯à®•à®¾à®ªà¯à®ªà¯ மீறலà¯)"
+msgstr "எவறோ கà¯à®±à®¿à®ªà¯à®ªà¯à®±à¯ˆà®¯à¯ˆà®šà¯ சேதபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®µà®¿à®Ÿà¯à®Ÿà®°à¯à®•à®³à¯ (பாதà¯à®•à®¾à®ªà¯à®ªà¯ மீறலà¯)"
-#: contrib/comments/views/comments.py:207
+#: 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 "கà¯à®±à®¿à®ªà¯à®ªà¯à®±à¯ˆ படிவதà¯à®¤à®¿à®²à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© இலகà¯à®•à¯ அளவà¯à®°à¯à®•à¯à®• இலà¯à®²à¯ˆ -- object ID à®®à¯à®±à¯ˆà®¯à®¾à®©à®¤à®¾à®• இலà¯à®²à¯ˆ"
+msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯à®±à¯ˆ படிவதà¯à®¤à®¿à®²à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© இலகà¯à®•à¯ அளவà¯à®°à¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ -- object 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 "கà¯à®±à®¿à®ªà¯à®ªà¯ படிவம௠மà¯à®©à¯à®©à¯‹à®Ÿà¯à®Ÿà®®à¯ அலà¯à®²à®¤à¯ பிறà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ˆ வழஙà¯à®•à®µà®¿à®²à¯à®²à¯ˆ."
+msgstr "கà¯à®±à®¿à®ªà¯à®ªà¯ படிவம௠மà¯à®©à¯à®©à¯‹à®Ÿà¯à®Ÿà®®à¯ அலà¯à®²à®¤à¯ பிறà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ˆ வழஙà¯à®•à¯à®µà®¤à¯ இலà¯à®²à¯ˆ"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/login.html:17
msgid "Username:"
-msgstr "பயணர௠பெயரà¯:"
+msgstr "பயனர௠பெயரà¯:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "கடவà¯à®šà¯à®šà¯†à®¾à®²à¯:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯€à®°à®¾?"
-
-#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/registration/password_change_done.html:3
@@ -304,6 +302,15 @@ msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯
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 "விகிதமà¯"
@@ -311,7 +318,7 @@ msgstr "விகிதமà¯"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Required"
-msgstr "தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯ "
+msgstr "தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
@@ -320,88 +327,21 @@ msgstr "விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
-msgstr "பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®¤à¯à®¤à¯ˆ அணà¯à®ªà¯à®ªà¯"
+msgstr "பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®¤à¯à®¤à¯ˆ அனà¯à®ªà¯à®ªà¯"
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
#: contrib/comments/templates/comments/freeform.html:5
msgid "Comment:"
msgstr "விவரமà¯:"
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
+#: 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 "உஙà¯à®•à®³à¯à®ªà¯†à®¯à®°à¯:"
+msgstr "உஙà¯à®•à®³à¯ பெயரà¯:"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -413,9 +353,9 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
-msgstr "அணைதà¯à®¤à¯à®®à¯"
+msgstr "அனைதà¯à®¤à¯à®®à¯"
#: contrib/admin/filterspecs.py:109
msgid "Any date"
@@ -423,7 +363,7 @@ msgstr "எநà¯à®¤ தேதியà¯à®®à¯"
#: contrib/admin/filterspecs.py:110
msgid "Today"
-msgstr "இணà¯à®±à¯"
+msgstr "இனà¯à®±à¯"
#: contrib/admin/filterspecs.py:113
msgid "Past 7 days"
@@ -475,230 +415,295 @@ msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ உளà¯à®³à¯€à®Ÿà¯"
#: contrib/admin/models.py:26
msgid "log entries"
-msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ உளà¯à®³à¯€à®Ÿà¯"
+msgstr "பà¯à®•à¯à®ªà®¤à®¿à®µà¯ உளà¯à®³à¯€à®Ÿà¯à®•à®³à¯"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:230
msgid "All dates"
msgstr "அனைதà¯à®¤à¯ தேதியà¯à®®à¯"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
-msgstr "தயவà¯à®šà¯†à®¯à¯à®¤à¯ சரியான பயனரà¯à®ªà®ªà¯†à®¯à®°à¯ மறà¯à®±à¯à®®à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à¯à®³à®¿à®Ÿà®µà¯à®®à¯. இரணà¯à®Ÿà¯à®®à¯ எழà¯à®¤à¯à®¤à¯à®µà®•à¯ˆà®¯à¯ˆ சாரà¯à®¨à¯à®¤à®¤à¯."
+msgstr "தயவà¯à®šà¯†à®¯à¯à®¤à¯ சரியான பயனரà¯à®ªà¯à®ªà¯†à®¯à®°à¯ மறà¯à®±à¯à®®à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯. இரணà¯à®Ÿà¯à®®à¯ எழà¯à®¤à¯à®¤à¯à®µà®•à¯ˆà®¯à¯ˆà®šà¯ சாரà¯à®¨à¯à®¤à®¤à¯."
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "உளà¯à®³à¯‡ போ"
-#: contrib/admin/views/decorators.py:61
+#: 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 "தயவà¯à®šà¯†à®¯à¯à®¤à¯ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®µà¯ செயà¯. à®à®©à¯†à®©à¯à®±à®¾à®³à¯ காலம௠மà¯à®Ÿà®¿à®µà®Ÿà¯ˆà®¨à¯à®¤à®µà¯. கவலை படவேணà¯à®Ÿà®¾à®®à¯: உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ அணà¯à®ªà¯à®ªà¯à®¤à®²à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. "
+msgstr "தயவà¯à®šà¯†à®¯à¯à®¤à¯ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®µà¯ செயà¯à®•. à®à®©à¯†à®©à¯à®±à®¾à®²à¯ காலம௠மà¯à®Ÿà®¿à®µà®Ÿà¯ˆà®¨à¯à®¤à®¤à¯. கவலை படவேணà¯à®Ÿà®¾à®®à¯: உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ அனà¯à®ªà¯à®ªà¯à®¤à®²à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
-#: contrib/admin/views/decorators.py:68
+#: 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 "உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ உலாவி தறà¯à®•à®¾à®² நிரலà¯à®•à®³à¯ˆ அணà¯à®®à®¤à®¿à®•à¯à®•à®¾à®¤à®µà®¾à®±à¯ உளà¯à®³à®®à¯ˆà®•à¯à®•à®ªà¯ படà¯à®Ÿà®µà®¾à®±à¯ தெரிகிறதà¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ தறà¯à®•à®¾à®²à®¿à®• நிரலை செயலà¯à®ªà®Ÿ செயà¯à®¤à¯, பகà¯à®•à®¤à¯à®¤à¯ˆ மறà¯à®ªà®Ÿà®¿ உளà¯à®³à¯à®µà®¾à®™à¯à®•à®µà¯à®®à¯."
+msgstr "உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ உலாவி தறà¯à®•à®¾à®² நிரலà¯à®•à®³à¯ˆ அமதிகà¯à®•à®¾à®¤à®µà®¾à®±à¯ உளà¯à®³à®®à¯ˆà®•à¯à®•à®ªà¯ படà¯à®Ÿà®µà®¾à®±à¯ தெரிகிறதà¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ தறà¯à®•à®¾à®²à®¿à®• நிரலை செயலà¯à®ªà®Ÿ செயà¯à®¤à¯, பகà¯à®•à®¤à¯à®¤à¯ˆ மறà¯à®ªà®Ÿà®¿ உள௠வாஙà¯à®•à®µà¯à®®à¯. "
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "பயனர௠பெயர௠'@' கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯ˆ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "உனà¯à®•à®³à¯ மிணà¯à®…ஞà¯à®šà®³à¯ à®®à¯à®•à®µà®°à®¿à®‰à®™à¯à®•à®³à¯ பயனர௠பெயர௠இலà¯à®²à¯ˆ. '%s' யை à®®à¯à®¯à®±à¯à®šà¯à®šà®¿ செயà¯à®¯à®µà¯à®®à¯. "
+msgstr "உஙà¯à®•à®³à¯ மின௠அஞà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ உஙà¯à®•à®³à¯ பயனர௠பெயராக இலà¯à®²à¯ˆ. '%s'யை à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®¯à®µà¯à®®à¯."
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:223
msgid "Site administration"
-msgstr "இணைய மேளானà¯à®®à¯ˆ"
+msgstr "இணைய மேலானà¯à®®à¯ˆ"
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" வெறà¯à®±à®¿à®•à®°à®®à®¾à®• சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯."
+msgstr "%(name)s \"%(obj)s\" வெறà¯à®±à®¿à®•à®°à®®à®¾à®•à®šà¯ சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
msgid "You may edit it again below."
msgstr "நீஙà¯à®•à®³à¯ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. "
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: 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:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
-msgstr "%s யை சேரà¯"
+msgstr "%s யை சேரà¯à®•à¯à®•"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "%s சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
msgid "and"
msgstr "மறà¯à®±à¯à®®à¯"
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
-msgstr "%s மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
+msgstr "%s மாறà¯à®±à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "%s அழிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "எநà¯à®¤ பà¯à®²à®®à¯à®®à¯ மாறவிலà¯à®²à¯ˆ."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr " %(name)s \"%(obj)s\" வெறà¯à®±à®¿à®•à®°à®®à®¾à®• மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯."
+msgstr "%(name)s \"%(obj)s\" வெறà¯à®±à®¿à®•à®°à®®à®¾à®• மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯."
-#: contrib/admin/views/main.py:354
+#: 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:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "%s யை மாறà¯à®±à¯"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:473
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "%(name)s ல௠உளà¯à®³ %(fieldname)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:478
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "%(name)s ல௠உளà¯à®³ %(fieldname)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:511
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)s \"%(obj)s\" வெறà¯à®±à®¿à®•à®°à®®à®¾à®• அழிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:514
msgid "Are you sure?"
-msgstr "உறà¯à®¤à®¿à®¯à®¾à®• சொகிறீரà¯à®•à®³à®¾?"
+msgstr "உறà¯à®¤à®¿à®¯à®¾à®• சொலà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à®¾?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:536
#, python-format
msgid "Change history: %s"
msgstr "வரலாறà¯à®±à¯ˆ மாறà¯à®±à¯: %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s"
msgstr "%s யை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s to change"
msgstr "%s யை மாறà¯à®± தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "தகவலà¯à®šà¯‡à®®à®¿à®ªà¯à®ªà¯ பிழை"
+
+#: 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 %r not found in app %r"
+msgstr "மாதரி %r பகà¯à®•à®®à¯ %rல௠இலà¯à®²à¯ˆ "
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "சமà¯à®®à®¨à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ '%s.%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 `%s.%s` objects"
+msgstr "மாதரி %s பகà¯à®•à®®à¯ %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:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "பூலியன௠(சரி அலà¯à®²à®¤à¯ தவறà¯)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: 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:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "கமாவாள௠பிரிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ à®®à¯à®´à¯ எணà¯"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "தேதி (நேரமிலà¯à®²à®¾à®®à®²à¯)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "தேதி (நேரமà¯à®Ÿà®©à¯)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "மின௠அஞà¯à®šà®²à¯"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
-msgstr "கோபà¯à®ªà¯à®ªà¯ பாதை"
+msgstr "கோபà¯à®ªà¯à®ªà¯ பாதை"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
-msgstr "பà¯à®³à¯à®³à®¿ எணà¯à®•à®³à¯"
+msgstr "தசம எணà¯à®•à®³à¯"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "இலகà¯à®•à¯ à®®à¯à®±à¯ˆ (சரி, தவற௠அலà¯à®²à®¤à¯ ஒனà¯à®±à¯à®®à¯ இலà¯à®²à¯ˆ)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "ஆதி மாதிரிகà¯à®•à¯ தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯à®¤à¯"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "தொலைபேசி எணà¯"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "உரை"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "நேரமà¯"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
-msgstr "U.S. மாநிலம௠(இரணà¯à®Ÿà¯ மேல௠எழà¯à®¤à¯à®¤à¯à®µà®•à¯ˆ எழà¯à®¤à¯à®¤à¯)"
+msgstr "U.S. மாநிலம௠(இரணà¯à®Ÿà¯ மேல௠எழà¯à®¤à¯à®¤à¯à®µà®•à¯ˆ எழà¯à®¤à¯à®¤à¯"
-#: contrib/admin/views/doc.py:302
+#: 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:28
+msgid "Add user"
+msgstr "பà¯à®¤à®¿à®¯ பயனரà¯"
+
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
-msgstr "ஆவணமாகà¯à®•à®®à¯"
+msgstr "ஆவனமாகà¯à®•à®®à¯"
-# translation of django_ac.po to
-# translation of django_ac.po to tamil
-# Ashwin <ashwin@au-kbc.org>, 2006.
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/registration/password_change_done.html:3
@@ -714,14 +719,15 @@ msgstr "ஆவணமாகà¯à®•à®®à¯"
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
msgid "Change password"
-msgstr "கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ மாறà¯à®±à¯ "
+msgstr "கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ மாறà¯à®±à¯"
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -757,7 +763,7 @@ msgid ""
"This object doesn't have a change history. It probably wasn't added via this "
"admin site."
msgstr ""
-"இநà¯à®¤ பொரà¯à®³à¯ மாறà¯à®± வரலாறà¯à®±à®¿à®²à¯ இலà¯à®²à¯ˆ"
+"இநà¯à®¤ பொரà¯à®³à¯ மாறà¯à®±à¯ வரலாறà¯à®±à®¿à®²à¯ இலà¯à®²à¯ˆ"
"ஒர௠வேளை நிரà¯à®µà®¾à®•à®¤à¯à®¤à®³à®¤à¯à®¤à®¿à®©à¯ மூலம௠சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®®à®²à®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯"
#: contrib/admin/templates/admin/base_site.html:4
@@ -786,36 +792,39 @@ msgid ""
"mail and should be fixed shortly. Thanks for your patience."
msgstr ""
"தவற௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯"
-"வலைதà¯à®¤à®³ நிரà¯à®µà®¾à®•à®¿à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. விரைவில௠சரி செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯. உஙà¯à®•à¯à®³à®¤à¯ பொறà¯à®®à¯ˆà®•à¯à®•à¯ நனà¯à®±à®¿"
+"வலைதà¯à®¤à®³ நிரà¯à®µà®¾à®•à®¿à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. விரைவில௠சரி செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯. உஙà¯à®•à®³à®¤à¯ பொறà¯à®®à¯ˆà®•à¯à®•à¯ நனà¯à®±à®¿"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
msgid "Page not found"
-msgstr "பகà¯à®•à®¤à¯à®¤à¯ˆ காணவிலà¯à®²à¯ˆ"
+msgstr "பகà¯à®•à®¤à¯à®¤à¯ˆà®•à¯ காணவிலà¯à®²à¯ˆ"
#: contrib/admin/templates/admin/404.html:10
msgid "We're sorry, but the requested page could not be found."
-msgstr ""
-"நீஙà¯à®•à®³à¯ விரà¯à®®à¯à®ªà®¿à®¯ பகà¯à®•à®¤à¯à®¤à¯ˆ காண இயலவிலà¯à®²à¯ˆ. "
-"அதறà¯à®•à®¾à®• வரà¯à®¨à¯à®¤à¯à®•à®¿à®±à¯‹à®®à¯."
+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:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
-msgstr "சேரà¯"
+msgstr "சேரà¯à®•à¯à®•"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
-msgstr "மாறà¯à®±à¯"
+msgstr "மாறà¯à®±à¯à®•"
#: contrib/admin/templates/admin/index.html:44
msgid "You don't have permission to edit anything."
-msgstr "உஙà¯à®•à®³à¯à®•à¯à®•à¯ மாறà¯à®±à¯à®µà®¤à®±à¯à®•à¯ உரிமையிலà¯à®²à¯ˆ"
+msgstr "உஙà¯à®•à®³à¯à®•à¯à®•à¯ மாறà¯à®±à¯à®µà®¤à®±à¯à®•à¯à®°à®¿à®¯ உரிமையிலà¯à®²à¯ˆ"
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
@@ -832,58 +841,80 @@ msgstr "எதà¯à®µà¯à®®à¯ கிடைகà¯à®•à®µà®¿à®²à¯à®²à¯ˆ"
#: contrib/admin/templates/admin/change_list.html:11
#, python-format
msgid "Add %(name)s"
-msgstr "%(name)s சேரà¯"
+msgstr "%(name)s சேரà¯à®•à¯à®•"
#: contrib/admin/templates/admin/login.html:22
msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
msgstr "நீஙà¯à®•à®³à¯ தஙà¯à®•à®³à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ <a href=\"/password_reset/\"> மறநà¯à®¤à¯ விடà¯à®Ÿà¯€à®°à¯à®•à®³à®¾?"
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "நலà¯à®µà®°à®µà¯,"
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
-msgstr "நீகà¯à®•à¯"
+msgstr "நீகà¯à®•à¯à®•"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr "இநà¯à®¤ '%(object)s' இல௠%(object_name)s நீகà¯à®•à¯à®µà®¤à¯ தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯ மறà¯à®±à®µà®±à¯à®±à¯ˆà®¯à¯à®®à¯ நீகà¯à®•à¯à®®à¯. ஆனால௠அதறà¯à®•à¯ உஙà¯à®•à®³à¯à®•à¯à®•à¯ உரிமையிலà¯à®²à¯ˆ"
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "நீகà¯à®•à¯à®®à¯ '%(escaped_object)s' ஆனத௠%(object_name)s தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯ மறà¯à®±à®µà®±à¯à®±à¯ˆà®¯à¯à®®à¯ நீகà¯à®•à¯à®®à¯. ஆனால௠அதை நீகà¯à®•à¯à®µà®¤à®±à¯à®•à¯à®°à®¿à®¯ உரிமை உஙà¯à®•à®³à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"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)s\" %(object_name)s நீகà¯à®•à¯à®µà®¤à®¿à®²à¯ நிசà¯à®šà®¯à®®à®¾?"
+"நீஙà¯à®•à®³à¯ இநà¯à®¤ \"%(escaped_object)s\" %(object_name)s நீகà¯à®•à¯à®µà®¤à®¿à®²à¯ நிசà¯à®šà®¯à®®à®¾?"
"தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯ மறà¯à®±à®µà¯ˆà®¯à¯à®®à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯. "
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
-msgstr "ஆம௠எனகà¯à®•à¯ உறà¯à®¤à®¿ "
+msgstr "ஆமà¯, எனகà¯à®•à¯ உறà¯à®¤à®¿"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid " By %(title)s "
-msgstr "%(title)s ஆல௠"
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ஆலà¯"
#: 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/pagination.html:10
+msgid "Show all"
+msgstr "எலà¯à®²à®¾à®µà®±à¯à®±à¯ˆà®¯à¯à®®à¯ காடà¯à®Ÿà¯"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "வடிகடà¯à®Ÿà®¿"
+
#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
-msgstr "தளà¯à®¤à¯à®¤à®¿à®²à¯ பார௠"
+msgstr "தளதà¯à®¤à®¿à®²à¯ பாரà¯"
#: contrib/admin/templates/admin/change_form.html:30
msgid "Please correct the error below."
-msgstr "கீழே உளà¯à®³ தவறà¯à®•à®³à¯ˆà®¤à¯à®¤à®¿à®°à¯à®¤à¯à®¤à¯"
+msgid_plural "Please correct the errors below."
+msgstr[0] "கீழே உளà¯à®³ தவறà¯à®¯à¯ˆà®¤à¯ திரà¯à®¤à¯à®¤à¯à®•"
+msgstr[1] "கீழே உளà¯à®³ தவறà¯à®•à®³à¯ˆà®¤à¯ திரà¯à®¤à¯à®¤à¯à®•"
#: contrib/admin/templates/admin/change_form.html:48
msgid "Ordering"
@@ -891,7 +922,7 @@ msgstr "வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®¤à®²à¯"
#: contrib/admin/templates/admin/change_form.html:51
msgid "Order:"
-msgstr "வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯"
+msgstr "வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯:"
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
@@ -907,23 +938,52 @@ msgstr "சேமிதà¯à®¤à¯ மாறà¯à®±à®¤à¯à®¤à¯ˆ தொடரà¯à®•"
#: contrib/admin/templates/admin/submit_line.html:7
msgid "Save"
-msgstr "சேமி"
+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/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
+msgid "Password"
+msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯(மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "மேலே அதே கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯, சரிபாரà¯à®ªà¯à®ªà®¤à®±à¯à®•à®¾à®• ."
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
#: contrib/admin/templates/registration/password_change_form.html:10
msgid "Password change"
-msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®®à¯"
+msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à¯"
#: contrib/admin/templates/registration/password_change_done.html:6
#: contrib/admin/templates/registration/password_change_done.html:10
msgid "Password change successful"
-msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®®à¯ வெறà¯à®±à®¿ "
+msgstr "வெறà¯à®±à®¿à®•à®°à®®à®¾à®• கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®ªà®Ÿà¯à®Ÿà®¤à¯"
#: contrib/admin/templates/registration/password_change_done.html:12
msgid "Your password was changed."
-msgstr "உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®ªà¯ படà¯à®Ÿà¯à®³à¯à®³à®¤à¯"
+msgstr "உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®ªà®Ÿà¯à®Ÿà®¤à¯"
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/password_reset_form.html:6
@@ -937,10 +997,8 @@ msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll reset "
"your password and e-mail the new one to you."
msgstr ""
-"கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மறநà¯à®¤à¯ விடà¯à®Ÿà®¾à®²à¯"
-"உஙà¯à®•à®³à®¤à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•"
-"அதன௠பிறக௠உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®¿à®¯à®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ "
-"உஙà¯à®•à®³à®¤à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®®à¯"
+"கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯€à®°à®¾? உஙà¯à®•à®³à®¤à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•,அதன௠பிறக௠உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯"
+" மாறà¯à®±à®¿à®¯à®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ உஙà¯à®•à®³à®¤à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®®à¯"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -952,9 +1010,7 @@ msgstr "எனத௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à®¿à®¯à
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr ""
-"வலைதà¯à®¤à®³à®¤à¯à®¤à®¿à®²à¯ உஙà¯à®•à®³à®¤à¯ பொனà¯à®©à®¾à®© நேரதà¯à®¤à¯ˆ "
-"செலவழிதà¯à®¤à®®à¯ˆà®•à¯à®•à¯ மிகà¯à®¨à¯à®¤ நனà¯à®±à®¿"
+msgstr "வலைதà¯à®¤à®³à®¤à¯à®¤à®¿à®²à¯ உஙà¯à®•à®³à®¤à¯ பொனà¯à®©à®¾à®© நேரதà¯à®¤à¯ˆ செலவழிதà¯à®¤à®®à¯ˆà®•à¯à®•à¯ மிகà¯à®¨à¯à®¤ நனà¯à®±à®¿"
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
@@ -970,9 +1026,7 @@ 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:12
@@ -991,7 +1045,7 @@ msgstr "பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯ மாறà¯à®±à®¤à¯à®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯:"
+msgstr "கடவà¯à®šà¯à®šà¯Šà®²à®¿à®©à¯ மாறà¯à®±à®¤à¯à®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
@@ -1009,7 +1063,7 @@ 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 "
+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:"
@@ -1017,7 +1071,7 @@ msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à®¿à®¯à®®à¯ˆà®•à¯à®
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "உஙà¯à®•à®³à®¤à¯ பயனாளர௠பெயரà¯, (நீஙà¯à®•à®³à¯ மறநà¯à®¤à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯ ): "
+msgstr "உஙà¯à®•à®³à®¤à¯ பயனாளர௠பெயரà¯, நீஙà¯à®•à®³à¯ மறநà¯à®¤à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
@@ -1026,78 +1080,15 @@ msgstr "எஙà¯à®•à®³à®¤à¯ வலைதà¯à®¤à®³à®¤à¯à®¤à¯ˆ பயன௠ப
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
-msgstr "இநà¯à®¤ %(site_name)s -இன௠கà¯à®´à¯ "
+msgstr "இநà¯à®¤ %(site_name)s -இன௠கà¯à®´à¯"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®•à®³à¯"
-# translation of django_ad.po to
-# translation of django_ad.po to
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# aukbc-guest, 2006.
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
-msgstr "ஆவணமாகà¯à®•à®•à¯ கà¯à®±à®¿à®¯à¯€à®Ÿà¯"
+msgstr "ஆவணமாகà¯à®•à®•à¯ கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à¯"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
@@ -1111,9 +1102,9 @@ msgid ""
msgstr ""
"\n"
"<p class=\"help\"> பà¯à®¤à¯à®¤à®• கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à¯ˆ நிறà¯à®µ இநà¯à®¤ இணைபà¯à®ªà®¿à®©à¯ˆ பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯à®ªà¯ \n"
-"படà¯à®Ÿà¯ˆà®•à¯à®•à¯ இழà¯à®•à¯à®•à®µà¯à®®à¯. அலà¯à®²à®¤à¯ வலத௠கிிளிக செயà¯à®¤à¯ பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à®¿à®²à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯. \n"
+"படà¯à®Ÿà¯ˆà®•à¯à®•à¯ இழà¯à®•à¯à®•à®µà¯à®®à¯. அலà¯à®²à®¤à¯ வலத௠கிளிக௠செயà¯à®¤à¯ பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à®¿à®²à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯. \n"
" இனி தளதà¯à®¤à®¿à®²à¯ எநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ இரà¯à®¨à¯à®¤à¯à®®à¯ பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà®¿à®©à¯ˆ தேரà¯à®µà¯à®šà¯†à®¯à¯à®¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. \n"
-" நீஙà¯à®•à®³à¯ இநà¯à®¤ தளதà¯à®¤à¯ˆ \"internal\" என கà¯à¯à®±à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கணிணியில௠இரà¯à®¨à¯à®¤à¯ மடà¯à®Ÿà¯à®®à¯‡ \n"
+" நீஙà¯à®•à®³à¯ இநà¯à®¤ தளதà¯à®¤à¯ˆ \"internal\" என கà¯à®±à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கணிணியில௠இரà¯à®¨à¯à®¤à¯ மடà¯à®Ÿà¯à®®à¯‡ \n"
" à®’à®°à¯à®šà®¿à®² பà¯à®¤à¯à®¤à®•à®•à¯à®•à¯à®±à®¿à®•à®³à¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®®à¯à®Ÿà®¿à®¯à¯à®®à¯\n "
" உஙà¯à®•à®³à¯à®•à¯à®•à¯, கணிணி \"internal\" என உறà¯à®¤à®¿ செயà¯à®¯ கணிணிமேளாலரை அணà¯à®•à®µà¯à®®à¯.</p>\n"
@@ -1192,17 +1183,17 @@ msgid ""
"'http://'."
msgstr "இத௠மà¯à®´à¯à®®à¯ˆà®¯à®¾à®© பாதையாக (மேலே உளà¯à®³à®¤à¯ போல) அலà¯à®²à®¤à¯ \"http\"//\" என தொடஙà¯à®•à¯à®®à¯ வலை à®®à¯à®•à®µà®°à®¿à®¯à®¾à®• இரà¯à®•à¯à®•à®²à®¾à®®à¯."
-#: contrib/redirects/models.py:12
+#: contrib/redirects/models.py:13
msgid "redirect"
msgstr "திரà¯à®®à¯à®ª அனà¯à®ªà¯à®ªà¯"
-#: contrib/redirects/models.py:13
+#: contrib/redirects/models.py:14
msgid "redirects"
msgstr "திரà¯à®®à¯à®ª அனà¯à®ªà¯à®ªà¯à®•à®¿à®±à®¤à¯. "
#: contrib/flatpages/models.py:8
msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr "உதாரணமà¯: '/about/contact/'. à®®à¯à®©à¯à®©à¯à®®à¯ பினà¯à®©à¯à®®à¯ '/' உளà¯à®³à®¤à¯ˆ உறà¯à®¤à®¿ செயà¯à®•. "
+msgstr "உதாரணமà¯: '/about/contact/'. à®®à¯à®©à¯à®©à¯à®®à¯ பினà¯à®©à¯à®®à¯ '/' உளà¯à®³à®¤à¯ˆ உறà¯à®¤à®¿ செயà¯à®•."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -1222,8 +1213,8 @@ msgstr "வாரà¯à®ªà¯à®ªà¯à®°à¯ பெயரà¯"
#: contrib/flatpages/models.py:13
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr "உதாரணம௠'flatpages/contact_page'. இத௠இலà¯à®²à¯ˆà®¯à¯†à®©à®¿à®²à¯ 'flatpages/default' எனà¯à®ªà®¤à¯‡ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.பà¯à®ªà®Ÿà¯à®®à¯."
#: contrib/flatpages/models.py:14
@@ -1242,151 +1233,179 @@ msgstr "எளிய பகà¯à®•à®®à¯"
msgid "flat pages"
msgstr "எளிய பகà¯à®•à®™à¯à®•à®³à¯"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: 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:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "கà¯à®±à®¿à®®à¯à®±à¯ˆ பெயரà¯"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:42
msgid "permission"
msgstr "அனà¯à®®à®¤à®¿"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
msgid "permissions"
msgstr "அனà¯à®®à®¤à®¿à®•à®³à¯"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:60
msgid "group"
msgstr "கà¯à®´à¯"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
msgid "groups"
msgstr "கà¯à®´à¯à®•à¯à®•à®³à¯"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:90
msgid "username"
msgstr "பயனர௠பெயரà¯"
-#: contrib/auth/models.py:56
+#: 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:57
+#: contrib/auth/models.py:92
msgid "last name"
msgstr "கடைசி பெயரà¯"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:93
msgid "e-mail address"
msgstr "மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "password"
msgstr "கடவà¯à®šà¯à®šà¯Šà®²à¯"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "Use '[algo]$[salt]$[hexdigest]'"
msgstr "பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ '[algo]$[salt]$[hexdigest]'"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "staff status"
msgstr "பணியாளர௠நிலை"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "Designates whether the user can log into this admin site."
-msgstr "பயனரà¯, 'மேலாளலரà¯' பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ நà¯à®´à¯ˆà¯à®´à¯ˆà®µà®¤à¯ˆ à®®à¯à®Ÿà®¿à®µà¯ செயà¯à®•à®¿à®±à®¤à¯ "
+msgstr "பயனரà¯, 'மேலாளலரà¯' பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ நà¯à®´à¯ˆà®µà®¤à¯ˆ à®®à¯à®Ÿà®¿à®µà¯ செயà¯à®•à®¿à®±à®¤à¯"
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:96
msgid "active"
msgstr "செயலà¯à®ªà®Ÿà¯à®®à¯"
-#: contrib/auth/models.py:62
+#: 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:63
+#: 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:64
+#: contrib/auth/models.py:99
msgid "date joined"
msgstr "சேரà¯à®¨à¯à®¤ தேதி"
-#: contrib/auth/models.py:66
+#: 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 "பயனர௠தனத௠அனà¯à®®à®¤à®¿à®•à®³à¯‹à®Ÿà¯ ,தான௠உளà¯à®³ கà¯à®´à¯à®µà®¿à®©à®¤à¯ அனà¯à®®à®¤à®¿à®•à®³à¯ˆà¯ˆà®¯à¯à®®à¯ பெறà¯à®µà®¾à®°à¯."
+msgstr "பயனர௠தனத௠அனà¯à®®à®¤à®¿à®•à®³à¯‹à®Ÿà¯ ,தான௠உளà¯à®³ கà¯à®´à¯à®µà®¿à®©à®¤à¯ அனà¯à®®à®¤à®¿à®•à®³à¯ˆà®¯à¯à®®à¯ பெறà¯à®µà®¾à®°à¯."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:102
msgid "user permissions"
msgstr "பயனர௠அனà¯à®®à®¤à®¿à®•à®³à¯"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:105
msgid "user"
msgstr "பயனரà¯"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:106
msgid "users"
msgstr "பயனரà¯à®•à®³à¯"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:111
msgid "Personal info"
msgstr "தனிபà¯à®ªà®Ÿà¯à®Ÿ விவரமà¯"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:112
msgid "Permissions"
msgstr "அனà¯à®®à®¤à®¿à®•à®³à¯"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:113
msgid "Important dates"
msgstr "à®®à¯à®•à¯à®•à®¿à®¯à®®à®¾à®© தேதிகளà¯"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:114
msgid "Groups"
msgstr "கà¯à®´à¯à®•à¯à®•à®³à¯"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:256
msgid "message"
msgstr "செயà¯à®¤à®¿"
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:52
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
-msgstr " உஙà¯à®•à®³à¯ இணைய உலாவியில௠கà¯à®•à¯à®•à®¿à®•à®³à¯ செயலாகà¯à®•à®®à¯ பெறவிலà¯à®²à¯ˆ. உளà¯à®¨à¯à®´à¯ˆà®µà®¤à®±à¯à®•à¯à®•à¯ கà¯à®•à¯à®•à®¿à®•à®³à¯ அவசியமà¯."
+msgstr " உஙà¯à®•à®³à¯ இணைய உலாவியில௠கà¯à®•à¯à®•à®¿à®•à®³à¯ செயலாகà¯à®•à®®à¯ பெறவிலà¯à®²à¯ˆ. உளà¯à®¨à¯à®´à¯ˆà®µà®¤à®±à¯à®•à¯ கà¯à®•à¯à®•à®¿à®•à®³à¯ அவசியமà¯."
-#: contrib/contenttypes/models.py:25
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "இநà¯à®¤ கணகà¯à®•à¯ செயலà¯à®ªà®Ÿ தà¯à®µà®™à¯à®•à®µà®¿à®²à¯à®²à¯ˆ"
+
+#: contrib/contenttypes/models.py:20
msgid "python model class name"
msgstr "python model class name"
-#: contrib/contenttypes/models.py:28
+#: contrib/contenttypes/models.py:23
msgid "content type"
-msgstr "பொரà¯à®³à®Ÿà®•à¯à®• வகை "
+msgstr "பொரà¯à®³à®Ÿà®•à¯à®• வகை"
-#: contrib/contenttypes/models.py:29
+#: contrib/contenttypes/models.py:24
msgid "content types"
msgstr "பொரà¯à®³à®Ÿà®•à¯à®• வகைகளà¯"
-#: contrib/sessions/models.py:35
+#: contrib/sessions/models.py:51
msgid "session key"
msgstr "அமரà¯à®µà¯ கà¯à®±à®¿à®¯à¯€"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:52
msgid "session data"
msgstr "அமரà¯à®µà¯ தகவலà¯"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:53
msgid "expire date"
msgstr "காலாவதியாகà¯à®®à¯ தேதி"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:57
msgid "session"
msgstr "அமரà¯à®µà¯"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:58
msgid "sessions"
msgstr "அமரà¯à®µà¯à®•à®³à¯"
@@ -1406,21 +1425,6 @@ msgstr "வலைதà¯à®¤à®³à®®à¯"
msgid "sites"
msgstr "வலைதà¯à®¤à®³à®™à¯à®•à®³à¯"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "தேதி வடிவமà¯"
-
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "தேதிநேர வடிவமà¯"
-
-# translation of django_ae.po to
-# translation of django_ae.po to
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "நேரதà¯à®¤à®¿à®©à¯ அமைபà¯à®ªà¯à®®à¯"
-
#: utils/dates.py:6
msgid "Monday"
msgstr "திஙà¯à®•à®³à¯"
@@ -1575,537 +1579,558 @@ msgstr "டிச."
#: utils/timesince.py:12
msgid "year"
-msgstr "வரà¯à®Ÿà®®à¯"
+msgid_plural "years"
+msgstr[0] "வரà¯à®Ÿà®®à¯"
+msgstr[1] "வரà¯à®Ÿà®™à¯à®•à®³à¯"
#: utils/timesince.py:13
msgid "month"
-msgstr "மாதமà¯"
+msgid_plural "months"
+msgstr[0] "மாதமà¯"
+msgstr[1] "மாதஙà¯à®•à®³à¯"
#: utils/timesince.py:14
msgid "week"
-msgstr "வாரமà¯"
+msgid_plural "weeks"
+msgstr[0] "வாரமà¯"
+msgstr[1] "வாரஙà¯à®•à®³à¯"
#: utils/timesince.py:15
msgid "day"
-msgstr "நாளà¯"
+msgid_plural "days"
+msgstr[0] "நாளà¯"
+msgstr[1] "நாடà¯à®•à®³à¯"
#: utils/timesince.py:16
msgid "hour"
-msgstr "மணி"
+msgid_plural "hours"
+msgstr[0] "மணி"
+msgstr[1] "மணி"
#: utils/timesince.py:17
msgid "minute"
-msgstr "நிமிடமà¯"
+msgid_plural "minutes"
+msgstr[0] "நிமிடமà¯"
+msgstr[1] "நிமிடஙà¯à®•à®³à¯"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "தேதி_à®®à¯à®±à¯ˆ"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "தேதிநேரமà¯_à®®à¯à®±à¯ˆ"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "நேரமà¯_à®®à¯à®±à¯ˆ"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "வரà¯à®Ÿà®®à¯_மாதமà¯_à®®à¯à®±à¯ˆ"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "மாதமà¯_நாளà¯_à®®à¯à®±à¯ˆ"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "அரபிகà¯"
-#: conf/global_settings.py:37
+#: conf/global_settings.py:40
msgid "Bengali"
msgstr "பெஙà¯à®•à®¾à®²à®¿"
-#: conf/global_settings.py:38
+#: conf/global_settings.py:41
msgid "Czech"
msgstr "செகà¯"
-#: conf/global_settings.py:39
+#: conf/global_settings.py:42
msgid "Welsh"
msgstr "வெலà¯à®¸à¯"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:43
msgid "Danish"
msgstr "டேனிஷà¯"
-#: conf/global_settings.py:41
+#: conf/global_settings.py:44
msgid "German"
msgstr "ஜெரà¯à®®à®©à¯"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:45
msgid "Greek"
msgstr "கிரேகà¯à®•à®®à¯"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:46
msgid "English"
msgstr "ஆஙà¯à®•à®¿à®²à®®à¯"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:47
msgid "Spanish"
msgstr "ஸà¯à®ªà®¾à®©à®¿à®·à¯"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "à®…à®°à¯à®œà¯†à®£à¯à®Ÿà®¿à®¯à®©à¯ ஸà¯à®ªà®¾à®©à®¿à®·à¯ "
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "பீனீஷà¯"
+
+#: conf/global_settings.py:50
msgid "French"
msgstr "பà¯à®°à¯†à®©à¯à®šà¯"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:51
msgid "Galician"
msgstr "கலீஷீயனà¯"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:52
msgid "Hungarian"
msgstr "ஹஙà¯à®•à¯‡à®°à®¿à®¯à®©à¯"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:53
msgid "Hebrew"
msgstr "ஹீபà¯à®°à¯"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:54
msgid "Icelandic"
msgstr "à®à®¸à¯à®²à®¾à®©à¯à®Ÿà®¿à®•à¯"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:55
msgid "Italian"
msgstr "இதà¯à®¤à®¾à®²à®¿à®¯à®©à¯"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:56
msgid "Japanese"
msgstr "ஜபà¯à®ªà®¾à®©à®¿à®¯"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:57
msgid "Dutch"
msgstr "டசà¯à®šà¯"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:58
msgid "Norwegian"
msgstr "நாரà¯à®µà¯€à®šà®¿à®¯à®©à¯"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:59
msgid "Brazilian"
msgstr "பிரேசிலியனà¯"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:60
msgid "Romanian"
msgstr "ரோமானியனà¯"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:61
msgid "Russian"
msgstr "à®°à®·à¯à®¯à®©à¯"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:62
msgid "Slovak"
msgstr "சà¯à®²à¯‹à®µà®¾à®•à¯"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:63
msgid "Slovenian"
msgstr "ஸà¯à®²à¯‹à®µà¯‡à®©à®¿à®¯à®©à¯"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:64
msgid "Serbian"
msgstr "செரà¯à®ªà®¿à®¯à®©à¯"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:65
msgid "Swedish"
msgstr "சà¯à®µà®¿à®Ÿà®¿à®·à¯"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "தமிழà¯"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "தà¯à®°à¯à®•à¯à®•à®¿à®·à¯"
+
+#: conf/global_settings.py:68
msgid "Ukrainian"
msgstr "உகà¯à®°à¯‡à®©à®¿à®¯à®©à¯"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:69
msgid "Simplified Chinese"
msgstr "எளிய சீன மொழி"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:70
msgid "Traditional Chinese"
msgstr "மரப௠சீன மொழி"
-#: core/validators.py:60
+#: core/validators.py:63
msgid "This value must contain only letters, numbers and underscores."
-msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯ எணà¯à®•à®³à¯ அனà¯à®Ÿà®°à¯à®¸à¯à®•à¯‹à®°à¯ மறà¯à®±à¯à®®à¯ உளà¯à®³à®Ÿà®•à¯à®• வேணà¯à®Ÿà¯à®®à¯ "
+msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯, எணà¯à®•à®³à¯ மேலà¯à®®à¯ அனà¯à®Ÿà®°à¯à®¸à¯à®•à¯‹à®°à¯ உளà¯à®³à®Ÿà®•à¯à®• வேணà¯à®Ÿà¯à®®à¯. "
-#: core/validators.py:64
+#: core/validators.py:67
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
-msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯ எணà¯à®•à®³à¯ அனà¯à®Ÿà®°à¯à®¸à¯à®•à¯‹à®°à¯ டஷ௠அலà¯à®²à®¤à¯ சலஷ௠மறà¯à®±à¯à®®à¯ உளà¯à®³à®Ÿà®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
+msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯, எணà¯à®•à®³à¯, அனà¯à®Ÿà®°à¯à®¸à¯à®•à¯‹à®°à¯, டஷ௠அலà¯à®²à®¤à¯ சலஷ௠மறà¯à®±à¯à®®à¯ உளà¯à®³à®Ÿà®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯, எணà¯à®•à®³à¯, அனà¯à®Ÿà®°à¯à®¸à¯à®•à¯‹à®°à¯ டஷ௠அலà¯à®²à®¤à¯ கைபà¯à®ªà®©à¯ மறà¯à®±à¯à®®à¯ உளà¯à®³à®Ÿà®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
-#: core/validators.py:72
+#: core/validators.py:75
msgid "Uppercase letters are not allowed here."
-msgstr "பெரிய எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à¯ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ இலà¯à®²à¯ˆ."
+msgstr "பெரிய எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à¯ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: core/validators.py:76
+#: core/validators.py:79
msgid "Lowercase letters are not allowed here."
-msgstr "சிறிய ய எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à¯ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-
-# translation of django_af.po to
-# translation of django_af.po to
-# translation of django_af.po to
-# translation of django_af.po to
-# translation of django_af.po to
-# translation of django_af.po to
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# R Hariram Aatreya <rha@localhost.localdomain>, 2006.
-#: core/validators.py:83
+msgstr "சிறிய எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à¯ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
+
+#: core/validators.py:86
msgid "Enter only digits separated by commas."
-msgstr "காறà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à®¾à®²à¯ தனிமைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ இலகà¯à®•à®™à®•à®³ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "இஙà¯à®•à¯ எணà¯à®•à®³à¯ˆ மடà¯à®Ÿà¯à®®à¯‡ எழà¯à®¤à®µà¯à®®à¯ காமவாள௠தனிமைபடà¯à®¤à¯à®¤à®µà¯à®®à¯ "
-#: core/validators.py:95
+#: core/validators.py:98
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "காறà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à®¾à®²à¯ தனிமைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ à®®à¯à®±à¯ˆà®¯à®¾à®© e à®®à¯à®•à®µà®°à®¿à®•à®³à¯à¯ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "காறà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à®¾à®²à¯ தனிமைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ à®®à¯à®±à¯ˆà®¯à®¾à®© e à®®à¯à®•à®µà®°à®¿à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:99
+#: core/validators.py:102
msgid "Please enter a valid IP address."
-msgstr "தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© à®.பி à®®à¯à®•à®µà®±à®¿ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© à®.பி à®®à¯à®•à®µà®°à®¿ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:103
+#: core/validators.py:106
msgid "Empty values are not allowed here."
-msgstr "காலியான மதிபà¯à®ªà¯à®•à¯à®•à®³à¯ அனà¯à®®à®¤à®¿Â à®‡à®²à¯à®²à¯ˆ"
+msgstr "காலியான மதிபà¯à®ªà¯à®•à¯à®•à®³à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: core/validators.py:107
+#: core/validators.py:110
msgid "Non-numeric characters aren't allowed here."
-msgstr "எண௠வடிவமிலà¯à®²à®¾à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ அனà¯à®®à®¤à®¿Â à®‡à®²à¯à®²à¯ˆ"
+msgstr "எண௠வடிவமிலà¯à®²à®¾à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: core/validators.py:111
+#: core/validators.py:114
msgid "This value can't be comprised solely of digits."
msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ இலகà¯à®•à®™à¯à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯‡ கொணà¯à®Ÿà®¤à®¾à®• இரà¯à®•à¯à®• கூடாதà¯"
-#: core/validators.py:116
+#: core/validators.py:119
msgid "Enter a whole number."
msgstr "à®®à¯à®´à¯ எண௠மடà¯à®Ÿà¯à®®à¯‡ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:120
+#: core/validators.py:123
msgid "Only alphabetical characters are allowed here."
msgstr "அகர வரிசை எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯‡ அனà¯à®®à®¤à®¿ உனà¯à®Ÿà¯"
-#: core/validators.py:124
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "வரà¯à®Ÿà®®à¯ கணà¯à®Ÿà®¿à®ªà¯à®ªà®¾à®• 1900 அலà¯à®²à®¤à¯ அதறà¯à®•à¯ மேலà¯"
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "à®®à¯à®±à¯ˆà®¯à®²à¯à®²à®¾à®¤ தேதி: %s"
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "வவவவ-மாமா-நாநா எனà¯à®± அமைபà¯à®ªà®¿à®²à¯ உளà¯à®³ à®®à¯à®±à¯ˆà®¯à®¾à®© தேதி மடà¯à®Ÿà¯à®®à¯‡ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:128
+#: core/validators.py:151
msgid "Enter a valid time in HH:MM format."
msgstr "மம-நிநி எனà¯à®± அமைபà¯à®ªà®¿à®²à¯ உளà¯à®³ à®®à¯à®±à¯ˆà®¯à®¾à®© நேரம௠மடà¯à®Ÿà¯à®®à¯‡ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:132 db/models/fields/__init__.py:468
+#: core/validators.py:155 db/models/fields/__init__.py:477
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "வவவவ-மாமா-நாநா மம-நிநி எனà¯à®± அமைபà¯à®ªà®¿à®²à¯ உளà¯à®³ à®®à¯à®±à¯ˆà®¯à®¾à®© தேதி/நேரம௠மடà¯à®Ÿà¯à®®à¯‡ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:136
+#: core/validators.py:160
msgid "Enter a valid e-mail address."
-msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© e à®®à¯à®•à®µà®°à®¿à®•à®³à¯à¯ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© e à®®à¯à®•à®µà®°à®¿à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "அநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ encoding வகையைப௠பரிசோதிகà¯à®•.கோபà¯à®ªà¯ சமரà¯à®ªà®¿à®•à¯à®•à®ªà¯ படà¯à®Ÿà®µà®¿à®²à¯à®²à¯ˆ "
-#: core/validators.py:148
+#: core/validators.py:176
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
-msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© படம௠மடà¯à®Ÿà¯à®®à¯‡ பதிவேறà¯à®±à®®à¯ செயà¯à®¯à®µà¯à®®à¯. நீஙà¯à®•à®³à¯ பதிவேறà¯à®±à®®à¯ செயà¯à®¤ கோபà¯à®ªà¯ படம௠அளà¯à®³à®¾à®¤ அளà¯à®³à®¤à¯ கெடà¯à®Ÿà¯à®ªà¯à®ªà¯‹à®© கோபà¯à®ªà®¾à®•à¯à®®à¯"
+msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© படம௠மடà¯à®Ÿà¯à®®à¯‡ பதிவேறà¯à®±à®®à¯ செயà¯à®¯à®µà¯à®®à¯. நீஙà¯à®•à®³à¯ பதிவேறà¯à®±à®®à¯ செயà¯à®¤ கோபà¯à®ªà¯ படம௠அளà¯à®³à®¾à®¤ அலà¯à®²à®¤à¯ கெடà¯à®Ÿà¯à®ªà¯à®ªà¯‹à®© கோபà¯à®ªà®¾à®•à¯à®®à¯"
-#: core/validators.py:155
+#: core/validators.py:183
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®±à®¿ சறியான படதà¯à®¤à¯ˆà®šà¯ சà¯à®Ÿà¯à®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
+msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®°à®¿ சரியான படதà¯à®¤à¯ˆà®šà¯ சà¯à®Ÿà¯à®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
-#: core/validators.py:159
+#: core/validators.py:187
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr "தொலைபேசி எணà¯à®•à®³à¯ XXX-XXX-XXXX எனà¯à®± அமைபà¯à®ªà®¿à®²à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯. \"%s\" எனà¯à®ªà®¤à¯ à®®à¯à®±à¯ˆà®¯à®³à¯à®³"
-#: core/validators.py:167
+#: core/validators.py:195
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®±à®¿ à®®à¯à®±à¯ˆà®¯à®¾à®© கà¯à®¯à®¿à®•à¯ டைம௠படகà¯à®•à®¾à®Ÿà¯à®šà®¿à®¯à¯ˆà®šà¯ சà¯à®Ÿà¯à®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
+msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®°à®¿ à®®à¯à®±à¯ˆà®¯à®¾à®© கà¯à®¯à®¿à®•à¯ டைம௠படகà¯à®•à®¾à®Ÿà¯à®šà®¿à®¯à¯ˆà®šà¯ சà¯à®Ÿà¯à®Ÿà®µà®¿à®²à¯à®²à¯ˆ"
-#: core/validators.py:171
+#: core/validators.py:199
msgid "A valid URL is required."
-msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© இணையதள à®®à¯à®•à®µà®±à®¿ தேவை"
+msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© இணையதள à®®à¯à®•à®µà®°à®¿ தேவை"
-#: core/validators.py:185
+#: core/validators.py:213
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"à®®à¯à®±à¯ˆà®¯à®¾à®© இணையதள à®®à¯à®•à®µà®±à®¿ தேவை. கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®•à¯à®•à®¤à¯ தவறà¯à®•à®³à®¾à®µà®©:\n"
+"à®®à¯à®±à¯ˆà®¯à®¾à®© இணையதள à®®à¯à®•à®µà®°à®¿ தேவை. கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®•à¯à®•à®¤à¯ தவறà¯à®•à®³à®¾à®µà®©:\n"
"%s"
-#: core/validators.py:192
+#: core/validators.py:220
#, python-format
msgid "Badly formed XML: %s"
msgstr "à®®à¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ XML: %s"
-#: core/validators.py:202
+#: core/validators.py:230
#, python-format
msgid "Invalid URL: %s"
msgstr "à®®à¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ இணையதள à®®à¯à®•à®µà®±à®¿: %s"
-#: core/validators.py:206 core/validators.py:208
+#: core/validators.py:234 core/validators.py:236
#, python-format
msgid "The URL %s is a broken link."
-msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®±à®¿ உடைநà¯à®¤à¯à®³à¯à®³à®¤à¯"
+msgstr "%s எனà¯à®± இணையதள à®®à¯à®•à®µà®°à®¿ உடைநà¯à®¤à¯à®³à¯à®³à®¤à¯"
-#: core/validators.py:214
+#: core/validators.py:242
msgid "Enter a valid U.S. state abbreviation."
-msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© U.S மாநில பெயர௠சà¯à®°à¯à®•à¯à®•à®®à¯ எழà¯à®¤à®µà¯à®®à¯à®´à¯à®¤à®µà¯à®®à¯"
+msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© U.S மாநில பெயர௠சà¯à®°à¯à®•à¯à®•à®®à¯ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:229
+#: core/validators.py:256
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
-msgstr "வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ˆ அளனà¯à®¤à¯ பேசà¯à®™à¯à®•à®³à¯. %s எனà¯à®± வாரà¯à®¤à¯à®¤à¯ˆ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ˆ அளனà¯à®¤à¯ பேசà¯à®™à¯à®•à®³à¯! %s எனà¯à®± வாரà¯à®¤à¯à®¤à¯ˆ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
+msgstr[1] "வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ˆ அளநà¯à®¤à¯ பேசà¯à®™à¯à®•à®³à¯! %s எனà¯à®± வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ இஙà¯à®•à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: core/validators.py:236
+#: core/validators.py:263
#, python-format
msgid "This field must match the '%s' field."
msgstr "இநà¯à®¤ பà¯à®²à®®à¯ %s எனà¯à®± பà¯à®²à®¤à¯à®¤à¯à®Ÿà®©à¯ ஒதà¯à®¤à®¿à®±à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
-#: core/validators.py:255
+#: core/validators.py:282
msgid "Please enter something for at least one field."
msgstr "தயவ௠செயà¯à®¤à¯ ஒர௠பà¯à®²à®¤à¯à®¤à®¿à®²à®¾à®µà®¤à¯ à®à®¤à®¾à®µà®¤à¯ எழà¯à®¤à®µà¯à®®à¯"
-#: core/validators.py:264 core/validators.py:275
+#: core/validators.py:291 core/validators.py:302
msgid "Please enter both fields or leave them both empty."
-msgstr "தயவ௠செயà¯à®¤à¯ இரà¯à¯à®ªà¯à®²à®™à¯à®•à®²à¯ˆà®¯à¯à®®à¯à¯à®®à¯ நிரபà¯à®ªà®µà¯à®®à¯; அலà¯à®²à®¤à¯ இரணà¯à®Ÿà¯ˆà®¯à¯à®®à¯ காலியாக விடவà¯à®®à¯"
+msgstr "தயவ௠செயà¯à®¤à¯ இர௠பà¯à®²à®™à¯à®•à®²à¯ˆà®¯à¯à®®à¯ நிரபà¯à®ªà®µà¯à®®à¯ அலà¯à®²à®¤à¯ இரணà¯à®Ÿà¯ˆà®¯à¯à®®à¯ காலியாக விடவà¯à®®à¯"
-#: core/validators.py:282
+#: core/validators.py:309
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "%(field)s, %(value)s ஆக இரà¯à®¨à¯à®¤à®¾à®²à¯ இனà¯à®¤ பà¯à®²à®®à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
+msgstr "%(field)s, %(value)s ஆக இரà¯à®¨à¯à®¤à®¾à®²à¯ இநà¯à®¤ பà¯à®²à®®à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
-#: core/validators.py:294
+#: core/validators.py:321
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "%(field)s, %(value)s ஆக இலà¯à®²à¯ˆ எனà¯à®±à®¾à®²à¯ இனà¯à®¤ பà¯à®²à®®à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
+msgstr "%(field)s, %(value)s ஆக இலà¯à®²à¯ˆ எனà¯à®±à®¾à®²à¯ இநà¯à®¤ பà¯à®²à®®à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
-#: core/validators.py:313
+#: core/validators.py:340
msgid "Duplicate values are not allowed."
msgstr "போலியான மதிபà¯à®ªà¯à®•à®³à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: core/validators.py:336
+#: core/validators.py:363
#, python-format
msgid "This value must be a power of %s."
msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ %s இன௠அடà¯à®•à¯à®•à®¾à®• இரà¯à®•à¯à®• வேனà¯à®Ÿà¯à®®à¯"
-#: core/validators.py:347
+#: core/validators.py:374
msgid "Please enter a valid decimal number."
-msgstr "தயவà¯à®šà¯†à®¯à¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© பதினà¯à®® எணà¯à®£à¯ˆ நழைகà¯à®•cவà¯à®®à¯"
+msgstr "தயவà¯à®šà¯†à®¯à¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© பதினà¯à®® எணà¯à®£à¯ˆ நà¯à®´à¯ˆà®•à¯à®•à®µà¯à®®à¯"
-#: core/validators.py:349
+#: core/validators.py:378
#, python-format
-msgid ""
-"Please enter a valid decimal number with at most %s total digit."
-"Please enter a valid decimal number with at most %s total digits."
-msgstr ""
-"அதிகபடà¯à®šà®®à¯ %s எணà¯à®£à¯ˆ உளà¯à®³ பதினà¯à®® எணà¯à®£à¯ˆ நà¯à®´à¯ˆ."
-"அதிகபடà¯à®šà®®à¯ %s எணà¯à®•à®³à¯ உளà¯à®³ பதினà¯à®® எணà¯à®£à¯ˆ நà¯à®´à¯ˆ."
+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:352
+#: core/validators.py:381
#, python-format
-msgid ""
-"Please enter a valid decimal number with at most %s decimal place."
-"Please enter a valid decimal number with at most %s decimal places."
-msgstr ""
-"அதிகபடà¯à®šà®®à¯ %s பà¯à®³à¯à®³à®¿ இடம௠ள௠உளà¯à®³ பதினà¯à®® எணà¯à¯ˆ நà¯à®´à¯ˆ"
-"அதிகபடà¯à®šà®®à¯ %s பà¯à®³à¯à®³à®¿ இடஙà¯à®•à®³à¯ உளà¯à®³ பதினà¯à®® எணà¯à¯ˆ நà¯à®´à¯ˆ"
+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:384
+#, 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:362
+#: core/validators.py:394
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "மேலà¯à®à®±à¯à®±à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கோபà¯à®ªà¯ கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®šà®®à¯ %s பைடà¯à®Ÿà¯à®•à®³à¯ உளà¯à®³à®©à®µà®¾ என சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯"
-#: core/validators.py:363
+#: core/validators.py:395
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "மேலà¯à®à®±à¯à®±à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கோபà¯à®ªà¯ அதிகபடà¯à®šà®®à¯ %s பைடà¯à®Ÿà¯à®•à®³à¯ உளà¯à®³à®©à®µà®¾ என சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯."
-#: core/validators.py:376
+#: core/validators.py:412
msgid "The format for this field is wrong."
msgstr "பà¯à®²à®©à¯à®Ÿà¯ˆà®¯ அமைபà¯à®ªà¯ தவறà¯"
-#: core/validators.py:391
+#: core/validators.py:427
msgid "This field is invalid."
-msgstr "இநà¯à®¤ பà¯à®²à®®à¯ செலà¯à®²à®¾à®¤à¯."
+msgstr "இநà¯à®¤ பà¯à®²à®®à¯ செலà¯à®²à®¾à®¤à¯.ள"
-#: core/validators.py:426
+#: core/validators.py:463
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "%s இரà¯à®¨à¯à®¤à¯ எதà¯à®µà¯à®®à¯ எடà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
-#: core/validators.py:429
+#: core/validators.py:466
#, python-format
msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr "வலைமனை %(url)s எனà¯à®ªà®¤à¯ செலà¯à®²à®¾à®¤ உளà¯à®³à®Ÿà®•à¯à®•-வகை தலைபà¯à®ªà®¾à®© '%(contenttype)s' ஠திரà¯à®ªà¯à®ªà®¿ தநà¯à®¤à¯à®³à¯à®³à®¤à¯."
-#: core/validators.py:462
+#: core/validators.py:499
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
-msgstr " %(line)s கோட௠லிரà¯à®¨à¯à®¤à¯ மூடாத %(tag)s டாகை மூடà¯. ( வரி,\"%(start)s\"வà¯à®Ÿà®©à¯ தà¯à®µà®™à¯à®•à¯à®•à®¿à®©à¯à®±à®¤à¯)"
+msgstr "%(line)s கோட௠லிரà¯à®¨à¯à®¤à¯ மூடாத %(tag)s டாகை மூடà¯. ( வரி,\"%(start)s\"வà¯à®Ÿà®©à¯ தà¯à®µà®™à¯à®•à¯à®•à®¿à®©à¯à®±à®¤à¯)"
-#: core/validators.py:466
+#: core/validators.py:503
#, 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:471
+#: core/validators.py:508
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr "வரி %(line)s இல௠உளà¯à®³ \"%(attr)s\" எனà¯à®ªà®¤à¯ தவறான பணà¯à®ªà®¾à®•à¯à®®.( வரி,\"%(start)s\"வà¯à®Ÿà®©à¯ தà¯à®µà®™à¯à®•à¯à®•à®¿à®©à¯à®±à®¤à¯)"
-#: core/validators.py:476
+#: core/validators.py:513
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr "வரி %(line)s இல௠உளà¯à®³ \"<%(tag)s>\" எனà¯à®ªà®¤à¯ தவறான ஒடà¯à®Ÿà®¾à®•à¯à®®à¯ .( வரி,\"%(start)s\"வà¯à®Ÿà®©à¯ தà¯à®µà®™à¯à®•à¯à®•à®¿à®©à¯à®±à®¤à¯)"
-#: core/validators.py:480
+#: core/validators.py:517
#, 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:485
+#: core/validators.py:522
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr "வரி %(line)s இல௠உளà¯à®³ \"%(attr)s\" பணà¯à®ªà®¿à®©à¯ மதிபà¯à®ªà¯ தவறானதà¯.(வரி \"%(start)s\" இரà¯à®¨à¯à®¤à¯ ஆரமà¯à®ªà®®à¯)"
+#: 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 நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯"
+
#: db/models/manipulators.py:302
#, python-format
-#, fuzzy
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(type)s உடன௠உளà¯à®³ %(object)s உளà¯à®³à®¤à¯"
+msgstr "%(type)s உடன௠உளà¯à®³ %(object)s à®à®±à¯à®•à®©à®µà¯‡ %(field)s கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ உளà¯à®³à®¤à¯"
#: db/models/fields/__init__.py:40
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(fieldname)s உடன௠உளà¯à®³ %(optname)s உயிரà¯à®Ÿà®© உளà¯à®³à®¤à¯"
+msgstr "%(fieldname)s உடன௠உளà¯à®³ %(optname)s à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯"
#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
#: forms/__init__.py:346
msgid "This field is required."
msgstr "இநà¯à®¤ பà¯à®²à®¤à¯à®¤à®¿à®²à¯ மதிபà¯à®ªà¯ தேவை"
-#: db/models/fields/__init__.py:337
+#: db/models/fields/__init__.py:340
msgid "This value must be an integer."
msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ à®®à¯à®´à¯à®µà¯†à®£à¯à®£à®¾à®• இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®"
-#: db/models/fields/__init__.py:369
+#: db/models/fields/__init__.py:372
msgid "This value must be either True or False."
msgstr "இநà¯à®¤ மதிபà¯à®ªà¯ சரி அலà¯à®²à®¤à¯ தவறாக இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯"
-#: db/models/fields/__init__.py:385
+#: db/models/fields/__init__.py:388
msgid "This field cannot be null."
msgstr "இநà¯à®¤ பà¯à®²à®®à¯ காலியாக இரà¯à®•à¯à®•à®•à¯ கூடாதà¯"
-#: db/models/fields/__init__.py:562
+#: db/models/fields/__init__.py:571
msgid "Enter a valid filename."
msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© கோபà¯à®ªà¯à®ªà¯ பெயரை எழà¯à®¤à®µà¯à®®à¯"
-#: db/models/fields/related.py:43
+#: db/models/fields/related.py:51
#, python-format
msgid "Please enter a valid %s."
msgstr "தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© %s எழà¯à®¤à®µà¯à®®à¯"
-#: db/models/fields/related.py:579
+#: db/models/fields/related.py:618
msgid "Separate multiple IDs with commas."
msgstr "பனà¯à®®à¯ˆà®¯à®¿à®²à¯à®³à¯à®³ அடையாளஙà¯à®•à®³à¯ˆ காறà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à®¾à®²à¯ பிரிகà¯à®•à®µà¯à®®à¯"
-#: db/models/fields/related.py:581
+#: db/models/fields/related.py:620
msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "Mac இலà¯, ஒனà¯à®±à¯à®•à¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿà®µà®±à¯à®±à¯ˆ தேரà¯à®µà¯ செயà¯à®¯ \"Control\" அலà¯à®²à®¤à¯ \"Command\" à® à®…à®´à¯à®¤à¯à®¤à®µà¯à®®à¯"
-#: db/models/fields/related.py:625
+#: db/models/fields/related.py:664
#, python-format
-msgid ""
-"Please enter valid %(self)s IDs. The value %(value)r is invalid."
-"Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr ""
-"தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© %(self)s அடையாளஙà¯à®•à®³à¯ˆ எழà¯à®¤à®µà¯à®®à¯. %(value)r எனà¯à®± மதிபà¯à®ªà¯ à®®à¯à®±à¯ˆà®¯à®¾à®©à®¤à®²à¯à®². "
-"தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© %(self)s அடையாளஙà¯à®•à®³à¯ˆ எழà¯à®¤à®µà¯à®®à¯. %(value)r எனà¯à®± மதிபà¯à®ªà¯à®•à®³à¯ à®®à¯à®±à¯ˆà®¯à®¾à®©à®¤à®²à¯à®². "
+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 அடையாளஙà¯à®•à®³à¯ˆ எழà¯à®¤à®µà¯à®®à¯. %(value)r எனà¯à®± மதிபà¯à®ªà¯ à®®à¯à®±à¯ˆà®¯à®¾à®©à®¤à®²à¯à®²."
+msgstr[1] "தயவ௠செயà¯à®¤à¯ à®®à¯à®±à¯ˆà®¯à®¾à®© %(self)s அடையாளஙà¯à®•à®³à¯ˆ எழà¯à®¤à®µà¯à®®à¯. %(value)r எனà¯à®± மதிபà¯à®ªà¯à®•à®³à¯ à®®à¯à®±à¯ˆà®¯à®¾à®©à®¤à®²à¯à®²."
-#: forms/__init__.py:380
+#: forms/__init__.py:381
#, python-format
msgid "Ensure your text is less than %s character."
-msgstr "உஙà¯à®•à®³à¯ உரை %s ஠விட கà¯à®±à¯ˆà®µà®¾à®© எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ˆ உடையதென உறà¯à®¤à®¿ செயà¯à®¤à¯ கொளà¯à®³à¯à®™à¯à®•à®³à¯"
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "உஙà¯à®•à®³à¯ உரை %s ஠விட கà¯à®±à¯ˆà®µà®¾à®© எழà¯à®¤à¯à®¤à¯ உடையத௠எனà¯à®±à¯ உறà¯à®¤à®¿ செயà¯à®¤à¯ கொளà¯à®³à¯à®™à¯à®•à®³à¯"
+msgstr[1] "உஙà¯à®•à®³à¯ உரை %s ஠விட கà¯à®±à¯ˆà®µà®¾à®© எழà¯à®¤à¯à®¤à¯à®•à®³à¯ உடையத௠எனà¯à®±à¯ உறà¯à®¤à®¿ செயà¯à®¤à¯ கொளà¯à®³à¯à®™à¯à®•à®³à¯"
-#: forms/__init__.py:385
+#: forms/__init__.py:386
msgid "Line breaks are not allowed here."
-msgstr "வரி உடைவà¯à®•à®³à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
+msgstr "வரி உடைவà¯à®•à®³à¯ அனà¯à®®à®¤à®¿ இலà¯à®²à¯ˆ"
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯ˆ தேரà¯à®µà¯ செயà¯à®¯à®µà¯à®®à¯; '%(data)s எனà¯à®ªà®¤à¯ %(choices)s இல௠இலà¯à®²à¯ˆ"
+msgstr "à®®à¯à®±à¯ˆà®¯à®¾à®© விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯ˆà®¤à¯ தேரà¯à®µà¯ செயà¯à®¯à®µà¯à®®à¯; '%(data)s எனà¯à®ªà®¤à¯ %(choices)s இல௠இலà¯à®²à¯ˆ"
-#: forms/__init__.py:645
+#: forms/__init__.py:663
msgid "The submitted file is empty."
-msgstr "சமரà¯à®ªà®¿à®•à¯à®•à®ªà¯ படà¯à®Ÿ கோபà¯à®ªà¯ காலியாக உளà¯à®³à®¤à¯"
+msgstr "சமரà¯à®ªà®¿à®•à¯à®•à®ªà¯ படà¯à®Ÿ கோபà¯à®ªà¯à®•à¯ காலியாக உளà¯à®³à®¤à¯"
-#: forms/__init__.py:699
+#: forms/__init__.py:719
msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "-32,768 மறà¯à®±à¯à®®à¯ 32,767 க௠நடà¯à®µà®¿à®²à¯ ஒர௠மà¯à®´à¯ எணà¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "-32,768 மறà¯à®±à¯à®®à¯ 32,767 கà¯à®•à¯ நடà¯à®µà®¿à®²à¯ ஒர௠மà¯à®´à¯ எணà¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
-#: forms/__init__.py:708
+#: forms/__init__.py:729
msgid "Enter a positive number."
-msgstr "ஒர௠நேரà¯à®•à¯à®•à¯à®±à®¿Â à®Žà®£à¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "ஒர௠நேரà¯à®•à¯à®•à¯à®±à®¿ எணà¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
-#: forms/__init__.py:717
+#: forms/__init__.py:739
msgid "Enter a whole number between 0 and 32,767."
-msgstr "0 மறà¯à®±à¯à®®à¯ 32,767 க௠நடà¯à®µà®¿à®²à¯ ஒர௠மà¯à®´à¯ எணà¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
+msgstr "0 மறà¯à®±à¯à®®à¯ 32,767 கà¯à®•à¯ நடà¯à®µà®¿à®²à¯ ஒர௠மà¯à®´à¯ எணà¯à®£à¯ˆ எழà¯à®¤à®µà¯à®®à¯"
-#: template/defaultfilters.py:379
+#: template/defaultfilters.py:401
msgid "yes,no,maybe"
msgstr "ஆமà¯, இலà¯à®²à¯ˆ, இரà¯à®•à¯à®•à®²à®¾à®®à¯"
diff --git a/django/conf/locale/ta/LC_MESSAGES/djangojs.mo b/django/conf/locale/ta/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..2565a6dda0
--- /dev/null
+++ b/django/conf/locale/ta/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/ta/LC_MESSAGES/djangojs.po b/django/conf/locale/ta/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..03fbece314
--- /dev/null
+++ b/django/conf/locale/ta/LC_MESSAGES/djangojs.po
@@ -0,0 +1,112 @@
+# translation of djangojs.po to tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# PONNUSAMY.A <ponnusamy.simpleman@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-14 16:40+0530\n"
+"Last-Translator: PONNUSAMY <ponnusamy.simpleman@gmail.com>\n"
+"Language-Team: tamil <tamilinix@yahoogroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: 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 மணி "
+
+#: 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/conf/locale/te/LC_MESSAGES/django.mo b/django/conf/locale/te/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..8823b2015c
--- /dev/null
+++ b/django/conf/locale/te/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/te/LC_MESSAGES/django.po b/django/conf/locale/te/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..248baf2249
--- /dev/null
+++ b/django/conf/locale/te/LC_MESSAGES/django.po
@@ -0,0 +1,2109 @@
+# translation of django.po to Telugu
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-05-19 12:44+0530\n"
+"Last-Translator: pavithran <pavithran.s@gmail.com>\n"
+"Language-Team: Telugu <indlinux-telugu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; nplurals=n>1;"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "వసà±à°¤à±à°µà± à°à°¡à°¿"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "à°®à±à°–à±à°¯ అంశం"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py: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 "à°à°ªà°¿ à°…à°¡à±à°°à°¸à±"
+
+#: 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 "వసà±à°¤à±à°µà± లోనిది"
+
+#: 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 ""
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "à°µà±à°¯à°•à±à°¤à°¿ పేరà±"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "à°à°ªà°¿ à°…à°¡à±à°°à°¸à±"
+
+#: 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/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "అపరిచిత యూజరà±à°²à± వోటౠవేయలేరà±"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "సరికాని à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°®à± à°à°¡à°¿"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "మీకౠవోటౠహకà±à°•à± లేదà±"
+
+#: contrib/comments/views/comments.py:27
+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 "ఇకà±à°•à°¡ సమరà±à°ªà°£à°²à± మాతà±à°°à°®à±‡ అంగీకరిసà±à°¤à°¾à°®à±"
+
+#: 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 ""
+"à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°®à± ఫారà±à°®à± లో చెలà±à°²à°¨à°¿ 'టారà±à°—ెటౠ' పారామీటరౠ, à°† వసà±à°¤à±à°µà± à°à°¡à°¿ "
+"చెలà±à°²à°¦à±"
+
+#: 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/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/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+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/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/filterspecs.py:143
+msgid "Yes"
+msgstr "à°…à°µà±à°¨à±"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "కాదà±"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "తెలియనది"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "పని సమయమౠ"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "వసà±à°¤à±à°µà±"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "వసà±à°¤à±à°µà±"
+
+#: 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:230
+msgid "All dates"
+msgstr "à°…à°¨à±à°¨à±€ రోజà±à°²à±"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "దయచేసి సరైన యూజరౠపేరౠపాసౠవరà±à°¡à± ఇవà±à°µà°‚à°¡à°¿"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+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 "మీ à°¬à±à°°à±Œà°œà°°à± పై à°•à±à°•à±€à°¸à± అంగీకరించేటటà±à°²à± చేయలేదౠ. దయ చేసి à°•à±à°•à±€à°¸à± ఎనేబలౠచేసి ,మళà±à°³à±€ à°Ÿà±à°°à±ˆ చేయండి"
+
+#: 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 "మీ à°ˆ మెయిలౠఅడà±à°°à°¸à± మీ యూజరౠపేరౠకాదౠ. '%s' ఇచà±à°šà°¿ చూడండి "
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "సైటౠనిరà±à°µà°¾à°¹à°¨"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, 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:22
+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:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ఇంకా"
+
+#: 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:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "à°’à°•à°Ÿà°¿ కాని ,à°…à°‚à°¤ à°•à°¨à±à°¨à°Žà°•à±à°•à±à°µ %(name)s లో %(fieldname)s : %(obj)s "
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "à°’à°•à°Ÿà°¿ కాని ,à°…à°‚à°¤ à°•à°¨à±à°¨à°Žà°•à±à°•à±à°µ %(name)s లో %(fieldname)s"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\"జయపà±à°°à°¦à°‚à°—à°¾ తీసివేయబడà±à°¡à°¡à°¿"
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "మీరౠకచà±à°šà°¿à°¤à°‚à°—à°¾ ఉనà±à°¨à°¾à°°à°¾?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "మారà±à°šà°¬à°¡à°¿à°¨ à°ªà±à°°à°¾à°£à°®à±: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "%s ని à°Žà°¨à±à°¨à±à°•à±‹à°‚à°¡à°¿"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "%s ని మారà±à°šà°Ÿà°¾à°¨à°¿à°•à°¿ à°Žà°¨à±à°¨à±à°•à±‹à°‚à°¡à°¿"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "డాటాబేసౠఎరà±à°°à°°à± "
+
+#: 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 %r not found in app %r"
+msgstr "%r à°Žà°ªà±à°ªà± లో %r మొడలౠదొరకలేడà±"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "సంబంధించిన `%s.%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 `%s.%s` objects"
+msgstr "సంబంధించిన `%s.%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 ""
+
+#: 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 ""
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: 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 "à°ˆ మెయిలౠఅడà±à°°à°¸à± "
+
+#: 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 ""
+
+#: 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:315 contrib/flatpages/models.py:7
+msgid "URL"
+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 "à°Žà°•à±à°¸à± ఎమౠఎలà±"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "యూజరౠని జత చేయండి"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "పాసౠవరà±à°¡à± మారà±à°šà±à°•à±‹à°‚à°¡à°¿"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "ఇలà±à°²à±"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+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 ""
+
+#: 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/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/500.html:4
+msgid "Server error"
+msgstr "సరà±à°µà°°à± తపà±à°ªà±"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "సరà±à°µà°°à± తపà±à°ªà± (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "సరà±à°µà°°à± తపà±à°ªà± <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/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/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:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "జత చేయి"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "మారà±à°šà±"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "మీకౠà°à°¦à°¿ మారà±à°šà°Ÿà°¾à°¨à°¿à°•à°¿ అధికారమౠలేదà±"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "à°ˆ మధà±à°¯ చేసిన పనà±à°²à±"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "నా పనà±à°²à±"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "à°à°®à°¿ దొరకలేదà±"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s జత చేయà±"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "మీరà±<a href=\"/password_reset/\">పాసౠవరà±à°¡ మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾? "
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "à°¸à±à°¸à±à°µà°¾à°—తం"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+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 ""
+
+#: 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 ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "à°…à°µà±à°¨à± "
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+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] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "à°…à°¨à±à°¨à±€ చూడండి"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "సైటౠలో చూడండి"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "à°•à±à°°à°¿à°‚à°¦ ఉనà±à°¨ తపà±à°ªà± సరిదిదà±à°¦à±à°•à±‹à°‚à°¡à°¿"
+msgstr[1] "à°•à±à°°à°¿à°‚à°¦ ఉనà±à°¨ తపà±à°ªà±à°²à± సరిదిదà±à°¦à±à°•à±‹à°‚à°¡à°¿"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+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/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/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
+msgid "Password"
+msgstr "పాసౠవరà±à°¡à±"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "పాసౠవరà±à°¡à± (మళà±à°³à±€)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "ఇందాక పాసౠవరà±à°¡à± మళà±à°³à±€ ఇవà±à°µà°‚à°¡à°¿ పరిశీలన కోసమà±"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "పాసౠవరà±à°¡à± మారà±à°ªà±"
+
+#: 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:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "పాసౠవరà±à°¡à± రీసెటà±"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "పాసౠవరà±à°¡à± మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾? మీ à°ˆ మెయిలౠఅడà±à°°à°¸à± ఇవà±à°µà°‚à°¡à°¿ , మీ పాసౠవరà±à°¡à± రీసెటౠచేసి మీకౠకొతà±à°¤à°¦à°¿ à°ˆ మెయిలౠచేసà±à°¤à°¾à°®à± "
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "à°ˆ మెయిలౠఅడà±à°°à°¸à±"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "నా పాసౠవరà±à°¡à± రీసెటౠచేయండి"
+
+#: contrib/admin/templates/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_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: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_reset_.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "మీరౠఈ à°ˆ మెయిలౠఅందà±à°•à±à°¨à±à°¨à°¾à°°à±, à°Žà°‚à°¦à±à°•à°‚టే పాసౠవరà±à°¡à± రీసెటౠకోసమౠకోరారà±"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "మీ కొతà±à°¤ పాసౠవరà±à°¡à± : %(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 ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: 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 "వసà±à°¤à±à°µà± ఇడి చూడండి"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: 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/widget/date_time.html:3
+msgid "Date:"
+msgstr "తారీఖà±"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "వేళ:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "ఇపà±à°ªà±à°¡à±"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "మారà±à°šà±"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "పటà±à°Ÿà°®à±"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr ""
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr ""
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Example: '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/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 ""
+
+#: 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 "à°ˆ మెయిలౠఅడà±à°°à°¸à±"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "పాసౠవరà±à°¡à±"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: 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:256
+msgid "message"
+msgstr "సమాచారం"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr ""
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "పైతానౠమొడలౠకà±à°²à°¾à°¸à± పేరà±"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+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 "సైటà±à°²à±"
+
+#: 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/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/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ఆరబికà±"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "బెంగాలి"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "à°•à±à°œà±†à°–à±"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "వెలà±à°¶à±"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "డానిశà±"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "జెరà±à°®à°¨à±"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "à°—à±à°°à±€à°•à±"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ఆంగà±à°²à°®à±"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "à°¸à±à°ªà°¾à°¨à°¿à°·à±"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "à°…à°°à±à°œà°‚టీనా à°¸à±à°ªà°¾à°¨à°¿à°·à±"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "ఫీనà±à°¨à°¿à°·à±"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "à°«à±à°°à±†à°‚à°šà±"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "గలిసియనà±"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "హంగారియనà±"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "హెబà±à°°à°¿à°µà±"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "à°à°¸à± లాండికà±"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "ఇటాలియవà±"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "జపనీసà±"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "à°¡à°Ÿà±à°šà±"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "నారà±à°µà±€à°œà°¿à°¯à°¨à±"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "à°¬à±à°°à°œà±€à°²à°¿à°¯à°¨à±"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "రొమానియనà±"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "à°°à°¸à±à°¸à±†à°¨à±"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "à°¸à±à°²à±Šà°µà°¾à°•à±"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "à°¸à±à°²à±Šà°µà°¾à°¨à°¿à°¯à°¨à±"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "సెరà±à°¬à°¿à°¯à°¨à±"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "à°¸à±à°µà±€à°¡à°¿à°·à±"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "తమిళà±"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "à°Ÿà°°à±à°•à°¿à°¶à±"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "à°¯à±à°•à±à°°à°¾à°¨à°¿à°¯à°¨à±"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "వాడà±à°• చైనీసà±"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "à°—à±à°°à°¾à°‚ధిక చైనీసà±"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "à°ˆ విలà±à°µ లో à°…à°•à±à°·à°°à°¾à°²à±, అంకెలౠఇంకా à°…à°‚à°¡à°°à± à°¸à±à°•à±‹à°°à±à°²à± ఉందాలి"
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "à°ˆ విలà±à°µ లో à°…à°•à±à°·à°°à°¾à°²à±, అంకెలౠ, à°…à°‚à°¡à°°à± à°¸à±à°•à±‹à°°à±à°²à± ,డాషౠలౠలేక à°¸à±à°²à°¾à°·à± లౠఉందాలి"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "à°ˆ విలà±à°µ లో à°…à°•à±à°·à°°à°¾à°²à±, అంకెలౠ, à°…à°‚à°¡à°°à± à°¸à±à°•à±‹à°°à±à°²à± లేక హైఫనà±à°²à± ఉందాలి"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "కామాల తో అంకెలౠవిడడీసి ఇవà±à°µà°‚à°¡à°¿ "
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "కామాల తో విడతీసి సరైన à°ˆ మెయిలౠఅడà±à°°à°¸à± ఇవà±à°µà°‚à°¡à°¿"
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "దయచేసి సరైన à°à°ªà°¿ à°…à°¡à±à°°à°¸à± ఇవà±à°µà°‚à°¡à°¿ "
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "ఇకà±à°•à°¡ కాళీ విలà±à°µà°²à± à°…à°¨à±à°®à°¤à°¿à°‚చబడవౠ"
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "అంకెలౠకాని à°šà°¿à°¹à±à°¨à°¾à°²à± à°…à°¨à±à°®à°¤à°¿à°‚చబడవà±"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "à°ˆ విలà±à°µ లో ఉటà±à°Ÿà°¿ మాతà±à°°à°®à±‡ ఉందకూడడà±"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "పూరà±à°£ సంఖà±à°¯ ఇవà±à°µà°‚à°¡à°¿"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "à°…à°•à±à°·à°°à°¾à°²à± అయిన à°šà°¿à°¹à±à°¨à°¾à°²à± మాతà±à°°à°®à±‡ à°…à°¨à±à°®à°¤à°¿à°‚చబడతాయి "
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "సంవతà±à°¸à°°à°®à± 1900 లేక దాని తరà±à°µà°¾à°¤ à°…à°¯à±à°¯à°¿ ఉందాలి "
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "సరికాని తారీఖౠ: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "సరైన à°ˆ మెయిలౠఅడà±à°°à°¸à± ఇవà±à°µà°‚à°¡à°¿"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "సరైన URL కావాలి"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"సరైన HTML ఇవà±à°µà°‚à°¡à°¿ .à°ªà±à°°à°¤à±à°¯à±‡à°•à°®à±ˆà°¨ తపà±à°ªà±à°²à± :\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "సరికాని URL: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "దయచేసి సరైన à°…à°—à±à°° రాజà±à°¯ సంకà±à°·à±‡à°ªà°®à± చేసిన రాషà±à°Ÿà±à°°à°®à± పేరౠఇవà±à°µà°‚à°¡à°¿"
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "à°ˆ ఫీలà±à°¡à± '%s' ఫీలà±à°¡à± à°•à°¿ సరి తూగాలి"
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "దయచేసి à°à°¦à±‹ à°’à°•à°Ÿà°¿ à°à°¦à±‹ à°’à°• ఫీలà±à°¡à± à°•à°¿ ఇవà±à°µà°‚à°¡à°¿ "
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "దయచేసి రెండౠఫీలà±à°¡à±à°²à°²à± ఇవà±à°µà°‚à°¡à°¿ లేకపోతే రెండౠకాళీ à°—à°¾ వదిలేయండి "
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "%(field)s %(value)s à°à°¤à±‡ à°ˆ ఫీలà±à°¡à± ఇవà±à°µà°¾à°²à°¿ "
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "%(field)s %(value)s à°…à°µà±à°µà°•à°ªà±‹à°¤à±‡ à°ˆ ఫీలà±à°¡à± ఇవà±à°µà°¾à°²à°¿ "
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "నకలీ విలà±à°µà°²à± ఇకà±à°•à°¡ à°…à°¨à±à°®à°¤à°¿à°‚చబడవà±"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:378
+#, 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] ""
+msgstr[1] ""
+
+#: core/validators.py:381
+#, 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] ""
+msgstr[1] ""
+
+#: core/validators.py:384
+#, 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] ""
+msgstr[1] ""
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "à°ˆ ఫీలà±à°¡à± ఫోరà±à°®à°¾à°Ÿà± తపà±à°ªà±"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "à°ˆ ఫీలà±à°¡à± సరి కానిది"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s నించి à°à°®à°¿ రాబటà±à°Ÿà°²à±‡à°®à±"
+
+#: core/validators.py:466
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+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 తీసివేయబడినది"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(field)s లో %(object)s తో %(type)s ఉనà±à°¨à°¾à°¯à°¿"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s తో %(fieldname)s à°®à±à°‚దే ఉనà±à°¨à°¾à°¯à°¿ ."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "à°ˆ ఫీలà±à°¡à± అవసరమà±"
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "à°ˆ విలà±à°µ లో ఉందాలి"
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "à°ˆ విలà±à°µ తపà±à°ªà±ˆà°¨ à°’à°ªà±à°ªà±ˆà°¨ ఉందాలి"
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "à°ˆ ఫీలà±à°¡à± కాళీగా ఉందకూడడౠ"
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "దయచేసి సరైన దసà±à°¤à±à°°à°‚ పేరౠఇవà±à°µà°‚à°¡à°¿."
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "దయచేసి సరైన %sఇవà±à°µà°‚à°¡à°¿."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "à°—à±à°‚పౠగా ఉనà±à°¨ à°à°¡à°¿à°² నౠకామా తో విడడీయంది"
+
+#: db/models/fields/related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "\"Control\" కాని \"Command\" మాకౠలో నొకà±à°•à°¿ ఉంచండి , à°’à°•à°Ÿà°¿ à°•à°¨à±à°¨ à°Žà°•à±à°•à±à°µ à°Žà°¨à±à°¨à±à°•à±‹à°µà°Ÿà°¾à°¨à°¿à°•à°¿"
+
+#: db/models/fields/related.py:664
+#, 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 à°à°¡à°¿à°²à± ఇవà±à°µà°‚à°¡à°¿. "
+msgstr[1] ""
+
+#: forms/__init__.py:381
+#, 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] "మీరౠఇచà±à°šà°¿à°¨ టెకà±à°¸à±à°Ÿ %s ఆకà±à°·à°°à°®à±à°²à± à°•à°¨à±à°¨ తకà±à°•à±à°µ ఉందాలి"
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "లైనౠబà±à°°à±‡à°•à±à°¸à± à°•à°¿ ఇకà±à°•à°¡ ఆనà±à°®à°¤à°¿ లేదà±"
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "సరైనది à°Žà°‚à°šà±à°•à±‹à°‚à°¡à°¿; %(choices)s లో '%(data)s' లేవౠ"
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "మీరౠసమరà±à°ªà°¿à°‚à°šà°¿à°¨ ఫైలౠకాళీగా ఉంది "
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr " -32,768 ఇంకా 32,767 మధà±à°¯à°²à±‹ à°’à°• ఆంకె ఇవà±à°µà°‚à°¡à°¿"
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "à°’à°• ధన సంఖà±à°¯ ఇవà±à°µà°‚à°¡à°¿"
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 ఇంకా 32,767 మధà±à°¯à°²à±‹ à°’à°• పూరౠఇవà±à°µà°‚à°¡à°¿"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "à°…à°µà±à°¨à±, కాదౠ, à°à°®à±Š"
+
diff --git a/django/conf/locale/te/LC_MESSAGES/djangojs.mo b/django/conf/locale/te/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..c7c56427cb
--- /dev/null
+++ b/django/conf/locale/te/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/te/LC_MESSAGES/djangojs.po b/django/conf/locale/te/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..7f392fde25
--- /dev/null
+++ b/django/conf/locale/te/LC_MESSAGES/djangojs.po
@@ -0,0 +1,110 @@
+# translation of djangojs.po to Telugu
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# pavithran <pavithran.s@gmail.com>, 2007.
+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-03-06 16:08+0530\n"
+"Last-Translator: pavithran <pavithran.s@gmail.com>\n"
+"Language-Team: Telugu <indlinux-telugu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: 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"
+
+#: 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/conf/locale/tr/LC_MESSAGES/django.mo b/django/conf/locale/tr/LC_MESSAGES/django.mo
index 2415d26ee9..87ac4d05b1 100644
--- a/django/conf/locale/tr/LC_MESSAGES/django.mo
+++ b/django/conf/locale/tr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/tr/LC_MESSAGES/django.po b/django/conf/locale/tr/LC_MESSAGES/django.po
index daa299ca66..a2c080d8f6 100644
--- a/django/conf/locale/tr/LC_MESSAGES/django.po
+++ b/django/conf/locale/tr/LC_MESSAGES/django.po
@@ -2,14 +2,15 @@
# Django 0.95
# Copyright (C) 2006 Django
# This file is distributed under the same license as the Django package.
-#
+#
+# Can Burak Çilingir <canburak@cs.bilgi.edu.tr>, 2007. (Slight modifications)
# Bahadır Kandemir <bahadir@pardus.org.tr>, 2006.
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-10-01 21:09+0300\n"
-"PO-Revision-Date: 2006-10-01 21:19+0300\n"
+"POT-Creation-Date: 2007-03-14 01:38+0200\n"
+"PO-Revision-Date: 2007-03-14 02:06+0200\n"
"Last-Translator: Bahadır Kandemir <bahadir@pardus.org.tr>\n"
"Language-Team: Turkish <bahadir@pardus.org.tr>\n"
"MIME-Version: 1.0\n"
@@ -17,74 +18,134 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
-#: db/models/manipulators.py:305
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:116
+#: db/models/fields/__init__.py:273 db/models/fields/__init__.py:609
+#: db/models/fields/__init__.py:620 newforms/models.py:177
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461
+msgid "This field is required."
+msgstr "Bu alan gerekli."
+
+#: 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] "Metnin %s karakterden az olmasına dikkat edin."
+msgstr[1] "Metnin %s karakterden az olmasına dikkat edin."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Burada birden fazla satır olamaz."
+
+#: 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 ""
+"Geçerli bir seçimde bulunun; %(choices)s değerleri içinde '%(data)s' yok."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Bilinmiyor"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Evet"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Hayır"
+
+#: 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 "Dosya gönderilmedi. Formdaki kodlama türünü kontrol edin."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Gönderilen dosya boş."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 ve 32,767 arası bir sayı girin."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Pozitif tamsayı girin."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 ve 32,767 arası bir sayı girin."
+
+#: db/models/manipulators.py:307
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr "%(type)s ve %(field)s değerine sahip %(object)s kaydı zaten var."
-#: db/models/manipulators.py:332
-#, python-format
-msgid ""
-"Please enter a different %s. The one you entered is already being used for %"
-"s."
-msgstr "Lütfen farklı bir %s girin. Girdiğiniz, %s tarihinde bir kez kullanılmış."
+#: 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 "ve"
-#: db/models/fields/__init__.py:41
+#: db/models/fields/__init__.py:42
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(fieldname)s için %(optname)s değeri zaten seçilmiş."
-#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266
-#: db/models/fields/__init__.py:560 db/models/fields/__init__.py:571
-#: forms/__init__.py:347
-msgid "This field is required."
-msgstr "Bu alan gerekli."
-
-#: db/models/fields/__init__.py:349
+#: db/models/fields/__init__.py:366
msgid "This value must be an integer."
msgstr "Bu değer tamsayı olmalı."
-#: db/models/fields/__init__.py:381
+#: db/models/fields/__init__.py:401
msgid "This value must be either True or False."
msgstr "Bu deÄŸer True ya da False olabilir."
-#: db/models/fields/__init__.py:397
+#: db/models/fields/__init__.py:422
msgid "This field cannot be null."
msgstr "Bu alan boş bırakılamaz."
-#: db/models/fields/__init__.py:424 core/validators.py:146
+#: db/models/fields/__init__.py:456 core/validators.py:148
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "YYYY-AA-GG formatında tarih girin."
-#: db/models/fields/__init__.py:486 core/validators.py:155
+#: db/models/fields/__init__.py:525 core/validators.py:157
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "YYYY-AA-GG SS:DD formatında tarih girin."
-#: db/models/fields/__init__.py:580
+#: db/models/fields/__init__.py:629
msgid "Enter a valid filename."
msgstr "Geçerli bir dosya adı girin."
-#: db/models/fields/related.py:51
+#: db/models/fields/__init__.py:750
+msgid "This value must be either None, True or False."
+msgstr "Bu deÄŸer None, True ya da False olabilir."
+
+#: db/models/fields/related.py:53
#, python-format
msgid "Please enter a valid %s."
msgstr "Lütfen geçerli bir %s girin."
-#: db/models/fields/related.py:618
+#: db/models/fields/related.py:642
msgid "Separate multiple IDs with commas."
msgstr "Birden fazla numarayı virgül ile ayırın."
-#: db/models/fields/related.py:620
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"\"Ctrl\" ve Mac'de \"Command\" tuşunu basılı tutarak birden fazla seçimde "
"bulunabilirsiniz."
-#: db/models/fields/related.py:664
+#: 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] "Lütfen geçerli bir %(self)s numarası girin. %(value)r değeri geçersiz."
-msgstr[1] "Lütfen geçerli %(self)s numaraları girin. %(value)r değerleri geçersiz."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Lütfen geçerli bir %(self)s numarası girin. %(value)r değeri geçersiz."
+msgstr[1] ""
+"Lütfen geçerli %(self)s numaraları girin. %(value)r değerleri geçersiz."
#: conf/global_settings.py:39
msgid "Arabic"
@@ -95,233 +156,222 @@ msgid "Bengali"
msgstr "Bengali Dili"
#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:42
msgid "Czech"
msgstr "Çekçe"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:43
msgid "Welsh"
msgstr "Galce"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:44
msgid "Danish"
msgstr "Danca"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:45
msgid "German"
msgstr "Almanca"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:46
msgid "Greek"
msgstr "Yunanca"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:47
msgid "English"
msgstr "Ä°ngilizce"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:48
msgid "Spanish"
msgstr "Ä°spanyolca"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:49
msgid "Argentinean Spanish"
msgstr "Arjantin İspanyolcası"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:50
msgid "Finnish"
msgstr "Fince"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:51
msgid "French"
msgstr "Fransızca"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:52
msgid "Galician"
msgstr "Galler Dili"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:53
msgid "Hungarian"
msgstr "Macarca"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:54
msgid "Hebrew"
msgstr "Ä°branice"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:55
msgid "Icelandic"
msgstr "Ä°zlanda dili"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:56
msgid "Italian"
msgstr "Ä°talyanca"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:57
msgid "Japanese"
msgstr "Japonca"
-#: conf/global_settings.py:57
+#: 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 "Flamanca"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:62
msgid "Norwegian"
msgstr "Norveç Dili"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr ""
+
+#: conf/global_settings.py:64
msgid "Brazilian"
msgstr "Brezilya Dili"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:65
msgid "Romanian"
msgstr "Romence"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:66
msgid "Russian"
msgstr "Rusça"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:67
msgid "Slovak"
msgstr "Slovakça"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:68
msgid "Slovenian"
msgstr "Slovence"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:69
msgid "Serbian"
msgstr "Sırpça"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:70
msgid "Swedish"
msgstr "İsveççe"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:71
msgid "Tamil"
msgstr "Tamilce"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:72
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:73
msgid "Turkish"
msgstr "Türkçe"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:74
msgid "Ukrainian"
msgstr "Ukraynaca"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:75
msgid "Simplified Chinese"
msgstr "Basiteştirilmiş Çince"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:76
msgid "Traditional Chinese"
msgstr "Gelenelsek Çince"
-#: forms/__init__.py:382
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Metnin %s karakterden az olmasına dikkat edin."
-msgstr[1] "Metnin %s karakterden az olmasına dikkat edin."
-
-#: forms/__init__.py:387
-msgid "Line breaks are not allowed here."
-msgstr "Burada birden fazla satır olamaz."
-
-#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Geçerli bir seçimde bulunun; %(choices)s değerleri içinde '%(data)s' yok."
-
-#: forms/__init__.py:662 core/validators.py:172 core/validators.py:401
-msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Dosya gönderilmedi. Formdaki kodlama türünü kontrol edin."
-
-#: forms/__init__.py:664
-msgid "The submitted file is empty."
-msgstr "Gönderilen dosya boş."
-
-#: forms/__init__.py:720
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "-32,768 ve 32,767 arası bir sayı girin."
-
-#: forms/__init__.py:730
-msgid "Enter a positive number."
-msgstr "Pozitif tamsayı girin."
-
-#: forms/__init__.py:740
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "0 ve 32,767 arası bir sayı girin."
-
-#: core/validators.py:63
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "Bu değer sadece karakter, rakam ve altçizgiden oluşabilir."
-#: core/validators.py:67
+#: core/validators.py:68
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
-msgstr "Bu değer sadece harf, rakam, altçizgi, bölü ve ters bölüden oluşabilir."
+msgstr ""
+"Bu değer sadece harf, rakam, altçizgi, bölü ve ters bölüden oluşabilir."
-#: core/validators.py:71
+#: core/validators.py:72
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr "Bu değer sadece harf, rakam, altçizgi veya çizgiden oluşabilir."
-#: core/validators.py:75
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "Burada büyük harf kullanılamaz."
-#: core/validators.py:79
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "Burada küçük harf kullanılamaz."
-#: core/validators.py:86
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "Sadece virgülle ayrılmış sayılar girin."
-#: core/validators.py:98
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Virgülle ayrılmış geçerli e-posta adresleri girin."
-#: core/validators.py:102
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "Lütfen geçerli bir IP adresi girin."
-#: core/validators.py:106
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "Burada boş değer kullanılamaz."
-#: core/validators.py:110
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "Burada numerik olmayan karakterler kullanılamaz."
-#: core/validators.py:114
+#: core/validators.py:115
msgid "This value can't be comprised solely of digits."
msgstr "Bu alanda sadece rakam kullanılamaz."
-#: core/validators.py:119
+#: core/validators.py:120 newforms/fields.py:126
msgid "Enter a whole number."
msgstr "Sayı girin."
-#: core/validators.py:123
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "Burada sadece alfabetik karakterler kullanılabilir."
-#: core/validators.py:138
+#: core/validators.py:139
msgid "Year must be 1900 or later."
msgstr "Yıl 1900 ya da sonrası olabilir."
-#: core/validators.py:142
+#: core/validators.py:143
#, python-format
-msgid "Invalid date: %s."
+msgid "Invalid date: %s"
msgstr "Geçersiz tarih: %s"
-#: core/validators.py:151
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "SS:DD formatında geçerli bir saat girin."
-#: core/validators.py:160
+#: core/validators.py:162 newforms/fields.py:269
msgid "Enter a valid e-mail address."
msgstr "Geçerli bir e-posta adresi girin."
-#: core/validators.py:176
+#: core/validators.py:178
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@@ -329,26 +379,26 @@ msgstr ""
"Geçerli bir resim girin. Gönderdiğiniz dosya resim değil, ya da bozuk bir "
"dosya."
-#: core/validators.py:183
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "%s adresi geçerli bir resme işaret etmiyor."
-#: core/validators.py:187
+#: core/validators.py:189
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr "Telefon numarası XXX-XXX-XXXX formatında olmalı. \"%s\" geçersiz."
-#: core/validators.py:195
+#: core/validators.py:197
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "%s adresi geçerli bir QuickTime dosyasına işaret etmiyor."
-#: core/validators.py:199
+#: core/validators.py:201
msgid "A valid URL is required."
msgstr "Geçerli bir URL gerekli."
-#: core/validators.py:213
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -357,118 +407,140 @@ msgstr ""
"Metnin geçerli bir HTML kodu olması gerekir. Hatalar:\n"
"%s"
-#: core/validators.py:220
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "Geçersiz XML kodu: %s"
-#: core/validators.py:230
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "Geçersiz adres: %s"
-#: core/validators.py:234 core/validators.py:236
+#: core/validators.py:244 core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "%s kırık bir link."
-#: core/validators.py:242
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr "Geçerli bir şehir kodu girin."
-#: core/validators.py:256
+#: 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öylediğinize dikkat edin! %s kelimesi burada kullanılamaz."
msgstr[1] "Söylediğinize dikkat edin! %s kelimeleri burada kullanılamaz."
-#: core/validators.py:263
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "Bu alan '%s' ile alanı ile uyuşmalı."
-#: core/validators.py:282
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "Lütfen en az bir alana giriş yapın."
-#: core/validators.py:291 core/validators.py:302
+#: core/validators.py:301 core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "Lütfen tüm alanları doldurun ya da hepsini boş bırakın."
-#: core/validators.py:309
+#: core/validators.py:320
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Bu alan %(field)s alanı %(value)s değerine sahipse doldurulmalı."
-#: core/validators.py:321
+#: core/validators.py:333
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Bu alan %(field)s alanı %(value)s değerine sahip değilse doldurulmalı."
-#: core/validators.py:340
+#: core/validators.py:352
msgid "Duplicate values are not allowed."
msgstr "Tekrarlanan deÄŸerler kabul edilmez."
-#: core/validators.py:363
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Bu değer %(lower)s ve %(upper)s arasında olabilir."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Bu deÄŸer en az %s olabilir."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr ""
+
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr "Bu deÄŸer %s ya da kuvvetleri olabilir."
-#: core/validators.py:374
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "Lütfen geçerli bir ondalık sayı girin."
-#: core/validators.py:378
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
msgstr[0] "Lütfen en fazla %s basamaklı bir ondalık sayı girin."
msgstr[1] "Lütfen en fazla %s basamaklı bir ondalık sayı girin."
-#: core/validators.py:381
+#: 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."
+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] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin."
msgstr[1] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin."
-#: core/validators.py:384
+#: 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] "Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
-msgstr[1] "Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+msgstr[1] ""
+"Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
-#: core/validators.py:394
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "Gönderdiğiniz dosyanın en az %s byte uzunlukta olduğundan emin olun."
-#: core/validators.py:395
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "Gönderdiğiniz dosyanın en fazl %s byte uzunlukta olduğundan emin olun."
-#: core/validators.py:412
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "Bu alandaki veri formatı hatalı."
-#: core/validators.py:427
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "Alan geçersiz."
-#: core/validators.py:463
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "%s içinden hiçbirşey aktarılamıyor."
-#: core/validators.py:466
+#: core/validators.py:510
#, python-format
-msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr "%(url)s adresi geçersiz içerik türü (%(contenttype)s) gönderdi."
-#: core/validators.py:499
+#: core/validators.py:543
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
@@ -477,7 +549,7 @@ msgstr ""
"Lütfen %(line)s. satırdaki kapatılmayan %(tag)s etiketini kapatın. (Satır, "
"\"%(start)s\" ile başlıyor.)"
-#: core/validators.py:503
+#: core/validators.py:547
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -486,7 +558,7 @@ msgstr ""
"%(line)s. satırda başlayan bazı kelimeler içerik olarak kabul edilmiyor. "
"(Satır, \"%(start)s\" ile başlıyor.)"
-#: core/validators.py:508
+#: core/validators.py:552
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -495,7 +567,7 @@ msgstr ""
"%(line)s. satırdaki \"%(attr)s\" özelliği geçersiz. (Satır, \"%(start)s\" "
"ile başlıyor.)"
-#: core/validators.py:513
+#: core/validators.py:557
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -504,7 +576,7 @@ msgstr ""
"%(line)s. satırdaki \"<%(tag)s>\" etiketi geçersiz. (Satır, \"%(start)s\" "
"ile başlıyor.)"
-#: core/validators.py:517
+#: core/validators.py:561
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@@ -513,7 +585,7 @@ msgstr ""
"%(line)s. satırdaki bir etiket eksik ya da eklenmesi gereken özellikleri "
"var. (Satır, \"%(start)s\" ile başlıyor.)"
-#: core/validators.py:522
+#: core/validators.py:566
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -537,407 +609,135 @@ msgstr "%(verbose_name)s başarıyla güncellendi."
msgid "The %(verbose_name)s was deleted."
msgstr "%(verbose_name)s silindi."
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "Pazartesi"
-
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "Salı"
-
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "Çarşamba"
-
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "PerÅŸembe"
-
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "Cuma"
-
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "Cumartesi"
-
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "Pazar"
-
-#: utils/dates.py:14
-msgid "January"
-msgstr "Ocak"
-
-#: utils/dates.py:14
-msgid "February"
-msgstr "Åžubat"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "March"
-msgstr "Mart"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "April"
-msgstr "Nisan"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "May"
-msgstr "Mayıs"
-
-#: utils/dates.py:14 utils/dates.py:27
-msgid "June"
-msgstr "Haziran"
-
-#: utils/dates.py:15 utils/dates.py:27
-msgid "July"
-msgstr "Temmuz"
-
-#: utils/dates.py:15
-msgid "August"
-msgstr "AÄŸustos"
-
-#: utils/dates.py:15
-msgid "September"
-msgstr "Eylül"
-
-#: utils/dates.py:15
-msgid "October"
-msgstr "Ekim"
-
-#: utils/dates.py:15
-msgid "November"
-msgstr "Kasım"
-
-#: utils/dates.py:16
-msgid "December"
-msgstr "Aralık"
+#: newforms/models.py:164 newforms/fields.py:360
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Geçerli bir seçimde bulunun; seçiminiz mevcut değerlerden birisi değil."
-#: utils/dates.py:19
-msgid "jan"
-msgstr "oca"
-
-#: utils/dates.py:19
-msgid "feb"
-msgstr "ÅŸub"
-
-#: utils/dates.py:19
-msgid "mar"
-msgstr "mar"
-
-#: utils/dates.py:19
-msgid "apr"
-msgstr "nis"
-
-#: utils/dates.py:19
-msgid "may"
-msgstr "may"
-
-#: utils/dates.py:19
-msgid "jun"
-msgstr "haz"
-
-#: utils/dates.py:20
-msgid "jul"
-msgstr "tem"
-
-#: utils/dates.py:20
-msgid "aug"
-msgstr "aÄŸu"
-
-#: utils/dates.py:20
-msgid "sep"
-msgstr "eyl"
-
-#: utils/dates.py:20
-msgid "oct"
-msgstr "eki"
-
-#: utils/dates.py:20
-msgid "nov"
-msgstr "kas"
-
-#: utils/dates.py:20
-msgid "dec"
-msgstr "ara"
-
-#: utils/dates.py:27
-msgid "Jan."
-msgstr "Oca."
-
-#: utils/dates.py:27
-msgid "Feb."
-msgstr "Åžub."
-
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "AÄŸu."
-
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "Eyl."
-
-#: utils/dates.py:28
-msgid "Oct."
-msgstr "Eki."
-
-#: utils/dates.py:28
-msgid "Nov."
-msgstr "Kas."
-
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "Ara."
-
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "yıl"
-msgstr[1] "yıl"
-
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "ay"
-msgstr[1] "ay"
-
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "hafta"
-msgstr[1] "hafta"
-
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "gün"
-msgstr[1] "gün"
-
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "saat"
-msgstr[1] "saat"
-
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "dakika"
-msgstr[1] "dakika"
-
-#: utils/translation/trans_real.py:362
-msgid "DATE_FORMAT"
-msgstr "DATE_FORMAT"
-
-#: utils/translation/trans_real.py:363
-msgid "DATETIME_FORMAT"
-msgstr "DATETIME_FORMAT"
-
-#: utils/translation/trans_real.py:364
-msgid "TIME_FORMAT"
-msgstr "TIME_FORMAT"
-
-#: utils/translation/trans_real.py:380
-msgid "YEAR_MONTH_FORMAT"
-msgstr "YEAR_MONTH_FORMAT"
-
-#: utils/translation/trans_real.py:381
-msgid "MONTH_DAY_FORMAT"
-msgstr "MONTH_DAY_FORMAT"
-
-#: contrib/contenttypes/models.py:20
-msgid "python model class name"
-msgstr "python model sınıfı"
-
-#: contrib/contenttypes/models.py:23
-msgid "content type"
-msgstr "içerik türü"
-
-#: contrib/contenttypes/models.py:24
-msgid "content types"
-msgstr "içerik türleri"
-
-#: contrib/auth/views.py:39
-msgid "Logged out"
-msgstr "Çıkış yapıldı"
-
-#: contrib/auth/models.py:38 contrib/auth/models.py:57
-msgid "name"
-msgstr "isim"
-
-#: contrib/auth/models.py:40
-msgid "codename"
-msgstr "takma ad"
-
-#: contrib/auth/models.py:42
-msgid "permission"
-msgstr "izin"
-
-#: contrib/auth/models.py:43 contrib/auth/models.py:58
-msgid "permissions"
-msgstr "izinler"
+#: newforms/models.py:181 newforms/fields.py:378 newforms/fields.py:454
+msgid "Enter a list of values."
+msgstr ""
-#: contrib/auth/models.py:60
-msgid "group"
-msgstr "grup"
+#: newforms/models.py:187 newforms/fields.py:387
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Geçerli bir seçimde bulunun; %s mevcut değerlerden biri değil."
-#: contrib/auth/models.py:61 contrib/auth/models.py:100
-msgid "groups"
-msgstr "gruplar"
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Bu deÄŸer en fazla %d karakter olabilir."
-#: contrib/auth/models.py:90
-msgid "username"
-msgstr "kullanıcı adı"
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Bu deÄŸer en az %d arakter olabilir."
-#: contrib/auth/models.py:90
-msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
msgstr ""
-"Gerekli. 30 karakter ya da da az olmalı. Alfanumerik (harf, rakam ve alt "
-"çizgi) karakterler kullanılabilir."
-
-#: contrib/auth/models.py:91
-msgid "first name"
-msgstr "isim"
-#: contrib/auth/models.py:92
-msgid "last name"
-msgstr "soyisim"
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
-#: contrib/auth/models.py:93
-msgid "e-mail address"
-msgstr "e-posta adresi"
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "Geçerli bir tarih girin."
-#: contrib/auth/models.py:94
-msgid "password"
-msgstr "parola"
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr ""
-#: contrib/auth/models.py:94
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "'[algo]$[salt]$[hexdigest]' formatında"
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr ""
-#: contrib/auth/models.py:95
-msgid "staff status"
-msgstr "yönetici modu"
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "Geçerli bir değer girin."
-#: contrib/auth/models.py:95
-msgid "Designates whether the user can log into this admin site."
-msgstr "Kullanıcının yönetici sayfasına girip giremeyeceğini belirler."
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "Geçerli bir URL girin."
-#: contrib/auth/models.py:96
-msgid "active"
-msgstr "aktif"
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "Bu URL kırık bir link gibi duruyor."
-#: contrib/auth/models.py:96
-msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
msgstr ""
-"Kullanıcının Django yönetim sayfasına girip giremeyeceğini belirler. "
-"Kullanıcı hesabı silmek yerine işareti kaldırın."
-#: contrib/auth/models.py:97
-msgid "superuser status"
-msgstr "süper kullanıcı modu"
-
-#: contrib/auth/models.py:97
-msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
msgstr ""
-"Kullanıcının tek tek hak atamasına gerek kalmadan tüm haklara sahip olup "
-"olamayacağını belirler."
-
-#: contrib/auth/models.py:98
-msgid "last login"
-msgstr "son ziyaret"
-
-#: contrib/auth/models.py:99
-msgid "date joined"
-msgstr "kayıt tarihi"
-#: contrib/auth/models.py:101
-msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
msgstr ""
-"Özel olarak atanmış hakların yanı sıra, kullanıcının üyesi olduğu grupların "
-"hakları alır."
-#: contrib/auth/models.py:102
-msgid "user permissions"
-msgstr "kullanıcı izinleri"
-
-#: contrib/auth/models.py:105
-msgid "user"
-msgstr "kullanıcı"
-
-#: contrib/auth/models.py:106
-msgid "users"
-msgstr "kullanıcılar"
-
-#: contrib/auth/models.py:111
-msgid "Personal info"
-msgstr "KiÅŸisel bilgiler"
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
-#: contrib/auth/models.py:112
-msgid "Permissions"
-msgstr "Ä°zinler"
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
-#: contrib/auth/models.py:113
-msgid "Important dates"
-msgstr "Önemli tarihler"
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
-#: contrib/auth/models.py:114
-msgid "Groups"
-msgstr "Gruplar"
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
-#: contrib/auth/models.py:258
-msgid "message"
-msgstr "mesaj"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "bir"
-#: contrib/auth/forms.py:16
-msgid "The two password fields didn't match."
-msgstr "İki parola alanı uyuşmuyor."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "iki"
-#: contrib/auth/forms.py:24
-msgid "A user with that username already exists."
-msgstr "Bu isimde bir kullanıcı zaten var."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "üç"
-#: contrib/auth/forms.py:52
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Web tarayıcınızın çerezleri desteklemediği görülüyor. Çerezler giriş için "
-"gerekli."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "dört"
-#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Lütfen geçerli bir kullanıcı adı ve parola girin. Tüm alanlar büyük/küçük "
-"harf duyarlıdır."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "beÅŸ"
-#: contrib/auth/forms.py:61
-msgid "This account is inactive."
-msgstr "Bu hesap aktif deÄŸil."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "altı"
-#: contrib/auth/forms.py:84
-msgid ""
-"That e-mail address doesn't have an associated user acount. Are you sure "
-"you've registered?"
-msgstr "Bu e-posta hesabıyla ilişkili kullanıcı bulunmuyor. Kayıtlı olduğunuzdan emin misiniz?"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "yedi"
-#: contrib/auth/forms.py:116
-msgid "The two 'new password' fields didn't match."
-msgstr "İki parola alanı uyuşmuyor."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "sekiz"
-#: contrib/auth/forms.py:123
-msgid "Your old password was entered incorrectly. Please enter it again."
-msgstr "Eski parolanız hatalı. Lütfen tekrar girin."
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "dokuz"
#: contrib/redirects/models.py:7
msgid "redirect from"
@@ -1166,7 +966,8 @@ msgid "No voting for yourself"
msgstr "Kendinize oy veremezsiniz"
#: contrib/comments/views/comments.py:27
-msgid "This rating is required because you've entered at least one other rating."
+msgid ""
+"This rating is required because you've entered at least one other rating."
msgstr "Reyting gerekli, çünkü en az bir reyting tanımladınız."
#: contrib/comments/views/comments.py:111
@@ -1216,14 +1017,16 @@ msgstr "Bir ya da daha fazla gerekli alan doldurulmadı"
#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Birisi yorum gönderme formunu kötüye kullanmaya çalıştı (güvenlik ihlali)"
+msgstr ""
+"Birisi yorum gönderme formunu kötüye kullanmaya çalıştı (güvenlik ihlali)"
#: 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 "Bu yorumun geçersiz bir 'hedef' parametresi var -- nesne narası geçersiz"
+msgstr ""
+"Bu yorumun geçersiz bir 'hedef' parametresi var -- nesne narası geçersiz"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
@@ -1242,6 +1045,7 @@ msgstr "Kullanıcı:"
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/view_detail.html:4
@@ -1298,76 +1102,6 @@ msgstr "Yorumu görüntüle"
msgid "Your name:"
msgstr "Ä°sminiz:"
-#: 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 ""
-"Örnek: '/about/contact/'. Başında ve sonunda bölü işareti olduğundan emin "
-"olun."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "başlık"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "içerik"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "yorumlara izin ver"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "şablon adı"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
-msgstr ""
-"Örnek: 'flatpages/contact_page.html'. Eğer birşey yazılmazsa, sistem "
-"otomatik olarak 'flatpages/default.html' kullanacak."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "kayıt gerekli"
-
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Bu seçili ise, sadece kayıtlı kullanıcılar sayfayı görüntüleyebilir."
-
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "düz sayfa"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "düz sayfalar"
-
-#: contrib/sessions/models.py:51
-msgid "session key"
-msgstr "oturum anahtarı"
-
-#: contrib/sessions/models.py:52
-msgid "session data"
-msgstr "oturum bilgisi"
-
-#: contrib/sessions/models.py:53
-msgid "expire date"
-msgstr "bitiÅŸ tarihi"
-
-#: contrib/sessions/models.py:57
-msgid "session"
-msgstr "oturum"
-
-#: contrib/sessions/models.py:58
-msgid "sessions"
-msgstr "oturumlar"
-
#: contrib/sites/models.py:10
msgid "domain name"
msgstr "alan adı"
@@ -1418,18 +1152,6 @@ msgstr "Bu ay"
msgid "This year"
msgstr "Bu yıl"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Evet"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Hayır"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Bilinmiyor"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "işlem zamanı"
@@ -1458,24 +1180,33 @@ msgstr "giriÅŸi kaydet"
msgid "log entries"
msgstr "giriÅŸleri kaydet"
-#: contrib/admin/templatetags/admin_list.py:230
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Tüm tarihler"
-#: contrib/admin/views/auth.py:17 contrib/admin/views/main.py:257
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "\"%(obj)s\" isimli %(name)s eklendi."
-#: contrib/admin/views/auth.py:22 contrib/admin/views/main.py:261
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Tekrar düzenleyebilirsiniz."
-#: contrib/admin/views/auth.py:28
+#: contrib/admin/views/auth.py:30
msgid "Add user"
msgstr "Kullanıcı ekle"
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Parola başarı ile değiştirildi."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Parola deÄŸiÅŸtir: %s"
+
#: contrib/admin/views/main.py:223
msgid "Site administration"
msgstr "Site yönetimi"
@@ -1495,11 +1226,6 @@ msgstr "%s ekle"
msgid "Added %s."
msgstr "%s eklendi."
-#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339
-msgid "and"
-msgstr "ve"
-
#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
@@ -1521,52 +1247,62 @@ msgstr "\"%(obj)s\" isimli %(name)s deÄŸiÅŸtirildi."
#: contrib/admin/views/main.py:353
#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "\"%(obj)s\" isimli %(name)s eklendi. Aşağıda tekrar düzenleyebilirsiniz."
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"\"%(obj)s\" isimli %(name)s eklendi. Aşağıda tekrar düzenleyebilirsiniz."
#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "%s deÄŸiÅŸtir"
-#: contrib/admin/views/main.py:473
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s: %(obj)s"
-#: contrib/admin/views/main.py:478
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s:"
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "\"%(obj)s\" isimli %(name)s silindi."
-#: contrib/admin/views/main.py:514
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "Emin misiniz?"
-#: contrib/admin/views/main.py:536
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
msgstr "%s için değişiklik geçmişi:"
-#: contrib/admin/views/main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "%s seç"
-#: contrib/admin/views/main.py:570
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
msgstr "Değiştirilecek %s nesnesini seçin"
-#: contrib/admin/views/main.py:758
+#: contrib/admin/views/main.py:768
msgid "Database error"
msgstr "Veritabanı hatası"
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Lütfen geçerli bir kullanıcı adı ve parola girin. Tüm alanlar büyük/küçük "
+"harf duyarlıdır."
+
#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
@@ -1619,13 +1355,13 @@ msgstr "%r uygulaması bulunamadı"
#: contrib/admin/views/doc.py:171
#, python-format
-msgid "Model %r not found in app %r"
-msgstr "%r modeli %r uygulamasında bulunamadı"
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "%(name)r modeli %(label)r uygulamasında bulunamadı"
#: contrib/admin/views/doc.py:183
#, python-format
-msgid "the related `%s.%s` object"
-msgstr "ilgili `%s.%s` nesnesi"
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "ilgili `%(label)s.%(type)s` nesnesi"
#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
@@ -1634,8 +1370,8 @@ msgstr "model:"
#: contrib/admin/views/doc.py:214
#, python-format
-msgid "related `%s.%s` objects"
-msgstr "ilgili `%s.%s` nesneleri"
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "ilgili `%(label)s.%(name)s` nesneleri"
#: contrib/admin/views/doc.py:219
#, python-format
@@ -1712,6 +1448,10 @@ msgstr "Metin"
msgid "Time"
msgstr "Saat"
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "Åžehir Kodu (iki karakter)"
@@ -1746,17 +1486,21 @@ msgstr "Saat:"
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
-msgstr "Dökümantasyon"
+msgstr "Dokümantasyon"
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/view_detail.html:4
@@ -1779,6 +1523,7 @@ msgstr "Parola deÄŸiÅŸtir"
#: contrib/admin/templates/admin/change_form.html:13
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -1788,7 +1533,7 @@ msgstr "Parola deÄŸiÅŸtir"
msgid "Home"
msgstr "Anasayfa"
-#: contrib/admin/templates/admin/change_list.html:11
+#: contrib/admin/templates/admin/change_list.html:12
#, python-format
msgid "Add %(name)s"
msgstr "%(name)s Ekle"
@@ -1799,7 +1544,7 @@ msgid " By %(filter_title)s "
msgstr " %(filter_title)s nesnesine göre "
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Geçmiş"
@@ -1933,28 +1678,25 @@ msgstr "Üzgünüm, aradığınız sayfa bulunamadı."
msgid "Filter"
msgstr "Filtrele"
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Sitede görüntüle"
-#: contrib/admin/templates/admin/change_form.html:30
+#: 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] "Lütfen aşağıdaki hatayı düzeltin."
msgstr[1] "Lütfen aşağıdaki hataları düzeltin."
-#: contrib/admin/templates/admin/change_form.html:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
msgstr "Sıralama:"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Sıra:"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "<a href=\"/password_reset/\">Åžifrenizi mi unuttunuz?</a>"
-
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
@@ -2004,28 +1746,38 @@ msgstr "Kaydet ve düzenlemeye devam et"
msgid "Save"
msgstr "Kaydet"
-#: 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 "Önce bir kullanıcı adı ve parola girin. Daha sonra daha fazla bilgi girebilirsiniz."
-
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
-msgstr "Kullanıcı"
+#: 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> için yeni parola girin."
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
#: contrib/admin/templates/admin/auth/user/add_form.html:18
msgid "Password"
msgstr "Parola"
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
#: contrib/admin/templates/admin/auth/user/add_form.html:23
msgid "Password (again)"
msgstr "Parola (tekrar)"
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
#: contrib/admin/templates/admin/auth/user/add_form.html:24
msgid "Enter the same password as above, for verification."
msgstr "Onaylamak için, yukarıdaki parolanın aynısını girin."
+#: 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 ""
+"Önce bir kullanıcı adı ve parola girin. Daha sonra daha fazla bilgi "
+"girebilirsiniz."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Kullanıcı"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -2149,7 +1901,7 @@ msgstr "Kısayollar"
#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
-msgstr "Döküman kısayolları"
+msgstr "Doküman kısayolları"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
@@ -2169,13 +1921,13 @@ msgstr ""
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
-msgstr "Bu sayfa için dökümantasyon"
+msgstr "Bu sayfa için dokümantasyon"
#: 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 "Sizi, bu sayfayı üreten betiğin dökümantasyonuna yönlendirir."
+msgstr "Sizi, bu sayfayı üreten betiğin dokümantasyonuna yönlendirir."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
@@ -2185,7 +1937,8 @@ msgstr "Nesne numarasını göster"
msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
-msgstr "Tek bir nesneyi temsil eden sayfaların içerik türünü ve numarasını gösterir."
+msgstr ""
+"Tek bir nesneyi temsil eden sayfaların içerik türünü ve numarasını gösterir."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
@@ -2203,7 +1956,515 @@ msgstr "Nesneyi düzenle (yeni pencerede)"
msgid "As above, but opens the admin page in a new window."
msgstr "Yukarıdaki gibi, ancak yönetim sayfasını yeni bir pencerede açar."
-#: template/defaultfilters.py:401
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python model sınıfı"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "içerik türü"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "içerik türleri"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Çıkış yapıldı"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "isim"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "takma ad"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "izin"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "izinler"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grup"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "gruplar"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "kullanıcı adı"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Gerekli. 30 karakter ya da da az olmalı. Alfanumerik (harf, rakam ve alt "
+"çizgi) karakterler kullanılabilir."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "isim"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "soyisim"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "e-posta adresi"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "parola"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "yönetici modu"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Kullanıcının yönetici sayfasına girip giremeyeceğini belirler."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "aktif"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Kullanıcının Django yönetim sayfasına girip giremeyeceğini belirler. "
+"Kullanıcı hesabı silmek yerine işareti kaldırın."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "süper kullanıcı modu"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Kullanıcının tek tek hak atamasına gerek kalmadan tüm haklara sahip olup "
+"olamayacağını belirler."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "son ziyaret"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "kayıt tarihi"
+
+#: 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 ""
+"Özel olarak atanmış hakların yanı sıra, kullanıcının üyesi olduğu grupların "
+"hakları alır."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "kullanıcı izinleri"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "kullanıcı"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "kullanıcılar"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "KiÅŸisel bilgiler"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Ä°zinler"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Önemli tarihler"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Gruplar"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "mesaj"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "İki parola alanı uyuşmuyor."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Bu isimde bir kullanıcı zaten var."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Web tarayıcınızın çerezleri desteklemediği görülüyor. Çerezler giriş için "
+"gerekli."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Bu hesap aktif deÄŸil."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Bu e-posta hesabıyla ilişkili kullanıcı bulunmuyor. Kayıtlı olduğunuzdan "
+"emin misiniz?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "İki parola alanı uyuşmuyor."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Eski parolanız hatalı. Lütfen tekrar girin."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Posta kodu girin. Posta kodunun iki kısmı arasında bir boşluk bırakın."
+
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "oturum anahtarı"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "oturum bilgisi"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "bitiÅŸ tarihi"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "oturum"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "oturumlar"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Örnek: '/about/contact/'. Başında ve sonunda bölü işareti olduğundan emin "
+"olun."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "başlık"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "içerik"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "yorumlara izin ver"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "şablon adı"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Örnek: 'flatpages/contact_page.html'. Eğer birşey yazılmazsa, sistem "
+"otomatik olarak 'flatpages/default.html' kullanacak."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "kayıt gerekli"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Bu seçili ise, sadece kayıtlı kullanıcılar sayfayı görüntüleyebilir."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "düz sayfa"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "düz sayfalar"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pazartesi"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Salı"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Çarşamba"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "PerÅŸembe"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Cuma"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Cumartesi"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Pazar"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ocak"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Åžubat"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mart"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Nisan"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayıs"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Haziran"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Temmuz"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "AÄŸustos"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Eylül"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Ekim"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Kasım"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Aralık"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "oca"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "ÅŸub"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "nis"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "haz"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "tem"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "aÄŸu"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "eyl"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "eki"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "kas"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "ara"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Oca."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Åžub."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "AÄŸu."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Eyl."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Eki."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Kas."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Ara."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "yıl"
+msgstr[1] "yıl"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "ay"
+msgstr[1] "ay"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "hafta"
+msgstr[1] "hafta"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "gün"
+msgstr[1] "gün"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "saat"
+msgstr[1] "saat"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "dakika"
+msgstr[1] "dakika"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr ""
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr ""
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
msgid "yes,no,maybe"
msgstr "evet,hayır,olabilir"
+#~ msgid ""
+#~ "Please enter a different %s. The one you entered is already being used "
+#~ "for %s."
+#~ msgstr ""
+#~ "Lütfen farklı bir %s girin. Girdiğiniz, %s tarihinde bir kez kullanılmış."
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "'[algo]$[salt]$[hexdigest]' formatında"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "<a href=\"/password_reset/\">Åžifrenizi mi unuttunuz?</a>"
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
index 0d6bf90c0e..3b04920654 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
index 2552b677bd..1f30a08b15 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.po
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -1344,7 +1344,7 @@ msgstr "四月"
#: utils/dates.py:19
msgid "may"
-msgstr "三月"
+msgstr "五月"
#: utils/dates.py:19
msgid "jun"
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
index ec7580a862..f0127a55a0 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
index 610e61d17a..03abe3708c 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -46,7 +46,7 @@ msgstr "清除全部"
#: contrib/admin/media/js/dateparse.js:32
#: contrib/admin/media/js/calendar.js:24
msgid "January February March April May June July August September October November December"
-msgstr "一月 二月 三月 四月 五月 六月 六月 七月 八月 ä¹æœˆ å月 å一月 å二月"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 ä¹æœˆ å月 å一月 å二月"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py
index a44bc172f0..36039d7e98 100644
--- a/django/conf/project_template/settings.py
+++ b/django/conf/project_template/settings.py
@@ -9,15 +9,18 @@ ADMINS = (
MANAGERS = ADMINS
-DATABASE_ENGINE = '' # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = '' # Or path to database file if using sqlite3.
DATABASE_USER = '' # Not used with sqlite3.
DATABASE_PASSWORD = '' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
-# Local time zone for this installation. All choices can be found here:
+# Local time zone for this installation. Choices can be found here:
# http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
+# although not all variations may be possible on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
TIME_ZONE = 'America/Chicago'
# Language code for this installation. All choices can be found here:
@@ -35,8 +38,9 @@ USE_I18N = True
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''
-# URL that handles the media served from MEDIA_ROOT.
-# Example: "http://media.lawrence.com"
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
diff --git a/django/conf/urls/admin_password_reset.py b/django/conf/urls/admin_password_reset.py
deleted file mode 100644
index afa078205a..0000000000
--- a/django/conf/urls/admin_password_reset.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from django.conf.urls.defaults import *
-
-urlpatterns = patterns('django.views',
- (r'^$', 'registration.passwords.password_reset', {'is_admin_site' : True}),
- (r'^done/$', 'registration.passwords.password_reset_done'),
-)
diff --git a/django/conf/urls/defaults.py b/django/conf/urls/defaults.py
index 17fe603d96..26cdd3e1ff 100644
--- a/django/conf/urls/defaults.py
+++ b/django/conf/urls/defaults.py
@@ -1,19 +1,32 @@
from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+from django.core.exceptions import ImproperlyConfigured
-__all__ = ['handler404', 'handler500', 'include', 'patterns']
+__all__ = ['handler404', 'handler500', 'include', 'patterns', 'url']
handler404 = 'django.views.defaults.page_not_found'
handler500 = 'django.views.defaults.server_error'
include = lambda urlconf_module: [urlconf_module]
-def patterns(prefix, *tuples):
+def patterns(prefix, *args):
pattern_list = []
- for t in tuples:
- regex, view_or_include = t[:2]
- default_kwargs = t[2:]
- if type(view_or_include) == list:
- pattern_list.append(RegexURLResolver(regex, view_or_include[0], *default_kwargs))
- else:
- pattern_list.append(RegexURLPattern(regex, prefix and (prefix + '.' + view_or_include) or view_or_include, *default_kwargs))
+ for t in args:
+ if isinstance(t, (list, tuple)):
+ t = url(prefix=prefix, *t)
+ elif isinstance(t, RegexURLPattern):
+ t.add_prefix(prefix)
+ pattern_list.append(t)
return pattern_list
+
+def url(regex, view, kwargs=None, name=None, prefix=''):
+ if type(view) == list:
+ # For include(...) processing.
+ return RegexURLResolver(regex, view[0], kwargs)
+ else:
+ if isinstance(view, basestring):
+ if not view:
+ raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
+ if prefix:
+ view = prefix + '.' + view
+ return RegexURLPattern(regex, view, kwargs, name)
+
diff --git a/django/conf/urls/registration.py b/django/conf/urls/registration.py
deleted file mode 100644
index 9b41e434f9..0000000000
--- a/django/conf/urls/registration.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from django.conf.urls.defaults import *
-
-urlpatterns = patterns('',
- (r'^login/$', 'django.contrib.auth.views.login'),
- (r'^logout/$', 'django.contrib.auth.views.logout'),
- (r'^login_another/$', 'django.contrib.auth.views.logout_then_login'),
-
- (r'^register/$', 'ellington.registration.views.registration.signup'),
- (r'^register/(?P<challenge_string>\w{32})/$', 'ellington.registration.views.registration.register_form'),
-
- (r'^profile/$', 'ellington.registration.views.profile.profile'),
- (r'^profile/welcome/$', 'ellington.registration.views.profile.profile_welcome'),
- (r'^profile/edit/$', 'ellington.registration.views.profile.edit_profile'),
-
- (r'^password_reset/$', 'django.contrib.auth.views.password_reset'),
- (r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done'),
- (r'^password_change/$', 'django.contrib.auth.views.password_change'),
- (r'^password_change/done/$', 'django.contrib.auth.views.password_change_done'),
-)
diff --git a/django/contrib/admin/media/css/forms.css b/django/contrib/admin/media/css/forms.css
index 01a2937b7b..dd4c2507b7 100644
--- a/django/contrib/admin/media/css/forms.css
+++ b/django/contrib/admin/media/css/forms.css
@@ -26,7 +26,7 @@ form .aligned p, form .aligned ul { margin-left:7em; padding-left:30px; }
form .aligned table p { margin-left:0; padding-left:0; }
form .aligned p.help { padding-left:38px; }
.aligned .vCheckboxLabel { float:none !important; display:inline; padding-left:4px; }
-.colM .aligned .vLargeTextField, colM .aligned .vXMLLargeTextField { width:610px; }
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { width:610px; }
.checkbox-row p.help { margin-left:0; padding-left:0 !important; }
/* WIDE FIELDSETS */
@@ -66,4 +66,5 @@ fieldset.monospace textarea { font-family:"Bitstream Vera Sans Mono",Monaco,"Cou
.paginate-first, .paginate-last { padding: 2px 6px; border: 1px solid #ddd; font-weight: bold; }
.paginate-previous, .paginate-next { padding: 2px 3px; border: 1px solid #ddd; }
.paginate-link { padding: 2px 4px; border: 1px solid #ddd; }
-.paginate-current { padding: 2px 4px; border: 1px solid #ddd; font-weight: bold; background:#417690; color:#f4f379; } \ No newline at end of file
+.paginate-current { padding: 2px 4px; border: 1px solid #ddd; font-weight: bold; background:#417690; color:#f4f379; }
+.module table .vPositiveSmallIntegerField { width:2.2em; }
diff --git a/django/contrib/admin/media/js/urlify.js b/django/contrib/admin/media/js/urlify.js
index 90d11c435a..9b87113628 100644
--- a/django/contrib/admin/media/js/urlify.js
+++ b/django/contrib/admin/media/js/urlify.js
@@ -7,7 +7,7 @@ function URLify(s, num_chars) {
"with"];
r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
s = s.replace(r, '');
- s = s.replace(/[^-A-Z0-9\s]/gi, ''); // remove unneeded chars
+ s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
s = s.toLowerCase(); // convert to lowercase
diff --git a/django/contrib/admin/row_level_perm_manipulator.py b/django/contrib/admin/row_level_perm_manipulator.py
index efedc46041..cde087c5a3 100644
--- a/django/contrib/admin/row_level_perm_manipulator.py
+++ b/django/contrib/admin/row_level_perm_manipulator.py
@@ -1,4 +1,4 @@
-from django import forms
+from django import oldforms as forms
from django.contrib.contenttypes.models import ContentType
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.contrib.auth.models import User, Group, Permission, RowLevelPermission
diff --git a/django/contrib/admin/templates/admin/auth/user/change_password.html b/django/contrib/admin/templates/admin/auth/user/change_password.html
new file mode 100644
index 0000000000..3d359ecf8f
--- /dev/null
+++ b/django/contrib/admin/templates/admin/auth/user/change_password.html
@@ -0,0 +1,52 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="../../../../jsi18n/"></script>
+{% for js in javascript_imports %}{% include_admin_script js %}{% endfor %}
+{% endblock %}
+{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+{% block userlinks %}<a href="../../../../doc/">{% trans 'Documentation' %}</a> / <a href="../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+ <a href="../../../../">{% trans "Home" %}</a> &rsaquo;
+ <a href="../../">{{ opts.verbose_name_plural|capfirst|escape }}</a> &rsaquo;
+ <a href="../">{{ original|truncatewords:"18"|escape }}</a> &rsaquo;
+ {% trans 'Change password' %}
+</div>
+{% endif %}{% endblock %}
+{% block content %}<div id="content-main">
+<form action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if form.error_dict %}
+ <p class="errornote">
+ {% blocktrans count form.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+ </p>
+{% endif %}
+
+<p>{% blocktrans with original.username|escape as username %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p>
+
+<fieldset class="module aligned">
+
+<div class="form-row">
+ {{ form.password1.html_error_list }}
+ <label for="id_password1" class="required">{% trans 'Password' %}:</label> {{ form.password1 }}
+</div>
+
+<div class="form-row">
+ {{ form.password2.html_error_list }}
+ <label for="id_password2" class="required">{% trans 'Password (again)' %}:</label> {{ form.password2 }}
+ <p class="help">{% trans 'Enter the same password as above, for verification.' %}</p>
+</div>
+
+</fieldset>
+
+<div class="submit-row">
+<input type="submit" value="{% trans 'Change password' %}" class="default" />
+</div>
+
+<script type="text/javascript">document.getElementById("{{ first_form_field_id }}").focus();</script>
+</div>
+</form></div>
+{% endblock %}
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index 430fe2781c..e4d91c0174 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -72,6 +72,7 @@ def result_headers(cl):
for i, field_name in enumerate(lookup_opts.admin.list_display):
try:
f = lookup_opts.get_field(field_name)
+ admin_order_field = None
except models.FieldDoesNotExist:
# For non-field list_display values, check for the function
# attribute "short_description". If that doesn't exist, fall
@@ -84,22 +85,36 @@ def result_headers(cl):
header = attr.short_description
except AttributeError:
header = field_name.replace('_', ' ')
- # Non-field list_display values don't get ordering capability.
- yield {"text": header}
+
+ # It is a non-field, but perhaps one that is sortable
+ admin_order_field = getattr(getattr(cl.model, field_name), "admin_order_field", None)
+ if not admin_order_field:
+ yield {"text": header}
+ continue
+
+ # So this _is_ a sortable non-field. Go to the yield
+ # after the else clause.
else:
if isinstance(f.rel, models.ManyToOneRel) and f.null:
yield {"text": f.verbose_name}
+ continue
else:
- th_classes = []
- new_order_type = 'asc'
- if field_name == cl.order_field:
- th_classes.append('sorted %sending' % cl.order_type.lower())
- new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()]
+ header = f.verbose_name
+
+ th_classes = []
+ new_order_type = 'asc'
+ if field_name == cl.order_field or admin_order_field == cl.order_field:
+ th_classes.append('sorted %sending' % cl.order_type.lower())
+ new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()]
- yield {"text": f.verbose_name,
- "sortable": True,
- "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}),
- "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')}
+ yield {"text": header,
+ "sortable": True,
+ "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}),
+ "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')}
+
+def _boolean_icon(field_val):
+ BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'}
+ return '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val)
def items_for_result(cl, result):
first = True
@@ -116,9 +131,14 @@ def items_for_result(cl, result):
try:
attr = getattr(result, field_name)
allow_tags = getattr(attr, 'allow_tags', False)
+ boolean = getattr(attr, 'boolean', False)
if callable(attr):
attr = attr()
- result_repr = str(attr)
+ if boolean:
+ allow_tags = True
+ result_repr = _boolean_icon(attr)
+ else:
+ result_repr = str(attr)
except (AttributeError, ObjectDoesNotExist):
result_repr = EMPTY_CHANGELIST_VALUE
else:
@@ -149,10 +169,9 @@ def items_for_result(cl, result):
row_class = ' class="nowrap"'
# Booleans are special: We use images.
elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField):
- BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'}
- result_repr = '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val)
- # FloatFields are special: Zero-pad the decimals.
- elif isinstance(f, models.FloatField):
+ result_repr = _boolean_icon(field_val)
+ # DecimalFields are special: Zero-pad the decimals.
+ elif isinstance(f, models.DecimalField):
if field_val is not None:
result_repr = ('%%.%sf' % f.decimal_places) % field_val
else:
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py
index 85479d3756..81441c1fbb 100644
--- a/django/contrib/admin/templatetags/admin_modify.py
+++ b/django/contrib/admin/templatetags/admin_modify.py
@@ -11,6 +11,7 @@ import re
register = template.Library()
word_re = re.compile('[A-Z][a-z]+')
+absolute_url_re = re.compile(r'^(?:http(?:s)?:/)?/', re.IGNORECASE)
def class_name_to_underscored(name):
return '_'.join([s.lower() for s in word_re.findall(name)[:-1]])
@@ -18,18 +19,19 @@ def class_name_to_underscored(name):
def include_admin_script(script_path):
"""
Returns an HTML script element for including a script from the admin
- media url.
+ media url (or other location if an absolute url is given).
Example usage::
- {% include_admin_script js/calendar.js %}
+ {% include_admin_script "js/calendar.js" %}
could return::
<script type="text/javascript" src="/media/admin/js/calendar.js">
"""
-
- return '<script type="text/javascript" src="%s%s"></script>' % (settings.ADMIN_MEDIA_PREFIX, script_path)
+ if not absolute_url_re.match(script_path):
+ script_path = '%s%s' % (settings.ADMIN_MEDIA_PREFIX, script_path)
+ return '<script type="text/javascript" src="%s"></script>' % script_path
include_admin_script = register.simple_tag(include_admin_script)
def submit_row(context):
@@ -72,7 +74,7 @@ class FieldWidgetNode(template.Node):
self.bound_field_var = bound_field_var
def get_nodelist(cls, klass):
- if not cls.nodelists.has_key(klass):
+ if klass not in cls.nodelists:
try:
field_class_name = klass.__name__
template_name = "widget/%s.html" % class_name_to_underscored(field_class_name)
@@ -92,15 +94,15 @@ class FieldWidgetNode(template.Node):
return cls.nodelists[klass]
get_nodelist = classmethod(get_nodelist)
- def render(self, context):
+ def iter_render(self, context):
bound_field = template.resolve_variable(self.bound_field_var, context)
context.push()
context['bound_field'] = bound_field
- output = self.get_nodelist(bound_field.field.__class__).render(context)
+ for chunk in self.get_nodelist(bound_field.field.__class__).iter_render(context):
+ yield chunk
context.pop()
- return output
class FieldWrapper(object):
def __init__(self, field ):
@@ -165,7 +167,7 @@ class EditInlineNode(template.Node):
def __init__(self, rel_var):
self.rel_var = rel_var
- def render(self, context):
+ def iter_render(self, context):
relation = template.resolve_variable(self.rel_var, context)
context.push()
if relation.field.rel.edit_inline == models.TABULAR:
@@ -177,10 +179,9 @@ class EditInlineNode(template.Node):
original = context.get('original', None)
bound_related_object = relation.bind(context['form'], original, bound_related_object_class)
context['bound_related_object'] = bound_related_object
- t = loader.get_template(bound_related_object.template_name())
- output = t.render(context)
+ for chunk in loader.get_template(bound_related_object.template_name()).iter_render(context):
+ yield chunk
context.pop()
- return output
def output_all(form_fields):
return ''.join([str(f) for f in form_fields])
diff --git a/django/contrib/admin/templatetags/adminapplist.py b/django/contrib/admin/templatetags/adminapplist.py
index 6754632fba..f9c140433f 100644
--- a/django/contrib/admin/templatetags/adminapplist.py
+++ b/django/contrib/admin/templatetags/adminapplist.py
@@ -7,7 +7,7 @@ class AdminApplistNode(template.Node):
def __init__(self, varname):
self.varname = varname
- def render(self, context):
+ def iter_render(self, context):
from django.db import models
from django.utils.text import capfirst
app_list = []
@@ -56,7 +56,7 @@ class AdminApplistNode(template.Node):
'models': model_list,
})
context[self.varname] = app_list
- return ''
+ return ()
def get_admin_app_list(parser, token):
"""
diff --git a/django/contrib/admin/templatetags/log.py b/django/contrib/admin/templatetags/log.py
index 5caba2b795..96db2373b4 100644
--- a/django/contrib/admin/templatetags/log.py
+++ b/django/contrib/admin/templatetags/log.py
@@ -10,11 +10,14 @@ class AdminLogNode(template.Node):
def __repr__(self):
return "<GetAdminLog Node>"
- def render(self, context):
- if self.user is not None and not self.user.isdigit():
- self.user = context[self.user].id
- context[self.varname] = LogEntry.objects.filter(user__id__exact=self.user).select_related()[:self.limit]
- return ''
+ def iter_render(self, context):
+ if self.user is None:
+ context[self.varname] = LogEntry.objects.all().select_related()[:self.limit]
+ else:
+ if not self.user.isdigit():
+ self.user = context[self.user].id
+ context[self.varname] = LogEntry.objects.filter(user__id__exact=self.user).select_related()[:self.limit]
+ return ()
class DoGetAdminLog:
"""
diff --git a/django/contrib/admin/urls.py b/django/contrib/admin/urls.py
index 3d029b7e45..67a481765a 100644
--- a/django/contrib/admin/urls.py
+++ b/django/contrib/admin/urls.py
@@ -35,6 +35,8 @@ urlpatterns = patterns('',
# "Add user" -- a special-case view
('^auth/user/add/$', 'django.contrib.admin.views.auth.user_add_stage'),
+ # "Change user password" -- another special-case view
+ ('^auth/user/(\d+)/password/$', 'django.contrib.admin.views.auth.user_change_password'),
# Add/change/delete/history
('^([^/]+)/([^/]+)/$', 'django.contrib.admin.views.main.change_list'),
diff --git a/django/contrib/admin/views/auth.py b/django/contrib/admin/views/auth.py
index 52bf3bcde8..206e3eb7d4 100644
--- a/django/contrib/admin/views/auth.py
+++ b/django/contrib/admin/views/auth.py
@@ -1,10 +1,11 @@
from django.contrib.admin.views.decorators import staff_member_required
-from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth.forms import UserCreationForm, AdminPasswordChangeForm
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django import oldforms, template
-from django.shortcuts import render_to_response
+from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect
+from django.utils.html import escape
def user_add_stage(request):
if not request.user.has_perm('auth.change_user'):
@@ -16,7 +17,7 @@ def user_add_stage(request):
if not errors:
new_user = manipulator.save(new_data)
msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': 'user', 'obj': new_user}
- if request.POST.has_key("_addanother"):
+ if "_addanother" in request.POST:
request.user.message_set.create(message=msg)
return HttpResponseRedirect(request.path)
else:
@@ -28,7 +29,7 @@ def user_add_stage(request):
return render_to_response('admin/auth/user/add_form.html', {
'title': _('Add user'),
'form': form,
- 'is_popup': request.REQUEST.has_key('_popup'),
+ 'is_popup': '_popup' in request.REQUEST,
'add': True,
'change': False,
'has_add_permission': True,
@@ -43,3 +44,35 @@ def user_add_stage(request):
'username_help_text': User._meta.get_field('username').help_text,
}, context_instance=template.RequestContext(request))
user_add_stage = staff_member_required(user_add_stage)
+
+def user_change_password(request, id):
+ if not request.user.has_perm('auth.change_user'):
+ raise PermissionDenied
+ user = get_object_or_404(User, pk=id)
+ manipulator = AdminPasswordChangeForm(user)
+ if request.method == 'POST':
+ new_data = request.POST.copy()
+ errors = manipulator.get_validation_errors(new_data)
+ if not errors:
+ new_user = manipulator.save(new_data)
+ msg = _('Password changed successfully.')
+ request.user.message_set.create(message=msg)
+ return HttpResponseRedirect('..')
+ else:
+ errors = new_data = {}
+ form = oldforms.FormWrapper(manipulator, new_data, errors)
+ return render_to_response('admin/auth/user/change_password.html', {
+ 'title': _('Change password: %s') % escape(user.username),
+ 'form': form,
+ 'is_popup': '_popup' in request.REQUEST,
+ 'add': True,
+ 'change': False,
+ 'has_delete_permission': False,
+ 'has_change_permission': True,
+ 'has_absolute_url': False,
+ 'first_form_field_id': 'id_password1',
+ 'opts': User._meta,
+ 'original': user,
+ 'show_save': True,
+ }, context_instance=template.RequestContext(request))
+user_change_password = staff_member_required(user_change_password)
diff --git a/django/contrib/admin/views/decorators.py b/django/contrib/admin/views/decorators.py
index 9dfe651fe6..5389ca4dff 100644
--- a/django/contrib/admin/views/decorators.py
+++ b/django/contrib/admin/views/decorators.py
@@ -12,7 +12,7 @@ LOGIN_FORM_KEY = 'this_is_the_login_form'
def _display_login_form(request, error_message=''):
request.session.set_test_cookie()
- if request.POST and request.POST.has_key('post_data'):
+ if request.POST and 'post_data' in request.POST:
# User has failed login BUT has previously saved post data.
post_data = request.POST['post_data']
elif request.POST:
@@ -48,7 +48,7 @@ def staff_member_required(view_func):
def _checklogin(request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_staff:
# The user is valid. Continue to the admin page.
- if request.POST.has_key('post_data'):
+ if 'post_data' in request.POST:
# User must have re-authenticated through a different window
# or tab.
request.POST = _decode_post_data(request.POST['post_data'])
@@ -57,7 +57,7 @@ def staff_member_required(view_func):
assert hasattr(request, 'session'), "The Django admin requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
# If this isn't already the login page, display it.
- if not request.POST.has_key(LOGIN_FORM_KEY):
+ if LOGIN_FORM_KEY not in request.POST:
if request.POST:
message = _("Please log in again, because your session has expired. Don't worry: Your submission has been saved.")
else:
@@ -90,11 +90,9 @@ def staff_member_required(view_func):
if user.is_active and user.is_staff:
login(request, user)
# TODO: set last_login with an event.
- user.last_login = datetime.datetime.now()
- user.save()
- if request.POST.has_key('post_data'):
+ if 'post_data' in request.POST:
post_data = _decode_post_data(request.POST['post_data'])
- if post_data and not post_data.has_key(LOGIN_FORM_KEY):
+ if post_data and LOGIN_FORM_KEY not in post_data:
# overwrite request.POST with the saved post_data, and continue
request.POST = post_data
request.user = user
diff --git a/django/contrib/admin/views/doc.py b/django/contrib/admin/views/doc.py
index 4b592acebd..6430252690 100644
--- a/django/contrib/admin/views/doc.py
+++ b/django/contrib/admin/views/doc.py
@@ -168,7 +168,7 @@ def model_detail(request, app_label, model_name):
model = m
break
if model is None:
- raise Http404, _("Model %r not found in app %r") % (model_name, app_label)
+ raise Http404, _("Model %(name)r not found in app %(label)r") % {'name': model_name, 'label': app_label}
opts = model._meta
@@ -180,7 +180,7 @@ def model_detail(request, app_label, model_name):
if isinstance(field, models.ForeignKey):
data_type = related_object_name = field.rel.to.__name__
app_label = field.rel.to._meta.app_label
- verbose = utils.parse_rst((_("the related `%s.%s` object") % (app_label, data_type)), 'model', _('model:') + data_type)
+ verbose = utils.parse_rst((_("the related `%(label)s.%(type)s` object") % {'label': app_label, 'type': data_type}), 'model', _('model:') + data_type)
else:
data_type = get_readable_field_data_type(field)
verbose = field.verbose_name
@@ -211,7 +211,7 @@ def model_detail(request, app_label, model_name):
# Gather related objects
for rel in opts.get_all_related_objects():
- verbose = _("related `%s.%s` objects") % (rel.opts.app_label, rel.opts.object_name)
+ verbose = _("related `%(label)s.%(name)s` objects") % {'label': rel.opts.app_label, 'name': rel.opts.object_name}
accessor = rel.get_accessor_name()
fields.append({
'name' : "%s.all" % accessor,
@@ -294,10 +294,11 @@ DATA_TYPE_MAPPING = {
'CommaSeparatedIntegerField': _('Comma-separated integers'),
'DateField' : _('Date (without time)'),
'DateTimeField' : _('Date (with time)'),
+ 'DecimalField' : _('Decimal number'),
'EmailField' : _('E-mail address'),
'FileField' : _('File path'),
'FilePathField' : _('File path'),
- 'FloatField' : _('Decimal number'),
+ 'FloatField' : _('Floating point number'),
'ForeignKey' : _('Integer'),
'ImageField' : _('File path'),
'IntegerField' : _('Integer'),
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index aa8b35bb96..1e99ea341b 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -46,8 +46,8 @@ def quote(s):
"""
Ensure that primary key values do not confuse the admin URLs by escaping
any '/', '_' and ':' characters. Similar to urllib.quote, except that the
- quoting is slightly different so that it doesn't get autoamtically
- unquoted by the web browser.
+ quoting is slightly different so that it doesn't get automatically
+ unquoted by the Web browser.
"""
if type(s) != type(''):
return s
@@ -273,17 +273,17 @@ def add_stage(request, app_label, model_name, show_delete=False, form_url='', po
delete=admin_opts.grant_delete_row_level_perm)
# Here, we distinguish between different save types by checking for
# the presence of keys in request.POST.
- if request.POST.has_key("_continue"):
+ if "_continue" in request.POST:
request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
- if request.POST.has_key("_popup"):
+ if "_popup" in request.POST:
post_url_continue += "?_popup=1"
return HttpResponseRedirect(post_url_continue % pk_value)
- if request.POST.has_key("_popup"):
+ if "_popup" in request.POST:
if type(pk_value) is str: # Quote if string, so JavaScript doesn't think it's a variable.
pk_value = '"%s"' % pk_value.replace('"', '\\"')
return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, %s, "%s");</script>' % \
(pk_value, str(new_object).replace('"', '\\"')))
- elif request.POST.has_key("_addanother"):
+ elif "_addanother" in request.POST:
request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
return HttpResponseRedirect(request.path)
else:
@@ -304,7 +304,7 @@ def add_stage(request, app_label, model_name, show_delete=False, form_url='', po
c = template.RequestContext(request, {
'title': _('Add %s') % opts.verbose_name,
'form': form,
- 'is_popup': request.REQUEST.has_key('_popup'),
+ 'is_popup': '_popup' in request.REQUEST,
'show_delete': show_delete,
})
@@ -329,7 +329,7 @@ def change_stage(request, app_label, model_name, object_id):
if not request.user.has_perm(app_label + '.' + opts.get_change_permission(), object=manipulator.original_object):
raise PermissionDenied
- if request.POST and request.POST.has_key("_saveasnew"):
+ if request.POST and "_saveasnew" in request.POST:
return add_stage(request, app_label, model_name, form_url='../../add/')
if request.POST:
@@ -367,16 +367,16 @@ def change_stage(request, app_label, model_name, object_id):
delete=admin_opts.grant_delete_row_level_perm)
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': opts.verbose_name, 'obj': new_object}
- if request.POST.has_key("_continue"):
+ if "_continue" in request.POST:
request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
- if request.REQUEST.has_key('_popup'):
+ if '_popup' in request.REQUEST:
return HttpResponseRedirect(request.path + "?_popup=1")
else:
return HttpResponseRedirect(request.path)
- elif request.POST.has_key("_saveasnew"):
+ elif "_saveasnew" in request.POST:
request.user.message_set.create(message=_('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': opts.verbose_name, 'obj': new_object})
return HttpResponseRedirect("../%s/" % pk_value)
- elif request.POST.has_key("_addanother"):
+ elif "_addanother" in request.POST:
request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
return HttpResponseRedirect("../add/")
else:
@@ -416,7 +416,7 @@ def change_stage(request, app_label, model_name, object_id):
'form': form,
'object_id': object_id,
'original': manipulator.original_object,
- 'is_popup': request.REQUEST.has_key('_popup'),
+ 'is_popup': '_popup' in request.REQUEST,
'object_has_row_level_permissions':opts.row_level_permissions,
'has_row_level_permissions':request.user.has_perm("auth.change_rowlevelpermission") and request.user.has_perm(opts.app_label+"."+opts.get_change_permission(), object=manipulator.original_object),
})
@@ -488,9 +488,12 @@ def _get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current
opts_seen.append(related.opts)
rel_opts_name = related.get_accessor_name()
has_related_objs = False
- rel_objs = getattr(obj, rel_opts_name, None)
- if rel_objs:
- has_related_objs = True
+
+ # related.get_accessor_name() could return None for symmetrical relationships
+ if rel_opts_name:
+ rel_objs = getattr(obj, rel_opts_name, None)
+ if rel_objs:
+ has_related_objs = True
if has_related_objs:
for sub_obj in rel_objs.all():
@@ -585,12 +588,12 @@ class ChangeList(object):
self.page_num = int(request.GET.get(PAGE_VAR, 0))
except ValueError:
self.page_num = 0
- self.show_all = request.GET.has_key(ALL_VAR)
- self.is_popup = request.GET.has_key(IS_POPUP_VAR)
+ self.show_all = ALL_VAR in request.GET
+ self.is_popup = IS_POPUP_VAR in request.GET
self.params = dict(request.GET.items())
- if self.params.has_key(PAGE_VAR):
+ if PAGE_VAR in self.params:
del self.params[PAGE_VAR]
- if self.params.has_key(ERROR_FLAG):
+ if ERROR_FLAG in self.params:
del self.params[ERROR_FLAG]
self.order_field, self.order_type = self.get_ordering()
@@ -621,7 +624,7 @@ class ChangeList(object):
if k.startswith(r):
del p[k]
for k, v in new_params.items():
- if p.has_key(k) and v is None:
+ if k in p and v is None:
del p[k]
elif v is not None:
p[k] = v
@@ -687,18 +690,25 @@ class ChangeList(object):
order_field, order_type = ordering[0][1:], 'desc'
else:
order_field, order_type = ordering[0], 'asc'
- if params.has_key(ORDER_VAR):
+ if ORDER_VAR in params:
try:
+ field_name = lookup_opts.admin.list_display[int(params[ORDER_VAR])]
try:
- f = lookup_opts.get_field(lookup_opts.admin.list_display[int(params[ORDER_VAR])])
+ f = lookup_opts.get_field(field_name)
except models.FieldDoesNotExist:
- pass
+ # see if field_name is a name of a non-field
+ # that allows sorting
+ try:
+ attr = getattr(lookup_opts.admin.manager.model, field_name)
+ order_field = attr.admin_order_field
+ except IndexError:
+ pass
else:
if not isinstance(f.rel, models.ManyToOneRel) or not f.null:
order_field = f.name
except (IndexError, ValueError):
pass # Invalid ordering specified. Just use the default.
- if params.has_key(ORDER_TYPE_VAR) and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
+ if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
order_type = params[ORDER_TYPE_VAR]
return order_field, order_type
@@ -715,7 +725,7 @@ class ChangeList(object):
qs = self.manager.get_query_set()
lookup_params = self.params.copy() # a dictionary of the query string
for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
- if lookup_params.has_key(i):
+ if i in lookup_params:
del lookup_params[i]
# Apply lookup parameters from the query string.
diff --git a/django/contrib/admin/views/row_level_permissions.py b/django/contrib/admin/views/row_level_permissions.py
index a5ea239b51..e9bda73217 100644
--- a/django/contrib/admin/views/row_level_permissions.py
+++ b/django/contrib/admin/views/row_level_permissions.py
@@ -1,5 +1,6 @@
from django.contrib.admin import utils
-from django import forms, template
+from django import oldforms as forms
+from django import template
from django.shortcuts import render_to_response, get_object_or_404
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.contrib.contenttypes.models import ContentType
diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py
index dd3b8152e6..14ae020674 100644
--- a/django/contrib/auth/__init__.py
+++ b/django/contrib/auth/__init__.py
@@ -1,8 +1,8 @@
+import datetime
from django.core.exceptions import ImproperlyConfigured
SESSION_KEY = '_auth_user_id'
BACKEND_SESSION_KEY = '_auth_user_backend'
-LOGIN_URL = '/accounts/login/'
REDIRECT_FIELD_NAME = 'next'
def load_backend(path):
@@ -49,8 +49,12 @@ def login(request, user):
if user is None:
user = request.user
# TODO: It would be nice to support different login methods, like signed cookies.
+ user.last_login = datetime.datetime.now()
+ user.save()
request.session[SESSION_KEY] = user.id
request.session[BACKEND_SESSION_KEY] = user.backend
+ if hasattr(request, 'user'):
+ request.user = user
def logout(request):
"""
@@ -64,6 +68,9 @@ def logout(request):
del request.session[BACKEND_SESSION_KEY]
except KeyError:
pass
+ if hasattr(request, 'user'):
+ from django.contrib.auth.models import AnonymousUser
+ request.user = AnonymousUser()
def get_user(request):
from django.contrib.auth.models import AnonymousUser
diff --git a/django/contrib/auth/decorators.py b/django/contrib/auth/decorators.py
index 37e948f8fe..2fb4a6f510 100644
--- a/django/contrib/auth/decorators.py
+++ b/django/contrib/auth/decorators.py
@@ -1,13 +1,16 @@
-from django.contrib.auth import LOGIN_URL, REDIRECT_FIELD_NAME
+from django.contrib.auth import REDIRECT_FIELD_NAME
from django.http import HttpResponseRedirect
from urllib import quote
-def user_passes_test(test_func, login_url=LOGIN_URL):
+def user_passes_test(test_func, login_url=None):
"""
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable
that takes the user object and returns True if the user passes.
"""
+ if not login_url:
+ from django.conf import settings
+ login_url = settings.LOGIN_URL
def _dec(view_func):
def _checklogin(request, *args, **kwargs):
if test_func(request.user):
@@ -27,7 +30,7 @@ login_required.__doc__ = (
"""
)
-def permission_required(perm, login_url=LOGIN_URL):
+def permission_required(perm, login_url=None):
"""
Decorator for views that checks whether a user has a particular permission
enabled, redirecting to the log-in page if necessary.
diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
index aea52d1f2a..023f9b43be 100644
--- a/django/contrib/auth/forms.py
+++ b/django/contrib/auth/forms.py
@@ -4,6 +4,7 @@ from django.contrib.sites.models import Site
from django.template import Context, loader
from django.core import validators
from django import oldforms
+from django.utils.translation import gettext as _
class UserCreationForm(oldforms.Manipulator):
"A form that creates a user, with no privileges, from the given username and password."
@@ -126,3 +127,18 @@ class PasswordChangeForm(oldforms.Manipulator):
"Saves the new password."
self.user.set_password(new_data['new_password1'])
self.user.save()
+
+class AdminPasswordChangeForm(oldforms.Manipulator):
+ "A form used to change the password of a user in the admin interface."
+ def __init__(self, user):
+ self.user = user
+ self.fields = (
+ oldforms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True),
+ oldforms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True,
+ validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]),
+ )
+
+ def save(self, new_data):
+ "Saves the new password."
+ self.user.set_password(new_data['password1'])
+ self.user.save()
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index fdb48be1d2..d4ed1e9582 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -1,6 +1,7 @@
from django.core import validators
from django.core.exceptions import ImproperlyConfigured
from django.db import backend, connection, models
+from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _
import datetime
@@ -17,6 +18,12 @@ def check_password(raw_password, enc_password):
elif algo == 'sha1':
import sha
return hsh == sha.new(salt+raw_password).hexdigest()
+ elif algo == 'crypt':
+ try:
+ import crypt
+ except ImportError:
+ raise ValueError, "Crypt password algorithm not supported in this environment."
+ return hsh == crypt.crypt(raw_password, salt)
raise ValueError, "Got unknown password algorithm type in password."
class SiteProfileNotAvailable(Exception):
@@ -38,6 +45,7 @@ class Permission(models.Model):
name = models.CharField(_('name'), maxlength=50)
content_type = models.ForeignKey(ContentType)
codename = models.CharField(_('codename'), maxlength=100)
+
class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
@@ -45,7 +53,7 @@ class Permission(models.Model):
ordering = ('content_type', 'codename')
def __str__(self):
- return "%s | %s" % (self.content_type, self.name)
+ return "%s | %s | %s" % (self.content_type.app_label, self.content_type, self.name)
class RowLevelPermissionManager(models.Manager):
def create_row_level_permission(self, model_instance, owner, permission, negative=False):
@@ -98,8 +106,8 @@ class RowLevelPermission(models.Model):
owner_ct = models.ForeignKey(ContentType, verbose_name="'Owner' content type", related_name="owner_ct")
negative = models.BooleanField()
permission = models.ForeignKey(Permission)
- model = models.GenericForeignKey(fk_field='model_id', ct_field='model_ct')
- owner = models.GenericForeignKey(fk_field='owner_id', ct_field='owner_ct')
+ model = generic.GenericForeignKey(fk_field='model_id', ct_field='model_ct')
+ owner = generic.GenericForeignKey(fk_field='owner_id', ct_field='owner_ct')
objects = RowLevelPermissionManager()
class Meta:
@@ -125,11 +133,12 @@ class Group(models.Model):
"""
name = models.CharField(_('name'), maxlength=80, unique=True)
permissions = models.ManyToManyField(Permission, verbose_name=_('permissions'), blank=True, filter_interface=models.HORIZONTAL)
- row_level_permissions_owned = models.GenericRelation(RowLevelPermission, object_id_field="owner_id", content_type_field="owner_ct", related_name="group")
+ row_level_permissions_owned = generic.GenericRelation(RowLevelPermission, object_id_field="owner_id", content_type_field="owner_ct", related_name="group")
class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')
ordering = ('name',)
+
class Admin:
search_fields = ('name',)
@@ -161,24 +170,26 @@ class User(models.Model):
first_name = models.CharField(_('first name'), maxlength=30, blank=True)
last_name = models.CharField(_('last name'), maxlength=30, blank=True)
email = models.EmailField(_('e-mail address'), blank=True)
- password = models.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]'"))
+ password = models.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them."))
- last_login = models.DateTimeField(_('last login'), default=models.LazyDate())
- date_joined = models.DateTimeField(_('date joined'), default=models.LazyDate())
+ last_login = models.DateTimeField(_('last login'), default=datetime.datetime.now)
+ date_joined = models.DateTimeField(_('date joined'), default=datetime.datetime.now)
groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True,
help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True, filter_interface=models.HORIZONTAL)
- row_level_permissions_owned = models.GenericRelation(RowLevelPermission, object_id_field="owner_id", content_type_field="owner_ct", related_name="owner")
+ row_level_permissions_owned = generic.GenericRelation(RowLevelPermission, object_id_field="owner_id", content_type_field="owner_ct", related_name="owner")
objects = UserManager()
+
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
ordering = ('username',)
row_level_permissions = True
+
class Admin:
fields = (
(None, {'fields': ('username', 'password')}),
@@ -480,7 +491,7 @@ class AnonymousUser(object):
pass
def __str__(self):
- return 'AnonymousUser'
+ return _('AnonymousUser')
def __eq__(self, other):
return isinstance(other, self.__class__)
diff --git a/django/contrib/auth/views.py b/django/contrib/auth/views.py
index fda17b91fb..77350b9a8f 100644
--- a/django/contrib/auth/views.py
+++ b/django/contrib/auth/views.py
@@ -6,7 +6,7 @@ from django.template import RequestContext
from django.contrib.sites.models import Site
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
-from django.contrib.auth import LOGIN_URL, REDIRECT_FIELD_NAME
+from django.contrib.auth import REDIRECT_FIELD_NAME
def login(request, template_name='registration/login.html'):
"Displays the login form and handles the login action."
@@ -17,7 +17,8 @@ def login(request, template_name='registration/login.html'):
if not errors:
# Light security check -- make sure redirect_to isn't garbage.
if not redirect_to or '://' in redirect_to or ' ' in redirect_to:
- redirect_to = '/accounts/profile/'
+ from django.conf import settings
+ redirect_to = settings.LOGIN_REDIRECT_URL
from django.contrib.auth import login
login(request, manipulator.get_user())
request.session.delete_test_cookie()
@@ -41,12 +42,18 @@ def logout(request, next_page=None, template_name='registration/logged_out.html'
# Redirect to this page until the session has been cleared.
return HttpResponseRedirect(next_page or request.path)
-def logout_then_login(request, login_url=LOGIN_URL):
+def logout_then_login(request, login_url=None):
"Logs out the user if he is logged in. Then redirects to the log-in page."
+ if not login_url:
+ from django.conf import settings
+ login_url = settings.LOGIN_URL
return logout(request, login_url)
-def redirect_to_login(next, login_url=LOGIN_URL):
+def redirect_to_login(next, login_url=None):
"Redirects the user to the login page, passing the given 'next' page"
+ if not login_url:
+ from django.conf import settings
+ login_url = settings.LOGIN_URL
return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, next))
def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html',
diff --git a/django/contrib/comments/feeds.py b/django/contrib/comments/feeds.py
index 34cf3d9cef..1ad638469b 100644
--- a/django/contrib/comments/feeds.py
+++ b/django/contrib/comments/feeds.py
@@ -23,16 +23,19 @@ class LatestFreeCommentsFeed(Feed):
self._site = Site.objects.get_current()
return "Latest comments on %s" % self._site.name
+ def get_query_set(self):
+ return self.comments_class.objects.filter(site__pk=settings.SITE_ID, is_public=True)
+
def items(self):
- return self.comments_class.objects.filter(site__pk=settings.SITE_ID, is_public=True)[:40]
+ return self.get_query_set()[:40]
class LatestCommentsFeed(LatestFreeCommentsFeed):
"""Feed of latest free comments on the current site"""
comments_class = Comment
- def items(self):
- qs = LatestFreeCommentsFeed.items(self)
+ def get_query_set(self):
+ qs = super(LatestCommentsFeed, self).get_query_set()
qs = qs.filter(is_removed=False)
if settings.COMMENTS_BANNED_USERS_GROUP:
where = ['user_id NOT IN (SELECT user_id FROM auth_users_group WHERE group_id = %s)']
diff --git a/django/contrib/comments/models.py b/django/contrib/comments/models.py
index 90a84baaff..fa6c6aa363 100644
--- a/django/contrib/comments/models.py
+++ b/django/contrib/comments/models.py
@@ -209,7 +209,7 @@ class FreeComment(models.Model):
class KarmaScoreManager(models.Manager):
def vote(self, user_id, comment_id, score):
try:
- karma = self.objects.get(comment__pk=comment_id, user__pk=user_id)
+ karma = self.get(comment__pk=comment_id, user__pk=user_id)
except self.model.DoesNotExist:
karma = self.model(None, user_id=user_id, comment_id=comment_id, score=score, scored_date=datetime.datetime.now())
karma.save()
diff --git a/django/contrib/comments/templates/comments/form.html b/django/contrib/comments/templates/comments/form.html
index c5aa7686a3..11eaa8d00d 100644
--- a/django/contrib/comments/templates/comments/form.html
+++ b/django/contrib/comments/templates/comments/form.html
@@ -3,7 +3,7 @@
<form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post">
{% if user.is_authenticated %}
-<p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="/accounts/logout/">{% trans "Log out" %}</a>)</p>
+<p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="{{ logout_url }}">{% trans "Log out" %}</a>)</p>
{% else %}
<p><label for="id_username">{% trans "Username:" %}</label> <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
{% endif %}
diff --git a/django/contrib/comments/templatetags/comments.py b/django/contrib/comments/templatetags/comments.py
index c3a2fd40d8..a43b11f452 100644
--- a/django/contrib/comments/templatetags/comments.py
+++ b/django/contrib/comments/templatetags/comments.py
@@ -24,7 +24,8 @@ class CommentFormNode(template.Node):
self.photo_options, self.rating_options = photo_options, rating_options
self.is_public = is_public
- def render(self, context):
+ def iter_render(self, context):
+ from django.conf import settings
from django.utils.text import normalize_newlines
import base64
context.push()
@@ -32,7 +33,7 @@ class CommentFormNode(template.Node):
try:
self.obj_id = template.resolve_variable(self.obj_id_lookup_var, context)
except template.VariableDoesNotExist:
- return ''
+ return
# Validate that this object ID is valid for this content-type.
# We only have to do this validation if obj_id_lookup_var is provided,
# because do_comment_form() validates hard-coded object IDs.
@@ -64,10 +65,11 @@ class CommentFormNode(template.Node):
if self.rating_options:
context['rating_range'], context['rating_choices'] = Comment.objects.get_rating_options(self.rating_options)
context['hash'] = Comment.objects.get_security_hash(context['options'], context['photo_options'], context['rating_options'], context['target'])
+ context['logout_url'] = settings.LOGOUT_URL
default_form = loader.get_template(COMMENT_FORM)
- output = default_form.render(context)
+ for chunk in default_form.iter_render(context):
+ yield chunk
context.pop()
- return output
class CommentCountNode(template.Node):
def __init__(self, package, module, context_var_name, obj_id, var_name, free):
@@ -75,7 +77,7 @@ class CommentCountNode(template.Node):
self.context_var_name, self.obj_id = context_var_name, obj_id
self.var_name, self.free = var_name, free
- def render(self, context):
+ def iter_render(self, context):
from django.conf import settings
manager = self.free and FreeComment.objects or Comment.objects
if self.context_var_name is not None:
@@ -84,7 +86,7 @@ class CommentCountNode(template.Node):
content_type__app_label__exact=self.package,
content_type__model__exact=self.module, site__id__exact=settings.SITE_ID).count()
context[self.var_name] = comment_count
- return ''
+ return ()
class CommentListNode(template.Node):
def __init__(self, package, module, context_var_name, obj_id, var_name, free, ordering, extra_kwargs=None):
@@ -94,14 +96,14 @@ class CommentListNode(template.Node):
self.ordering = ordering
self.extra_kwargs = extra_kwargs or {}
- def render(self, context):
+ def iter_render(self, context):
from django.conf import settings
get_list_function = self.free and FreeComment.objects.filter or Comment.objects.get_list_with_karma
if self.context_var_name is not None:
try:
self.obj_id = template.resolve_variable(self.context_var_name, context)
except template.VariableDoesNotExist:
- return ''
+ return ()
kwargs = {
'object_id__exact': self.obj_id,
'content_type__app_label__exact': self.package,
@@ -114,7 +116,7 @@ class CommentListNode(template.Node):
comment_list = get_list_function(**kwargs).order_by(self.ordering + 'submit_date').select_related()
if not self.free:
- if context.has_key('user') and context['user'].is_authenticated():
+ if 'user' in context and context['user'].is_authenticated():
user_id = context['user'].id
context['user_can_moderate_comments'] = Comment.objects.user_is_moderator(context['user'])
else:
@@ -125,7 +127,7 @@ class CommentListNode(template.Node):
comment_list = [c for c in comment_list if not c.is_hidden or (user_id == c.user_id)]
context[self.var_name] = comment_list
- return ''
+ return ()
class DoCommentForm:
"""
diff --git a/django/contrib/comments/views/comments.py b/django/contrib/comments/views/comments.py
index 12330afe41..73a9b2c480 100644
--- a/django/contrib/comments/views/comments.py
+++ b/django/contrib/comments/views/comments.py
@@ -217,10 +217,10 @@ def post_comment(request):
errors = manipulator.get_validation_errors(new_data)
# If user gave correct username/password and wasn't already logged in, log them in
# so they don't have to enter a username/password again.
- if manipulator.get_user() and not manipulator.get_user().is_authenticated() and new_data.has_key('password') and manipulator.get_user().check_password(new_data['password']):
+ if manipulator.get_user() and not manipulator.get_user().is_authenticated() and 'password' in new_data and manipulator.get_user().check_password(new_data['password']):
from django.contrib.auth import login
login(request, manipulator.get_user())
- if errors or request.POST.has_key('preview'):
+ if errors or 'preview' in request.POST:
class CommentFormWrapper(oldforms.FormWrapper):
def __init__(self, manipulator, new_data, errors, rating_choices):
oldforms.FormWrapper.__init__(self, manipulator, new_data, errors)
@@ -244,7 +244,7 @@ def post_comment(request):
'rating_range': rating_range,
'rating_choices': rating_choices,
}, context_instance=RequestContext(request))
- elif request.POST.has_key('post'):
+ elif 'post' in request.POST:
# If the IP is banned, mail the admins, do NOT save the comment, and
# serve up the "Thanks for posting" page as if the comment WAS posted.
if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
@@ -298,7 +298,7 @@ def post_free_comment(request):
new_data['is_public'] = IS_PUBLIC in option_list
manipulator = PublicFreeCommentManipulator()
errors = manipulator.get_validation_errors(new_data)
- if errors or request.POST.has_key('preview'):
+ if errors or 'preview' in request.POST:
comment = errors and '' or manipulator.get_comment(new_data)
return render_to_response('comments/free_preview.html', {
'comment': comment,
@@ -307,7 +307,7 @@ def post_free_comment(request):
'target': target,
'hash': security_hash,
}, context_instance=RequestContext(request))
- elif request.POST.has_key('post'):
+ elif 'post' in request.POST:
# If the IP is banned, mail the admins, do NOT save the comment, and
# serve up the "Thanks for posting" page as if the comment WAS posted.
if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
@@ -330,7 +330,7 @@ def comment_was_posted(request):
The object the comment was posted on
"""
obj = None
- if request.GET.has_key('c'):
+ if 'c' in request.GET:
content_type_id, object_id = request.GET['c'].split(':')
try:
content_type = ContentType.objects.get(pk=content_type_id)
diff --git a/django/db/models/fields/generic.py b/django/contrib/contenttypes/generic.py
index 1ad8346e42..f995ab2044 100644
--- a/django/db/models/fields/generic.py
+++ b/django/contrib/contenttypes/generic.py
@@ -37,7 +37,7 @@ class GenericForeignKey(object):
def instance_pre_init(self, signal, sender, args, kwargs):
# Handle initalizing an object with the generic FK instaed of
# content-type/object-id fields.
- if kwargs.has_key(self.name):
+ if self.name in kwargs:
value = kwargs.pop(self.name)
kwargs[self.ct_field] = self.get_content_type(value)
kwargs[self.fk_field] = value._get_pk_val()
@@ -94,6 +94,7 @@ class GenericRelation(RelatedField, Field):
kwargs['blank'] = True
kwargs['editable'] = False
+ kwargs['serialize'] = False
Field.__init__(self, **kwargs)
def get_manipulator_field_objs(self):
diff --git a/django/contrib/contenttypes/management.py b/django/contrib/contenttypes/management.py
index f492f54303..3572d93049 100644
--- a/django/contrib/contenttypes/management.py
+++ b/django/contrib/contenttypes/management.py
@@ -7,6 +7,7 @@ from django.db.models import get_apps, get_models, signals
def create_contenttypes(app, created_models, verbosity=2):
from django.contrib.contenttypes.models import ContentType
+ ContentType.objects.clear_cache()
app_models = get_models(app)
if not app_models:
return
diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py
index a95748a9a1..0a5e68f37e 100644
--- a/django/contrib/contenttypes/models.py
+++ b/django/contrib/contenttypes/models.py
@@ -1,6 +1,7 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
+CONTENT_TYPE_CACHE = {}
class ContentTypeManager(models.Manager):
def get_for_model(self, model):
"""
@@ -8,11 +9,26 @@ class ContentTypeManager(models.Manager):
ContentType if necessary.
"""
opts = model._meta
- # The str() is needed around opts.verbose_name because it's a
- # django.utils.functional.__proxy__ object.
- ct, created = self.model._default_manager.get_or_create(app_label=opts.app_label,
- model=opts.object_name.lower(), defaults={'name': str(opts.verbose_name)})
+ key = (opts.app_label, opts.object_name.lower())
+ try:
+ ct = CONTENT_TYPE_CACHE[key]
+ except KeyError:
+ # The str() is needed around opts.verbose_name because it's a
+ # django.utils.functional.__proxy__ object.
+ ct, created = self.model._default_manager.get_or_create(app_label=key[0],
+ model=key[1], defaults={'name': str(opts.verbose_name)})
+ CONTENT_TYPE_CACHE[key] = ct
return ct
+
+ def clear_cache(self):
+ """
+ Clear out the content-type cache. This needs to happen during database
+ flushes to prevent caching of "stale" content type IDs (see
+ django.contrib.contenttypes.management.create_contenttypes for where
+ this gets called).
+ """
+ global CONTENT_TYPE_CACHE
+ CONTENT_TYPE_CACHE = {}
class ContentType(models.Model):
name = models.CharField(maxlength=100)
diff --git a/django/contrib/databrowse/__init__.py b/django/contrib/databrowse/__init__.py
new file mode 100644
index 0000000000..e2f48ac822
--- /dev/null
+++ b/django/contrib/databrowse/__init__.py
@@ -0,0 +1 @@
+from django.contrib.databrowse.sites import DatabrowsePlugin, ModelDatabrowse, DatabrowseSite, site
diff --git a/django/contrib/databrowse/datastructures.py b/django/contrib/databrowse/datastructures.py
new file mode 100644
index 0000000000..24f2e68f46
--- /dev/null
+++ b/django/contrib/databrowse/datastructures.py
@@ -0,0 +1,192 @@
+"""
+These classes are light wrappers around Django's database API that provide
+convenience functionality and permalink functions for the databrowse app.
+"""
+
+from django.db import models
+from django.utils import dateformat
+from django.utils.text import capfirst
+from django.utils.translation import get_date_formats
+
+EMPTY_VALUE = '(None)'
+
+class EasyModel(object):
+ def __init__(self, site, model):
+ self.site = site
+ self.model = model
+ self.model_list = site.registry.keys()
+ self.verbose_name = model._meta.verbose_name
+ self.verbose_name_plural = model._meta.verbose_name_plural
+
+ def __repr__(self):
+ return '<EasyModel for %s>' % self.model._meta.object_name
+
+ def model_databrowse(self):
+ "Returns the ModelDatabrowse class for this model."
+ return self.site.registry[self.model]
+
+ def url(self):
+ return '%s%s/%s/' % (self.site.root_url, self.model._meta.app_label, self.model._meta.module_name)
+
+ def objects(self, **kwargs):
+ for obj in self.model._default_manager.filter(**kwargs):
+ yield EasyInstance(self, obj)
+
+ def object_by_pk(self, pk):
+ return EasyInstance(self, self.model._default_manager.get(pk=pk))
+
+ def sample_objects(self):
+ for obj in self.model._default_manager.all()[:3]:
+ yield EasyInstance(self, obj)
+
+ def field(self, name):
+ try:
+ f = self.model._meta.get_field(name)
+ except models.FieldDoesNotExist:
+ return None
+ return EasyField(self, f)
+
+ def fields(self):
+ return [EasyField(self, f) for f in (self.model._meta.fields + self.model._meta.many_to_many)]
+
+class EasyField(object):
+ def __init__(self, easy_model, field):
+ self.model, self.field = easy_model, field
+
+ def __repr__(self):
+ return '<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)
+
+ def choices(self):
+ for value, label in self.field.choices:
+ yield EasyChoice(self.model, self, value, label)
+
+ def url(self):
+ if self.field.choices:
+ return '%s%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name)
+ elif self.field.rel:
+ return '%s%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name)
+
+class EasyChoice(object):
+ def __init__(self, easy_model, field, value, label):
+ self.model, self.field = easy_model, field
+ self.value, self.label = value, label
+
+ def __repr__(self):
+ return '<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name)
+
+ def url(self):
+ return '%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, self.value)
+
+class EasyInstance(object):
+ def __init__(self, easy_model, instance):
+ self.model, self.instance = easy_model, instance
+
+ def __repr__(self):
+ return '<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val())
+
+ def __str__(self):
+ val = str(self.instance)
+ if len(val) > 30:
+ return val[:30] + '...'
+ return val
+
+ def pk(self):
+ return self.instance._get_pk_val()
+
+ def url(self):
+ return '%s%s/%s/objects/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.pk())
+
+ def fields(self):
+ """
+ Generator that yields EasyInstanceFields for each field in this
+ EasyInstance's model.
+ """
+ for f in self.model.model._meta.fields + self.model.model._meta.many_to_many:
+ yield EasyInstanceField(self.model, self, f)
+
+ def related_objects(self):
+ """
+ Generator that yields dictionaries of all models that have this
+ EasyInstance's model as a ForeignKey or ManyToManyField, along with
+ lists of related objects.
+ """
+ for rel_object in self.model.model._meta.get_all_related_objects() + self.model.model._meta.get_all_related_many_to_many_objects():
+ if rel_object.model not in self.model.model_list:
+ continue # Skip models that aren't in the model_list
+ em = EasyModel(self.model.site, rel_object.model)
+ yield {
+ 'model': em,
+ 'related_field': rel_object.field.verbose_name,
+ 'object_list': [EasyInstance(em, i) for i in getattr(self.instance, rel_object.get_accessor_name()).all()],
+ }
+
+class EasyInstanceField(object):
+ def __init__(self, easy_model, instance, field):
+ self.model, self.field, self.instance = easy_model, field, instance
+ self.raw_value = getattr(instance.instance, field.name)
+
+ def __repr__(self):
+ return '<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)
+
+ def values(self):
+ """
+ Returns a list of values for this field for this instance. It's a list
+ so we can accomodate many-to-many fields.
+ """
+ # This import is deliberately inside the function because it causes
+ # some settings to be imported, and we don't want to do that at the
+ # module level.
+ if self.field.rel:
+ if isinstance(self.field.rel, models.ManyToOneRel):
+ objs = getattr(self.instance.instance, self.field.name)
+ elif isinstance(self.field.rel, models.ManyToManyRel): # ManyToManyRel
+ return list(getattr(self.instance.instance, self.field.name).all())
+ elif self.field.choices:
+ objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE)
+ elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField):
+ if self.raw_value:
+ date_format, datetime_format, time_format = get_date_formats()
+ if isinstance(self.field, models.DateTimeField):
+ objs = capfirst(dateformat.format(self.raw_value, datetime_format))
+ elif isinstance(self.field, models.TimeField):
+ objs = capfirst(dateformat.time_format(self.raw_value, time_format))
+ else:
+ objs = capfirst(dateformat.format(self.raw_value, date_format))
+ else:
+ objs = EMPTY_VALUE
+ elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField):
+ objs = {True: 'Yes', False: 'No', None: 'Unknown'}[self.raw_value]
+ else:
+ objs = self.raw_value
+ return [objs]
+
+ def urls(self):
+ "Returns a list of (value, URL) tuples."
+ # First, check the urls() method for each plugin.
+ plugin_urls = []
+ for plugin_name, plugin in self.model.model_databrowse().plugins.items():
+ urls = plugin.urls(plugin_name, self)
+ if urls is not None:
+ #plugin_urls.append(urls)
+ values = self.values()
+ return zip(self.values(), urls)
+ if self.field.rel:
+ m = EasyModel(self.model.site, self.field.rel.to)
+ if self.field.rel.to in self.model.model_list:
+ lst = []
+ for value in self.values():
+ url = '%s%s/%s/objects/%s/' % (self.model.site.root_url, m.model._meta.app_label, m.model._meta.module_name, value._get_pk_val())
+ lst.append((str(value), url))
+ else:
+ lst = [(value, None) for value in self.values()]
+ elif self.field.choices:
+ lst = []
+ for value in self.values():
+ url = '%s%s/%s/fields/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name, self.raw_value)
+ lst.append((value, url))
+ elif isinstance(self.field, models.URLField):
+ val = self.values()[0]
+ lst = [(val, val)]
+ else:
+ lst = [(self.values()[0], None)]
+ return lst
diff --git a/tests/regressiontests/markup/__init__.py b/django/contrib/databrowse/plugins/__init__.py
index e69de29bb2..e69de29bb2 100644
--- a/tests/regressiontests/markup/__init__.py
+++ b/django/contrib/databrowse/plugins/__init__.py
diff --git a/django/contrib/databrowse/plugins/calendars.py b/django/contrib/databrowse/plugins/calendars.py
new file mode 100644
index 0000000000..7977524cdb
--- /dev/null
+++ b/django/contrib/databrowse/plugins/calendars.py
@@ -0,0 +1,84 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.utils.translation import get_date_formats
+from django.views.generic import date_based
+import datetime
+import time
+
+class CalendarPlugin(DatabrowsePlugin):
+ def __init__(self, field_names=None):
+ self.field_names = field_names
+
+ def field_dict(self, model):
+ """
+ Helper function that returns a dictionary of all DateFields or
+ DateTimeFields in the given model. If self.field_names is set, it takes
+ take that into account when building the dictionary.
+ """
+ if self.field_names is None:
+ return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField)])
+ else:
+ return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField) and f.name in self.field_names])
+
+ def model_index_html(self, request, model, site):
+ fields = self.field_dict(model)
+ if not fields:
+ return ''
+ return '<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
+ ', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, capfirst(f.verbose_name)) for f in fields.values()])
+
+ def urls(self, plugin_name, easy_instance_field):
+ if isinstance(easy_instance_field.field, models.DateField):
+ return ['%s%s/%s/%s/%s/%s/' % (easy_instance_field.model.url(),
+ plugin_name, easy_instance_field.field.name,
+ easy_instance_field.raw_value.year,
+ easy_instance_field.raw_value.strftime('%b').lower(),
+ easy_instance_field.raw_value.day)]
+
+ def model_view(self, request, model_databrowse, url):
+ self.model, self.site = model_databrowse.model, model_databrowse.site
+ self.fields = self.field_dict(self.model)
+
+ # If the model has no DateFields, there's no point in going further.
+ if not self.fields:
+ raise http.Http404('The requested model has no calendars.')
+
+ if url is None:
+ return self.homepage_view(request)
+ url_bits = url.split('/')
+ if self.fields.has_key(url_bits[0]):
+ return self.calendar_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+ raise http.Http404('The requested page does not exist.')
+
+ def homepage_view(self, request):
+ easy_model = EasyModel(self.site, self.model)
+ field_list = self.fields.values()
+ field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+ return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+ def calendar_view(self, request, field, year=None, month=None, day=None):
+ easy_model = EasyModel(self.site, self.model)
+ extra_context = {'root_url': self.site.root_url, 'model': easy_model, 'field': field}
+ if day is not None:
+ # TODO: The objects in this template should be EasyInstances
+ return date_based.archive_day(request, year, month, day, self.model.objects.all(), field.name,
+ template_name='databrowse/calendar_day.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ elif month is not None:
+ return date_based.archive_month(request, year, month, self.model.objects.all(), field.name,
+ template_name='databrowse/calendar_month.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ elif year is not None:
+ return date_based.archive_year(request, year, self.model.objects.all(), field.name,
+ template_name='databrowse/calendar_year.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ else:
+ return date_based.archive_index(request, self.model.objects.all(), field.name,
+ template_name='databrowse/calendar_main.html', allow_empty=True, allow_future=True,
+ extra_context=extra_context)
+ assert False, ('%s, %s, %s, %s' % (field, year, month, day))
diff --git a/django/contrib/databrowse/plugins/fieldchoices.py b/django/contrib/databrowse/plugins/fieldchoices.py
new file mode 100644
index 0000000000..49d17ff148
--- /dev/null
+++ b/django/contrib/databrowse/plugins/fieldchoices.py
@@ -0,0 +1,72 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.views.generic import date_based
+import datetime
+import time
+
+class FieldChoicePlugin(DatabrowsePlugin):
+ def __init__(self, field_filter=None):
+ # If field_filter is given, it should be a callable that takes a
+ # Django database Field instance and returns True if that field should
+ # be included. If field_filter is None, that all fields will be used.
+ self.field_filter = field_filter
+
+ def field_dict(self, model):
+ """
+ Helper function that returns a dictionary of all fields in the given
+ model. If self.field_filter is set, it only includes the fields that
+ match the filter.
+ """
+ if self.field_filter:
+ return dict([(f.name, f) for f in model._meta.fields if self.field_filter(f)])
+ else:
+ return dict([(f.name, f) for f in model._meta.fields if not f.rel and not f.primary_key and not f.unique and not isinstance(f, (models.AutoField, models.TextField))])
+
+ def model_index_html(self, request, model, site):
+ fields = self.field_dict(model)
+ if not fields:
+ return ''
+ return '<p class="filter"><strong>View by:</strong> %s</p>' % \
+ ', '.join(['<a href="fields/%s/">%s</a>' % (f.name, capfirst(f.verbose_name)) for f in fields.values()])
+
+ def urls(self, plugin_name, easy_instance_field):
+ if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
+ return ['%s%s/%s/%s/' % (easy_instance_field.model.url(),
+ plugin_name, easy_instance_field.field.name,
+ easy_instance_field.raw_value)]
+
+ def model_view(self, request, model_databrowse, url):
+ self.model, self.site = model_databrowse.model, model_databrowse.site
+ self.fields = self.field_dict(self.model)
+
+ # If the model has no fields with choices, there's no point in going
+ # further.
+ if not self.fields:
+ raise http.Http404('The requested model has no fields.')
+
+ if url is None:
+ return self.homepage_view(request)
+ url_bits = url.split('/', 1)
+ if self.fields.has_key(url_bits[0]):
+ return self.field_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+ raise http.Http404('The requested page does not exist.')
+
+ def homepage_view(self, request):
+ easy_model = EasyModel(self.site, self.model)
+ field_list = self.fields.values()
+ field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+ return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+ def field_view(self, request, field, value=None):
+ easy_model = EasyModel(self.site, self.model)
+ easy_field = easy_model.field(field.name)
+ if value is not None:
+ obj_list = easy_model.objects(**{field.name: value})
+ return render_to_response('databrowse/fieldchoice_detail.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'value': value, 'object_list': obj_list})
+ obj_list = [v[field.name] for v in self.model._default_manager.distinct().order_by(field.name).values(field.name)]
+ return render_to_response('databrowse/fieldchoice_list.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'object_list': obj_list})
diff --git a/django/contrib/databrowse/plugins/objects.py b/django/contrib/databrowse/plugins/objects.py
new file mode 100644
index 0000000000..7326566655
--- /dev/null
+++ b/django/contrib/databrowse/plugins/objects.py
@@ -0,0 +1,14 @@
+from django import http
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+import urlparse
+
+class ObjectDetailPlugin(DatabrowsePlugin):
+ def model_view(self, request, model_databrowse, url):
+ # If the object ID wasn't provided, redirect to the model page, which is one level up.
+ if url is None:
+ return http.HttpResponseRedirect(urlparse.urljoin(request.path, '../'))
+ easy_model = EasyModel(model_databrowse.site, model_databrowse.model)
+ obj = easy_model.object_by_pk(url)
+ return render_to_response('databrowse/object_detail.html', {'object': obj, 'root_url': model_databrowse.site.root_url})
diff --git a/django/contrib/databrowse/sites.py b/django/contrib/databrowse/sites.py
new file mode 100644
index 0000000000..8521343e50
--- /dev/null
+++ b/django/contrib/databrowse/sites.py
@@ -0,0 +1,148 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel, EasyChoice
+from django.shortcuts import render_to_response
+
+class AlreadyRegistered(Exception):
+ pass
+
+class NotRegistered(Exception):
+ pass
+
+class DatabrowsePlugin(object):
+ def urls(self, plugin_name, easy_instance_field):
+ """
+ Given an EasyInstanceField object, returns a list of URLs for this
+ plugin's views of this object. These URLs should be absolute.
+
+ Returns None if the EasyInstanceField object doesn't get a
+ list of plugin-specific URLs.
+ """
+ return None
+
+ def model_index_html(self, request, model, site):
+ """
+ Returns a snippet of HTML to include on the model index page.
+ """
+ return ''
+
+ def model_view(self, request, model_databrowse, url):
+ """
+ Handles main URL routing for a plugin's model-specific pages.
+ """
+ raise NotImplementedError
+
+class ModelDatabrowse(object):
+ plugins = {}
+
+ def __init__(self, model, site):
+ self.model = model
+ self.site = site
+
+ def root(self, request, url):
+ """
+ Handles main URL routing for the databrowse app.
+
+ `url` is the remainder of the URL -- e.g. 'objects/3'.
+ """
+ # Delegate to the appropriate method, based on the URL.
+ if url is None:
+ return self.main_view(request)
+ try:
+ plugin_name, rest_of_url = url.split('/', 1)
+ except ValueError: # need more than 1 value to unpack
+ plugin_name, rest_of_url = url, None
+ try:
+ plugin = self.plugins[plugin_name]
+ except KeyError:
+ raise http.Http404('A plugin with the requested name does not exist.')
+ return plugin.model_view(request, self, rest_of_url)
+
+ def main_view(self, request):
+ easy_model = EasyModel(self.site, self.model)
+ html_snippets = '\n'.join([p.model_index_html(request, self.model, self.site) for p in self.plugins.values()])
+ return render_to_response('databrowse/model_detail.html', {
+ 'model': easy_model,
+ 'root_url': self.site.root_url,
+ 'plugin_html': html_snippets,
+ })
+
+class DatabrowseSite(object):
+ def __init__(self):
+ self.registry = {} # model_class -> databrowse_class
+ self.root_url = None
+
+ def register(self, model_or_iterable, databrowse_class=None, **options):
+ """
+ Registers the given model(s) with the given databrowse site.
+
+ The model(s) should be Model classes, not instances.
+
+ If a databrowse class isn't given, it will use DefaultModelDatabrowse
+ (the default databrowse options).
+
+ If a model is already registered, this will raise AlreadyRegistered.
+ """
+ databrowse_class = databrowse_class or DefaultModelDatabrowse
+ if issubclass(model_or_iterable, models.Model):
+ model_or_iterable = [model_or_iterable]
+ for model in model_or_iterable:
+ if model in self.registry:
+ raise AlreadyRegistered('The model %s is already registered' % model.__class__.__name__)
+ self.registry[model] = databrowse_class
+
+ def unregister(self, model_or_iterable):
+ """
+ Unregisters the given model(s).
+
+ If a model isn't already registered, this will raise NotRegistered.
+ """
+ if issubclass(model_or_iterable, models.Model):
+ model_or_iterable = [model_or_iterable]
+ for model in model_or_iterable:
+ if model not in self.registry:
+ raise NotRegistered('The model %s is not registered' % model.__class__.__name__)
+ del self.registry[model]
+
+ def root(self, request, url):
+ """
+ Handles main URL routing for the databrowse app.
+
+ `url` is the remainder of the URL -- e.g. 'comments/comment/'.
+ """
+ self.root_url = request.path[:len(request.path) - len(url)]
+ url = url.rstrip('/') # Trim trailing slash, if it exists.
+
+ if url == '':
+ return self.index(request)
+ elif '/' in url:
+ return self.model_page(request, *url.split('/', 2))
+
+ raise http.Http404('The requested databrowse page does not exist.')
+
+ def index(self, request):
+ m_list = [EasyModel(self, m) for m in self.registry.keys()]
+ return render_to_response('databrowse/homepage.html', {'model_list': m_list, 'root_url': self.root_url})
+
+ def model_page(self, request, app_label, model_name, rest_of_url=None):
+ """
+ Handles the model-specific functionality of the databrowse site, delegating
+ to the appropriate ModelDatabrowse class.
+ """
+ model = models.get_model(app_label, model_name)
+ if model is None:
+ raise http.Http404("App %r, model %r, not found." % (app_label, model_name))
+ try:
+ databrowse_class = self.registry[model]
+ except KeyError:
+ raise http.Http404("This model exists but has not been registered with databrowse.")
+ return databrowse_class(model, self).root(request, rest_of_url)
+
+site = DatabrowseSite()
+
+from django.contrib.databrowse.plugins.calendars import CalendarPlugin
+from django.contrib.databrowse.plugins.objects import ObjectDetailPlugin
+from django.contrib.databrowse.plugins.fieldchoices import FieldChoicePlugin
+
+class DefaultModelDatabrowse(ModelDatabrowse):
+ plugins = {'objects': ObjectDetailPlugin(), 'calendars': CalendarPlugin(), 'fields': FieldChoicePlugin()}
diff --git a/django/contrib/databrowse/templates/databrowse/base.html b/django/contrib/databrowse/templates/databrowse/base.html
new file mode 100644
index 0000000000..30ba5bb2fc
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/base.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+<style type="text/css">
+* { margin:0; padding:0; }
+body { background:#eee; color:#333; font:76%/1.6 "Lucida Grande","Bitstream Vera Sans",Verdana,sans-serif; }
+a { color: #5b80b2; text-decoration:none; }
+a:hover { text-decoration:underline; }
+a img { border:none; }
+h1 { font-size:1.8em; color:#666; margin:0.4em 0 0.2em 0; }
+h2 { font-size:1.5em; color:#666; margin:1em 0 0.2em 0; }
+p { margin:0.5em 0 1em 0; }
+.odd { background-color:#EDF3FE; }
+.quiet { color:#666; }
+/* FILTERS */
+.filter { color:#999; font-size:0.9em; float:left; margin-bottom:10px; margin-right:20px; }
+.filter strong { color:#666; }
+/* OBJECT LISTS */
+.objectlist { clear:both; margin:0 -20px; color:#666; }
+.objectlist li a { display:block; padding:1em 20px; }
+.objectlist li a:hover { background:#5b80b2; color:#3B5572; color:#fff; text-decoration:none; }
+.related h2 { font-size: 1em; margin-bottom: 0.6em; }
+.related .objectlist li a { padding: 0.6em 20px; }
+.related .objectlist li.odd { background:#eee; }
+/* OBJECT DETAIL */
+.objectinfo { border-collapse:collapse; color:#666; margin:0 -20px; }
+.objectinfo td, .objectinfo th { padding:1em 20px; vertical-align:top; }
+.objectinfo td { width:100%; }
+.objectinfo th { text-align:left; white-space:nowrap; }
+/* MODEL GROUPS */
+.modelgroup { color:#999; font-size:0.9em; margin:0 -20px; }
+.modelgroup h2 { font-size:1.2em; margin:0; }
+.modelgroup h2 a { display: block; padding: 0.83em 20px; }
+.modelgroup h2 a:hover { text-decoration: none; color: #fff; }
+.modelgroup p { float:left; margin:-2.65em 0 0 14em; position:relative; }
+.modelgroup p a { white-space:nowrap; }
+.modelgroup a.more { color:#999; }
+.modelgroup:hover { background:#5b80b2; color:#becfe5; }
+.modelgroup:hover p a { color:#becfe5; }
+.modelgroup:hover a { color:#fff; }
+.modelgroup:hover a.more { color:#fff; }
+/* BREADCRUMBS */
+#breadcrumbs { padding:10px 0; color:#999; font-size:0.9em; }
+/* HEADER */
+#header a { display:block; background:#eee; color:#676868; padding:10px 20px; font-weight:bold; font-size:1em; text-decoration:none; border-bottom:1px solid #ddd; }
+#header a:hover { text-decoration:underline; }
+/* CONTENT */
+#content { background:#fff; border-bottom:1px solid #ddd; padding:0 20px; }
+</style>
+</head>
+<body id="{% block bodyid %}page{% endblock %}">
+<div id="header"><a href="{{ root_url }}">Databrowse</a></div>
+<div id="content">
+{% block content %}{% endblock %}
+</div>
+</body>
+</html>
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_day.html b/django/contrib/databrowse/templates/databrowse/calendar_day.html
new file mode 100644
index 0000000000..d45fb3e768
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/calendar_day.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} {{ day|date:"F j, Y" }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../../../">Calendars</a> / <a href="../../../">By {{ field.verbose_name }}</a> / <a href="../../">{{ day.year }}</a> / <a href="../">{{ day|date:"F" }}</a> / {{ day.day }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} on {{ day|date:"F j, Y" }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_homepage.html b/django/contrib/databrowse/templates/databrowse/calendar_homepage.html
new file mode 100644
index 0000000000..5bbc42e353
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/calendar_homepage.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}Calendars{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / Calendars</div>
+
+<h1>Calendars</h1>
+
+<ul class="objectlist">
+{% for field in field_list %}
+<li class="{% cycle odd,even %}"><a href="{{ field.name }}/">{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_main.html b/django/contrib/databrowse/templates/databrowse/calendar_main.html
new file mode 100644
index 0000000000..7f9ba03bbe
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/calendar_main.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ field.verbose_name|capfirst }} calendar{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../">Calendars</a> / By {{ field.verbose_name }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</h1>
+
+<ul class="objectlist">
+{% for year in date_list %}
+<li class="{% cycle odd,even %}"><a href="{{ year.year }}/">{{ year.year }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_month.html b/django/contrib/databrowse/templates/databrowse/calendar_month.html
new file mode 100644
index 0000000000..51a25967f8
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/calendar_month.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ month|date:"F Y" }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../../">Calendars</a> / <a href="../../">By {{ field.verbose_name }}</a> / <a href="../">{{ month.year }}</a> / {{ month|date:"F" }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ month|date:"F Y" }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_year.html b/django/contrib/databrowse/templates/databrowse/calendar_year.html
new file mode 100644
index 0000000000..676ae88e27
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/calendar_year.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ year }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../">Calendars</a> / <a href="../">By {{ field.verbose_name }}</a> / {{ year }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ year }}</h1>
+
+<ul class="objectlist">
+{% for month in date_list %}
+<li class="{% cycle odd,even %}"><a href="{{ month|date:"M"|lower }}/">{{ month|date:"F" }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/choice_detail.html b/django/contrib/databrowse/templates/databrowse/choice_detail.html
new file mode 100644
index 0000000000..977a4a482f
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/choice_detail.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}: {{ value|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="{{ field.url }}">By {{ field.field.verbose_name }}</a> / {{ value|escape }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}: {{ value|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/choice_list.html b/django/contrib/databrowse/templates/databrowse/choice_list.html
new file mode 100644
index 0000000000..b15531a0fd
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/choice_list.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / By {{ field.field.verbose_name }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}</h1>
+
+<ul class="objectlist">
+{% for choice in field.choices %}
+<li class="{% cycle odd,even %}"><a href="{{ choice.url }}">{{ choice.label }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html b/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html
new file mode 100644
index 0000000000..a620ec931c
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst|escape }} with {{ field.field.verbose_name|escape }} {{ value|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../">Fields</a> / <a href="../">By {{ field.field.verbose_name|escape }}</a> / {{ value|escape }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst|escape }} with {{ field.field.verbose_name|escape }} {{ value|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html b/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html
new file mode 100644
index 0000000000..ad842c1e6d
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}Browsable fields in {{ model.verbose_name_plural|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / Fields</div>
+
+<h1>Browsable fields in {{ model.verbose_name_plural }}</h1>
+
+<ul class="objectlist">
+{% for field in field_list %}
+<li class="{% cycle odd,even %}"><a href="{{ field.name }}/">{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html b/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html
new file mode 100644
index 0000000000..686e6bc533
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst|escape }} by {{ field.field.verbose_name|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../">Fields</a> / By {{ field.field.verbose_name|escape }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst|escape }} by {{ field.field.verbose_name|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle odd,even %}"><a href="{{ object }}/">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/homepage.html b/django/contrib/databrowse/templates/databrowse/homepage.html
new file mode 100644
index 0000000000..ebf3ceca80
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/homepage.html
@@ -0,0 +1,21 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}Databrowse{% endblock %}
+
+{% block bodyid %}homepage{% endblock %}
+
+{% block content %}
+
+{% for model in model_list %}
+ <div class="modelgroup {% cycle even,odd %}">
+ <h2><a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a></h2>
+ <p>
+ {% for object in model.sample_objects %}
+ <a href="{{ object.url }}">{{ object }}</a>,
+ {% endfor %}
+ <a class="more" href="{{ model.url }}">More &rarr;</a>
+ </p>
+ </div>
+{% endfor %}
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/model_detail.html b/django/contrib/databrowse/templates/databrowse/model_detail.html
new file mode 100644
index 0000000000..24cd766a3d
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/model_detail.html
@@ -0,0 +1,19 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / {{ model.verbose_name_plural|capfirst }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }}</h1>
+
+{{ plugin_html }}
+
+<ul class="objectlist">
+{% for object in model.objects %}
+ <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/django/contrib/databrowse/templates/databrowse/object_detail.html b/django/contrib/databrowse/templates/databrowse/object_detail.html
new file mode 100644
index 0000000000..0096178cd2
--- /dev/null
+++ b/django/contrib/databrowse/templates/databrowse/object_detail.html
@@ -0,0 +1,41 @@
+{% extends "databrowse/base.html" %}
+
+{% block title %}{{ object.model.verbose_name|capfirst }}: {{ object }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ object.model.url }}">{{ object.model.verbose_name_plural|capfirst }}</a> / {{ object }}</div>
+
+<h1>{{ object.model.verbose_name|capfirst }}: {{ object }}</h1>
+
+<table class="objectinfo">
+{% for field in object.fields %}
+<tr class="{% cycle odd,even %}">
+<th>{{ field.field.verbose_name|capfirst }}</th>
+<td>
+{% if field.urls %}
+{% for urlvalue in field.urls %}
+{% if urlvalue.1 %}<a href="{{ urlvalue.1 }}">{% endif %}{{ urlvalue.0 }}{% if urlvalue.1 %}</a>{% endif %}{% if not forloop.last %}, {% endif %}
+{% endfor %}
+{% else %}None{% endif %}
+</td>
+</tr>
+{% endfor %}
+</table>
+
+{% for related_object in object.related_objects %}
+ <div class="related">
+ <h2>Appears in "{{ related_object.related_field }}" in the following {{ related_object.model.verbose_name_plural }}:</h2>
+ {% if related_object.object_list %}
+ <ul class="objectlist">
+ {% for object in related_object.object_list %}
+ <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% else %}
+ <p class="quiet">(None)</p>
+ {% endif %}
+{% endfor %}
+
+{% endblock %}
diff --git a/django/contrib/databrowse/urls.py b/django/contrib/databrowse/urls.py
new file mode 100644
index 0000000000..9b85d142a2
--- /dev/null
+++ b/django/contrib/databrowse/urls.py
@@ -0,0 +1,20 @@
+from django.conf.urls.defaults import *
+from django.contrib.databrowse import views
+
+# Note: The views in this URLconf all require a 'models' argument,
+# which is a list of model classes (*not* instances).
+
+urlpatterns = patterns('',
+ #(r'^$', views.homepage),
+ #(r'^([^/]+)/([^/]+)/$', views.model_detail),
+
+ (r'^([^/]+)/([^/]+)/fields/(\w+)/$', views.choice_list),
+ (r'^([^/]+)/([^/]+)/fields/(\w+)/(.*)/$', views.choice_detail),
+
+ #(r'^([^/]+)/([^/]+)/calendars/(\w+)/$', views.calendar_main),
+ #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/$', views.calendar_year),
+ #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/(\w{3})/$', views.calendar_month),
+ #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/(\w{3})/(\d{1,2})/$', views.calendar_day),
+
+ #(r'^([^/]+)/([^/]+)/objects/(.*)/$', views.object_detail),
+)
diff --git a/django/contrib/databrowse/views.py b/django/contrib/databrowse/views.py
new file mode 100644
index 0000000000..d493f9dad3
--- /dev/null
+++ b/django/contrib/databrowse/views.py
@@ -0,0 +1,23 @@
+from django.db.models import FieldDoesNotExist, DateTimeField
+from django.http import Http404
+from django.shortcuts import render_to_response
+from django.contrib.databrowse.datastructures import EasyModel, EasyChoice
+import datetime
+import time
+
+###########
+# CHOICES #
+###########
+
+def choice_list(request, app_label, module_name, field_name, models):
+ m, f = lookup_field(app_label, module_name, field_name, models)
+ return render_to_response('databrowse/choice_list.html', {'model': m, 'field': f})
+
+def choice_detail(request, app_label, module_name, field_name, field_val, models):
+ m, f = lookup_field(app_label, module_name, field_name, models)
+ try:
+ label = dict(f.field.choices)[field_val]
+ except KeyError:
+ raise Http404('Invalid choice value given')
+ obj_list = m.objects(**{f.field.name: field_val})
+ return render_to_response('databrowse/choice_detail.html', {'model': m, 'field': f, 'value': label, 'object_list': obj_list})
diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py
index bc2a392121..8d0b2c0d90 100644
--- a/django/contrib/flatpages/models.py
+++ b/django/contrib/flatpages/models.py
@@ -4,7 +4,7 @@ from django.contrib.sites.models import Site
from django.utils.translation import gettext_lazy as _
class FlatPage(models.Model):
- url = models.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL],
+ url = models.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], db_index=True,
help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."))
title = models.CharField(_('title'), maxlength=200)
content = models.TextField(_('content'))
diff --git a/django/contrib/formtools/preview.py b/django/contrib/formtools/preview.py
index 9a9371b5f8..dcb58e85d8 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
@@ -48,6 +48,7 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.http import Http404
from django.shortcuts import render_to_response
+from django.template.context import RequestContext
import cPickle as pickle
import md5
@@ -82,7 +83,7 @@ class FormPreview(object):
"""
while 1:
try:
- f = self.form.fields[name]
+ f = self.form.base_fields[name]
except KeyError:
break # This field name isn't being used by the form.
name += '_'
@@ -91,7 +92,9 @@ class FormPreview(object):
def preview_get(self, request):
"Displays the form"
f = self.form(auto_id=AUTO_ID)
- return render_to_response(self.form_template, {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state})
+ return render_to_response(self.form_template,
+ {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
+ context_instance=RequestContext(request))
def preview_post(self, request):
"Validates the POST data. If valid, displays the preview page. Else, redisplays form."
@@ -100,9 +103,9 @@ class FormPreview(object):
if f.is_valid():
context['hash_field'] = self.unused_name('hash')
context['hash_value'] = self.security_hash(request, f)
- return render_to_response(self.preview_template, context)
+ return render_to_response(self.preview_template, context, context_instance=RequestContext(request))
else:
- return render_to_response(self.form_template, context)
+ return render_to_response(self.form_template, context, context_instance=RequestContext(request))
def post_post(self, request):
"Validates the POST data. If valid, calls done(). Else, redisplays form."
@@ -110,9 +113,11 @@ 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})
+ return render_to_response(self.form_template,
+ {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
+ context_instance=RequestContext(request))
# METHODS SUBCLASSES MIGHT OVERRIDE IF APPROPRIATE ########################
@@ -155,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/contrib/formtools/templates/formtools/form.html b/django/contrib/formtools/templates/formtools/form.html
index 90da8b2b2b..194bbdd675 100644
--- a/django/contrib/formtools/templates/formtools/form.html
+++ b/django/contrib/formtools/templates/formtools/form.html
@@ -9,7 +9,7 @@
{{ form }}
</table>
<input type="hidden" name="{{ stage_field }}" value="1" />
-<p><input type="submit" value="Submit" /></p>
+<p><input type="submit" value="Preview" /></p>
</form>
{% endblock %}
diff --git a/django/contrib/formtools/templates/formtools/preview.html b/django/contrib/formtools/templates/formtools/preview.html
index c7955d46e1..983115758f 100644
--- a/django/contrib/formtools/templates/formtools/preview.html
+++ b/django/contrib/formtools/templates/formtools/preview.html
@@ -7,7 +7,7 @@
<table>
{% for field in form %}
<tr>
-<th>{{ field.verbose_name }}:</th>
+<th>{{ field.label }}:</th>
<td>{{ field.data|escape }}</td>
</tr>
{% endfor %}
@@ -30,7 +30,7 @@
{{ form }}
</table>
<input type="hidden" name="{{ stage_field }}" value="1" />
-<p><input type="submit" value="Submit changes" /></p>
+<p><input type="submit" value="Preview" /></p>
</form>
{% endblock %}
diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py
index b2d28a0ab4..a16cbcc9bb 100644
--- a/django/contrib/humanize/templatetags/humanize.py
+++ b/django/contrib/humanize/templatetags/humanize.py
@@ -1,3 +1,5 @@
+from django.utils.translation import ngettext
+from django.utils.translation import gettext_lazy as _
from django import template
import re
@@ -12,9 +14,9 @@ def ordinal(value):
value = int(value)
except ValueError:
return value
- t = ('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th')
+ t = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th'))
if value % 100 in (11, 12, 13): # special case
- return '%dth' % value
+ return "%d%s" % (value, t[0])
return '%d%s' % (value, t[value % 10])
register.filter(ordinal)
@@ -41,11 +43,14 @@ def intword(value):
if value < 1000000:
return value
if value < 1000000000:
- return '%.1f million' % (value / 1000000.0)
+ new_value = value / 1000000.0
+ return ngettext('%(value).1f million', '%(value).1f million', new_value) % {'value': new_value}
if value < 1000000000000:
- return '%.1f billion' % (value / 1000000000.0)
+ new_value = value / 1000000000.0
+ return ngettext('%(value).1f billion', '%(value).1f billion', new_value) % {'value': new_value}
if value < 1000000000000000:
- return '%.1f trillion' % (value / 1000000000000.0)
+ new_value = value / 1000000000000.0
+ return ngettext('%(value).1f trillion', '%(value).1f trillion', new_value) % {'value': new_value}
return value
register.filter(intword)
@@ -60,5 +65,5 @@ def apnumber(value):
return value
if not 0 < value < 10:
return value
- return ('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine')[value-1]
+ return (_('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'))[value-1]
register.filter(apnumber)
diff --git a/tests/regressiontests/markup/models.py b/django/contrib/localflavor/__init__.py
index e69de29bb2..e69de29bb2 100644
--- a/tests/regressiontests/markup/models.py
+++ b/django/contrib/localflavor/__init__.py
diff --git a/django/contrib/localflavor/au/__init__.py b/django/contrib/localflavor/au/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/au/__init__.py
diff --git a/django/contrib/localflavor/au/au_states.py b/django/contrib/localflavor/au/au_states.py
new file mode 100644
index 0000000000..578d61bb01
--- /dev/null
+++ b/django/contrib/localflavor/au/au_states.py
@@ -0,0 +1,17 @@
+"""
+An alphabetical list of states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+ ('ACT', 'Australian Capital Territory'),
+ ('NSW', 'New South Wales'),
+ ('NT', 'Northern Territory'),
+ ('QLD', 'Queensland'),
+ ('SA', 'South Australia'),
+ ('TAS', 'Tasmania'),
+ ('VIC', 'Victoria'),
+ ('WA', 'Western Australia'),
+)
diff --git a/django/contrib/localflavor/au/forms.py b/django/contrib/localflavor/au/forms.py
new file mode 100644
index 0000000000..b81a903d13
--- /dev/null
+++ b/django/contrib/localflavor/au/forms.py
@@ -0,0 +1,43 @@
+"""
+Australian-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.newforms.util import smart_unicode
+from django.utils.translation import gettext
+import re
+
+PHONE_DIGITS_RE = re.compile(r'^(\d{10})$')
+
+class AUPostCodeField(RegexField):
+ """Australian post code field."""
+ def __init__(self, *args, **kwargs):
+ super(AUPostCodeField, self).__init__(r'^\d{4}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a 4 digit post code.'),
+ *args, **kwargs)
+
+class AUPhoneNumberField(Field):
+ """Australian phone number field."""
+ def clean(self, value):
+ """Validate a phone number. Strips parentheses, whitespace and
+ hyphens.
+ """
+ super(AUPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value))
+ phone_match = PHONE_DIGITS_RE.search(value)
+ if phone_match:
+ return u'%s' % phone_match.group(1)
+ raise ValidationError(u'Phone numbers must contain 10 digits.')
+
+class AUStateSelect(Select):
+ """
+ A Select widget that uses a list of Australian states/territories as its
+ choices.
+ """
+ def __init__(self, attrs=None):
+ from au_states import STATE_CHOICES # relative import
+ super(AUStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
diff --git a/django/contrib/localflavor/br/__init__.py b/django/contrib/localflavor/br/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/br/__init__.py
diff --git a/django/contrib/localflavor/br/br_states.py b/django/contrib/localflavor/br/br_states.py
new file mode 100644
index 0000000000..98e54bca2c
--- /dev/null
+++ b/django/contrib/localflavor/br/br_states.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+An alphabetical list of Brazilian states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+ ('AC', 'Acre'),
+ ('AL', 'Alagoas'),
+ ('AP', u'Amapá'),
+ ('AM', 'Amazonas'),
+ ('BA', 'Bahia'),
+ ('CE', u'Ceará'),
+ ('DF', 'Distrito Federal'),
+ ('ES', u'Espírito Santo'),
+ ('GO', u'Goiás'),
+ ('MA', u'Maranhão'),
+ ('MT', 'Mato Grosso'),
+ ('MS', 'Mato Grosso do Sul'),
+ ('MG', 'Minas Gerais'),
+ ('PA', u'Pará'),
+ ('PB', u'Paraíba'),
+ ('PR', u'Paraná'),
+ ('PE', 'Pernambuco'),
+ ('PI', u'Piauí'),
+ ('RJ', 'Rio de Janeiro'),
+ ('RN', 'Rio Grande do Norte'),
+ ('RS', 'Rio Grande do Sul'),
+ ('RO', u'Rondônia'),
+ ('RR', 'Roraima'),
+ ('SC', 'Santa Catarina'),
+ ('SP', u'São Paulo'),
+ ('SE', 'Sergipe'),
+ ('TO', 'Tocantins'),
+)
diff --git a/django/contrib/localflavor/br/forms.py b/django/contrib/localflavor/br/forms.py
new file mode 100644
index 0000000000..3487787643
--- /dev/null
+++ b/django/contrib/localflavor/br/forms.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+"""
+BR-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, CharField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+phone_digits_re = re.compile(r'^(\d{2})[-\.]?(\d{4})[-\.]?(\d{4})$')
+
+class BRZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(BRZipCodeField, self).__init__(r'^\d{5}-\d{3}$',
+ max_length=None, min_length=None,
+ error_message=gettext('Enter a zip code in the format XXXXX-XXX.'),
+ *args, **kwargs)
+
+class BRPhoneNumberField(Field):
+ def clean(self, value):
+ super(BRPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
+ m = phone_digits_re.search(value)
+ if m:
+ return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+ raise ValidationError(gettext(u'Phone numbers must be in XX-XXXX-XXXX format.'))
+
+class BRStateSelect(Select):
+ """
+ A Select widget that uses a list of Brazilian states/territories
+ as its choices.
+ """
+ def __init__(self, attrs=None):
+ from br_states import STATE_CHOICES # relative import
+ super(BRStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+
+def DV_maker(v):
+ if v >= 2:
+ return 11 - v
+ return 0
+
+class BRCPFField(CharField):
+ """
+ This field validate a CPF number or a CPF string. A CPF number is
+ compounded by XXX.XXX.XXX-VD. The two last digits are check digits.
+
+ More information:
+ http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas
+ """
+ def __init__(self, *args, **kwargs):
+ super(BRCPFField, self).__init__(max_length=14, min_length=11, *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Value can be either a string in the format XXX.XXX.XXX-XX or an
+ 11-digit number.
+ """
+ value = super(BRCPFField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ orig_value = value[:]
+ if not value.isdigit():
+ value = re.sub("[-\.]", "", value)
+ try:
+ int(value)
+ except ValueError:
+ raise ValidationError(gettext("This field requires only numbers."))
+ if len(value) != 11:
+ raise ValidationError(gettext("This field requires at most 11 digits or 14 characters."))
+ orig_dv = value[-2:]
+
+ new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(10, 1, -1))])
+ new_1dv = DV_maker(new_1dv % 11)
+ value = value[:-2] + str(new_1dv) + value[-1]
+ new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(range(11, 1, -1))])
+ new_2dv = DV_maker(new_2dv % 11)
+ value = value[:-1] + str(new_2dv)
+ if value[-2:] != orig_dv:
+ raise ValidationError(gettext("Invalid CPF number."))
+
+ return orig_value
+
+class BRCNPJField(Field):
+ def clean(self, value):
+ """
+ Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
+ group of 14 characters.
+ """
+ value = super(BRCNPJField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ orig_value = value[:]
+ if not value.isdigit():
+ value = re.sub("[-/\.]", "", value)
+ try:
+ int(value)
+ except ValueError:
+ raise ValidationError("This field requires only numbers.")
+ if len(value) != 14:
+ raise ValidationError(
+ gettext("This field requires at least 14 digits"))
+ orig_dv = value[-2:]
+
+ new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(5, 1, -1) + range(9, 1, -1))])
+ new_1dv = DV_maker(new_1dv % 11)
+ value = value[:-2] + str(new_1dv) + value[-1]
+ new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(range(6, 1, -1) + range(9, 1, -1))])
+ new_2dv = DV_maker(new_2dv % 11)
+ value = value[:-1] + str(new_2dv)
+ if value[-2:] != orig_dv:
+ raise ValidationError(gettext("Invalid CNPJ number."))
+
+ return orig_value
+
diff --git a/django/contrib/localflavor/ch/__init__.py b/django/contrib/localflavor/ch/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/ch/__init__.py
diff --git a/django/contrib/localflavor/ch/ch_states.py b/django/contrib/localflavor/ch/ch_states.py
new file mode 100644
index 0000000000..e9bbcc6268
--- /dev/null
+++ b/django/contrib/localflavor/ch/ch_states.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import gettext_lazy as _
+
+STATE_CHOICES = (
+ ('AG', _('Aargau')),
+ ('AI', _('Appenzell Innerrhoden')),
+ ('AR', _('Appenzell Ausserrhoden')),
+ ('BS', _('Basel-Stadt')),
+ ('BL', _('Basel-Land')),
+ ('BE', _('Berne')),
+ ('FR', _('Fribourg')),
+ ('GE', _('Geneva')),
+ ('GL', _('Glarus')),
+ ('GR', _('Graubuenden')),
+ ('JU', _('Jura')),
+ ('LU', _('Lucerne')),
+ ('NE', _('Neuchatel')),
+ ('NW', _('Nidwalden')),
+ ('OW', _('Obwalden')),
+ ('SH', _('Schaffhausen')),
+ ('SZ', _('Schwyz')),
+ ('SO', _('Solothurn')),
+ ('SG', _('St. Gallen')),
+ ('TG', _('Thurgau')),
+ ('TI', _('Ticino')),
+ ('UR', _('Uri')),
+ ('VS', _('Valais')),
+ ('VD', _('Vaud')),
+ ('ZG', _('Zug')),
+ ('ZH', _('Zurich'))
+)
diff --git a/django/contrib/localflavor/ch/forms.py b/django/contrib/localflavor/ch/forms.py
new file mode 100644
index 0000000000..51e52dc0e9
--- /dev/null
+++ b/django/contrib/localflavor/ch/forms.py
@@ -0,0 +1,109 @@
+"""
+Swiss-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+id_re = re.compile(r"^(?P<idnumber>\w{8})(?P<pos9>(\d{1}|<))(?P<checksum>\d{1})$")
+phone_digits_re = re.compile(r'^0([1-9]{1})\d{8}$')
+
+class CHZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(CHZipCodeField, self).__init__(r'^\d{4}$',
+ max_length=None, min_length=None,
+ error_message=gettext('Enter a zip code in the format XXXX.'),
+ *args, **kwargs)
+
+class CHPhoneNumberField(Field):
+ """
+ Validate local Swiss phone number (not international ones)
+ The correct format is '0XX XXX XX XX'.
+ '0XX.XXX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
+ '0XX XXX XX XX'.
+ """
+ def clean(self, value):
+ super(CHPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
+ m = phone_digits_re.search(value)
+ if m:
+ return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10])
+ raise ValidationError('Phone numbers must be in 0XX XXX XX XX format.')
+
+class CHStateSelect(Select):
+ """
+ A Select widget that uses a list of CH states as its choices.
+ """
+ def __init__(self, attrs=None):
+ from ch_states import STATE_CHOICES # relative import
+ super(CHStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class CHIdentityCardNumberField(Field):
+ """
+ A Swiss identity card number.
+
+ Checks the following rules to determine whether the number is valid:
+
+ * Conforms to the X1234567<0 or 1234567890 format.
+ * Included checksums match calculated checksums
+
+ Algorithm is documented at http://adi.kousz.ch/artikel/IDCHE.htm
+ """
+ def has_valid_checksum(self, number):
+ given_number, given_checksum = number[:-1], number[-1]
+ new_number = given_number
+ calculated_checksum = 0
+ fragment = ""
+ parameter = 7
+
+ first = str(number[:1])
+ if first.isalpha():
+ num = ord(first.upper()) - 65
+ if num < 0 or num > 8:
+ return False
+ new_number = str(num) + new_number[1:]
+ new_number = new_number[:8] + '0'
+
+ if not new_number.isdigit():
+ return False
+
+ for i in range(len(new_number)):
+ fragment = int(new_number[i])*parameter
+ calculated_checksum += fragment
+
+ if parameter == 1:
+ parameter = 7
+ elif parameter == 3:
+ parameter = 1
+ elif parameter ==7:
+ parameter = 3
+
+ return str(calculated_checksum)[-1] == given_checksum
+
+ def clean(self, value):
+ super(CHIdentityCardNumberField, self).clean(value)
+ error_msg = gettext('Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.')
+ if value in EMPTY_VALUES:
+ return u''
+
+ match = re.match(id_re, value)
+ if not match:
+ raise ValidationError(error_msg)
+
+ idnumber, pos9, checksum = match.groupdict()['idnumber'], match.groupdict()['pos9'], match.groupdict()['checksum']
+
+ if idnumber == '00000000' or \
+ idnumber == 'A0000000':
+ raise ValidationError(error_msg)
+
+ all_digits = "%s%s%s" % (idnumber, pos9, checksum)
+ if not self.has_valid_checksum(all_digits):
+ raise ValidationError(error_msg)
+
+ return u'%s%s%s' % (idnumber, pos9, checksum)
+
diff --git a/django/contrib/localflavor/cl/__init__.py b/django/contrib/localflavor/cl/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/cl/__init__.py
diff --git a/django/contrib/localflavor/cl/forms.py b/django/contrib/localflavor/cl/forms.py
new file mode 100644
index 0000000000..87c8093407
--- /dev/null
+++ b/django/contrib/localflavor/cl/forms.py
@@ -0,0 +1,78 @@
+"""
+Chile specific form helpers.
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import RegexField, EMPTY_VALUES
+from django.utils.translation import gettext
+
+class CLRutField(RegexField):
+ """
+ Chilean "Rol Unico Tributario" (RUT) field. This is the Chilean national
+ identification number.
+
+ Samples for testing are available from
+ https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html
+ """
+ def __init__(self, *args, **kwargs):
+ if 'strict' in kwargs:
+ del kwargs['strict']
+ super(CLRutField, self).__init__(r'^(\d{1,2}\.)?\d{3}\.\d{3}-[\dkK]$',
+ error_message=gettext('Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.'),
+ *args, **kwargs)
+ else:
+ # In non-strict mode, accept RUTs that validate but do not exist in
+ # the real world.
+ super(CLRutField, self).__init__(r'^[\d\.]{1,11}-?[\dkK]$', error_message=gettext(u'Enter valid a Chilean RUT'), *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Check and clean the Chilean RUT.
+ """
+ super(CLRutField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ rut, verificador = self._canonify(value)
+ if self._algorithm(rut) == verificador:
+ return self._format(rut, verificador)
+ else:
+ raise ValidationError(u'The Chilean RUT is not valid.')
+
+ def _algorithm(self, rut):
+ """
+ Takes RUT in pure canonical form, calculates the verifier digit.
+ """
+ suma = 0
+ multi = 2
+ for r in rut[::-1]:
+ suma += int(r) * multi
+ multi += 1
+ if multi == 8:
+ multi = 2
+ return '0123456789K0'[11 - suma % 11]
+
+ def _canonify(self, rut):
+ """
+ Turns the RUT into one normalized format. Returns a (rut, verifier)
+ tuple.
+ """
+ rut = str(rut).replace(' ', '').replace('.', '').replace('-', '')
+ return rut[:-1], rut[-1]
+
+ def _format(self, code, verifier=None):
+ """
+ Formats the RUT from canonical form to the common string representation.
+ If verifier=None, then the last digit in 'code' is the verifier.
+ """
+ if verifier is None:
+ verifier = code[-1]
+ code = code[:-1]
+ while len(code) > 3 and '.' not in code[:3]:
+ pos = code.find('.')
+ if pos == -1:
+ new_dot = -3
+ else:
+ new_dot = pos - 3
+ code = code[:new_dot] + '.' + code[new_dot:]
+ return '%s-%s' % (code, verifier)
+
diff --git a/django/contrib/localflavor/de/__init__.py b/django/contrib/localflavor/de/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/de/__init__.py
diff --git a/django/contrib/localflavor/de/de_states.py b/django/contrib/localflavor/de/de_states.py
new file mode 100644
index 0000000000..c00fd2e293
--- /dev/null
+++ b/django/contrib/localflavor/de/de_states.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import gettext_lazy as _
+
+STATE_CHOICES = (
+ ('BW', _('Baden-Wuerttemberg')),
+ ('BY', _('Bavaria')),
+ ('BE', _('Berlin')),
+ ('BB', _('Brandenburg')),
+ ('HB', _('Bremen')),
+ ('HH', _('Hamburg')),
+ ('HE', _('Hessen')),
+ ('MV', _('Mecklenburg-Western Pomerania')),
+ ('NI', _('Lower Saxony')),
+ ('NW', _('North Rhine-Westphalia')),
+ ('RP', _('Rhineland-Palatinate')),
+ ('SL', _('Saarland')),
+ ('SN', _('Saxony')),
+ ('ST', _('Saxony-Anhalt')),
+ ('SH', _('Schleswig-Holstein')),
+ ('TH', _('Thuringia')),
+)
diff --git a/django/contrib/localflavor/de/forms.py b/django/contrib/localflavor/de/forms.py
new file mode 100644
index 0000000000..8e140c125f
--- /dev/null
+++ b/django/contrib/localflavor/de/forms.py
@@ -0,0 +1,79 @@
+"""
+DE-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import gettext
+import re
+
+id_re = re.compile(r"^(?P<residence>\d{10})(?P<origin>\w{1,3})[-\ ]?(?P<birthday>\d{7})[-\ ]?(?P<validity>\d{7})[-\ ]?(?P<checksum>\d{1})$")
+
+class DEZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(DEZipCodeField, self).__init__(r'^\d{5}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a zip code in the format XXXXX.'),
+ *args, **kwargs)
+
+class DEStateSelect(Select):
+ """
+ A Select widget that uses a list of DE states as its choices.
+ """
+ def __init__(self, attrs=None):
+ from de_states import STATE_CHOICES # relative import
+ super(DEStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class DEIdentityCardNumberField(Field):
+ """
+ A German identity card number.
+
+ Checks the following rules to determine whether the number is valid:
+
+ * Conforms to the XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.
+ * No group consists entirely of zeroes.
+ * Included checksums match calculated checksums
+
+ Algorithm is documented at http://de.wikipedia.org/wiki/Personalausweis
+ """
+ def has_valid_checksum(self, number):
+ given_number, given_checksum = number[:-1], number[-1]
+ calculated_checksum = 0
+ fragment = ""
+ parameter = 7
+
+ for i in range(len(given_number)):
+ fragment = str(int(given_number[i]) * parameter)
+ if fragment.isalnum():
+ calculated_checksum += int(fragment[-1])
+ if parameter == 1:
+ parameter = 7
+ elif parameter == 3:
+ parameter = 1
+ elif parameter ==7:
+ parameter = 3
+
+ return str(calculated_checksum)[-1] == given_checksum
+
+ def clean(self, value):
+ super(DEIdentityCardNumberField, self).clean(value)
+ error_msg = gettext(u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.')
+ if value in EMPTY_VALUES:
+ return u''
+ match = re.match(id_re, value)
+ if not match:
+ raise ValidationError(error_msg)
+
+ gd = match.groupdict()
+ residence, origin = gd['residence'], gd['origin']
+ birthday, validity, checksum = gd['birthday'], gd['validity'], gd['checksum']
+
+ if residence == '0000000000' or birthday == '0000000' or validity == '0000000':
+ raise ValidationError(error_msg)
+
+ all_digits = "%s%s%s%s" % (residence, birthday, validity, checksum)
+ if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \
+ not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits):
+ raise ValidationError(error_msg)
+
+ return u'%s%s-%s-%s-%s' % (residence, origin, birthday, validity, checksum)
diff --git a/django/contrib/localflavor/fi/__init__.py b/django/contrib/localflavor/fi/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/fi/__init__.py
diff --git a/django/contrib/localflavor/fi/fi_municipalities.py b/django/contrib/localflavor/fi/fi_municipalities.py
new file mode 100644
index 0000000000..965a52d327
--- /dev/null
+++ b/django/contrib/localflavor/fi/fi_municipalities.py
@@ -0,0 +1,427 @@
+# -*- coding: utf-8 -*-
+"""
+An alphabetical list of Finnish municipalities for use as `choices` in a
+formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+MUNICIPALITY_CHOICES = (
+ ('akaa', u"Akaa"),
+ ('alaharma', u"Alahärmä"),
+ ('alajarvi', u"Alajärvi"),
+ ('alastaro', u"Alastaro"),
+ ('alavieska', u"Alavieska"),
+ ('alavus', u"Alavus"),
+ ('anjalankoski', u"Anjalankoski"),
+ ('artjarvi', u"Artjärvi"),
+ ('asikkala', u"Asikkala"),
+ ('askainen', u"Askainen"),
+ ('askola', u"Askola"),
+ ('aura', u"Aura"),
+ ('brando', u"Brändö"),
+ ('dragsfjard', u"Dragsfjärd"),
+ ('eckero', u"Eckerö"),
+ ('elimaki', u"Elimäki"),
+ ('eno', u"Eno"),
+ ('enonkoski', u"Enonkoski"),
+ ('enontekio', u"Enontekiö"),
+ ('espoo', u"Espoo"),
+ ('eura', u"Eura"),
+ ('eurajoki', u"Eurajoki"),
+ ('evijarvi', u"Evijärvi"),
+ ('finstrom', u"Finström"),
+ ('forssa', u"Forssa"),
+ ('foglo', u"Föglö"),
+ ('geta', u"Geta"),
+ ('haapajarvi', u"Haapajärvi"),
+ ('haapavesi', u"Haapavesi"),
+ ('hailuoto', u"Hailuoto"),
+ ('halikko', u"Halikko"),
+ ('halsua', u"Halsua"),
+ ('hamina', u"Hamina"),
+ ('hammarland', u"Hammarland"),
+ ('hankasalmi', u"Hankasalmi"),
+ ('hanko', u"Hanko"),
+ ('harjavalta', u"Harjavalta"),
+ ('hartola', u"Hartola"),
+ ('hattula', u"Hattula"),
+ ('hauho', u"Hauho"),
+ ('haukipudas', u"Haukipudas"),
+ ('hausjarvi', u"Hausjärvi"),
+ ('heinola', u"Heinola"),
+ ('heinavesi', u"Heinävesi"),
+ ('helsinki', u"Helsinki"),
+ ('himanka', u"Himanka"),
+ ('hirvensalmi', u"Hirvensalmi"),
+ ('hollola', u"Hollola"),
+ ('honkajoki', u"Honkajoki"),
+ ('houtskari', u"Houtskari"),
+ ('huittinen', u"Huittinen"),
+ ('humppila', u"Humppila"),
+ ('hyrynsalmi', u"Hyrynsalmi"),
+ ('hyvinkaa', u"Hyvinkää"),
+ ('hameenkoski', u"Hämeenkoski"),
+ ('hameenkyro', u"Hämeenkyrö"),
+ ('hameenlinna', u"Hämeenlinna"),
+ ('ii', u"Ii"),
+ ('iisalmi', u"Iisalmi"),
+ ('iitti', u"Iitti"),
+ ('ikaalinen', u"Ikaalinen"),
+ ('ilmajoki', u"Ilmajoki"),
+ ('ilomantsi', u"Ilomantsi"),
+ ('imatra', u"Imatra"),
+ ('inari', u"Inari"),
+ ('inio', u"Iniö"),
+ ('inkoo', u"Inkoo"),
+ ('isojoki', u"Isojoki"),
+ ('isokyro', u"Isokyrö"),
+ ('jaala', u"Jaala"),
+ ('jalasjarvi', u"Jalasjärvi"),
+ ('janakkala', u"Janakkala"),
+ ('joensuu', u"Joensuu"),
+ ('jokioinen', u"Jokioinen"),
+ ('jomala', u"Jomala"),
+ ('joroinen', u"Joroinen"),
+ ('joutsa', u"Joutsa"),
+ ('joutseno', u"Joutseno"),
+ ('juankoski', u"Juankoski"),
+ ('jurva', u"Jurva"),
+ ('juuka', u"Juuka"),
+ ('juupajoki', u"Juupajoki"),
+ ('juva', u"Juva"),
+ ('jyvaskyla', u"Jyväskylä"),
+ ('jyvaskylan_mlk', u"Jyväskylän maalaiskunta"),
+ ('jamijarvi', u"Jämijärvi"),
+ ('jamsa', u"Jämsä"),
+ ('jamsankoski', u"Jämsänkoski"),
+ ('jarvenpaa', u"Järvenpää"),
+ ('kaarina', u"Kaarina"),
+ ('kaavi', u"Kaavi"),
+ ('kajaani', u"Kajaani"),
+ ('kalajoki', u"Kalajoki"),
+ ('kalvola', u"Kalvola"),
+ ('kangasala', u"Kangasala"),
+ ('kangasniemi', u"Kangasniemi"),
+ ('kankaanpaa', u"Kankaanpää"),
+ ('kannonkoski', u"Kannonkoski"),
+ ('kannus', u"Kannus"),
+ ('karijoki', u"Karijoki"),
+ ('karjaa', u"Karjaa"),
+ ('karjalohja', u"Karjalohja"),
+ ('karkkila', u"Karkkila"),
+ ('karstula', u"Karstula"),
+ ('karttula', u"Karttula"),
+ ('karvia', u"Karvia"),
+ ('kaskinen', u"Kaskinen"),
+ ('kauhajoki', u"Kauhajoki"),
+ ('kauhava', u"Kauhava"),
+ ('kauniainen', u"Kauniainen"),
+ ('kaustinen', u"Kaustinen"),
+ ('keitele', u"Keitele"),
+ ('kemi', u"Kemi"),
+ ('kemijarvi', u"Kemijärvi"),
+ ('keminmaa', u"Keminmaa"),
+ ('kemio', u"Kemiö"),
+ ('kempele', u"Kempele"),
+ ('kerava', u"Kerava"),
+ ('kerimaki', u"Kerimäki"),
+ ('kestila', u"Kestilä"),
+ ('kesalahti', u"Kesälahti"),
+ ('keuruu', u"Keuruu"),
+ ('kihnio', u"Kihniö"),
+ ('kiikala', u"Kiikala"),
+ ('kiikoinen', u"Kiikoinen"),
+ ('kiiminki', u"Kiiminki"),
+ ('kinnula', u"Kinnula"),
+ ('kirkkonummi', u"Kirkkonummi"),
+ ('kisko', u"Kisko"),
+ ('kitee', u"Kitee"),
+ ('kittila', u"Kittilä"),
+ ('kiukainen', u"Kiukainen"),
+ ('kiuruvesi', u"Kiuruvesi"),
+ ('kivijarvi', u"Kivijärvi"),
+ ('kokemaki', u"Kokemäki"),
+ ('kokkola', u"Kokkola"),
+ ('kolari', u"Kolari"),
+ ('konnevesi', u"Konnevesi"),
+ ('kontiolahti', u"Kontiolahti"),
+ ('korpilahti', u"Korpilahti"),
+ ('korppoo', u"Korppoo"),
+ ('korsnas', u"Korsnäs"),
+ ('kortesjarvi', u"Kortesjärvi"),
+ ('koskitl', u"KoskiTl"),
+ ('kotka', u"Kotka"),
+ ('kouvola', u"Kouvola"),
+ ('kristiinankaupunki', u"Kristiinankaupunki"),
+ ('kruunupyy', u"Kruunupyy"),
+ ('kuhmalahti', u"Kuhmalahti"),
+ ('kuhmo', u"Kuhmo"),
+ ('kuhmoinen', u"Kuhmoinen"),
+ ('kumlinge', u"Kumlinge"),
+ ('kuopio', u"Kuopio"),
+ ('kuortane', u"Kuortane"),
+ ('kurikka', u"Kurikka"),
+ ('kuru', u"Kuru"),
+ ('kustavi', u"Kustavi"),
+ ('kuusamo', u"Kuusamo"),
+ ('kuusankoski', u"Kuusankoski"),
+ ('kuusjoki', u"Kuusjoki"),
+ ('kylmakoski', u"Kylmäkoski"),
+ ('kyyjarvi', u"Kyyjärvi"),
+ ('kalvia', u"Kälviä"),
+ ('karkola', u"Kärkölä"),
+ ('karsamaki', u"Kärsämäki"),
+ ('kokar', u"Kökar"),
+ ('koylio', u"Köyliö"),
+ ('lahti', u"Lahti"),
+ ('laihia', u"Laihia"),
+ ('laitila', u"Laitila"),
+ ('lammi', u"Lammi"),
+ ('lapinjarvi', u"Lapinjärvi"),
+ ('lapinlahti', u"Lapinlahti"),
+ ('lappajarvi', u"Lappajärvi"),
+ ('lappeenranta', u"Lappeenranta"),
+ ('lappi', u"Lappi"),
+ ('lapua', u"Lapua"),
+ ('laukaa', u"Laukaa"),
+ ('lavia', u"Lavia"),
+ ('lehtimaki', u"Lehtimäki"),
+ ('leivonmaki', u"Leivonmäki"),
+ ('lemi', u"Lemi"),
+ ('lemland', u"Lemland"),
+ ('lempaala', u"Lempäälä"),
+ ('lemu', u"Lemu"),
+ ('leppavirta', u"Leppävirta"),
+ ('lestijarvi', u"Lestijärvi"),
+ ('lieksa', u"Lieksa"),
+ ('lieto', u"Lieto"),
+ ('liljendal', u"Liljendal"),
+ ('liminka', u"Liminka"),
+ ('liperi', u"Liperi"),
+ ('lohja', u"Lohja"),
+ ('lohtaja', u"Lohtaja"),
+ ('loimaa', u"Loimaa"),
+ ('loppi', u"Loppi"),
+ ('loviisa', u"Loviisa"),
+ ('luhanka', u"Luhanka"),
+ ('lumijoki', u"Lumijoki"),
+ ('lumparland', u"Lumparland"),
+ ('luoto', u"Luoto"),
+ ('luumaki', u"Luumäki"),
+ ('luvia', u"Luvia"),
+ ('maalahti', u"Maalahti"),
+ ('maaninka', u"Maaninka"),
+ ('maarianhamina', u"Maarianhamina"),
+ ('marttila', u"Marttila"),
+ ('masku', u"Masku"),
+ ('mellila', u"Mellilä"),
+ ('merijarvi', u"Merijärvi"),
+ ('merikarvia', u"Merikarvia"),
+ ('merimasku', u"Merimasku"),
+ ('miehikkala', u"Miehikkälä"),
+ ('mikkeli', u"Mikkeli"),
+ ('mouhijarvi', u"Mouhijärvi"),
+ ('muhos', u"Muhos"),
+ ('multia', u"Multia"),
+ ('muonio', u"Muonio"),
+ ('mustasaari', u"Mustasaari"),
+ ('muurame', u"Muurame"),
+ ('muurla', u"Muurla"),
+ ('mynamaki', u"Mynämäki"),
+ ('myrskyla', u"Myrskylä"),
+ ('mantsala', u"Mäntsälä"),
+ ('mantta', u"Mänttä"),
+ ('mantyharju', u"Mäntyharju"),
+ ('naantali', u"Naantali"),
+ ('nakkila', u"Nakkila"),
+ ('nastola', u"Nastola"),
+ ('nauvo', u"Nauvo"),
+ ('nilsia', u"Nilsiä"),
+ ('nivala', u"Nivala"),
+ ('nokia', u"Nokia"),
+ ('noormarkku', u"Noormarkku"),
+ ('nousiainen', u"Nousiainen"),
+ ('nummi-pusula', u"Nummi-Pusula"),
+ ('nurmes', u"Nurmes"),
+ ('nurmijarvi', u"Nurmijärvi"),
+ ('nurmo', u"Nurmo"),
+ ('narpio', u"Närpiö"),
+ ('oravainen', u"Oravainen"),
+ ('orimattila', u"Orimattila"),
+ ('oripaa', u"Oripää"),
+ ('orivesi', u"Orivesi"),
+ ('oulainen', u"Oulainen"),
+ ('oulu', u"Oulu"),
+ ('oulunsalo', u"Oulunsalo"),
+ ('outokumpu', u"Outokumpu"),
+ ('padasjoki', u"Padasjoki"),
+ ('paimio', u"Paimio"),
+ ('paltamo', u"Paltamo"),
+ ('parainen', u"Parainen"),
+ ('parikkala', u"Parikkala"),
+ ('parkano', u"Parkano"),
+ ('pedersore', u"Pedersöre"),
+ ('pelkosenniemi', u"Pelkosenniemi"),
+ ('pello', u"Pello"),
+ ('perho', u"Perho"),
+ ('pernaja', u"Pernaja"),
+ ('pernio', u"Perniö"),
+ ('pertteli', u"Pertteli"),
+ ('pertunmaa', u"Pertunmaa"),
+ ('petajavesi', u"Petäjävesi"),
+ ('pieksamaki', u"Pieksämäki"),
+ ('pielavesi', u"Pielavesi"),
+ ('pietarsaari', u"Pietarsaari"),
+ ('pihtipudas', u"Pihtipudas"),
+ ('piikkio', u"Piikkiö"),
+ ('piippola', u"Piippola"),
+ ('pirkkala', u"Pirkkala"),
+ ('pohja', u"Pohja"),
+ ('polvijarvi', u"Polvijärvi"),
+ ('pomarkku', u"Pomarkku"),
+ ('pori', u"Pori"),
+ ('pornainen', u"Pornainen"),
+ ('porvoo', u"Porvoo"),
+ ('posio', u"Posio"),
+ ('pudasjarvi', u"Pudasjärvi"),
+ ('pukkila', u"Pukkila"),
+ ('pulkkila', u"Pulkkila"),
+ ('punkaharju', u"Punkaharju"),
+ ('punkalaidun', u"Punkalaidun"),
+ ('puolanka', u"Puolanka"),
+ ('puumala', u"Puumala"),
+ ('pyhtaa', u"Pyhtää"),
+ ('pyhajoki', u"Pyhäjoki"),
+ ('pyhajarvi', u"Pyhäjärvi"),
+ ('pyhanta', u"Pyhäntä"),
+ ('pyharanta', u"Pyhäranta"),
+ ('pyhaselka', u"Pyhäselkä"),
+ ('pylkonmaki', u"Pylkönmäki"),
+ ('palkane', u"Pälkäne"),
+ ('poytya', u"Pöytyä"),
+ ('raahe', u"Raahe"),
+ ('raisio', u"Raisio"),
+ ('rantasalmi', u"Rantasalmi"),
+ ('rantsila', u"Rantsila"),
+ ('ranua', u"Ranua"),
+ ('rauma', u"Rauma"),
+ ('rautalampi', u"Rautalampi"),
+ ('rautavaara', u"Rautavaara"),
+ ('rautjarvi', u"Rautjärvi"),
+ ('reisjarvi', u"Reisjärvi"),
+ ('renko', u"Renko"),
+ ('riihimaki', u"Riihimäki"),
+ ('ristiina', u"Ristiina"),
+ ('ristijarvi', u"Ristijärvi"),
+ ('rovaniemi', u"Rovaniemi"),
+ ('ruokolahti', u"Ruokolahti"),
+ ('ruotsinpyhtaa', u"Ruotsinpyhtää"),
+ ('ruovesi', u"Ruovesi"),
+ ('rusko', u"Rusko"),
+ ('rymattyla', u"Rymättylä"),
+ ('raakkyla', u"Rääkkylä"),
+ ('saarijarvi', u"Saarijärvi"),
+ ('salla', u"Salla"),
+ ('salo', u"Salo"),
+ ('saltvik', u"Saltvik"),
+ ('sammatti', u"Sammatti"),
+ ('sauvo', u"Sauvo"),
+ ('savitaipale', u"Savitaipale"),
+ ('savonlinna', u"Savonlinna"),
+ ('savonranta', u"Savonranta"),
+ ('savukoski', u"Savukoski"),
+ ('seinajoki', u"Seinäjoki"),
+ ('sievi', u"Sievi"),
+ ('siikainen', u"Siikainen"),
+ ('siikajoki', u"Siikajoki"),
+ ('siilinjarvi', u"Siilinjärvi"),
+ ('simo', u"Simo"),
+ ('sipoo', u"Sipoo"),
+ ('siuntio', u"Siuntio"),
+ ('sodankyla', u"Sodankylä"),
+ ('soini', u"Soini"),
+ ('somero', u"Somero"),
+ ('sonkajarvi', u"Sonkajärvi"),
+ ('sotkamo', u"Sotkamo"),
+ ('sottunga', u"Sottunga"),
+ ('sulkava', u"Sulkava"),
+ ('sund', u"Sund"),
+ ('suomenniemi', u"Suomenniemi"),
+ ('suomusjarvi', u"Suomusjärvi"),
+ ('suomussalmi', u"Suomussalmi"),
+ ('suonenjoki', u"Suonenjoki"),
+ ('sysma', u"Sysmä"),
+ ('sakyla', u"Säkylä"),
+ ('sarkisalo', u"Särkisalo"),
+ ('taipalsaari', u"Taipalsaari"),
+ ('taivalkoski', u"Taivalkoski"),
+ ('taivassalo', u"Taivassalo"),
+ ('tammela', u"Tammela"),
+ ('tammisaari', u"Tammisaari"),
+ ('tampere', u"Tampere"),
+ ('tarvasjoki', u"Tarvasjoki"),
+ ('tervo', u"Tervo"),
+ ('tervola', u"Tervola"),
+ ('teuva', u"Teuva"),
+ ('tohmajarvi', u"Tohmajärvi"),
+ ('toholampi', u"Toholampi"),
+ ('toivakka', u"Toivakka"),
+ ('tornio', u"Tornio"),
+ ('turku', u"Turku"),
+ ('tuulos', u"Tuulos"),
+ ('tuusniemi', u"Tuusniemi"),
+ ('tuusula', u"Tuusula"),
+ ('tyrnava', u"Tyrnävä"),
+ ('toysa', u"Töysä"),
+ ('ullava', u"Ullava"),
+ ('ulvila', u"Ulvila"),
+ ('urjala', u"Urjala"),
+ ('utajarvi', u"Utajärvi"),
+ ('utsjoki', u"Utsjoki"),
+ ('uurainen', u"Uurainen"),
+ ('uusikaarlepyy', u"Uusikaarlepyy"),
+ ('uusikaupunki', u"Uusikaupunki"),
+ ('vaala', u"Vaala"),
+ ('vaasa', u"Vaasa"),
+ ('vahto', u"Vahto"),
+ ('valkeakoski', u"Valkeakoski"),
+ ('valkeala', u"Valkeala"),
+ ('valtimo', u"Valtimo"),
+ ('vammala', u"Vammala"),
+ ('vampula', u"Vampula"),
+ ('vantaa', u"Vantaa"),
+ ('varkaus', u"Varkaus"),
+ ('varpaisjarvi', u"Varpaisjärvi"),
+ ('vehmaa', u"Vehmaa"),
+ ('velkua', u"Velkua"),
+ ('vesanto', u"Vesanto"),
+ ('vesilahti', u"Vesilahti"),
+ ('veteli', u"Veteli"),
+ ('vierema', u"Vieremä"),
+ ('vihanti', u"Vihanti"),
+ ('vihti', u"Vihti"),
+ ('viitasaari', u"Viitasaari"),
+ ('vilppula', u"Vilppula"),
+ ('vimpeli', u"Vimpeli"),
+ ('virolahti', u"Virolahti"),
+ ('virrat', u"Virrat"),
+ ('vardo', u"Vårdö"),
+ ('vahakyro', u"Vähäkyrö"),
+ ('vastanfjard', u"Västanfjärd"),
+ ('voyri-maksamaa', u"Vöyri-Maksamaa"),
+ ('yliharma', u"Ylihärmä"),
+ ('yli-ii', u"Yli-Ii"),
+ ('ylikiiminki', u"Ylikiiminki"),
+ ('ylistaro', u"Ylistaro"),
+ ('ylitornio', u"Ylitornio"),
+ ('ylivieska', u"Ylivieska"),
+ ('ylamaa', u"Ylämaa"),
+ ('ylane', u"Yläne"),
+ ('ylojarvi', u"Ylöjärvi"),
+ ('ypaja', u"Ypäjä"),
+ ('aetsa', u"Äetsä"),
+ ('ahtari', u"Ähtäri"),
+ ('aanekoski', u"Äänekoski")
+) \ No newline at end of file
diff --git a/django/contrib/localflavor/fi/forms.py b/django/contrib/localflavor/fi/forms.py
new file mode 100644
index 0000000000..da5cb5f2a8
--- /dev/null
+++ b/django/contrib/localflavor/fi/forms.py
@@ -0,0 +1,45 @@
+"""
+FI-specific Form helpers
+"""
+
+import re
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import gettext
+
+class FIZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(FIZipCodeField, self).__init__(r'^\d{5}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a zip code in the format XXXXX.'),
+ *args, **kwargs)
+
+class FIMunicipalitySelect(Select):
+ """
+ A Select widget that uses a list of Finnish municipalities as its choices.
+ """
+ def __init__(self, attrs=None):
+ from fi_municipalities import MUNICIPALITY_CHOICES # relative import
+ super(FIMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
+
+class FISocialSecurityNumber(Field):
+ def clean(self, value):
+ super(FISocialSecurityNumber, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+
+ checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
+ result = re.match(r"""^
+ (?P<date>([0-2]\d|3[01])
+ (0\d|1[012])
+ (\d{2}))
+ [A+-]
+ (?P<serial>(\d{3}))
+ (?P<checksum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
+ if not result:
+ raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))
+ gd = result.groupdict()
+ checksum = int(gd['date'] + gd['serial'])
+ if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper():
+ return u'%s' % value.upper()
+ raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))
diff --git a/django/contrib/localflavor/fr/__init__.py b/django/contrib/localflavor/fr/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/fr/__init__.py
diff --git a/django/contrib/localflavor/fr/forms.py b/django/contrib/localflavor/fr/forms.py
new file mode 100644
index 0000000000..550596b880
--- /dev/null
+++ b/django/contrib/localflavor/fr/forms.py
@@ -0,0 +1,44 @@
+"""
+FR-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+phone_digits_re = re.compile(r'^0\d(\s|\.)?(\d{2}(\s|\.)?){3}\d{2}$')
+
+class FRZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(FRZipCodeField, self).__init__(r'^\d{5}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a zip code in the format XXXXX.'),
+ *args, **kwargs)
+
+class FRPhoneNumberField(Field):
+ """
+ Validate local French phone number (not international ones)
+ The correct format is '0X XX XX XX XX'.
+ '0X.XX.XX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
+ '0X XX XX XX XX'.
+ """
+ def clean(self, value):
+ super(FRPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\.|\s)', '', smart_unicode(value))
+ m = phone_digits_re.search(value)
+ if m:
+ return u'%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6], value[6:8], value[8:10])
+ raise ValidationError(u'Phone numbers must be in 0X XX XX XX XX format.')
+
+class FRDepartmentSelect(Select):
+ """
+ A Select widget that uses a list of FR departments as its choices.
+ """
+ def __init__(self, attrs=None):
+ from fr_department import DEPARTMENT_ASCII_CHOICES # relative import
+ super(FRDepartmentSelect, self).__init__(attrs, choices=DEPARTMENT_ASCII_CHOICES)
+
diff --git a/django/contrib/localflavor/fr/fr_department.py b/django/contrib/localflavor/fr/fr_department.py
new file mode 100644
index 0000000000..02de295f88
--- /dev/null
+++ b/django/contrib/localflavor/fr/fr_department.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+
+DEPARTMENT_ASCII_CHOICES = (
+ ('01', '01 - Ain'),
+ ('02', '02 - Aisne'),
+ ('03', '03 - Allier'),
+ ('04', '04 - Alpes-de-Haute-Provence'),
+ ('05', '05 - Hautes-Alpes'),
+ ('06', '06 - Alpes-Maritimes'),
+ ('07', '07 - Ardeche'),
+ ('08', '08 - Ardennes'),
+ ('09', '09 - Ariege'),
+ ('10', '10 - Aube'),
+ ('11', '11 - Aude'),
+ ('12', '12 - Aveyron'),
+ ('13', '13 - Bouches-du-Rhone'),
+ ('14', '14 - Calvados'),
+ ('15', '15 - Cantal'),
+ ('16', '16 - Charente'),
+ ('17', '17 - Charente-Maritime'),
+ ('18', '18 - Cher'),
+ ('19', '19 - Correze'),
+ ('21', '21 - Cote-d\'Or'),
+ ('22', '22 - Cotes-d\'Armor'),
+ ('23', '23 - Creuse'),
+ ('24', '24 - Dordogne'),
+ ('25', '25 - Doubs'),
+ ('26', '26 - Drome'),
+ ('27', '27 - Eure'),
+ ('28', '28 - Eure-et-Loire'),
+ ('29', '29 - Finistere'),
+ ('2A', '2A - Corse-du-Sud'),
+ ('2B', '2B - Haute-Corse'),
+ ('30', '30 - Gard'),
+ ('31', '31 - Haute-Garonne'),
+ ('32', '32 - Gers'),
+ ('33', '33 - Gironde'),
+ ('34', '34 - Herault'),
+ ('35', '35 - Ille-et-Vilaine'),
+ ('36', '36 - Indre'),
+ ('37', '37 - Indre-et-Loire'),
+ ('38', '38 - Isere'),
+ ('39', '39 - Jura'),
+ ('40', '40 - Landes'),
+ ('41', '41 - Loir-et-Cher'),
+ ('42', '42 - Loire'),
+ ('43', '43 - Haute-Loire'),
+ ('44', '44 - Loire-Atlantique'),
+ ('45', '45 - Loiret'),
+ ('46', '46 - Lot'),
+ ('47', '47 - Lot-et-Garonne'),
+ ('48', '48 - Lozere'),
+ ('49', '49 - Maine-et-Loire'),
+ ('50', '50 - Manche'),
+ ('51', '51 - Marne'),
+ ('52', '52 - Haute-Marne'),
+ ('53', '53 - Mayenne'),
+ ('54', '54 - Meurthe-et-Moselle'),
+ ('55', '55 - Meuse'),
+ ('56', '56 - Morbihan'),
+ ('57', '57 - Moselle'),
+ ('58', '58 - Nievre'),
+ ('59', '59 - Nord'),
+ ('60', '60 - Oise'),
+ ('61', '61 - Orne'),
+ ('62', '62 - Pas-de-Calais'),
+ ('63', '63 - Puy-de-Dome'),
+ ('64', '64 - Pyrenees-Atlantiques'),
+ ('65', '65 - Hautes-Pyrenees'),
+ ('66', '66 - Pyrenees-Orientales'),
+ ('67', '67 - Bas-Rhin'),
+ ('68', '68 - Haut-Rhin'),
+ ('69', '69 - Rhone'),
+ ('70', '70 - Haute-Saone'),
+ ('71', '71 - Saone-et-Loire'),
+ ('72', '72 - Sarthe'),
+ ('73', '73 - Savoie'),
+ ('74', '74 - Haute-Savoie'),
+ ('75', '75 - Paris'),
+ ('76', '76 - Seine-Maritime'),
+ ('77', '77 - Seine-et-Marne'),
+ ('78', '78 - Yvelines'),
+ ('79', '79 - Deux-Sevres'),
+ ('80', '80 - Somme'),
+ ('81', '81 - Tarn'),
+ ('82', '82 - Tarn-et-Garonne'),
+ ('83', '83 - Var'),
+ ('84', '84 - Vaucluse'),
+ ('85', '85 - Vendee'),
+ ('86', '86 - Vienne'),
+ ('87', '87 - Haute-Vienne'),
+ ('88', '88 - Vosges'),
+ ('89', '89 - Yonne'),
+ ('90', '90 - Territoire de Belfort'),
+ ('91', '91 - Essonne'),
+ ('92', '92 - Hauts-de-Seine'),
+ ('93', '93 - Seine-Saint-Denis'),
+ ('94', '94 - Val-de-Marne'),
+ ('95', '95 - Val-d\'Oise'),
+ ('2A', '2A - Corse du sud'),
+ ('2B', '2B - Haute Corse'),
+ ('971', '971 - Guadeloupe'),
+ ('972', '972 - Martinique'),
+ ('973', '973 - Guyane'),
+ ('974', '974 - La Reunion'),
+ ('975', '975 - Saint-Pierre-et-Miquelon'),
+ ('976', '976 - Mayotte'),
+ ('984', '984 - Terres Australes et Antarctiques'),
+ ('986', '986 - Wallis et Futuna'),
+ ('987', '987 - Polynesie Francaise'),
+ ('988', '988 - Nouvelle-Caledonie'),
+)
diff --git a/django/contrib/localflavor/is_/__init__.py b/django/contrib/localflavor/is_/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/is_/__init__.py
diff --git a/django/contrib/localflavor/is_/forms.py b/django/contrib/localflavor/is_/forms.py
new file mode 100644
index 0000000000..41727d8fa3
--- /dev/null
+++ b/django/contrib/localflavor/is_/forms.py
@@ -0,0 +1,77 @@
+"""
+Iceland specific form helpers.
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import RegexField, EMPTY_VALUES
+from django.newforms.widgets import Select
+from django.utils.translation import gettext
+
+class ISIdNumberField(RegexField):
+ """
+ Icelandic identification number (kennitala). This is a number every citizen
+ of Iceland has.
+ """
+ def __init__(self, *args, **kwargs):
+ error_msg = gettext(u'Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.')
+ kwargs['min_length'],kwargs['max_length'] = 10,11
+ super(ISIdNumberField, self).__init__(r'^\d{6}(-| )?\d{4}$', error_message=error_msg, *args, **kwargs)
+
+ def clean(self, value):
+ value = super(ISIdNumberField, self).clean(value)
+
+ if value in EMPTY_VALUES:
+ return u''
+
+ value = self._canonify(value)
+ if self._validate(value):
+ return self._format(value)
+ else:
+ raise ValidationError(gettext(u'The Icelandic identification number is not valid.'))
+
+ def _canonify(self, value):
+ """
+ Returns the value as only digits.
+ """
+ return value.replace('-', '').replace(' ', '')
+
+ def _validate(self, value):
+ """
+ Takes in the value in canonical form and checks the verifier digit. The
+ method is modulo 11.
+ """
+ check = [3, 2, 7, 6, 5, 4, 3, 2, 1, 0]
+ return sum([int(value[i]) * check[i] for i in range(10)]) % 11 == 0
+
+ def _format(self, value):
+ """
+ Takes in the value in canonical form and returns it in the common
+ display format.
+ """
+ return value[:6]+'-'+value[6:]
+
+class ISPhoneNumberField(RegexField):
+ """
+ Icelandic phone number. Seven digits with an optional hyphen or space after
+ the first three digits.
+ """
+ def __init__(self, *args, **kwargs):
+ kwargs['min_length'], kwargs['max_length'] = 7,8
+ super(ISPhoneNumberField, self).__init__(r'^\d{3}(-| )?\d{4}$', *args, **kwargs)
+
+ def clean(self, value):
+ value = super(ISPhoneNumberField, self).clean(value)
+
+ if value in EMPTY_VALUES:
+ return u''
+
+ return value.replace('-', '').replace(' ', '')
+
+class ISPostalCodeSelect(Select):
+ """
+ A Select widget that uses a list of Icelandic postal codes as its choices.
+ """
+ def __init__(self, attrs=None):
+ from is_postalcodes import IS_POSTALCODES
+ super(ISPostalCodeSelect, self).__init__(attrs, choices=IS_POSTALCODES)
+
diff --git a/django/contrib/localflavor/is_/is_postalcodes.py b/django/contrib/localflavor/is_/is_postalcodes.py
new file mode 100644
index 0000000000..4feca9c013
--- /dev/null
+++ b/django/contrib/localflavor/is_/is_postalcodes.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+
+IS_POSTALCODES = (
+ ('101', u'101 Reykjavík'),
+ ('103', u'103 Reykjavík'),
+ ('104', u'104 Reykjavík'),
+ ('105', u'105 Reykjavík'),
+ ('107', u'107 Reykjavík'),
+ ('108', u'108 Reykjavík'),
+ ('109', u'109 Reykjavík'),
+ ('110', u'110 Reykjavík'),
+ ('111', u'111 Reykjavík'),
+ ('112', u'112 Reykjavík'),
+ ('113', u'113 Reykjavík'),
+ ('116', u'116 Kjalarnes'),
+ ('121', u'121 Reykjavík'),
+ ('123', u'123 Reykjavík'),
+ ('124', u'124 Reykjavík'),
+ ('125', u'125 Reykjavík'),
+ ('127', u'127 Reykjavík'),
+ ('128', u'128 Reykjavík'),
+ ('129', u'129 Reykjavík'),
+ ('130', u'130 Reykjavík'),
+ ('132', u'132 Reykjavík'),
+ ('150', u'150 Reykjavík'),
+ ('155', u'155 Reykjavík'),
+ ('170', u'170 Seltjarnarnes'),
+ ('172', u'172 Seltjarnarnes'),
+ ('190', u'190 Vogar'),
+ ('200', u'200 Kópavogur'),
+ ('201', u'201 Kópavogur'),
+ ('202', u'202 Kópavogur'),
+ ('203', u'203 Kópavogur'),
+ ('210', u'210 Garðabær'),
+ ('212', u'212 Garðabær'),
+ ('220', u'220 Hafnarfjörður'),
+ ('221', u'221 Hafnarfjörður'),
+ ('222', u'222 Hafnarfjörður'),
+ ('225', u'225 Ãlftanes'),
+ ('230', u'230 Reykjanesbær'),
+ ('232', u'232 Reykjanesbær'),
+ ('233', u'233 Reykjanesbær'),
+ ('235', u'235 Keflavíkurflugvöllur'),
+ ('240', u'240 Grindavík'),
+ ('245', u'245 Sandgerði'),
+ ('250', u'250 Garður'),
+ ('260', u'260 Reykjanesbær'),
+ ('270', u'270 Mosfellsbær'),
+ ('300', u'300 Akranes'),
+ ('301', u'301 Akranes'),
+ ('302', u'302 Akranes'),
+ ('310', u'310 Borgarnes'),
+ ('311', u'311 Borgarnes'),
+ ('320', u'320 Reykholt í Borgarfirði'),
+ ('340', u'340 Stykkishólmur'),
+ ('345', u'345 Flatey á Breiðafirði'),
+ ('350', u'350 Grundarfjörður'),
+ ('355', u'355 Ólafsvík'),
+ ('356', u'356 Snæfellsbær'),
+ ('360', u'360 Hellissandur'),
+ ('370', u'370 Búðardalur'),
+ ('371', u'371 Búðardalur'),
+ ('380', u'380 Reykhólahreppur'),
+ ('400', u'400 Ãsafjörður'),
+ ('401', u'401 Ãsafjörður'),
+ ('410', u'410 Hnífsdalur'),
+ ('415', u'415 Bolungarvík'),
+ ('420', u'420 Súðavík'),
+ ('425', u'425 Flateyri'),
+ ('430', u'430 Suðureyri'),
+ ('450', u'450 Patreksfjörður'),
+ ('451', u'451 Patreksfjörður'),
+ ('460', u'460 Tálknafjörður'),
+ ('465', u'465 Bíldudalur'),
+ ('470', u'470 Þingeyri'),
+ ('471', u'471 Þingeyri'),
+ ('500', u'500 Staður'),
+ ('510', u'510 Hólmavík'),
+ ('512', u'512 Hólmavík'),
+ ('520', u'520 Drangsnes'),
+ ('522', u'522 Kjörvogur'),
+ ('523', u'523 Bær'),
+ ('524', u'524 Norðurfjörður'),
+ ('530', u'530 Hvammstangi'),
+ ('531', u'531 Hvammstangi'),
+ ('540', u'540 Blönduós'),
+ ('541', u'541 Blönduós'),
+ ('545', u'545 Skagaströnd'),
+ ('550', u'550 Sauðárkrókur'),
+ ('551', u'551 Sauðárkrókur'),
+ ('560', u'560 Varmahlíð'),
+ ('565', u'565 Hofsós'),
+ ('566', u'566 Hofsós'),
+ ('570', u'570 Fljót'),
+ ('580', u'580 Siglufjörður'),
+ ('600', u'600 Akureyri'),
+ ('601', u'601 Akureyri'),
+ ('602', u'602 Akureyri'),
+ ('603', u'603 Akureyri'),
+ ('610', u'610 Grenivík'),
+ ('611', u'611 Grímsey'),
+ ('620', u'620 Dalvík'),
+ ('621', u'621 Dalvík'),
+ ('625', u'625 Ólafsfjörður'),
+ ('630', u'630 Hrísey'),
+ ('640', u'640 Húsavík'),
+ ('641', u'641 Húsavík'),
+ ('645', u'645 Fosshóll'),
+ ('650', u'650 Laugar'),
+ ('660', u'660 Mývatn'),
+ ('670', u'670 Kópasker'),
+ ('671', u'671 Kópasker'),
+ ('675', u'675 Raufarhöfn'),
+ ('680', u'680 Þórshöfn'),
+ ('681', u'681 Þórshöfn'),
+ ('685', u'685 Bakkafjörður'),
+ ('690', u'690 Vopnafjörður'),
+ ('700', u'700 Egilsstaðir'),
+ ('701', u'701 Egilsstaðir'),
+ ('710', u'710 Seyðisfjörður'),
+ ('715', u'715 Mjóifjörður'),
+ ('720', u'720 Borgarfjörður eystri'),
+ ('730', u'730 Reyðarfjörður'),
+ ('735', u'735 Eskifjörður'),
+ ('740', u'740 Neskaupstaður'),
+ ('750', u'750 Fáskrúðsfjörður'),
+ ('755', u'755 Stöðvarfjörður'),
+ ('760', u'760 Breiðdalsvík'),
+ ('765', u'765 Djúpivogur'),
+ ('780', u'780 Höfn í Hornafirði'),
+ ('781', u'781 Höfn í Hornafirði'),
+ ('785', u'785 Öræfi'),
+ ('800', u'800 Selfoss'),
+ ('801', u'801 Selfoss'),
+ ('802', u'802 Selfoss'),
+ ('810', u'810 Hveragerði'),
+ ('815', u'815 Þorlákshöfn'),
+ ('820', u'820 Eyrarbakki'),
+ ('825', u'825 Stokkseyri'),
+ ('840', u'840 Laugarvatn'),
+ ('845', u'845 Flúðir'),
+ ('850', u'850 Hella'),
+ ('851', u'851 Hella'),
+ ('860', u'860 Hvolsvöllur'),
+ ('861', u'861 Hvolsvöllur'),
+ ('870', u'870 Vík'),
+ ('871', u'871 Vík'),
+ ('880', u'880 Kirkjubæjarklaustur'),
+ ('900', u'900 Vestmannaeyjar'),
+ ('902', u'902 Vestmannaeyjar')
+)
diff --git a/django/contrib/localflavor/it/__init__.py b/django/contrib/localflavor/it/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/it/__init__.py
diff --git a/django/contrib/localflavor/it/forms.py b/django/contrib/localflavor/it/forms.py
new file mode 100644
index 0000000000..bb1bb2e6a4
--- /dev/null
+++ b/django/contrib/localflavor/it/forms.py
@@ -0,0 +1,77 @@
+"""
+IT-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import gettext
+from django.utils.encoding import smart_unicode
+from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit
+import re
+
+class ITZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(ITZipCodeField, self).__init__(r'^\d{5}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a valid zip code.'),
+ *args, **kwargs)
+
+class ITRegionSelect(Select):
+ """
+ A Select widget that uses a list of IT regions as its choices.
+ """
+ def __init__(self, attrs=None):
+ from it_region import REGION_CHOICES # relative import
+ super(ITRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class ITProvinceSelect(Select):
+ """
+ A Select widget that uses a list of IT regions as its choices.
+ """
+ def __init__(self, attrs=None):
+ from it_province import PROVINCE_CHOICES # relative import
+ super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class ITSocialSecurityNumberField(RegexField):
+ """
+ A form field that validates Italian Social Security numbers (codice fiscale).
+ For reference see http://www.agenziaentrate.it/ and search for
+ 'Informazioni sulla codificazione delle persone fisiche'.
+ """
+ err_msg = gettext(u'Enter a valid Social Security number.')
+ def __init__(self, *args, **kwargs):
+ super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$',
+ max_length=None, min_length=None, error_message=self.err_msg,
+ *args, **kwargs)
+
+ def clean(self, value):
+ value = super(ITSocialSecurityNumberField, self).clean(value)
+ if value == u'':
+ return value
+ value = re.sub('\s', u'', value).upper()
+ try:
+ check_digit = ssn_check_digit(value)
+ except ValueError:
+ raise ValidationError(self.err_msg)
+ if not value[15] == check_digit:
+ raise ValidationError(self.err_msg)
+ return value
+
+class ITVatNumberField(Field):
+ """
+ A form field that validates Italian VAT numbers (partita IVA).
+ """
+ def clean(self, value):
+ value = super(ITVatNumberField, self).clean(value)
+ if value == u'':
+ return value
+ err_msg = gettext(u'Enter a valid VAT number.')
+ try:
+ vat_number = int(value)
+ except ValueError:
+ raise ValidationError(err_msg)
+ vat_number = str(vat_number).zfill(11)
+ check_digit = vat_number_check_digit(vat_number[0:10])
+ if not vat_number[10] == check_digit:
+ raise ValidationError(err_msg)
+ return smart_unicode(vat_number)
diff --git a/django/contrib/localflavor/it/it_province.py b/django/contrib/localflavor/it/it_province.py
new file mode 100644
index 0000000000..1867191b31
--- /dev/null
+++ b/django/contrib/localflavor/it/it_province.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*
+
+PROVINCE_CHOICES = (
+ ('AG', 'Agrigento'),
+ ('AL', 'Alessandria'),
+ ('AN', 'Ancona'),
+ ('AO', 'Aosta'),
+ ('AR', 'Arezzo'),
+ ('AP', 'Ascoli Piceno'),
+ ('AT', 'Asti'),
+ ('AV', 'Avellino'),
+ ('BA', 'Bari'),
+# ('BT', 'Barletta-Andria-Trani'), # active starting from 2009
+ ('BL', 'Belluno'),
+ ('BN', 'Benevento'),
+ ('BG', 'Bergamo'),
+ ('BI', 'Biella'),
+ ('BO', 'Bologna'),
+ ('BZ', 'Bolzano/Bozen'),
+ ('BS', 'Brescia'),
+ ('BR', 'Brindisi'),
+ ('CA', 'Cagliari'),
+ ('CL', 'Caltanissetta'),
+ ('CB', 'Campobasso'),
+ ('CI', 'Carbonia-Iglesias'),
+ ('CE', 'Caserta'),
+ ('CT', 'Catania'),
+ ('CZ', 'Catanzaro'),
+ ('CH', 'Chieti'),
+ ('CO', 'Como'),
+ ('CS', 'Cosenza'),
+ ('CR', 'Cremona'),
+ ('KR', 'Crotone'),
+ ('CN', 'Cuneo'),
+ ('EN', 'Enna'),
+# ('FM', 'Fermo'), # active starting from 2009
+ ('FE', 'Ferrara'),
+ ('FI', 'Firenze'),
+ ('FG', 'Foggia'),
+ ('FC', 'Forlì-Cesena'),
+ ('FR', 'Frosinone'),
+ ('GE', 'Genova'),
+ ('GO', 'Gorizia'),
+ ('GR', 'Grosseto'),
+ ('IM', 'Imperia'),
+ ('IS', 'Isernia'),
+ ('SP', 'La Spezia'),
+ ('AQ', u'L’Acquila'),
+ ('LT', 'Latina'),
+ ('LE', 'Lecce'),
+ ('LC', 'Lecco'),
+ ('LI', 'Livorno'),
+ ('LO', 'Lodi'),
+ ('LU', 'Lucca'),
+ ('MC', 'Macerata'),
+ ('MN', 'Mantova'),
+ ('MS', 'Massa-Carrara'),
+ ('MT', 'Matera'),
+ ('VS', 'Medio Campidano'),
+ ('ME', 'Messina'),
+ ('MI', 'Milano'),
+ ('MO', 'Modena'),
+# ('MB', 'Monza e Brianza'), # active starting from 2009
+ ('NA', 'Napoli'),
+ ('NO', 'Novara'),
+ ('NU', 'Nuoro'),
+ ('OG', 'Ogliastra'),
+ ('OT', 'Olbia-Tempio'),
+ ('OR', 'Oristano'),
+ ('PD', 'Padova'),
+ ('PA', 'Palermo'),
+ ('PR', 'Parma'),
+ ('PV', 'Pavia'),
+ ('PG', 'Perugia'),
+ ('PU', 'Pesaro e Urbino'),
+ ('PE', 'Pescara'),
+ ('PC', 'Piacenza'),
+ ('PI', 'Pisa'),
+ ('PT', 'Pistoia'),
+ ('PN', 'Pordenone'),
+ ('PZ', 'Potenza'),
+ ('PO', 'Prato'),
+ ('RG', 'Ragusa'),
+ ('RA', 'Ravenna'),
+ ('RC', 'Reggio Calabria'),
+ ('RE', 'Reggio Emilia'),
+ ('RI', 'Rieti'),
+ ('RN', 'Rimini')
+ ('RM', 'Roma'),
+ ('RO', 'Rovigo'),
+ ('SA', 'Salerno'),
+ ('SS', 'Sassari'),
+ ('SV', 'Savona'),
+ ('SI', 'Siena'),
+ ('SR', 'Siracusa'),
+ ('SO', 'Sondrio'),
+ ('TA', 'Taranto'),
+ ('TE', 'Teramo'),
+ ('TR', 'Terni'),
+ ('TO', 'Torino'),
+ ('TP', 'Trapani'),
+ ('TN', 'Trento'),
+ ('TV', 'Treviso'),
+ ('TS', 'Trieste'),
+ ('UD', 'Udine'),
+ ('VA', 'Varese'),
+ ('VE', 'Venezia'),
+ ('VB', 'Verbano Cusio Ossola'),
+ ('VC', 'Vercelli'),
+ ('VR', 'Verona'),
+ ('VV', 'Vibo Valentia'),
+ ('VI', 'Vicenza'),
+ ('VT', 'Viterbo'),
+)
diff --git a/django/contrib/localflavor/it/it_region.py b/django/contrib/localflavor/it/it_region.py
new file mode 100644
index 0000000000..0700b46ea8
--- /dev/null
+++ b/django/contrib/localflavor/it/it_region.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*
+
+REGION_CHOICES = (
+ ('ABR', 'Abruzzo'),
+ ('BAS', 'Basilicata'),
+ ('CAL', 'Calabria'),
+ ('CAM', 'Campania'),
+ ('EMR', 'Emilia-Romagna'),
+ ('FVG', 'Friuli-Venezia Giulia'),
+ ('LAZ', 'Lazio'),
+ ('LIG', 'Liguria'),
+ ('LOM', 'Lombardia'),
+ ('MAR', 'Marche'),
+ ('MOL', 'Molise'),
+ ('PMN', 'Piemonte'),
+ ('PUG', 'Puglia'),
+ ('SAR', 'Sardegna'),
+ ('SIC', 'Sicilia'),
+ ('TOS', 'Toscana'),
+ ('TAA', 'Trentino-Alto Adige'),
+ ('UMB', 'Umbria'),
+ ('VAO', u'Valle d’Aosta'),
+ ('VEN', 'Veneto'),
+)
diff --git a/django/contrib/localflavor/it/util.py b/django/contrib/localflavor/it/util.py
new file mode 100644
index 0000000000..49b607f160
--- /dev/null
+++ b/django/contrib/localflavor/it/util.py
@@ -0,0 +1,40 @@
+def ssn_check_digit(value):
+ "Calculate Italian social security number check digit."
+ ssn_even_chars = {
+ '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
+ 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
+ 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18,
+ 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25
+ }
+ ssn_odd_chars = {
+ '0': 1, '1': 0, '2': 5, '3': 7, '4': 9, '5': 13, '6': 15, '7': 17, '8': 19, '9': 21,
+ 'A': 1, 'B': 0, 'C': 5, 'D': 7, 'E': 9, 'F': 13, 'G': 15, 'H': 17, 'I': 19, 'J': 21,
+ 'K': 2, 'L': 4, 'M': 18, 'N': 20, 'O': 11, 'P': 3, 'Q': 6, 'R': 8, 'S': 12,
+ 'T': 14, 'U': 16, 'V': 10, 'W': 22, 'X': 25, 'Y': 24, 'Z': 23
+ }
+ # Chars from 'A' to 'Z'
+ ssn_check_digits = [chr(x) for x in range(65, 91)]
+
+ ssn = value.upper()
+ total = 0
+ for i in range(0,15):
+ try:
+ if i % 2 == 0:
+ total += ssn_odd_chars[ssn[i]]
+ else:
+ total += ssn_even_chars[ssn[i]]
+ except KeyError:
+ msg = "Character '%(char)s' is not allowed." % {'char': ssn[i]}
+ raise ValueError(msg)
+ return ssn_check_digits[total % 26]
+
+def vat_number_check_digit(vat_number):
+ "Calculate Italian VAT number check digit."
+ normalized_vat_number = str(vat_number).zfill(10)
+ total = 0
+ for i in range(0, 10, 2):
+ total += int(normalized_vat_number[i])
+ for i in range(1, 11, 2):
+ quotient , remainder = divmod(int(normalized_vat_number[i]) * 2, 10)
+ total += quotient + remainder
+ return str((10 - total % 10) % 10)
diff --git a/django/contrib/localflavor/jp/__init__.py b/django/contrib/localflavor/jp/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/jp/__init__.py
diff --git a/django/contrib/localflavor/jp/forms.py b/django/contrib/localflavor/jp/forms.py
new file mode 100644
index 0000000000..4d93a21227
--- /dev/null
+++ b/django/contrib/localflavor/jp/forms.py
@@ -0,0 +1,38 @@
+"""
+JP-specific Form helpers
+"""
+
+from django.core import validators
+from django.newforms import ValidationError
+from django.utils.translation import gettext
+from django.newforms.fields import RegexField, Select
+
+import re
+
+class JPPostalCodeField(RegexField):
+ """
+ A form field that validates its input is a Japanese postcode.
+
+ Accepts 7 digits, with or without a hyphen.
+ """
+ def __init__(self, *args, **kwargs):
+ super(JPPostalCodeField, self).__init__(r'^\d{3}-\d{4}$|^\d{7}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a postal code in the format XXXXXXX or XXX-XXXX.'),
+ *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Validates the input and returns a string that contains only numbers.
+ Returns an empty string for empty values.
+ """
+ v = super(JPPostalCodeField, self).clean(value)
+ return v.replace('-', '')
+
+class JPPrefectureSelect(Select):
+ """
+ A Select widget that uses a list of Japanese prefectures as its choices.
+ """
+ def __init__(self, attrs=None):
+ from jp_prefectures import JP_PREFECTURES
+ super(JPPrefectureSelect, self).__init__(attrs, choices=JP_PREFECTURES)
diff --git a/django/contrib/localflavor/jp/jp_prefectures.py b/django/contrib/localflavor/jp/jp_prefectures.py
new file mode 100644
index 0000000000..72ac4f9474
--- /dev/null
+++ b/django/contrib/localflavor/jp/jp_prefectures.py
@@ -0,0 +1,51 @@
+from django.utils.translation import gettext_lazy as gettext_lazy
+
+JP_PREFECTURES = (
+ ('hokkaido', gettext_lazy('Hokkaido'),),
+ ('aomori', gettext_lazy('Aomori'),),
+ ('iwate', gettext_lazy('Iwate'),),
+ ('miyagi', gettext_lazy('Miyagi'),),
+ ('akita', gettext_lazy('Akita'),),
+ ('yamagata', gettext_lazy('Yamagata'),),
+ ('fukushima', gettext_lazy('Fukushima'),),
+ ('ibaraki', gettext_lazy('Ibaraki'),),
+ ('tochigi', gettext_lazy('Tochigi'),),
+ ('gunma', gettext_lazy('Gunma'),),
+ ('saitama', gettext_lazy('Saitama'),),
+ ('chiba', gettext_lazy('Chiba'),),
+ ('tokyo', gettext_lazy('Tokyo'),),
+ ('kanagawa', gettext_lazy('Kanagawa'),),
+ ('yamanashi', gettext_lazy('Yamanashi'),),
+ ('nagano', gettext_lazy('Nagano'),),
+ ('niigata', gettext_lazy('Niigata'),),
+ ('toyama', gettext_lazy('Toyama'),),
+ ('ishikawa', gettext_lazy('Ishikawa'),),
+ ('fukui', gettext_lazy('Fukui'),),
+ ('gifu', gettext_lazy('Gifu'),),
+ ('shizuoka', gettext_lazy('Shizuoka'),),
+ ('aichi', gettext_lazy('Aichi'),),
+ ('mie', gettext_lazy('Mie'),),
+ ('shiga', gettext_lazy('Shiga'),),
+ ('kyoto', gettext_lazy('Kyoto'),),
+ ('osaka', gettext_lazy('Osaka'),),
+ ('hyogo', gettext_lazy('Hyogo'),),
+ ('nara', gettext_lazy('Nara'),),
+ ('wakayama', gettext_lazy('Wakayama'),),
+ ('tottori', gettext_lazy('Tottori'),),
+ ('shimane', gettext_lazy('Shimane'),),
+ ('okayama', gettext_lazy('Okayama'),),
+ ('hiroshima', gettext_lazy('Hiroshima'),),
+ ('yamaguchi', gettext_lazy('Yamaguchi'),),
+ ('tokushima', gettext_lazy('Tokushima'),),
+ ('kagawa', gettext_lazy('Kagawa'),),
+ ('ehime', gettext_lazy('Ehime'),),
+ ('kochi', gettext_lazy('Kochi'),),
+ ('fukuoka', gettext_lazy('Fukuoka'),),
+ ('saga', gettext_lazy('Saga'),),
+ ('nagasaki', gettext_lazy('Nagasaki'),),
+ ('kumamoto', gettext_lazy('Kumamoto'),),
+ ('oita', gettext_lazy('Oita'),),
+ ('miyazaki', gettext_lazy('Miyazaki'),),
+ ('kagoshima', gettext_lazy('Kagoshima'),),
+ ('okinawa', gettext_lazy('Okinawa'),),
+)
diff --git a/django/contrib/localflavor/no/__init__.py b/django/contrib/localflavor/no/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/no/__init__.py
diff --git a/django/contrib/localflavor/no/forms.py b/django/contrib/localflavor/no/forms.py
new file mode 100644
index 0000000000..22099005b9
--- /dev/null
+++ b/django/contrib/localflavor/no/forms.py
@@ -0,0 +1,77 @@
+# -*- coding: iso-8859-1 -*-
+"""
+Norwegian-specific Form helpers
+"""
+
+import re, datetime
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import gettext
+
+class NOZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(NOZipCodeField, self).__init__(r'^\d{4}$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a zip code in the format XXXX.'),
+ *args, **kwargs)
+
+class NOMunicipalitySelect(Select):
+ """
+ A Select widget that uses a list of Norwegian municipalities (fylker)
+ as its choices.
+ """
+ def __init__(self, attrs=None):
+ from no_municipalities import MUNICIPALITY_CHOICES
+ super(NOMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
+
+class NOSocialSecurityNumber(Field):
+ """
+ Algorithm is documented at http://no.wikipedia.org/wiki/Personnummer
+ """
+ def clean(self, value):
+ super(NOSocialSecurityNumber, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+
+ msg = gettext(u'Enter a valid Norwegian social security number.')
+ if not re.match(r'^\d{11}$', value):
+ raise ValidationError(msg)
+
+ day = int(value[:2])
+ month = int(value[2:4])
+ year2 = int(value[4:6])
+
+ inum = int(value[6:9])
+ self.birthday = None
+ try:
+ if 000 <= inum < 500:
+ self.birthday = datetime.date(1900+year2, month, day)
+ if 500 <= inum < 750 and year2 > 54:
+ self.birthday = datetime.date(1800+year2, month, day)
+ if 500 <= inum < 1000 and year2 < 40:
+ self.birthday = datetime.date(2000+year2, month, day)
+ if 900 <= inum < 1000 and year2 > 39:
+ self.birthday = datetime.date(1900+year2, month, day)
+ except ValueError:
+ raise ValidationError(msg)
+
+ sexnum = int(value[8])
+ if sexnum % 2 == 0:
+ self.gender = 'F'
+ else:
+ self.gender = 'M'
+
+ digits = map(int, list(value))
+ weight_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2, 1, 0]
+ weight_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2, 1]
+
+ def multiply_reduce(aval, bval):
+ return sum((a * b) for (a, b) in zip(aval, bval))
+
+ if multiply_reduce(digits, weight_1) % 11 != 0:
+ raise ValidationError(msg)
+ if multiply_reduce(digits, weight_2) % 11 != 0:
+ raise ValidationError(msg)
+
+ return value
+
diff --git a/django/contrib/localflavor/no/no_municipalities.py b/django/contrib/localflavor/no/no_municipalities.py
new file mode 100644
index 0000000000..d66fef514c
--- /dev/null
+++ b/django/contrib/localflavor/no/no_municipalities.py
@@ -0,0 +1,32 @@
+# -*- coding: iso-8859-1 -*-
+"""
+An alphabetical list of Norwegian municipalities (fylker) fro use as `choices`
+in a formfield.
+
+This exists in this standalone file so that it's on ly imported into memory
+when explicitly needed.
+"""
+
+MUNICIPALITY_CHOICES = (
+ ('akershus', u'Akershus'),
+ ('austagder', u'Aust-Agder'),
+ ('buskerud', u'Buskerud'),
+ ('finnmark', u'Finnmark'),
+ ('hedmark', u'Hedmark'),
+ ('hordaland', u'Hordaland'),
+ ('janmayen', u'Jan Mayen'),
+ ('moreogromsdal', u'Møre og Romsdal'),
+ ('nordtrondelag', u'Nord-Trøndelag'),
+ ('nordland', u'Nordland'),
+ ('oppland', u'Oppland'),
+ ('oslo', u'Oslo'),
+ ('rogaland', u'Rogaland'),
+ ('sognogfjordane', u'Sogn og Fjordane'),
+ ('svalbard', u'Svalbard'),
+ ('sortrondelag', u'Sør-Trøndelag'),
+ ('telemark', u'Telemark'),
+ ('troms', u'Troms'),
+ ('vestagder', u'Vest-Agder'),
+ ('vestfold', u'Vestfold'),
+ ('ostfold', u'Østfold')
+)
diff --git a/django/contrib/localflavor/uk/__init__.py b/django/contrib/localflavor/uk/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/uk/__init__.py
diff --git a/django/contrib/localflavor/uk/forms.py b/django/contrib/localflavor/uk/forms.py
new file mode 100644
index 0000000000..ddd033e1e0
--- /dev/null
+++ b/django/contrib/localflavor/uk/forms.py
@@ -0,0 +1,19 @@
+"""
+UK-specific Form helpers
+"""
+
+from django.newforms.fields import RegexField
+from django.utils.translation import gettext
+
+class UKPostcodeField(RegexField):
+ """
+ A form field that validates its input is a UK postcode.
+
+ The regular expression used is sourced from the schema for British Standard
+ BS7666 address types: http://www.govtalk.gov.uk/gdsc/schemas/bs7666-v2-0.xsd
+ """
+ def __init__(self, *args, **kwargs):
+ super(UKPostcodeField, self).__init__(r'^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW]) [0-9][ABD-HJLNP-UW-Z]{2})$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a postcode. A space is required between the two postcode parts.'),
+ *args, **kwargs)
diff --git a/django/contrib/localflavor/us/__init__.py b/django/contrib/localflavor/us/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/us/__init__.py
diff --git a/django/contrib/localflavor/us/forms.py b/django/contrib/localflavor/us/forms.py
new file mode 100644
index 0000000000..feda68291b
--- /dev/null
+++ b/django/contrib/localflavor/us/forms.py
@@ -0,0 +1,99 @@
+"""
+USA-specific Form helpers
+"""
+
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$')
+ssn_re = re.compile(r"^(?P<area>\d{3})[-\ ]?(?P<group>\d{2})[-\ ]?(?P<serial>\d{4})$")
+
+class USZipCodeField(RegexField):
+ def __init__(self, *args, **kwargs):
+ super(USZipCodeField, self).__init__(r'^\d{5}(?:-\d{4})?$',
+ max_length=None, min_length=None,
+ error_message=gettext(u'Enter a zip code in the format XXXXX or XXXXX-XXXX.'),
+ *args, **kwargs)
+
+class USPhoneNumberField(Field):
+ def clean(self, value):
+ super(USPhoneNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
+ m = phone_digits_re.search(value)
+ if m:
+ return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+ raise ValidationError(u'Phone numbers must be in XXX-XXX-XXXX format.')
+
+class USSocialSecurityNumberField(Field):
+ """
+ A United States Social Security number.
+
+ Checks the following rules to determine whether the number is valid:
+
+ * Conforms to the XXX-XX-XXXX format.
+ * No group consists entirely of zeroes.
+ * The leading group is not "666" (block "666" will never be allocated).
+ * The number is not in the promotional block 987-65-4320 through 987-65-4329,
+ which are permanently invalid.
+ * The number is not one known to be invalid due to otherwise widespread
+ promotional use or distribution (e.g., the Woolworth's number or the 1962
+ promotional number).
+ """
+ def clean(self, value):
+ super(USSocialSecurityNumberField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ msg = gettext(u'Enter a valid U.S. Social Security number in XXX-XX-XXXX format.')
+ match = re.match(ssn_re, value)
+ if not match:
+ raise ValidationError(msg)
+ area, group, serial = match.groupdict()['area'], match.groupdict()['group'], match.groupdict()['serial']
+
+ # First pass: no blocks of all zeroes.
+ if area == '000' or \
+ group == '00' or \
+ serial == '0000':
+ raise ValidationError(msg)
+
+ # Second pass: promotional and otherwise permanently invalid numbers.
+ if area == '666' or \
+ (area == '987' and group == '65' and 4320 <= int(serial) <= 4329) or \
+ value == '078-05-1120' or \
+ value == '219-09-9999':
+ raise ValidationError(msg)
+ return u'%s-%s-%s' % (area, group, serial)
+
+class USStateField(Field):
+ """
+ A form field that validates its input is a U.S. state name or abbreviation.
+ It normalizes the input to the standard two-leter postal service
+ abbreviation for the given state.
+ """
+ def clean(self, value):
+ from us_states import STATES_NORMALIZED # relative import
+ super(USStateField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ try:
+ value = value.strip().lower()
+ except AttributeError:
+ pass
+ else:
+ try:
+ return STATES_NORMALIZED[value.strip().lower()].decode('ascii')
+ except KeyError:
+ pass
+ raise ValidationError(u'Enter a U.S. state or territory.')
+
+class USStateSelect(Select):
+ """
+ A Select widget that uses a list of U.S. states/territories as its choices.
+ """
+ def __init__(self, attrs=None):
+ from us_states import STATE_CHOICES # relative import
+ super(USStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
diff --git a/django/contrib/localflavor/us/us_states.py b/django/contrib/localflavor/us/us_states.py
new file mode 100644
index 0000000000..c84facc219
--- /dev/null
+++ b/django/contrib/localflavor/us/us_states.py
@@ -0,0 +1,240 @@
+"""
+A mapping of state misspellings/abbreviations to normalized abbreviations, and
+an alphabetical list of states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+ ('AL', 'Alabama'),
+ ('AK', 'Alaska'),
+ ('AS', 'American Samoa'),
+ ('AZ', 'Arizona'),
+ ('AR', 'Arkansas'),
+ ('CA', 'California'),
+ ('CO', 'Colorado'),
+ ('CT', 'Connecticut'),
+ ('DE', 'Delaware'),
+ ('DC', 'District of Columbia'),
+ ('FM', 'Federated States of Micronesia'),
+ ('FL', 'Florida'),
+ ('GA', 'Georgia'),
+ ('GU', 'Guam'),
+ ('HI', 'Hawaii'),
+ ('ID', 'Idaho'),
+ ('IL', 'Illinois'),
+ ('IN', 'Indiana'),
+ ('IA', 'Iowa'),
+ ('KS', 'Kansas'),
+ ('KY', 'Kentucky'),
+ ('LA', 'Louisiana'),
+ ('ME', 'Maine'),
+ ('MH', 'Marshall Islands'),
+ ('MD', 'Maryland'),
+ ('MA', 'Massachusetts'),
+ ('MI', 'Michigan'),
+ ('MN', 'Minnesota'),
+ ('MS', 'Mississippi'),
+ ('MO', 'Missouri'),
+ ('MT', 'Montana'),
+ ('NE', 'Nebraska'),
+ ('NV', 'Nevada'),
+ ('NH', 'New Hampshire'),
+ ('NJ', 'New Jersey'),
+ ('NM', 'New Mexico'),
+ ('NY', 'New York'),
+ ('NC', 'North Carolina'),
+ ('ND', 'North Dakota'),
+ ('MP', 'Northern Mariana Islands'),
+ ('OH', 'Ohio'),
+ ('OK', 'Oklahoma'),
+ ('OR', 'Oregon'),
+ ('PW', 'Palau'),
+ ('PA', 'Pennsylvania'),
+ ('PR', 'Puerto Rico'),
+ ('RI', 'Rhode Island'),
+ ('SC', 'South Carolina'),
+ ('SD', 'South Dakota'),
+ ('TN', 'Tennessee'),
+ ('TX', 'Texas'),
+ ('UT', 'Utah'),
+ ('VT', 'Vermont'),
+ ('VI', 'Virgin Islands'),
+ ('VA', 'Virginia'),
+ ('WA', 'Washington'),
+ ('WV', 'West Virginia'),
+ ('WI', 'Wisconsin'),
+ ('WY', 'Wyoming'),
+)
+
+STATES_NORMALIZED = {
+ 'ak': 'AK',
+ 'al': 'AL',
+ 'ala': 'AL',
+ 'alabama': 'AL',
+ 'alaska': 'AK',
+ 'american samao': 'AS',
+ 'american samoa': 'AS',
+ 'ar': 'AR',
+ 'ariz': 'AZ',
+ 'arizona': 'AZ',
+ 'ark': 'AR',
+ 'arkansas': 'AR',
+ 'as': 'AS',
+ 'az': 'AZ',
+ 'ca': 'CA',
+ 'calf': 'CA',
+ 'calif': 'CA',
+ 'california': 'CA',
+ 'co': 'CO',
+ 'colo': 'CO',
+ 'colorado': 'CO',
+ 'conn': 'CT',
+ 'connecticut': 'CT',
+ 'ct': 'CT',
+ 'dc': 'DC',
+ 'de': 'DE',
+ 'del': 'DE',
+ 'delaware': 'DE',
+ 'deleware': 'DE',
+ 'district of columbia': 'DC',
+ 'federated states of micronesia': 'FM',
+ 'fl': 'FL',
+ 'fla': 'FL',
+ 'florida': 'FL',
+ 'fm': 'FM',
+ 'ga': 'GA',
+ 'georgia': 'GA',
+ 'gu': 'GU',
+ 'guam': 'GU',
+ 'hawaii': 'HI',
+ 'hi': 'HI',
+ 'ia': 'IA',
+ 'id': 'ID',
+ 'idaho': 'ID',
+ 'il': 'IL',
+ 'ill': 'IL',
+ 'illinois': 'IL',
+ 'in': 'IN',
+ 'ind': 'IN',
+ 'indiana': 'IN',
+ 'iowa': 'IA',
+ 'kan': 'KS',
+ 'kans': 'KS',
+ 'kansas': 'KS',
+ 'kentucky': 'KY',
+ 'ks': 'KS',
+ 'ky': 'KY',
+ 'la': 'LA',
+ 'louisiana': 'LA',
+ 'ma': 'MA',
+ 'maine': 'ME',
+ 'marianas islands': 'MP',
+ 'marianas islands of the pacific': 'MP',
+ 'marinas islands of the pacific': 'MP',
+ 'maryland': 'MD',
+ 'mass': 'MA',
+ 'massachusetts': 'MA',
+ 'massachussetts': 'MA',
+ 'md': 'MD',
+ 'me': 'ME',
+ 'mi': 'MI',
+ 'mich': 'MI',
+ 'michigan': 'MI',
+ 'micronesia': 'FM',
+ 'minn': 'MN',
+ 'minnesota': 'MN',
+ 'miss': 'MS',
+ 'mississippi': 'MS',
+ 'missouri': 'MO',
+ 'mn': 'MN',
+ 'mo': 'MO',
+ 'mont': 'MT',
+ 'montana': 'MT',
+ 'mp': 'MP',
+ 'ms': 'MS',
+ 'mt': 'MT',
+ 'n d': 'ND',
+ 'n dak': 'ND',
+ 'n h': 'NH',
+ 'n j': 'NJ',
+ 'n m': 'NM',
+ 'n mex': 'NM',
+ 'nc': 'NC',
+ 'nd': 'ND',
+ 'ne': 'NE',
+ 'neb': 'NE',
+ 'nebr': 'NE',
+ 'nebraska': 'NE',
+ 'nev': 'NV',
+ 'nevada': 'NV',
+ 'new hampshire': 'NH',
+ 'new jersey': 'NJ',
+ 'new mexico': 'NM',
+ 'new york': 'NY',
+ 'nh': 'NH',
+ 'nj': 'NJ',
+ 'nm': 'NM',
+ 'nmex': 'NM',
+ 'north carolina': 'NC',
+ 'north dakota': 'ND',
+ 'northern mariana islands': 'MP',
+ 'nv': 'NV',
+ 'ny': 'NY',
+ 'oh': 'OH',
+ 'ohio': 'OH',
+ 'ok': 'OK',
+ 'okla': 'OK',
+ 'oklahoma': 'OK',
+ 'or': 'OR',
+ 'ore': 'OR',
+ 'oreg': 'OR',
+ 'oregon': 'OR',
+ 'pa': 'PA',
+ 'penn': 'PA',
+ 'pennsylvania': 'PA',
+ 'pr': 'PR',
+ 'puerto rico': 'PR',
+ 'rhode island': 'RI',
+ 'ri': 'RI',
+ 's dak': 'SD',
+ 'sc': 'SC',
+ 'sd': 'SD',
+ 'sdak': 'SD',
+ 'south carolina': 'SC',
+ 'south dakota': 'SD',
+ 'tenn': 'TN',
+ 'tennessee': 'TN',
+ 'territory of hawaii': 'HI',
+ 'tex': 'TX',
+ 'texas': 'TX',
+ 'tn': 'TN',
+ 'tx': 'TX',
+ 'us virgin islands': 'VI',
+ 'usvi': 'VI',
+ 'ut': 'UT',
+ 'utah': 'UT',
+ 'va': 'VA',
+ 'vermont': 'VT',
+ 'vi': 'VI',
+ 'viginia': 'VA',
+ 'virgin islands': 'VI',
+ 'virgina': 'VA',
+ 'virginia': 'VA',
+ 'vt': 'VT',
+ 'w va': 'WV',
+ 'wa': 'WA',
+ 'wash': 'WA',
+ 'washington': 'WA',
+ 'west virginia': 'WV',
+ 'wi': 'WI',
+ 'wis': 'WI',
+ 'wisc': 'WI',
+ 'wisconsin': 'WI',
+ 'wv': 'WV',
+ 'wva': 'WV',
+ 'wy': 'WY',
+ 'wyo': 'WY',
+ 'wyoming': 'WY',
+}
diff --git a/django/contrib/markup/models.py b/django/contrib/markup/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/markup/models.py
diff --git a/tests/regressiontests/markup/tests.py b/django/contrib/markup/tests.py
index bd3f52b9dd..bd3f52b9dd 100644
--- a/tests/regressiontests/markup/tests.py
+++ b/django/contrib/markup/tests.py
diff --git a/django/contrib/sessions/middleware.py b/django/contrib/sessions/middleware.py
index 2337ad8a61..434997d616 100644
--- a/django/contrib/sessions/middleware.py
+++ b/django/contrib/sessions/middleware.py
@@ -1,5 +1,6 @@
from django.conf import settings
from django.contrib.sessions.models import Session
+from django.core.exceptions import SuspiciousOperation
from django.utils.cache import patch_vary_headers
import datetime
@@ -9,6 +10,7 @@ TEST_COOKIE_VALUE = 'worked'
class SessionWrapper(object):
def __init__(self, session_key):
self.session_key = session_key
+ self.accessed = False
self.modified = False
def __contains__(self, key):
@@ -34,6 +36,9 @@ class SessionWrapper(object):
def get(self, key, default=None):
return self._session.get(key, default)
+ def pop(self, key, *args):
+ return self._session.pop(key, *args)
+
def set_test_cookie(self):
self[TEST_COOKIE_NAME] = TEST_COOKIE_VALUE
@@ -45,6 +50,7 @@ class SessionWrapper(object):
def _get_session(self):
# Lazily loads session from storage.
+ self.accessed = True
try:
return self._session_cache
except AttributeError:
@@ -55,7 +61,7 @@ class SessionWrapper(object):
s = Session.objects.get(session_key=self.session_key,
expire_date__gt=datetime.datetime.now())
self._session_cache = s.get_decoded()
- except Session.DoesNotExist:
+ except (Session.DoesNotExist, SuspiciousOperation):
self._session_cache = {}
# Set the session_key to None to force creation of a new
# key, for extra security.
@@ -71,14 +77,21 @@ class SessionMiddleware(object):
def process_response(self, request, response):
# If request.session was modified, or if response.session was set, save
# those changes and set a session cookie.
- patch_vary_headers(response, ('Cookie',))
try:
+ accessed = request.session.accessed
modified = request.session.modified
except AttributeError:
pass
else:
+ if accessed:
+ patch_vary_headers(response, ('Cookie',))
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
- session_key = request.session.session_key or Session.objects.get_new_session_key()
+ if request.session.session_key:
+ session_key = request.session.session_key
+ else:
+ obj = Session.objects.get_new_session_object()
+ session_key = obj.session_key
+
if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
max_age = None
expires = None
diff --git a/django/contrib/sessions/models.py b/django/contrib/sessions/models.py
index f684cd381e..521a2abee9 100644
--- a/django/contrib/sessions/models.py
+++ b/django/contrib/sessions/models.py
@@ -1,4 +1,4 @@
-import base64, md5, random, sys
+import base64, md5, random, sys, datetime, os, time
import cPickle as pickle
from django.db import models
from django.utils.translation import gettext_lazy as _
@@ -14,15 +14,32 @@ class SessionManager(models.Manager):
def get_new_session_key(self):
"Returns session key that isn't being used."
# The random module is seeded when this Apache child is created.
- # Use person_id and SECRET_KEY as added salt.
+ # Use SECRET_KEY as added salt.
while 1:
- session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + str(random.randint(0, sys.maxint - 1)) + settings.SECRET_KEY).hexdigest()
+ session_key = md5.new("%s%s%s%s" % (random.randint(0, sys.maxint - 1), os.getpid(), time.time(), settings.SECRET_KEY)).hexdigest()
try:
self.get(session_key=session_key)
except self.model.DoesNotExist:
break
return session_key
+ def get_new_session_object(self):
+ """
+ Returns a new session object.
+ """
+ # FIXME: There is a *small* chance of collision here, meaning we will
+ # return an existing object. That can be fixed when we add a way to
+ # validate (and guarantee) that non-auto primary keys are unique. For
+ # now, we save immediately in order to reduce the "window of
+ # misfortune" as much as possible.
+ created = False
+ while not created:
+ obj, created = self.get_or_create(session_key=self.get_new_session_key(),
+ expire_date = datetime.datetime.now())
+ # Collision in key generation, so re-seed the generator
+ random.seed()
+ return obj
+
def save(self, session_key, session_dict, expire_date):
s = self.model(session_key, self.encode(session_dict), expire_date)
if session_dict:
diff --git a/django/contrib/sessions/tests.py b/django/contrib/sessions/tests.py
new file mode 100644
index 0000000000..5a28effa86
--- /dev/null
+++ b/django/contrib/sessions/tests.py
@@ -0,0 +1,19 @@
+r"""
+>>> s = SessionWrapper(None)
+
+Inject data into the session cache.
+>>> s._session_cache = {}
+>>> s._session_cache['some key'] = 'exists'
+
+>>> s.pop('some key')
+'exists'
+
+>>> s.pop('some key', 'does not exist')
+'does not exist'
+"""
+
+from django.contrib.sessions.middleware import SessionWrapper
+
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod()
diff --git a/django/contrib/sitemaps/__init__.py b/django/contrib/sitemaps/__init__.py
index 44ede4460a..30949837e4 100644
--- a/django/contrib/sitemaps/__init__.py
+++ b/django/contrib/sitemaps/__init__.py
@@ -1,7 +1,7 @@
from django.core import urlresolvers
import urllib
-PING_URL = "http://www.google.com/webmasters/sitemaps/ping"
+PING_URL = "http://www.google.com/webmasters/tools/ping"
class SitemapNotFound(Exception):
pass
@@ -29,7 +29,7 @@ def ping_google(sitemap_url=None, ping_url=PING_URL):
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
- url = "%s%s" % (current_site.domain, sitemap_url)
+ url = "http://%s%s" % (current_site.domain, sitemap_url)
params = urllib.urlencode({'sitemap':url})
urllib.urlopen("%s?%s" % (ping_url, params))
diff --git a/django/contrib/sitemaps/views.py b/django/contrib/sitemaps/views.py
index 576e3d0bb8..d615c8e661 100644
--- a/django/contrib/sitemaps/views.py
+++ b/django/contrib/sitemaps/views.py
@@ -16,7 +16,7 @@ def index(request, sitemaps):
def sitemap(request, sitemaps, section=None):
maps, urls = [], []
if section is not None:
- if not sitemaps.has_key(section):
+ if section not in sitemaps:
raise Http404("No sitemap available for section: %r" % section)
maps.append(sitemaps[section])
else:
diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py
index 119615a0b9..af00bdc3e9 100644
--- a/django/contrib/syndication/feeds.py
+++ b/django/contrib/syndication/feeds.py
@@ -70,6 +70,7 @@ class Feed(object):
feed = self.feed_type(
title = self.__get_dynamic_attr('title', obj),
+ subtitle = self.__get_dynamic_attr('subtitle', obj),
link = link,
description = self.__get_dynamic_attr('description', obj),
language = settings.LANGUAGE_CODE.decode(),
@@ -78,6 +79,7 @@ class Feed(object):
author_link = self.__get_dynamic_attr('author_link', obj),
author_email = self.__get_dynamic_attr('author_email', obj),
categories = self.__get_dynamic_attr('categories', obj),
+ feed_copyright = self.__get_dynamic_attr('feed_copyright', obj),
)
try:
@@ -116,5 +118,6 @@ class Feed(object):
author_email = author_email,
author_link = author_link,
categories = self.__get_dynamic_attr('item_categories', item),
+ item_copyright = self.__get_dynamic_attr('item_copyright', item),
)
return feed
diff --git a/django/contrib/webdesign/__init__.py b/django/contrib/webdesign/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/webdesign/__init__.py
diff --git a/django/contrib/webdesign/lorem_ipsum.py b/django/contrib/webdesign/lorem_ipsum.py
new file mode 100644
index 0000000000..6226bbef1b
--- /dev/null
+++ b/django/contrib/webdesign/lorem_ipsum.py
@@ -0,0 +1,69 @@
+"""
+Utility functions for generating "lorem ipsum" Latin text.
+"""
+
+import random
+
+COMMON_P = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
+WORDS = ('exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet', 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi', 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi', 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos', 'facilis', 'neque', 'nihil', 'expedita', 'vitae', 'vero', 'ipsum', 'nisi', 'animi', 'cumque', 'pariatur', 'velit', 'modi', 'natus', 'iusto', 'eaque', 'sequi', 'illo', 'sed', 'ex', 'et', 'voluptatibus', 'tempora', 'veritatis', 'ratione', 'assumenda', 'incidunt', 'nostrum', 'placeat', 'aliquid', 'fuga', 'provident', 'praesentium', 'rem', 'necessitatibus', 'suscipit', 'adipisci', 'quidem', 'possimus', 'voluptas', 'debitis', 'sint', 'accusantium', 'unde', 'sapiente', 'voluptate', 'qui', 'aspernatur', 'laudantium', 'soluta', 'amet', 'quo', 'aliquam', 'saepe', 'culpa', 'libero', 'ipsa', 'dicta', 'reiciendis', 'nesciunt', 'doloribus', 'autem', 'impedit', 'minima', 'maiores', 'repudiandae', 'ipsam', 'obcaecati', 'ullam', 'enim', 'totam', 'delectus', 'ducimus', 'quis', 'voluptates', 'dolores', 'molestiae', 'harum', 'dolorem', 'quia', 'voluptatem', 'molestias', 'magni', 'distinctio', 'omnis', 'illum', 'dolorum', 'voluptatum', 'ea', 'quas', 'quam', 'corporis', 'quae', 'blanditiis', 'atque', 'deserunt', 'laboriosam', 'earum', 'consequuntur', 'hic', 'cupiditate', 'quibusdam', 'accusamus', 'ut', 'rerum', 'error', 'minus', 'eius', 'ab', 'ad', 'nemo', 'fugit', 'officia', 'at', 'in', 'id', 'quos', 'reprehenderit', 'numquam', 'iste', 'fugiat', 'sit', 'inventore', 'beatae', 'repellendus', 'magnam', 'recusandae', 'quod', 'explicabo', 'doloremque', 'aperiam', 'consequatur', 'asperiores', 'commodi', 'optio', 'dolor', 'labore', 'temporibus', 'repellat', 'veniam', 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique', 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere', 'maxime', 'corrupti')
+COMMON_WORDS = ('lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua')
+
+def sentence():
+ """
+ Returns a randomly generated sentence of lorem ipsum text.
+
+ The first word is capitalized, and the sentence ends in either a period or
+ question mark. Commas are added at random.
+ """
+ # Determine the number of comma-separated sections and number of words in
+ # each section for this sentence.
+ sections = [' '.join(random.sample(WORDS, random.randint(3, 12))) for i in range(random.randint(1, 5))]
+ s = ', '.join(sections)
+ # Convert to sentence case and add end punctuation.
+ return '%s%s%s' % (s[0].upper(), s[1:], random.choice('?.'))
+
+def paragraph():
+ """
+ Returns a randomly generated paragraph of lorem ipsum text.
+
+ The paragraph consists of between 1 and 4 sentences, inclusive.
+ """
+ return ' '.join([sentence() for i in range(random.randint(1, 4))])
+
+def paragraphs(count, common=True):
+ """
+ Returns a list of paragraphs as returned by paragraph().
+
+ If `common` is True, then the first paragraph will be the standard
+ 'lorem ipsum' paragraph. Otherwise, the first paragraph will be random
+ Latin text. Either way, subsequent paragraphs will be random Latin text.
+ """
+ paras = []
+ for i in range(count):
+ if common and i == 0:
+ paras.append(COMMON_P)
+ else:
+ paras.append(paragraph())
+ return paras
+
+def words(count, common=True):
+ """
+ Returns a string of `count` lorem ipsum words separated by a single space.
+
+ If `common` is True, then the first 19 words will be the standard
+ 'lorem ipsum' words. Otherwise, all words will be selected randomly.
+ """
+ if common:
+ word_list = list(COMMON_WORDS)
+ else:
+ word_list = []
+ c = len(word_list)
+ if count > c:
+ count -= c
+ while count > 0:
+ c = min(count, len(WORDS))
+ count -= c
+ word_list += random.sample(WORDS, c)
+ else:
+ word_list = word_list[:count]
+ return ' '.join(word_list)
diff --git a/django/contrib/webdesign/models.py b/django/contrib/webdesign/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/webdesign/models.py
diff --git a/django/contrib/webdesign/templatetags/__init__.py b/django/contrib/webdesign/templatetags/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/webdesign/templatetags/__init__.py
diff --git a/django/contrib/webdesign/templatetags/webdesign.py b/django/contrib/webdesign/templatetags/webdesign.py
new file mode 100644
index 0000000000..e5117093f8
--- /dev/null
+++ b/django/contrib/webdesign/templatetags/webdesign.py
@@ -0,0 +1,67 @@
+from django.contrib.webdesign.lorem_ipsum import words, paragraphs
+from django import template
+
+register = template.Library()
+
+class LoremNode(template.Node):
+ def __init__(self, count, method, common):
+ self.count, self.method, self.common = count, method, common
+
+ def render(self, context):
+ try:
+ count = int(self.count.resolve(context))
+ except (ValueError, TypeError):
+ count = 1
+ if self.method == 'w':
+ return words(count, common=self.common)
+ else:
+ paras = paragraphs(count, common=self.common)
+ if self.method == 'p':
+ paras = ['<p>%s</p>' % p for p in paras]
+ return '\n\n'.join(paras)
+
+#@register.tag
+def lorem(parser, token):
+ """
+ Creates random Latin text useful for providing test data in templates.
+
+ Usage format::
+
+ {% lorem [count] [method] [random] %}
+
+ ``count`` is a number (or variable) containing the number of paragraphs or
+ words to generate (default is 1).
+
+ ``method`` is either ``w`` for words, ``p`` for HTML paragraphs, ``b`` for
+ plain-text paragraph blocks (default is ``b``).
+
+ ``random`` is the word ``random``, which if given, does not use the common
+ paragraph (starting "Lorem ipsum dolor sit amet, consectetuer...").
+
+ Examples:
+ * ``{% lorem %}`` will output the common "lorem ipsum" paragraph
+ * ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
+ and two random paragraphs each wrapped in HTML ``<p>`` tags
+ * ``{% lorem 2 w random %}`` will output two random latin words
+ """
+ bits = list(token.split_contents())
+ tagname = bits[0]
+ # Random bit
+ common = bits[-1] != 'random'
+ if not common:
+ bits.pop()
+ # Method bit
+ if bits[-1] in ('w', 'p', 'b'):
+ method = bits.pop()
+ else:
+ method = 'b'
+ # Count bit
+ if len(bits) > 1:
+ count = bits.pop()
+ else:
+ count = '1'
+ count = parser.compile_filter(count)
+ if len(bits) != 1:
+ raise TemplateSyntaxError("Incorrect format for %r tag" % tagname)
+ return LoremNode(count, method, common)
+lorem = register.tag(lorem)
diff --git a/django/contrib/webdesign/tests.py b/django/contrib/webdesign/tests.py
new file mode 100644
index 0000000000..d20ebf110a
--- /dev/null
+++ b/django/contrib/webdesign/tests.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+r"""
+>>> words(7)
+'lorem ipsum dolor sit amet consectetur adipisicing'
+
+>>> paragraphs(1)
+['Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.']
+
+"""
+
+from django.contrib.webdesign.lorem_ipsum import *
+import datetime
+
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod() \ No newline at end of file
diff --git a/django/core/cache/backends/base.py b/django/core/cache/backends/base.py
index ef5f6a6b3e..bb67399f3b 100644
--- a/django/core/cache/backends/base.py
+++ b/django/core/cache/backends/base.py
@@ -54,3 +54,6 @@ class BaseCache(object):
Returns True if the key is in the cache and has not expired.
"""
return self.get(key) is not None
+
+ __contains__ = has_key
+
diff --git a/django/core/cache/backends/dummy.py b/django/core/cache/backends/dummy.py
index c68f33616c..4c64161538 100644
--- a/django/core/cache/backends/dummy.py
+++ b/django/core/cache/backends/dummy.py
@@ -6,8 +6,8 @@ class CacheClass(BaseCache):
def __init__(self, *args, **kwargs):
pass
- def get(self, *args, **kwargs):
- pass
+ def get(self, key, default=None):
+ return default
def set(self, *args, **kwargs):
pass
@@ -16,7 +16,7 @@ class CacheClass(BaseCache):
pass
def get_many(self, *args, **kwargs):
- pass
+ return {}
def has_key(self, *args, **kwargs):
return False
diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py
index 180f95da73..1ab019221a 100644
--- a/django/core/cache/backends/memcached.py
+++ b/django/core/cache/backends/memcached.py
@@ -3,9 +3,12 @@
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
try:
- import memcache
+ import cmemcache as memcache
except ImportError:
- raise InvalidCacheBackendError, "Memcached cache backend requires the 'memcache' library"
+ try:
+ import memcache
+ except:
+ raise InvalidCacheBackendError("Memcached cache backend requires either the 'memcache' or 'cmemcache' library")
class CacheClass(BaseCache):
def __init__(self, server, params):
diff --git a/django/core/cache/backends/simple.py b/django/core/cache/backends/simple.py
index 175944a75a..3fcad8c7ad 100644
--- a/django/core/cache/backends/simple.py
+++ b/django/core/cache/backends/simple.py
@@ -52,7 +52,7 @@ class CacheClass(BaseCache):
pass
def has_key(self, key):
- return self._cache.has_key(key)
+ return key in self._cache
def _cull(self):
if self._cull_frequency == 0:
diff --git a/django/core/context_processors.py b/django/core/context_processors.py
index f4b288dfc4..3c826b1a7d 100644
--- a/django/core/context_processors.py
+++ b/django/core/context_processors.py
@@ -42,6 +42,13 @@ def i18n(request):
return context_extras
+def media(request):
+ """
+ Adds media-related context variables to the context.
+
+ """
+ return {'MEDIA_URL': settings.MEDIA_URL}
+
def request(request):
return {'request': request}
diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py
index 5fc41a048b..6370cab47c 100644
--- a/django/core/handlers/modpython.py
+++ b/django/core/handlers/modpython.py
@@ -42,11 +42,11 @@ class ModPythonRequest(http.HttpRequest):
def is_secure(self):
# Note: modpython 3.2.10+ has req.is_https(), but we need to support previous versions
- return self._req.subprocess_env.has_key('HTTPS') and self._req.subprocess_env['HTTPS'] == 'on'
+ return 'HTTPS' in self._req.subprocess_env and self._req.subprocess_env['HTTPS'] == 'on'
def _load_post_and_files(self):
"Populates self._post and self._files"
- if self._req.headers_in.has_key('content-type') and self._req.headers_in['content-type'].startswith('multipart'):
+ if 'content-type' in self._req.headers_in and self._req.headers_in['content-type'].startswith('multipart'):
self._post, self._files = http.parse_file_upload(self._req.headers_in, self.raw_post_data)
else:
self._post, self._files = http.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py
index 71cfecd9a0..4320b69627 100644
--- a/django/core/handlers/wsgi.py
+++ b/django/core/handlers/wsgi.py
@@ -103,7 +103,7 @@ class WSGIRequest(http.HttpRequest):
return '%s%s' % (self.path, self.environ.get('QUERY_STRING', '') and ('?' + self.environ.get('QUERY_STRING', '')) or '')
def is_secure(self):
- return self.environ.has_key('HTTPS') and self.environ['HTTPS'] == 'on'
+ return 'HTTPS' in self.environ and self.environ['HTTPS'] == 'on'
def _load_post_and_files(self):
# Populates self._post and self._files
diff --git a/django/core/mail.py b/django/core/mail.py
index a5af6e610f..8661d84287 100644
--- a/django/core/mail.py
+++ b/django/core/mail.py
@@ -1,14 +1,56 @@
-# Use this module for e-mailing.
+"""
+Tools for sending email.
+"""
from django.conf import settings
from email.MIMEText import MIMEText
from email.Header import Header
-import smtplib, rfc822
+from email.Utils import formatdate
+from email import Charset
+import os
+import smtplib
import socket
import time
import random
-DNS_NAME = socket.getfqdn() # Cache the hostname
+# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from
+# some spam filters.
+Charset.add_charset('utf-8', Charset.SHORTEST, Charset.QP, 'utf-8')
+
+# Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of
+# seconds, which slows down the restart of the server.
+class CachedDnsName(object):
+ def __str__(self):
+ return self.get_fqdn()
+
+ def get_fqdn(self):
+ if not hasattr(self, '_fqdn'):
+ self._fqdn = socket.getfqdn()
+ return self._fqdn
+
+DNS_NAME = CachedDnsName()
+
+# Copied from Python standard library and modified to used the cached hostname
+# for performance.
+def make_msgid(idstring=None):
+ """Returns a string suitable for RFC 2822 compliant Message-ID, e.g:
+
+ <20020201195627.33539.96671@nightshade.la.mastaler.com>
+
+ Optional idstring if given is a string used to strengthen the
+ uniqueness of the message id.
+ """
+ timeval = time.time()
+ utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval))
+ pid = os.getpid()
+ randint = random.randrange(100000)
+ if idstring is None:
+ idstring = ''
+ else:
+ idstring = '.' + idstring
+ idhost = DNS_NAME
+ msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost)
+ return msgid
class BadHeaderError(ValueError):
pass
@@ -22,62 +64,173 @@ class SafeMIMEText(MIMEText):
val = Header(val, settings.DEFAULT_CHARSET)
MIMEText.__setitem__(self, name, val)
-def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=settings.EMAIL_HOST_USER, auth_password=settings.EMAIL_HOST_PASSWORD):
+class SMTPConnection(object):
+ """
+ A wrapper that manages the SMTP network connection.
+ """
+
+ def __init__(self, host=None, port=None, username=None, password=None,
+ use_tls=None, fail_silently=False):
+ self.host = host or settings.EMAIL_HOST
+ self.port = port or settings.EMAIL_PORT
+ self.username = username or settings.EMAIL_HOST_USER
+ self.password = password or settings.EMAIL_HOST_PASSWORD
+ self.use_tls = (use_tls is not None) and use_tls or settings.EMAIL_USE_TLS
+ self.fail_silently = fail_silently
+ self.connection = None
+
+ def open(self):
+ """
+ Ensure we have a connection to the email server. Returns whether or not
+ a new connection was required.
+ """
+ if self.connection:
+ # Nothing to do if the connection is already open.
+ return False
+ try:
+ self.connection = smtplib.SMTP(self.host, self.port)
+ if self.use_tls:
+ self.connection.ehlo()
+ self.connection.starttls()
+ self.connection.ehlo()
+ if self.username and self.password:
+ self.connection.login(self.username, self.password)
+ return True
+ except:
+ if not self.fail_silently:
+ raise
+
+ def close(self):
+ """Close the connection to the email server."""
+ try:
+ try:
+ self.connection.quit()
+ except socket.sslerror:
+ # This happens when calling quit() on a TLS connection
+ # sometimes.
+ self.connection.close()
+ except:
+ if self.fail_silently:
+ return
+ raise
+ finally:
+ self.connection = None
+
+ def send_messages(self, email_messages):
+ """
+ Send one or more EmailMessage objects and return the number of email
+ messages sent.
+ """
+ if not email_messages:
+ return
+ new_conn_created = self.open()
+ if not self.connection:
+ # We failed silently on open(). Trying to send would be pointless.
+ return
+ num_sent = 0
+ for message in email_messages:
+ sent = self._send(message)
+ if sent:
+ num_sent += 1
+ if new_conn_created:
+ self.close()
+ return num_sent
+
+ def _send(self, email_message):
+ """A helper method that does the actual sending."""
+ if not email_message.to:
+ return False
+ try:
+ self.connection.sendmail(email_message.from_email,
+ email_message.recipients(),
+ email_message.message().as_string())
+ except:
+ if not self.fail_silently:
+ raise
+ return False
+ return True
+
+class EmailMessage(object):
+ """
+ A container for email information.
+ """
+ def __init__(self, subject='', body='', from_email=None, to=None, bcc=None, connection=None):
+ self.to = to or []
+ self.bcc = bcc or []
+ self.from_email = from_email or settings.DEFAULT_FROM_EMAIL
+ self.subject = subject
+ self.body = body
+ self.connection = connection
+
+ def get_connection(self, fail_silently=False):
+ if not self.connection:
+ self.connection = SMTPConnection(fail_silently=fail_silently)
+ return self.connection
+
+ def message(self):
+ msg = SafeMIMEText(self.body, 'plain', settings.DEFAULT_CHARSET)
+ msg['Subject'] = self.subject
+ msg['From'] = self.from_email
+ msg['To'] = ', '.join(self.to)
+ msg['Date'] = formatdate()
+ msg['Message-ID'] = make_msgid()
+ if self.bcc:
+ msg['Bcc'] = ', '.join(self.bcc)
+ return msg
+
+ def recipients(self):
+ """
+ Returns a list of all recipients of the email (includes direct
+ addressees as well as Bcc entries).
+ """
+ return self.to + self.bcc
+
+ def send(self, fail_silently=False):
+ """Send the email message."""
+ return self.get_connection(fail_silently).send_messages([self])
+
+def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None):
"""
Easy wrapper for sending a single message to a recipient list. All members
of the recipient list will see the other recipients in the 'To' field.
+
+ If auth_user is None, the EMAIL_HOST_USER setting is used.
+ If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+ NOTE: This method is deprecated. It exists for backwards compatibility.
+ New code should use the EmailMessage class directly.
"""
- return send_mass_mail([[subject, message, from_email, recipient_list]], fail_silently, auth_user, auth_password)
+ connection = SMTPConnection(username=auth_user, password=auth_password,
+ fail_silently=fail_silently)
+ return EmailMessage(subject, message, from_email, recipient_list, connection=connection).send()
-def send_mass_mail(datatuple, fail_silently=False, auth_user=settings.EMAIL_HOST_USER, auth_password=settings.EMAIL_HOST_PASSWORD):
+def send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None):
"""
Given a datatuple of (subject, message, from_email, recipient_list), sends
each message to each recipient list. Returns the number of e-mails sent.
If from_email is None, the DEFAULT_FROM_EMAIL setting is used.
If auth_user and auth_password are set, they're used to log in.
+ If auth_user is None, the EMAIL_HOST_USER setting is used.
+ If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+ NOTE: This method is deprecated. It exists for backwards compatibility.
+ New code should use the EmailMessage class directly.
"""
- try:
- server = smtplib.SMTP(settings.EMAIL_HOST, settings.EMAIL_PORT)
- if auth_user and auth_password:
- server.login(auth_user, auth_password)
- except:
- if fail_silently:
- return
- raise
- num_sent = 0
- for subject, message, from_email, recipient_list in datatuple:
- if not recipient_list:
- continue
- from_email = from_email or settings.DEFAULT_FROM_EMAIL
- msg = SafeMIMEText(message, 'plain', settings.DEFAULT_CHARSET)
- msg['Subject'] = subject
- msg['From'] = from_email
- msg['To'] = ', '.join(recipient_list)
- msg['Date'] = rfc822.formatdate()
- try:
- random_bits = str(random.getrandbits(64))
- except AttributeError: # Python 2.3 doesn't have random.getrandbits().
- random_bits = ''.join([random.choice('1234567890') for i in range(19)])
- msg['Message-ID'] = "<%d.%s@%s>" % (time.time(), random_bits, DNS_NAME)
- try:
- server.sendmail(from_email, recipient_list, msg.as_string())
- num_sent += 1
- except:
- if not fail_silently:
- raise
- try:
- server.quit()
- except:
- if fail_silently:
- return
- raise
- return num_sent
+ connection = SMTPConnection(username=auth_user, password=auth_password,
+ fail_silently=fail_silently)
+ messages = [EmailMessage(subject, message, sender, recipient) for subject, message, sender, recipient in datatuple]
+ return connection.send_messages(messages)
def mail_admins(subject, message, fail_silently=False):
"Sends a message to the admins, as defined by the ADMINS setting."
- send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS], fail_silently)
+ EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+ settings.SERVER_EMAIL, [a[1] for a in
+ settings.ADMINS]).send(fail_silently=fail_silently)
def mail_managers(subject, message, fail_silently=False):
"Sends a message to the managers, as defined by the MANAGERS setting."
- send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS], fail_silently)
+ EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+ settings.SERVER_EMAIL, [a[1] for a in
+ settings.MANAGERS]).send(fail_silently=fail_silently)
+
diff --git a/django/core/management.py b/django/core/management.py
index d1a97c4a53..213eb4602c 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -3,14 +3,17 @@
import django
from django.core.exceptions import ImproperlyConfigured
-import os, re, shutil, sys, textwrap
from optparse import OptionParser
from django.utils import termcolors
+import os, re, shutil, sys, textwrap
# For Python 2.3
if not hasattr(__builtins__, 'set'):
from sets import Set as set
+# For backwards compatibility: get_version() used to be in this module.
+get_version = django.get_version
+
MODULE_TEMPLATE = ''' {%% if perms.%(app)s.%(addperm)s or perms.%(app)s.%(changeperm)s %%}
<tr>
<th>{%% if perms.%(app)s.%(changeperm)s %%}<a href="%(app)s/%(mod)s/">{%% endif %%}%(name)s{%% if perms.%(app)s.%(changeperm)s %%}</a>{%% endif %%}</th>
@@ -25,7 +28,7 @@ APP_ARGS = '[appname ...]'
# which has been installed.
PROJECT_TEMPLATE_DIR = os.path.join(django.__path__[0], 'conf', '%s_template')
-INVALID_PROJECT_NAMES = ('django', 'test')
+INVALID_PROJECT_NAMES = ('django', 'site', 'test')
# Set up the terminal color scheme.
class dummy: pass
@@ -68,20 +71,31 @@ def _get_table_list():
cursor = connection.cursor()
return get_introspection_module().get_table_list(cursor)
+def _get_sequence_list():
+ "Returns a list of information about all DB sequences for all models in all apps"
+ from django.db import models
+
+ apps = models.get_apps()
+ sequence_list = []
+
+ for app in apps:
+ for model in models.get_models(app):
+ for f in model._meta.fields:
+ if isinstance(f, models.AutoField):
+ sequence_list.append({'table':model._meta.db_table,'column':f.column,})
+ break # Only one AutoField is allowed per model, so don't bother continuing.
+
+ for f in model._meta.many_to_many:
+ sequence_list.append({'table':f.m2m_db_table(),'column':None,})
+
+ return sequence_list
+
# If the foreign key points to an AutoField, a PositiveIntegerField or a
# PositiveSmallIntegerField, the foreign key should be an IntegerField, not the
# referred field type. Otherwise, the foreign key should be the same type of
# field as the field to which it points.
get_rel_data_type = lambda f: (f.get_internal_type() in ('AutoField', 'PositiveIntegerField', 'PositiveSmallIntegerField')) and 'IntegerField' or f.get_internal_type()
-def get_version():
- "Returns the version as a human-format string."
- from django import VERSION
- v = '.'.join([str(i) for i in VERSION[:-1]])
- if VERSION[-1]:
- v += '-' + VERSION[-1]
- return v
-
def get_sql_create(app):
"Returns a list of the CREATE TABLE SQL statements for the given app."
from django.db import get_creation_module, models
@@ -149,6 +163,8 @@ def _get_sql_model_create(model, known_models=set()):
for f in opts.fields:
if isinstance(f, (models.ForeignKey, models.OneToOneField)):
rel_field = f.rel.get_related_field()
+ while isinstance(rel_field, (models.ForeignKey, models.OneToOneField)):
+ rel_field = rel_field.rel.get_related_field()
data_type = get_rel_data_type(rel_field)
else:
rel_field = f
@@ -167,7 +183,8 @@ def _get_sql_model_create(model, known_models=set()):
if f.rel.to in known_models:
field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \
- style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')'
+ style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' +
+ backend.get_deferrable_sql()
)
else:
# We haven't yet created the table to which this field
@@ -210,40 +227,43 @@ def _get_sql_for_pending_references(model, pending_references):
# For MySQL, r_name must be unique in the first 64 characters.
# So we are careful with character usage here.
r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table))))
- final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s);' % \
+ final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
(backend.quote_name(r_table), r_name,
- backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col)))
+ backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col),
+ backend.get_deferrable_sql()))
del pending_references[model]
return final_output
def _get_many_to_many_sql_for_model(model):
from django.db import backend, get_creation_module
- from django.db.models import GenericRel
+ from django.contrib.contenttypes import generic
data_types = get_creation_module().DATA_TYPES
opts = model._meta
final_output = []
for f in opts.many_to_many:
- if not isinstance(f.rel, GenericRel):
+ if not isinstance(f.rel, generic.GenericRel):
table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \
style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' (']
table_output.append(' %s %s %s,' % \
(style.SQL_FIELD(backend.quote_name('id')),
style.SQL_COLTYPE(data_types['AutoField']),
style.SQL_KEYWORD('NOT NULL PRIMARY KEY')))
- table_output.append(' %s %s %s %s (%s),' % \
+ table_output.append(' %s %s %s %s (%s)%s,' % \
(style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__),
style.SQL_KEYWORD('NOT NULL REFERENCES'),
style.SQL_TABLE(backend.quote_name(opts.db_table)),
- style.SQL_FIELD(backend.quote_name(opts.pk.column))))
- table_output.append(' %s %s %s %s (%s),' % \
+ style.SQL_FIELD(backend.quote_name(opts.pk.column)),
+ backend.get_deferrable_sql()))
+ table_output.append(' %s %s %s %s (%s)%s,' % \
(style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())),
style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__),
style.SQL_KEYWORD('NOT NULL REFERENCES'),
style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)),
- style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column))))
+ style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)),
+ backend.get_deferrable_sql()))
table_output.append(' %s (%s, %s)' % \
(style.SQL_KEYWORD('UNIQUE'),
style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
@@ -257,7 +277,7 @@ def get_sql_delete(app):
from django.db import backend, connection, models, get_introspection_module
introspection = get_introspection_module()
- # This should work even if a connecton isn't available
+ # This should work even if a connection isn't available
try:
cursor = connection.cursor()
except:
@@ -291,7 +311,7 @@ def get_sql_delete(app):
# Drop the table now
output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
- if backend.supports_constraints and references_to_delete.has_key(model):
+ if backend.supports_constraints and model in references_to_delete:
for rel_class, f in references_to_delete[model]:
table = rel_class._meta.db_table
col = f.column
@@ -330,7 +350,15 @@ def get_sql_reset(app):
get_sql_reset.help_doc = "Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s)."
get_sql_reset.args = APP_ARGS
-def get_sql_initial_data_for_model(model):
+def get_sql_flush():
+ "Returns a list of the SQL statements used to flush the database"
+ from django.db import backend
+ statements = backend.get_sql_flush(style, _get_table_list(), _get_sequence_list())
+ return statements
+get_sql_flush.help_doc = "Returns a list of the SQL statements required to return all tables in the database to the state they were in just after they were installed."
+get_sql_flush.args = ''
+
+def get_custom_sql_for_model(model):
from django.db import models
from django.conf import settings
@@ -357,8 +385,8 @@ def get_sql_initial_data_for_model(model):
return output
-def get_sql_initial_data(app):
- "Returns a list of the initial INSERT SQL statements for the given app."
+def get_custom_sql(app):
+ "Returns a list of the custom table modifying SQL statements for the given app."
from django.db.models import get_models
output = []
@@ -366,37 +394,23 @@ def get_sql_initial_data(app):
app_dir = os.path.normpath(os.path.join(os.path.dirname(app.__file__), 'sql'))
for model in app_models:
- output.extend(get_sql_initial_data_for_model(model))
+ output.extend(get_custom_sql_for_model(model))
return output
-get_sql_initial_data.help_doc = "Prints the initial INSERT SQL statements for the given app name(s)."
-get_sql_initial_data.args = APP_ARGS
+get_custom_sql.help_doc = "Prints the custom table modifying SQL statements for the given app name(s)."
+get_custom_sql.args = APP_ARGS
+
+def get_sql_initial_data(apps):
+ "Returns a list of the initial INSERT SQL statements for the given app."
+ return style.ERROR("This action has been renamed. Try './manage.py sqlcustom %s'." % ' '.join(apps and apps or ['app1', 'app2']))
+get_sql_initial_data.help_doc = "RENAMED: see 'sqlcustom'"
+get_sql_initial_data.args = ''
def get_sql_sequence_reset(app):
- "Returns a list of the SQL statements to reset PostgreSQL sequences for the given app."
+ "Returns a list of the SQL statements to reset sequences for the given app."
from django.db import backend, models
- output = []
- for model in models.get_models(app):
- for f in model._meta.fields:
- if isinstance(f, models.AutoField):
- output.append("%s setval('%s', (%s max(%s) %s %s));" % \
- (style.SQL_KEYWORD('SELECT'),
- style.SQL_FIELD('%s_%s_seq' % (model._meta.db_table, f.column)),
- style.SQL_KEYWORD('SELECT'),
- style.SQL_FIELD(backend.quote_name(f.column)),
- style.SQL_KEYWORD('FROM'),
- style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
- break # Only one AutoField is allowed per model, so don't bother continuing.
- for f in model._meta.many_to_many:
- output.append("%s setval('%s', (%s max(%s) %s %s));" % \
- (style.SQL_KEYWORD('SELECT'),
- style.SQL_FIELD('%s_id_seq' % f.m2m_db_table()),
- style.SQL_KEYWORD('SELECT'),
- style.SQL_FIELD(backend.quote_name('id')),
- style.SQL_KEYWORD('FROM'),
- style.SQL_TABLE(f.m2m_db_table())))
- return output
-get_sql_sequence_reset.help_doc = "Prints the SQL statements for resetting PostgreSQL sequences for the given app name(s)."
+ return backend.get_sql_sequence_reset(style, models.get_models(app))
+get_sql_sequence_reset.help_doc = "Prints the SQL statements for resetting sequences for the given app name(s)."
get_sql_sequence_reset.args = APP_ARGS
def get_sql_indexes(app):
@@ -419,7 +433,7 @@ def get_sql_indexes_for_model(model):
unique = f.unique and 'UNIQUE ' or ''
output.append(
style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
- style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
+ style.SQL_TABLE(backend.quote_name('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
style.SQL_KEYWORD('ON') + ' ' + \
style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
"(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
@@ -428,16 +442,26 @@ def get_sql_indexes_for_model(model):
def get_sql_all(app):
"Returns a list of CREATE TABLE SQL, initial-data inserts, and CREATE INDEX SQL for the given module."
- return get_sql_create(app) + get_sql_initial_data(app) + get_sql_indexes(app)
+ return get_sql_create(app) + get_custom_sql(app) + get_sql_indexes(app)
get_sql_all.help_doc = "Prints the CREATE TABLE, initial-data and CREATE INDEX SQL statements for the given model module name(s)."
get_sql_all.args = APP_ARGS
+def _emit_post_sync_signal(created_models, verbosity, interactive):
+ from django.db import models
+ from django.dispatch import dispatcher
+ # Emit the post_sync signal for every application.
+ for app in models.get_apps():
+ app_name = app.__name__.split('.')[-2]
+ if verbosity >= 2:
+ print "Running post-sync handlers for application", app_name
+ dispatcher.send(signal=models.signals.post_syncdb, sender=app,
+ app=app, created_models=created_models,
+ verbosity=verbosity, interactive=interactive)
+
def syncdb(verbosity=1, interactive=True):
"Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
from django.db import connection, transaction, models, get_creation_module
- from django.db.models import signals
from django.conf import settings
- from django.dispatch import dispatcher
disable_termcolors()
@@ -465,6 +489,7 @@ def syncdb(verbosity=1, interactive=True):
created_models = set()
pending_references = {}
+ # Create the tables for each model
for app in models.get_apps():
app_name = app.__name__.split('.')[-2]
model_list = models.get_models(app)
@@ -486,6 +511,11 @@ def syncdb(verbosity=1, interactive=True):
cursor.execute(statement)
table_list.append(model._meta.db_table)
+ # Create the m2m tables. This must be done after all tables have been created
+ # to ensure that all referred tables will exist.
+ for app in models.get_apps():
+ app_name = app.__name__.split('.')[-2]
+ model_list = models.get_models(app)
for model in model_list:
if model in created_models:
sql = _get_many_to_many_sql_for_model(model)
@@ -495,31 +525,27 @@ def syncdb(verbosity=1, interactive=True):
for statement in sql:
cursor.execute(statement)
- transaction.commit_unless_managed()
+ transaction.commit_unless_managed()
# Send the post_syncdb signal, so individual apps can do whatever they need
# to do at this point.
+ _emit_post_sync_signal(created_models, verbosity, interactive)
+
+ # Install custom SQL for the app (but only if this
+ # is a model we've just created)
for app in models.get_apps():
app_name = app.__name__.split('.')[-2]
- if verbosity >= 2:
- print "Running post-sync handlers for application", app_name
- dispatcher.send(signal=signals.post_syncdb, sender=app,
- app=app, created_models=created_models,
- verbosity=verbosity, interactive=interactive)
-
- # Install initial data for the app (but only if this is a model we've
- # just created)
for model in models.get_models(app):
if model in created_models:
- initial_sql = get_sql_initial_data_for_model(model)
- if initial_sql:
+ custom_sql = get_custom_sql_for_model(model)
+ if custom_sql:
if verbosity >= 1:
- print "Installing initial data for %s.%s model" % (app_name, model._meta.object_name)
+ print "Installing custom SQL for %s.%s model" % (app_name, model._meta.object_name)
try:
- for sql in initial_sql:
+ for sql in custom_sql:
cursor.execute(sql)
except Exception, e:
- sys.stderr.write("Failed to install initial SQL data for %s.%s model: %s" % \
+ sys.stderr.write("Failed to install custom SQL for %s.%s model: %s" % \
(app_name, model._meta.object_name, e))
transaction.rollback_unless_managed()
else:
@@ -544,7 +570,10 @@ def syncdb(verbosity=1, interactive=True):
else:
transaction.commit_unless_managed()
-syncdb.args = ''
+ # Install the 'initialdata' fixture, using format discovery
+ load_data(['initial_data'], verbosity=verbosity)
+syncdb.help_doc = "Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
+syncdb.args = '[--verbosity] [--noinput]'
def get_admin_index(app):
"Returns admin-index template snippet (in list form) for the given app."
@@ -597,36 +626,6 @@ def diffsettings():
print '\n'.join(output)
diffsettings.args = ""
-def install(app):
- "Executes the equivalent of 'get_sql_all' in the current database."
- from django.db import connection, transaction
-
- app_name = app.__name__.split('.')[-2]
-
- disable_termcolors()
-
- # First, try validating the models.
- _check_for_validation_errors(app)
-
- sql_list = get_sql_all(app)
-
- try:
- cursor = connection.cursor()
- for sql in sql_list:
- cursor.execute(sql)
- except Exception, e:
- sys.stderr.write(style.ERROR("""Error: %s couldn't be installed. Possible reasons:
- * The database isn't running or isn't configured correctly.
- * At least one of the database tables already exists.
- * The SQL was invalid.
-Hint: Look at the output of 'django-admin.py sqlall %s'. That's the SQL this command wasn't able to run.
-The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n')
- transaction.rollback_unless_managed()
- sys.exit(1)
- transaction.commit_unless_managed()
-install.help_doc = "Executes ``sqlall`` for the given app(s) in the current database."
-install.args = APP_ARGS
-
def reset(app, interactive=True):
"Executes the equivalent of 'get_sql_reset' in the current database."
from django.db import connection, transaction
@@ -668,7 +667,68 @@ The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n')
else:
print "Reset cancelled."
reset.help_doc = "Executes ``sqlreset`` for the given app(s) in the current database."
-reset.args = APP_ARGS
+reset.args = '[--noinput]' + APP_ARGS
+
+def flush(verbosity=1, interactive=True):
+ "Returns all tables in the database to the same state they were in immediately after syncdb."
+ from django.conf import settings
+ from django.db import connection, transaction, models
+ from django.dispatch import dispatcher
+
+ disable_termcolors()
+
+ # First, try validating the models.
+ _check_for_validation_errors()
+
+ # Import the 'management' module within each installed app, to register
+ # dispatcher events.
+ for app_name in settings.INSTALLED_APPS:
+ try:
+ __import__(app_name + '.management', {}, {}, [''])
+ except ImportError:
+ pass
+
+ sql_list = get_sql_flush()
+
+ if interactive:
+ confirm = raw_input("""
+You have requested a flush of the database.
+This will IRREVERSIBLY DESTROY all data currently in the database,
+and return each table to the state it was in after syncdb.
+Are you sure you want to do this?
+
+Type 'yes' to continue, or 'no' to cancel: """)
+ else:
+ confirm = 'yes'
+
+ if confirm == 'yes':
+ try:
+ cursor = connection.cursor()
+ for sql in sql_list:
+ cursor.execute(sql)
+ except Exception, e:
+ sys.stderr.write(style.ERROR("""Error: Database %s couldn't be flushed. Possible reasons:
+ * The database isn't running or isn't configured correctly.
+ * At least one of the expected database tables doesn't exist.
+ * The SQL was invalid.
+Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run.
+The full error: """ % settings.DATABASE_NAME + style.ERROR_OUTPUT(str(e)) + '\n'))
+ transaction.rollback_unless_managed()
+ sys.exit(1)
+ transaction.commit_unless_managed()
+
+ # Emit the post sync signal. This allows individual
+ # applications to respond as if the database had been
+ # sync'd from scratch.
+ _emit_post_sync_signal(models.get_models(), verbosity, interactive)
+
+ # Reinstall the initial_data fixture
+ load_data(['initial_data'], verbosity=verbosity)
+
+ else:
+ print "Flush cancelled."
+flush.help_doc = "Executes ``sqlflush`` on the current database."
+flush.args = '[--verbosity] [--noinput]'
def _start_helper(app_or_project, name, directory, other_name=''):
other = {'project': 'app', 'app': 'project'}[app_or_project]
@@ -708,7 +768,7 @@ def startproject(project_name, directory):
"Creates a Django project for the given project_name in the given directory."
from random import choice
if project_name in INVALID_PROJECT_NAMES:
- sys.stderr.write(style.ERROR("Error: %r isn't a valid project name. Please try another.\n" % project_name))
+ sys.stderr.write(style.ERROR("Error: '%r' conflicts with the name of an existing Python module and cannot be used as a project name. Please try another name.\n" % project_name))
sys.exit(1)
_start_helper('project', project_name, directory)
# Create a random SECRET_KEY hash, and put it in the main settings.
@@ -727,11 +787,12 @@ def startapp(app_name, directory):
# Determine the project_name a bit naively -- by looking at the name of
# the parent directory.
project_dir = os.path.normpath(os.path.join(directory, '..'))
- project_name = os.path.basename(project_dir)
- if app_name == os.path.basename(directory):
+ parent_dir = os.path.basename(project_dir)
+ project_name = os.path.basename(directory)
+ if app_name == project_name:
sys.stderr.write(style.ERROR("Error: You cannot create an app with the same name (%r) as your project.\n" % app_name))
sys.exit(1)
- _start_helper('app', app_name, directory, project_name)
+ _start_helper('app', app_name, directory, parent_dir)
startapp.help_doc = "Creates a Django app directory structure for the given app name in the current directory."
startapp.args = "[appname]"
@@ -751,7 +812,7 @@ def inspectdb():
yield "# * Make sure each model has one field with primary_key=True"
yield "# Feel free to rename the models, but don't rename db_table values or field names."
yield "#"
- yield "# Also note: You'll have to insert the output of 'django-admin.py sqlinitialdata [appname]'"
+ yield "# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'"
yield "# into your database."
yield ''
yield 'from django.db import models'
@@ -780,7 +841,7 @@ def inspectdb():
att_name += '_field'
comment_notes.append('Field renamed because it was a Python reserved word.')
- if relations.has_key(i):
+ if i in relations:
rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
field_type = 'ForeignKey(%s' % rel_to
if att_name.endswith('_id'):
@@ -804,7 +865,7 @@ def inspectdb():
if field_type == 'CharField' and row[3]:
extra_params['maxlength'] = row[3]
- if field_type == 'FloatField':
+ if field_type == 'DecimalField':
extra_params['max_digits'] = row[4]
extra_params['decimal_places'] = row[5]
@@ -879,11 +940,11 @@ def get_validation_errors(outfile, app=None):
e.add(opts, '"%s": You can\'t use "id" as a field name, because each model automatically gets an "id" field if none of the fields have primary_key=True. You need to either remove/rename your "id" field or add primary_key=True to a field.' % f.name)
if isinstance(f, models.CharField) and f.maxlength in (None, 0):
e.add(opts, '"%s": CharFields require a "maxlength" attribute.' % f.name)
- if isinstance(f, models.FloatField):
+ if isinstance(f, models.DecimalField):
if f.decimal_places is None:
- e.add(opts, '"%s": FloatFields require a "decimal_places" attribute.' % f.name)
+ e.add(opts, '"%s": DecimalFields require a "decimal_places" attribute.' % f.name)
if f.max_digits is None:
- e.add(opts, '"%s": FloatFields require a "max_digits" attribute.' % f.name)
+ e.add(opts, '"%s": DecimalFields require a "max_digits" attribute.' % f.name)
if isinstance(f, models.FileField) and not f.upload_to:
e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name)
if isinstance(f, models.ImageField):
@@ -1072,7 +1133,7 @@ def validate(outfile=sys.stdout, silent_success=False):
return
outfile.write('%s error%s found.\n' % (num_errors, num_errors != 1 and 's' or ''))
except ImproperlyConfigured:
- outfile.write("Skipping validation because things aren't configured properly.")
+ outfile.write("Skipping validation because things aren't configured properly.\n")
validate.args = ''
def _check_for_validation_errors(app=None):
@@ -1174,6 +1235,11 @@ createcachetable.args = "[tablename]"
def run_shell(use_plain=False):
"Runs a Python interactive interpreter. Tries to use IPython, if it's available."
+ # XXX: (Temporary) workaround for ticket #1796: force early loading of all
+ # models from installed apps.
+ from django.db.models.loading import get_models
+ loaded_models = get_models()
+
try:
if use_plain:
# Don't bother loading IPython, because the user wants plain Python.
@@ -1235,10 +1301,154 @@ def test(app_labels, verbosity=1):
test_module = __import__(test_module_name, {}, {}, test_path[-1])
test_runner = getattr(test_module, test_path[-1])
- test_runner(app_list, verbosity)
+ failures = test_runner(app_list, verbosity)
+ if failures:
+ sys.exit(failures)
+
test.help_doc = 'Runs the test suite for the specified applications, or the entire site if no apps are specified'
test.args = '[--verbosity] ' + APP_ARGS
+def load_data(fixture_labels, verbosity=1):
+ "Installs the provided fixture file(s) as data in the database."
+ from django.db.models import get_apps
+ from django.core import serializers
+ from django.db import connection, transaction, backend
+ from django.conf import settings
+ import sys
+
+ disable_termcolors()
+
+ # Keep a count of the installed objects and fixtures
+ count = [0,0]
+ models = set()
+
+ humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path'
+
+ # Get a cursor (even though we don't need one yet). This has
+ # the side effect of initializing the test database (if
+ # it isn't already initialized).
+ cursor = connection.cursor()
+
+ # Start transaction management. All fixtures are installed in a
+ # single transaction to ensure that all references are resolved.
+ transaction.commit_unless_managed()
+ transaction.enter_transaction_management()
+ transaction.managed(True)
+
+ app_fixtures = [os.path.join(os.path.dirname(app.__file__),'fixtures') for app in get_apps()]
+ for fixture_label in fixture_labels:
+ parts = fixture_label.split('.')
+ if len(parts) == 1:
+ fixture_name = fixture_label
+ formats = serializers.get_serializer_formats()
+ else:
+ fixture_name, format = '.'.join(parts[:-1]), parts[-1]
+ if format in serializers.get_serializer_formats():
+ formats = [format]
+ else:
+ formats = []
+
+ if verbosity > 0:
+ if formats:
+ print "Loading '%s' fixtures..." % fixture_name
+ else:
+ print "Skipping fixture '%s': %s is not a known serialization format" % (fixture_name, format)
+
+ for fixture_dir in app_fixtures + list(settings.FIXTURE_DIRS) + ['']:
+ if verbosity > 1:
+ print "Checking %s for fixtures..." % humanize(fixture_dir)
+
+ label_found = False
+ for format in formats:
+ serializer = serializers.get_serializer(format)
+ if verbosity > 1:
+ print "Trying %s for %s fixture '%s'..." % \
+ (humanize(fixture_dir), format, fixture_name)
+ try:
+ full_path = os.path.join(fixture_dir, '.'.join([fixture_name, format]))
+ fixture = open(full_path, 'r')
+ if label_found:
+ fixture.close()
+ print style.ERROR("Multiple fixtures named '%s' in %s. Aborting." %
+ (fixture_name, humanize(fixture_dir)))
+ transaction.rollback()
+ transaction.leave_transaction_management()
+ return
+ else:
+ count[1] += 1
+ if verbosity > 0:
+ print "Installing %s fixture '%s' from %s." % \
+ (format, fixture_name, humanize(fixture_dir))
+ try:
+ objects = serializers.deserialize(format, fixture)
+ for obj in objects:
+ count[0] += 1
+ models.add(obj.object.__class__)
+ obj.save()
+ label_found = True
+ except Exception, e:
+ fixture.close()
+ sys.stderr.write(
+ style.ERROR("Problem installing fixture '%s': %s\n" %
+ (full_path, str(e))))
+ transaction.rollback()
+ transaction.leave_transaction_management()
+ return
+ fixture.close()
+ except:
+ if verbosity > 1:
+ print "No %s fixture '%s' in %s." % \
+ (format, fixture_name, humanize(fixture_dir))
+
+ 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, ..."
+
+def dump_data(app_labels, format='json', indent=None):
+ "Output the current contents of the database as a fixture of the given format"
+ from django.db.models import get_app, get_apps, get_models
+ from django.core import serializers
+
+ if len(app_labels) == 0:
+ app_list = get_apps()
+ else:
+ app_list = [get_app(app_label) for app_label in app_labels]
+
+ # Check that the serialization format exists; this is a shortcut to
+ # avoid collating all the objects and _then_ failing.
+ try:
+ serializers.get_serializer(format)
+ except KeyError:
+ sys.stderr.write(style.ERROR("Unknown serialization format: %s\n" % format))
+
+ objects = []
+ for app in app_list:
+ for model in get_models(app):
+ objects.extend(model.objects.all())
+ try:
+ return serializers.serialize(format, objects, indent=indent)
+ except Exception, e:
+ sys.stderr.write(style.ERROR("Unable to serialize database: %s\n" % e))
+dump_data.help_doc = 'Output the contents of the database as a fixture of the given format'
+dump_data.args = '[--format] [--indent]' + APP_ARGS
+
# Utilities for command-line script
DEFAULT_ACTION_MAPPING = {
@@ -1246,8 +1456,10 @@ DEFAULT_ACTION_MAPPING = {
'createcachetable' : createcachetable,
'dbshell': dbshell,
'diffsettings': diffsettings,
+ 'dumpdata': dump_data,
+ 'flush': flush,
'inspectdb': inspectdb,
- 'install': install,
+ 'loaddata': load_data,
'reset': reset,
'runfcgi': runfcgi,
'runserver': runserver,
@@ -1255,6 +1467,8 @@ DEFAULT_ACTION_MAPPING = {
'sql': get_sql_create,
'sqlall': get_sql_all,
'sqlclear': get_sql_delete,
+ 'sqlcustom': get_custom_sql,
+ 'sqlflush': get_sql_flush,
'sqlindexes': get_sql_indexes,
'sqlinitialdata': get_sql_initial_data,
'sqlreset': get_sql_reset,
@@ -1271,7 +1485,6 @@ NO_SQL_TRANSACTION = (
'createcachetable',
'dbshell',
'diffsettings',
- 'install',
'reset',
'sqlindexes',
'syncdb',
@@ -1318,6 +1531,10 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
help='Tells Django to NOT prompt the user for input of any kind.')
parser.add_option('--noreload', action='store_false', dest='use_reloader', default=True,
help='Tells Django to NOT use the auto-reloader when running the development server.')
+ parser.add_option('--format', default='json', dest='format',
+ help='Specifies the output serialization format for fixtures')
+ parser.add_option('--indent', default=None, dest='indent',
+ type='int', help='Specifies the indent level to use when pretty-printing output')
parser.add_option('--verbosity', action='store', dest='verbosity', default='1',
type='choice', choices=['0', '1', '2'],
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
@@ -1337,7 +1554,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action = args[0]
except IndexError:
parser.print_usage_and_exit()
- if not action_mapping.has_key(action):
+ if action not in action_mapping:
print_error("Your action, %r, was invalid." % action, argv[0])
# Switch to English, because django-admin.py creates database content
@@ -1351,7 +1568,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action_mapping[action](options.plain is True)
elif action in ('validate', 'diffsettings', 'dbshell'):
action_mapping[action]()
- elif action == 'syncdb':
+ elif action in ('flush', 'syncdb'):
action_mapping[action](int(options.verbosity), options.interactive)
elif action == 'inspectdb':
try:
@@ -1365,11 +1582,16 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action_mapping[action](args[1])
except IndexError:
parser.print_usage_and_exit()
- elif action == 'test':
+ elif action in ('test', 'loaddata'):
try:
action_mapping[action](args[1:], int(options.verbosity))
except IndexError:
parser.print_usage_and_exit()
+ elif action == 'dumpdata':
+ try:
+ print action_mapping[action](args[1:], options.format, options.indent)
+ except IndexError:
+ parser.print_usage_and_exit()
elif action in ('startapp', 'startproject'):
try:
name = args[1]
@@ -1388,6 +1610,10 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action_mapping[action](addr, port, options.use_reloader, options.admin_media_path)
elif action == 'runfcgi':
action_mapping[action](args[1:])
+ elif action == 'sqlinitialdata':
+ print action_mapping[action](args[1:])
+ elif action == 'sqlflush':
+ print '\n'.join(action_mapping[action]())
else:
from django.db import models
validate(silent_success=True)
diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
index a1268321f2..494393f3cf 100644
--- a/django/core/serializers/__init__.py
+++ b/django/core/serializers/__init__.py
@@ -25,6 +25,13 @@ BUILTIN_SERIALIZERS = {
"json" : "django.core.serializers.json",
}
+# Check for PyYaml and register the serializer if it's available.
+try:
+ import yaml
+ BUILTIN_SERIALIZERS["yaml"] = "django.core.serializers.pyyaml"
+except ImportError:
+ pass
+
_serializers = {}
def register_serializer(format, serializer_module):
@@ -40,6 +47,11 @@ def get_serializer(format):
if not _serializers:
_load_serializers()
return _serializers[format].Serializer
+
+def get_serializer_formats():
+ if not _serializers:
+ _load_serializers()
+ return _serializers.keys()
def get_deserializer(format):
if not _serializers:
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 5b0acdc480..86d0037c17 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -34,17 +34,17 @@ class Serializer(object):
for obj in queryset:
self.start_object(obj)
for field in obj._meta.fields:
- if field is obj._meta.pk:
- continue
- elif field.rel is None:
- if self.selected_fields is None or field.attname in self.selected_fields:
- self.handle_field(obj, field)
- else:
- if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
- self.handle_fk_field(obj, field)
+ if field.serialize:
+ if field.rel is None:
+ if self.selected_fields is None or field.attname in self.selected_fields:
+ self.handle_field(obj, field)
+ else:
+ if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
+ self.handle_fk_field(obj, field)
for field in obj._meta.many_to_many:
- if self.selected_fields is None or field.attname in self.selected_fields:
- self.handle_m2m_field(obj, field)
+ if field.serialize:
+ if self.selected_fields is None or field.attname in self.selected_fields:
+ self.handle_m2m_field(obj, field)
self.end_object(obj)
self.end_serialization()
return self.getvalue()
@@ -54,11 +54,7 @@ class Serializer(object):
Convert a field's value to a string.
"""
if isinstance(field, models.DateTimeField):
- value = getattr(obj, field.name)
- if value is None:
- value = ''
- else:
- value = value.strftime("%Y-%m-%d %H:%M:%S")
+ value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(field, models.FileField):
value = getattr(obj, "get_%s_url" % field.name, lambda: None)()
else:
@@ -109,9 +105,11 @@ class Serializer(object):
def getvalue(self):
"""
- Return the fully serialized queryset.
+ Return the fully serialized queryset (or None if the output stream is
+ not seekable).
"""
- return self.stream.getvalue()
+ if callable(getattr(self.stream, 'getvalue', None)):
+ return self.stream.getvalue()
class Deserializer(object):
"""
@@ -141,7 +139,7 @@ class Deserializer(object):
class DeserializedObject(object):
"""
- A deserialzed model.
+ A deserialized model.
Basically a container for holding the pre-saved deserialized data along
with the many-to-many data saved with the object.
diff --git a/django/core/serializers/json.py b/django/core/serializers/json.py
index 15770f160e..fa2dca7295 100644
--- a/django/core/serializers/json.py
+++ b/django/core/serializers/json.py
@@ -4,22 +4,30 @@ Serialize data to/from JSON
import datetime
from django.utils import simplejson
+from django.utils.simplejson import decoder
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
+try:
+ import decimal
+except ImportError:
+ from django.utils import _decimal as decimal # Python 2.3 fallback
class Serializer(PythonSerializer):
"""
Convert a queryset to JSON.
"""
def end_serialization(self):
- simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder, **self.options)
-
+ self.options.pop('stream', None)
+ self.options.pop('fields', None)
+ simplejson.dump(self.objects, self.stream, cls=DjangoJSONEncoder, **self.options)
+
def getvalue(self):
- return self.stream.getvalue()
+ if callable(getattr(self.stream, 'getvalue', None)):
+ return self.stream.getvalue()
def Deserializer(stream_or_string, **options):
"""
@@ -31,15 +39,15 @@ def Deserializer(stream_or_string, **options):
stream = stream_or_string
for obj in PythonDeserializer(simplejson.load(stream)):
yield obj
-
-class DateTimeAwareJSONEncoder(simplejson.JSONEncoder):
+
+class DjangoJSONEncoder(simplejson.JSONEncoder):
"""
- JSONEncoder subclass that knows how to encode date/time types
+ JSONEncoder subclass that knows how to encode date/time and decimal types.
"""
-
- DATE_FORMAT = "%Y-%m-%d"
+
+ DATE_FORMAT = "%Y-%m-%d"
TIME_FORMAT = "%H:%M:%S"
-
+
def default(self, o):
if isinstance(o, datetime.datetime):
return o.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
@@ -47,5 +55,11 @@ class DateTimeAwareJSONEncoder(simplejson.JSONEncoder):
return o.strftime(self.DATE_FORMAT)
elif isinstance(o, datetime.time):
return o.strftime(self.TIME_FORMAT)
+ elif isinstance(o, decimal.Decimal):
+ return str(o)
else:
- return super(DateTimeAwareJSONEncoder, self).default(o)
+ return super(DjangoJSONEncoder, self).default(o)
+
+# Older, deprecated class name (for backwards compatibility purposes).
+DateTimeAwareJSONEncoder = DjangoJSONEncoder
+
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 859816c226..5fbb3163f7 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -37,7 +37,12 @@ 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()
+ if field.rel.field_name == related._meta.pk.name:
+ # Related to remote object via primary key
+ related = related._get_pk_val()
+ else:
+ # Related to remote object via other field
+ related = getattr(related, field.rel.field_name)
self._current[field.name] = related
def handle_m2m_field(self, obj, field):
@@ -57,7 +62,7 @@ def Deserializer(object_list, **options):
for d in object_list:
# Look up the model and starting build a dict of data for it.
Model = _get_model(d["model"])
- data = {Model._meta.pk.name : d["pk"]}
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
m2m_data = {}
# Handle each field
@@ -67,20 +72,23 @@ def Deserializer(object_list, **options):
field = Model._meta.get_field(field_name)
- # Handle M2M relations (with in_bulk() for performance)
+ # Handle M2M relations
if field.rel and isinstance(field.rel, models.ManyToManyRel):
pks = []
+ m2m_convert = field.rel.to._meta.pk.to_python
for pk in field_value:
if isinstance(pk, unicode):
- pk = pk.encode(options.get("encoding", settings.DEFAULT_CHARSET))
- m2m_data[field.name] = field.rel.to._default_manager.in_bulk(field_value).values()
+ pks.append(m2m_convert(pk.encode(options.get("encoding", settings.DEFAULT_CHARSET))))
+ else:
+ pks.append(m2m_convert(pk))
+ m2m_data[field.name] = pks
# Handle FK fields
- elif field.rel and isinstance(field.rel, models.ManyToOneRel) and field_value is not None:
- try:
- data[field.name] = field.rel.to._default_manager.get(pk=field_value)
- except field.rel.to.DoesNotExist:
- data[field.name] = None
+ elif field.rel and isinstance(field.rel, models.ManyToOneRel):
+ 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/pyyaml.py b/django/core/serializers/pyyaml.py
new file mode 100644
index 0000000000..d3444280c5
--- /dev/null
+++ b/django/core/serializers/pyyaml.py
@@ -0,0 +1,38 @@
+"""
+YAML serializer.
+
+Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__.
+"""
+
+import datetime
+from django.core.serializers.python import Serializer as PythonSerializer
+from django.core.serializers.python import Deserializer as PythonDeserializer
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+import yaml
+
+class Serializer(PythonSerializer):
+ """
+ Convert a queryset to YAML.
+ """
+ def end_serialization(self):
+ self.options.pop('stream', None)
+ self.options.pop('fields', None)
+ yaml.dump(self.objects, self.stream, **self.options)
+
+ def getvalue(self):
+ return self.stream.getvalue()
+
+def Deserializer(stream_or_string, **options):
+ """
+ Deserialize a stream or string of YAML data.
+ """
+ if isinstance(stream_or_string, basestring):
+ stream = StringIO(stream_or_string)
+ else:
+ stream = stream_or_string
+ for obj in PythonDeserializer(yaml.load(stream)):
+ yield obj
+
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 512b8c6176..3e4a6f3e79 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -13,6 +13,10 @@ class Serializer(base.Serializer):
Serializes a QuerySet to XML.
"""
+ def indent(self, level):
+ if self.options.get('indent', None) is not None:
+ self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)
+
def start_serialization(self):
"""
Start serialization -- open the XML document and the root element.
@@ -25,6 +29,7 @@ class Serializer(base.Serializer):
"""
End serialization -- end the document.
"""
+ self.indent(0)
self.xml.endElement("django-objects")
self.xml.endDocument()
@@ -35,6 +40,7 @@ class Serializer(base.Serializer):
if not hasattr(obj, "_meta"):
raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
+ self.indent(1)
self.xml.startElement("object", {
"pk" : str(obj._get_pk_val()),
"model" : str(obj._meta),
@@ -44,6 +50,7 @@ class Serializer(base.Serializer):
"""
Called after handling all fields for an object.
"""
+ self.indent(1)
self.xml.endElement("object")
def handle_field(self, obj, field):
@@ -51,16 +58,19 @@ class Serializer(base.Serializer):
Called to handle each field on an object (except for ForeignKeys and
ManyToManyFields)
"""
+ self.indent(2)
self.xml.startElement("field", {
"name" : field.name,
"type" : field.get_internal_type()
})
# Get a "string version" of the object's data (this is handled by the
- # serializer base class). None is handled specially.
- value = self.get_string_value(obj, field)
- if value is not None:
+ # serializer base class).
+ if getattr(obj, field.name) is not None:
+ value = self.get_string_value(obj, field)
self.xml.characters(str(value))
+ else:
+ self.xml.addQuickElement("None")
self.xml.endElement("field")
@@ -72,7 +82,13 @@ 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()))
+ if field.rel.field_name == related._meta.pk.name:
+ # Related to remote object via primary key
+ related = related._get_pk_val()
+ else:
+ # Related to remote object via other field
+ related = getattr(related, field.rel.field_name)
+ self.xml.characters(str(related))
else:
self.xml.addQuickElement("None")
self.xml.endElement("field")
@@ -92,6 +108,7 @@ class Serializer(base.Serializer):
"""
Helper to output the <field> element for relational fields
"""
+ self.indent(2)
self.xml.startElement("field", {
"name" : field.name,
"rel" : field.rel.__class__.__name__,
@@ -127,7 +144,8 @@ class Deserializer(base.Deserializer):
pk = node.getAttribute("pk")
if not pk:
raise base.DeserializationError("<object> node is missing the 'pk' attribute")
- data = {Model._meta.pk.name : pk}
+
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
# Also start building a dict of m2m data (this is saved as
# {m2m_accessor_attribute : [list_of_related_objects]})
@@ -148,41 +166,37 @@ class Deserializer(base.Deserializer):
# As is usually the case, relation fields get the special treatment.
if field.rel and isinstance(field.rel, models.ManyToManyRel):
- m2m_data[field.name] = self._handle_m2m_field_node(field_node)
+ m2m_data[field.name] = self._handle_m2m_field_node(field_node, field)
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.name] = self._handle_fk_field_node(field_node)
+ data[field.attname] = self._handle_fk_field_node(field_node, field)
else:
- value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
+ if len(field_node.childNodes) == 1 and field_node.childNodes[0].nodeName == 'None':
+ value = None
+ else:
+ value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
data[field.name] = value
# Return a DeserializedObject so that the m2m data has a place to live.
return base.DeserializedObject(Model(**data), m2m_data)
- def _handle_fk_field_node(self, node):
+ def _handle_fk_field_node(self, node, field):
"""
Handle a <field> node for a ForeignKey
"""
- # Try to set the foreign key by looking up the foreign related object.
- # If it doesn't exist, set the field to None (which might trigger
- # validation error, but that's expected).
- RelatedModel = self._get_model_from_node(node, "to")
# Check if there is a child node named 'None', returning None if so.
if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
return None
else:
- return RelatedModel.objects.get(pk=getInnerText(node).strip().encode(self.encoding))
+ 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):
+ def _handle_m2m_field_node(self, node, field):
"""
Handle a <field> node for a ManyToManyField
"""
- # Load the related model
- RelatedModel = self._get_model_from_node(node, "to")
-
- # Look up all the related objects. Using the in_bulk() lookup ensures
- # that missing related objects don't cause an exception
- related_ids = [c.getAttribute("pk").encode(self.encoding) for c in node.getElementsByTagName("object")]
- return RelatedModel._default_manager.in_bulk(related_ids).values()
+ return [field.rel.to._meta.pk.to_python(
+ c.getAttribute("pk").encode(self.encoding))
+ for c in node.getElementsByTagName("object")]
def _get_model_from_node(self, node, attr):
"""
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index a16b8b675a..9e603b42d4 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -208,15 +208,15 @@ def guess_scheme(environ):
else:
return 'http'
-_hoppish = {
+_hop_headers = {
'connection':1, 'keep-alive':1, 'proxy-authenticate':1,
'proxy-authorization':1, 'te':1, 'trailers':1, 'transfer-encoding':1,
'upgrade':1
-}.has_key
+}
def is_hop_by_hop(header_name):
"""Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header"""
- return _hoppish(header_name.lower())
+ return header_name.lower() in _hop_headers
class ServerHandler(object):
"""Manage the invocation of a WSGI application"""
@@ -309,7 +309,7 @@ class ServerHandler(object):
"""
if not self.result_is_file() and not self.sendfile():
for data in self.result:
- self.write(data)
+ self.write(data, False)
self.finish_content()
self.close()
@@ -334,7 +334,7 @@ class ServerHandler(object):
Subclasses can extend this to add other defaults.
"""
- if not self.headers.has_key('Content-Length'):
+ if 'Content-Length' not in self.headers:
self.set_content_length()
def start_response(self, status, headers,exc_info=None):
@@ -368,16 +368,16 @@ class ServerHandler(object):
if self.origin_server:
if self.client_is_modern():
self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
- if not self.headers.has_key('Date'):
+ if 'Date' not in self.headers:
self._write(
'Date: %s\r\n' % time.asctime(time.gmtime(time.time()))
)
- if self.server_software and not self.headers.has_key('Server'):
+ if self.server_software and 'Server' not in self.headers:
self._write('Server: %s\r\n' % self.server_software)
else:
self._write('Status: %s\r\n' % self.status)
- def write(self, data):
+ def write(self, data, flush=True):
"""'write()' callable as specified by PEP 333"""
assert type(data) is StringType,"write() argument must be string"
@@ -394,7 +394,8 @@ class ServerHandler(object):
# XXX check Content-Length and truncate if too many bytes written?
self._write(data)
- self._flush()
+ if flush:
+ self._flush()
def sendfile(self):
"""Platform-specific file transmission
@@ -421,8 +422,6 @@ class ServerHandler(object):
if not self.headers_sent:
self.headers['Content-Length'] = "0"
self.send_headers()
- else:
- pass # XXX check if content-length was too short?
def close(self):
try:
diff --git a/django/core/servers/fastcgi.py b/django/core/servers/fastcgi.py
index 649dd6942d..619758a0b1 100644
--- a/django/core/servers/fastcgi.py
+++ b/django/core/servers/fastcgi.py
@@ -1,5 +1,5 @@
"""
-FastCGI server that implements the WSGI protocol.
+FastCGI (or SCGI, or AJP1.3 ...) server that implements the WSGI protocol.
Uses the flup python package: http://www.saddi.com/software/flup/
@@ -18,15 +18,16 @@ __version__ = "0.1"
__all__ = ["runfastcgi"]
FASTCGI_HELP = r"""runfcgi:
- Run this project as a fastcgi application. To do this, the
- flup package from http://www.saddi.com/software/flup/ is
- required.
+ Run this project as a fastcgi (or some other protocol supported
+ by flup) application. To do this, the flup package from
+ http://www.saddi.com/software/flup/ is required.
Usage:
django-admin.py runfcgi --settings=yourproject.settings [fcgi settings]
manage.py runfcgi [fcgi settings]
Optional Fcgi settings: (setting=value)
+ protocol=PROTOCOL fcgi, scgi, ajp, ... (default fcgi)
host=HOSTNAME hostname to listen on..
port=PORTNUM port to listen on.
socket=FILE UNIX socket to listen on.
@@ -45,8 +46,8 @@ Examples:
(for webservers which spawn your processes for you)
$ manage.py runfcgi method=threaded
- Run a fastcgi server on a TCP host/port
- $ manage.py runfcgi method=prefork host=127.0.0.1 port=8025
+ Run a scgi server on a TCP host/port
+ $ manage.py runfcgi protocol=scgi method=prefork host=127.0.0.1 port=8025
Run a fastcgi server on a UNIX domain socket (posix platforms only)
$ manage.py runfcgi method=prefork socket=/tmp/fcgi.sock
@@ -58,6 +59,7 @@ Examples:
"""
FASTCGI_OPTIONS = {
+ 'protocol': 'fcgi',
'host': None,
'port': None,
'socket': None,
@@ -100,16 +102,17 @@ def runfastcgi(argset=[], **kwargs):
print >> sys.stderr, " installed flup, then make sure you have it in your PYTHONPATH."
return False
+ flup_module = 'server.' + options['protocol']
+
if options['method'] in ('prefork', 'fork'):
- from flup.server.fcgi_fork import WSGIServer
wsgi_opts = {
'maxSpare': int(options["maxspare"]),
'minSpare': int(options["minspare"]),
'maxChildren': int(options["maxchildren"]),
'maxRequests': int(options["maxrequests"]),
}
+ flup_module += '_fork'
elif options['method'] in ('thread', 'threaded'):
- from flup.server.fcgi import WSGIServer
wsgi_opts = {
'maxSpare': int(options["maxspare"]),
'minSpare': int(options["minspare"]),
@@ -120,6 +123,12 @@ def runfastcgi(argset=[], **kwargs):
wsgi_opts['debug'] = False # Turn off flup tracebacks
+ try:
+ WSGIServer = getattr(__import__('flup.' + flup_module, '', '', flup_module), 'WSGIServer')
+ except:
+ print "Can't import flup." + flup_module
+ return False
+
# Prep up and go
from django.core.handlers.wsgi import WSGIHandler
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index 93c9c30cca..38b3263da1 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -16,7 +16,7 @@ class Resolver404(Http404):
class NoReverseMatch(Exception):
# Don't make this raise an error when used in a template.
- silent_variable_failure = True
+ silent_variable_failure = True
def get_mod_func(callback):
# Converts 'django.views.news.stories.story_detail' to
@@ -88,7 +88,7 @@ class MatchChecker(object):
return str(value) # TODO: Unicode?
class RegexURLPattern(object):
- def __init__(self, regex, callback, default_args=None):
+ def __init__(self, regex, callback, default_args=None, name=None):
# regex is a string representing a regular expression.
# callback is either a string like 'foo.views.news.stories.story_detail'
# which represents the path to a module and a view function name, or a
@@ -100,6 +100,15 @@ class RegexURLPattern(object):
self._callback = None
self._callback_str = callback
self.default_args = default_args or {}
+ self.name = name
+
+ def add_prefix(self, prefix):
+ """
+ Adds the prefix string to a string-based callback.
+ """
+ if not prefix or not hasattr(self, '_callback_str'):
+ return
+ self._callback_str = prefix + '.' + self._callback_str
def resolve(self, path):
match = self.regex.search(path)
@@ -110,7 +119,7 @@ class RegexURLPattern(object):
kwargs = match.groupdict()
if kwargs:
args = ()
- if not kwargs:
+ else:
args = match.groups()
# In both cases, pass any extra_kwargs as **kwargs.
kwargs.update(self.default_args)
@@ -205,14 +214,15 @@ class RegexURLResolver(object):
try:
lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
except (ImportError, AttributeError):
- raise NoReverseMatch
+ if func_name != '':
+ raise NoReverseMatch
for pattern in self.urlconf_module.urlpatterns:
if isinstance(pattern, RegexURLResolver):
try:
return pattern.reverse_helper(lookup_view, *args, **kwargs)
except NoReverseMatch:
continue
- elif pattern.callback == lookup_view:
+ elif pattern.callback == lookup_view or pattern.name == lookup_view:
try:
return pattern.reverse_helper(*args, **kwargs)
except NoReverseMatch:
diff --git a/django/core/validators.py b/django/core/validators.py
index a2f3dc3bc3..293f0e1a8c 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -25,6 +25,7 @@ email_re = re.compile(
r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom
r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain
+decimal_re = re.compile(r'^-?(?P<digits>\d+)(\.(?P<decimals>\d+))?$')
integer_re = re.compile(r'^-?\d+$')
ip4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
phone_re = re.compile(r'^[A-PR-Y0-9]{3}-[A-PR-Y0-9]{3}-[A-PR-Y0-9]{4}$', re.IGNORECASE)
@@ -140,7 +141,8 @@ def _isValidDate(date_string):
try:
date(year, month, day)
except ValueError, e:
- raise ValidationError, gettext('Invalid date: %s.' % e)
+ msg = gettext('Invalid date: %s') % gettext(str(e))
+ raise ValidationError, msg
def isValidANSIDate(field_data, all_data):
if not ansi_date_re.search(field_data):
@@ -283,7 +285,7 @@ class ValidateIfOtherFieldEquals(object):
self.always_test = True
def __call__(self, field_data, all_data):
- if all_data.has_key(self.other_field) and all_data[self.other_field] == self.other_value:
+ if self.other_field in all_data and all_data[self.other_field] == self.other_value:
for v in self.validator_list:
v(field_data, all_data)
@@ -312,27 +314,29 @@ class RequiredIfOtherFieldGiven(RequiredIfOtherFieldsGiven):
RequiredIfOtherFieldsGiven.__init__(self, [other_field_name], error_message)
class RequiredIfOtherFieldEquals(object):
- def __init__(self, other_field, other_value, error_message=None):
+ def __init__(self, other_field, other_value, error_message=None, other_label=None):
self.other_field = other_field
self.other_value = other_value
+ other_label = other_label or other_value
self.error_message = error_message or lazy_inter(gettext_lazy("This field must be given if %(field)s is %(value)s"), {
- 'field': other_field, 'value': other_value})
+ 'field': other_field, 'value': other_label})
self.always_test = True
def __call__(self, field_data, all_data):
- if all_data.has_key(self.other_field) and all_data[self.other_field] == self.other_value and not field_data:
+ if self.other_field in all_data and all_data[self.other_field] == self.other_value and not field_data:
raise ValidationError(self.error_message)
class RequiredIfOtherFieldDoesNotEqual(object):
- def __init__(self, other_field, other_value, error_message=None):
+ def __init__(self, other_field, other_value, other_label=None, error_message=None):
self.other_field = other_field
self.other_value = other_value
+ other_label = other_label or other_value
self.error_message = error_message or lazy_inter(gettext_lazy("This field must be given if %(field)s is not %(value)s"), {
- 'field': other_field, 'value': other_value})
+ 'field': other_field, 'value': other_label})
self.always_test = True
def __call__(self, field_data, all_data):
- if all_data.has_key(self.other_field) and all_data[self.other_field] != self.other_value and not field_data:
+ if self.other_field in all_data and all_data[self.other_field] != self.other_value and not field_data:
raise ValidationError(self.error_message)
class IsLessThanOtherField(object):
@@ -361,7 +365,7 @@ class NumberIsInRange(object):
self.lower, self.upper = lower, upper
if not error_message:
if lower and upper:
- self.error_message = gettext("This value must be between %s and %s.") % (lower, upper)
+ self.error_message = gettext("This value must be between %(lower)s and %(upper)s.") % {'lower': lower, 'upper': upper}
elif lower:
self.error_message = gettext("This value must be at least %s.") % lower
elif upper:
@@ -403,28 +407,35 @@ class IsAPowerOf(object):
if val != int(val):
raise ValidationError, gettext("This value must be a power of %s.") % self.power_of
-class IsValidFloat(object):
+class IsValidDecimal(object):
def __init__(self, max_digits, decimal_places):
self.max_digits, self.decimal_places = max_digits, decimal_places
def __call__(self, field_data, all_data):
- data = str(field_data)
- try:
- float(data)
- except ValueError:
+ match = decimal_re.search(str(field_data))
+ if not match:
raise ValidationError, gettext("Please enter a valid decimal number.")
- # Negative floats require more space to input.
- max_allowed_length = data.startswith('-') and (self.max_digits + 2) or (self.max_digits + 1)
- if len(data) > max_allowed_length:
+
+ digits = len(match.group('digits') or '')
+ decimals = len(match.group('decimals') or '')
+
+ if digits + decimals > self.max_digits:
raise ValidationError, ngettext("Please enter a valid decimal number with at most %s total digit.",
"Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
- if (not '.' in data and len(data) > (max_allowed_length - self.decimal_places - 1)) or ('.' in data and len(data) > (max_allowed_length - (self.decimal_places - len(data.split('.')[1])))):
+ if digits > (self.max_digits - self.decimal_places):
raise ValidationError, ngettext( "Please enter a valid decimal number with a whole part of at most %s digit.",
"Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places)
- if '.' in data and len(data.split('.')[1]) > self.decimal_places:
+ if decimals > self.decimal_places:
raise ValidationError, ngettext("Please enter a valid decimal number with at most %s decimal place.",
"Please enter a valid decimal number with at most %s decimal places.", self.decimal_places) % self.decimal_places
+def isValidFloat(field_data, all_data):
+ data = str(field_data)
+ try:
+ float(data)
+ except ValueError:
+ raise ValidationError, gettext("Please enter a valid floating point number.")
+
class HasAllowableSize(object):
"""
Checks that the file-upload field data is a certain size. min_size and
diff --git a/django/db/__init__.py b/django/db/__init__.py
index 4176b5aa79..33223d200a 100644
--- a/django/db/__init__.py
+++ b/django/db/__init__.py
@@ -2,7 +2,7 @@ from django.conf import settings
from django.core import signals
from django.dispatch import dispatcher
-__all__ = ('backend', 'connection', 'DatabaseError')
+__all__ = ('backend', 'connection', 'DatabaseError', 'IntegrityError')
if not settings.DATABASE_ENGINE:
settings.DATABASE_ENGINE = 'dummy'
@@ -29,6 +29,7 @@ runshell = lambda: __import__('django.db.backends.%s.client' % settings.DATABASE
connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)
DatabaseError = backend.DatabaseError
+IntegrityError = backend.IntegrityError
# Register an event that closes the database connection
# when a Django request is finished.
diff --git a/django/db/backends/ado_mssql/base.py b/django/db/backends/ado_mssql/base.py
index 72d2fe083e..52363ed705 100644
--- a/django/db/backends/ado_mssql/base.py
+++ b/django/db/backends/ado_mssql/base.py
@@ -17,6 +17,7 @@ except ImportError:
mx = None
DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
# We need to use a special Cursor class because adodbapi expects question-mark
# param style, but Django expects "%s". This cursor converts question marks to
@@ -76,10 +77,11 @@ class DatabaseWrapper(local):
return cursor
def _commit(self):
- return self.connection.commit()
+ if self.connection is not None:
+ return self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
return self.connection.rollback()
def close(self):
@@ -125,6 +127,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "RAND()"
+def get_deferrable_sql():
+ return " DEFERRABLE INITIALLY DEFERRED"
+
def get_fulltext_search_sql(field_name):
raise NotImplementedError
@@ -134,6 +139,24 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "DEFAULT"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+ """
+ # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+ # TODO - SQL not actually tested against ADO MSSQL yet!
+ # TODO - autoincrement indices reset required? See other get_sql_flush() implementations
+ sql_list = ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables]
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ # No sequence reset required
+ return []
+
OPERATOR_MAPPING = {
'exact': '= %s',
'iexact': 'LIKE %s',
diff --git a/django/db/backends/ado_mssql/creation.py b/django/db/backends/ado_mssql/creation.py
index 4d85d27ea5..a1098ea43e 100644
--- a/django/db/backends/ado_mssql/creation.py
+++ b/django/db/backends/ado_mssql/creation.py
@@ -5,9 +5,10 @@ DATA_TYPES = {
'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
'DateField': 'smalldatetime',
'DateTimeField': 'smalldatetime',
+ 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'FileField': 'varchar(100)',
'FilePathField': 'varchar(100)',
- 'FloatField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'FloatField': 'double precision',
'ImageField': 'varchar(100)',
'IntegerField': 'int',
'IPAddressField': 'char(15)',
@@ -21,6 +22,5 @@ DATA_TYPES = {
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
- 'URLField': 'varchar(200)',
'USStateField': 'varchar(2)',
}
diff --git a/django/db/backends/dummy/base.py b/django/db/backends/dummy/base.py
index f98afc48bb..d0ec897407 100644
--- a/django/db/backends/dummy/base.py
+++ b/django/db/backends/dummy/base.py
@@ -12,13 +12,19 @@ from django.core.exceptions import ImproperlyConfigured
def complain(*args, **kwargs):
raise ImproperlyConfigured, "You haven't set the DATABASE_ENGINE setting yet."
+def ignore(*args, **kwargs):
+ pass
+
class DatabaseError(Exception):
pass
+class IntegrityError(DatabaseError):
+ pass
+
class DatabaseWrapper:
cursor = complain
_commit = complain
- _rollback = complain
+ _rollback = ignore
def __init__(self, **kwargs):
pass
@@ -36,6 +42,10 @@ get_date_extract_sql = complain
get_date_trunc_sql = complain
get_limit_offset_sql = complain
get_random_function_sql = complain
+get_deferrable_sql = complain
get_fulltext_search_sql = complain
get_drop_foreignkey_sql = complain
+get_sql_flush = complain
+get_sql_sequence_reset = complain
+
OPERATOR_MAPPING = {}
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index e7e060e6c2..d4cb1fa964 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -10,19 +10,34 @@ try:
except ImportError, e:
from django.core.exceptions import ImproperlyConfigured
raise ImproperlyConfigured, "Error loading MySQLdb module: %s" % e
+
+# We want version (1, 2, 1, 'final', 2) or later. We can't just use
+# lexicographic ordering in this check because then (1, 2, 1, 'gamma')
+# inadvertently passes the version test.
+version = Database.version_info
+if (version < (1,2,1) or (version[:3] == (1, 2, 1) and
+ (len(version) < 5 or version[3] != 'final' or version[4] < 2))):
+ raise ImportError, "MySQLdb-1.2.1p2 or newer is required; you have %s" % Database.__version__
+
from MySQLdb.converters import conversions
from MySQLdb.constants import FIELD_TYPE
import types
import re
DatabaseError = Database.DatabaseError
-
+IntegrityError = Database.IntegrityError
+
+# MySQLdb-1.2.1 supports the Python boolean type, and only uses datetime
+# module for time-related columns; older versions could have used mx.DateTime
+# or strings if there were no datetime module. However, MySQLdb still returns
+# TIME columns as timedelta -- they are more like timedelta in terms of actual
+# behavior as they are signed and include days -- and Django expects time, so
+# we still need to override that.
django_conversions = conversions.copy()
django_conversions.update({
- types.BooleanType: util.rev_typecast_boolean,
- FIELD_TYPE.DATETIME: util.typecast_timestamp,
- FIELD_TYPE.DATE: util.typecast_date,
FIELD_TYPE.TIME: util.typecast_time,
+ FIELD_TYPE.DECIMAL: util.typecast_decimal,
+ FIELD_TYPE.NEWDECIMAL: util.typecast_decimal,
})
# This should match the numerical portion of the version numbers (we can treat
@@ -31,31 +46,12 @@ django_conversions.update({
# http://dev.mysql.com/doc/refman/5.0/en/news.html .
server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
-# This is an extra debug layer over MySQL queries, to display warnings.
-# It's only used when DEBUG=True.
-class MysqlDebugWrapper:
- def __init__(self, cursor):
- self.cursor = cursor
-
- def execute(self, sql, params=()):
- try:
- return self.cursor.execute(sql, params)
- except Database.Warning, w:
- self.cursor.execute("SHOW WARNINGS")
- raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
-
- def executemany(self, sql, param_list):
- try:
- return self.cursor.executemany(sql, param_list)
- except Database.Warning, w:
- self.cursor.execute("SHOW WARNINGS")
- raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
-
- def __getattr__(self, attr):
- if self.__dict__.has_key(attr):
- return self.__dict__[attr]
- else:
- return getattr(self.cursor, attr)
+# MySQLdb-1.2.1 and newer automatically makes use of SHOW WARNINGS on
+# MySQL-4.1 and newer, so the MysqlDebugWrapper is unnecessary. Since the
+# point is to raise Warnings as exceptions, this can be done with the Python
+# warning module, and this is setup when the connection is created, and the
+# standard util.CursorDebugWrapper can be used. Also, using sql_mode
+# TRADITIONAL will automatically cause most warnings to be treated as errors.
try:
# Only exists in Python 2.4+
@@ -83,33 +79,41 @@ class DatabaseWrapper(local):
def cursor(self):
from django.conf import settings
+ from warnings import filterwarnings
if not self._valid_connection():
kwargs = {
- 'user': settings.DATABASE_USER,
- 'db': settings.DATABASE_NAME,
- 'passwd': settings.DATABASE_PASSWORD,
'conv': django_conversions,
+ 'charset': 'utf8',
+ 'use_unicode': False,
}
+ if settings.DATABASE_USER:
+ kwargs['user'] = settings.DATABASE_USER
+ if settings.DATABASE_NAME:
+ kwargs['db'] = settings.DATABASE_NAME
+ if settings.DATABASE_PASSWORD:
+ kwargs['passwd'] = settings.DATABASE_PASSWORD
if settings.DATABASE_HOST.startswith('/'):
kwargs['unix_socket'] = settings.DATABASE_HOST
- else:
+ elif settings.DATABASE_HOST:
kwargs['host'] = settings.DATABASE_HOST
if settings.DATABASE_PORT:
kwargs['port'] = int(settings.DATABASE_PORT)
kwargs.update(self.options)
self.connection = Database.connect(**kwargs)
- cursor = self.connection.cursor()
- if self.connection.get_server_info() >= '4.1':
- cursor.execute("SET NAMES 'utf8'")
+ cursor = self.connection.cursor()
+ else:
+ cursor = self.connection.cursor()
if settings.DEBUG:
- return util.CursorDebugWrapper(MysqlDebugWrapper(cursor), self)
+ filterwarnings("error", category=Database.Warning)
+ return util.CursorDebugWrapper(cursor, self)
return cursor
def _commit(self):
- self.connection.commit()
+ if self.connection is not None:
+ self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
try:
self.connection.rollback()
except Database.NotSupportedError:
@@ -172,6 +176,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "RAND()"
+def get_deferrable_sql():
+ return ""
+
def get_fulltext_search_sql(field_name):
return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
@@ -181,6 +188,41 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "DEFAULT"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+
+ """
+ # NB: The generated SQL below is specific to MySQL
+ # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+ # to clear all tables of all data
+ if tables:
+ sql = ['SET FOREIGN_KEY_CHECKS = 0;'] + \
+ ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables] + \
+ ['SET FOREIGN_KEY_CHECKS = 1;']
+
+ # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements
+ # to reset sequence indices
+ sql.extend(["%s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('TABLE'),
+ style.SQL_TABLE(quote_name(sequence['table'])),
+ style.SQL_KEYWORD('AUTO_INCREMENT'),
+ style.SQL_FIELD('= 1'),
+ ) for sequence in sequences])
+ return sql
+ else:
+ return []
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ # No sequence reset required
+ return []
+
OPERATOR_MAPPING = {
'exact': '= %s',
'iexact': 'LIKE %s',
diff --git a/django/db/backends/mysql/client.py b/django/db/backends/mysql/client.py
index f9d6297b8e..116074a9ce 100644
--- a/django/db/backends/mysql/client.py
+++ b/django/db/backends/mysql/client.py
@@ -3,12 +3,25 @@ import os
def runshell():
args = ['']
- args += ["--user=%s" % settings.DATABASE_USER]
- if settings.DATABASE_PASSWORD:
- args += ["--password=%s" % settings.DATABASE_PASSWORD]
- if settings.DATABASE_HOST:
- args += ["--host=%s" % settings.DATABASE_HOST]
- if settings.DATABASE_PORT:
- args += ["--port=%s" % settings.DATABASE_PORT]
- args += [settings.DATABASE_NAME]
+ db = settings.DATABASE_OPTIONS.get('db', settings.DATABASE_NAME)
+ user = settings.DATABASE_OPTIONS.get('user', settings.DATABASE_USER)
+ passwd = settings.DATABASE_OPTIONS.get('passwd', settings.DATABASE_PASSWORD)
+ host = settings.DATABASE_OPTIONS.get('host', settings.DATABASE_HOST)
+ port = settings.DATABASE_OPTIONS.get('port', settings.DATABASE_PORT)
+ defaults_file = settings.DATABASE_OPTIONS.get('read_default_file')
+ # Seems to be no good way to set sql_mode with CLI
+
+ if defaults_file:
+ args += ["--defaults-file=%s" % defaults_file]
+ if user:
+ args += ["--user=%s" % user]
+ if passwd:
+ args += ["--password=%s" % passwd]
+ if host:
+ args += ["--host=%s" % host]
+ if port:
+ args += ["--port=%s" % port]
+ if db:
+ args += [db]
+
os.execvp('mysql', args)
diff --git a/django/db/backends/mysql/creation.py b/django/db/backends/mysql/creation.py
index 116b490124..1b23fbff6e 100644
--- a/django/db/backends/mysql/creation.py
+++ b/django/db/backends/mysql/creation.py
@@ -9,9 +9,10 @@ DATA_TYPES = {
'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
+ 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'FileField': 'varchar(100)',
'FilePathField': 'varchar(100)',
- 'FloatField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'FloatField': 'double precision',
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
@@ -25,6 +26,5 @@ DATA_TYPES = {
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
- 'URLField': 'varchar(200)',
'USStateField': 'varchar(2)',
}
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 7829457fa9..39733311c5 100644
--- a/django/db/backends/mysql/introspection.py
+++ b/django/db/backends/mysql/introspection.py
@@ -76,7 +76,7 @@ def get_indexes(cursor, table_name):
DATA_TYPES_REVERSE = {
FIELD_TYPE.BLOB: 'TextField',
FIELD_TYPE.CHAR: 'CharField',
- FIELD_TYPE.DECIMAL: 'FloatField',
+ FIELD_TYPE.DECIMAL: 'DecimalField',
FIELD_TYPE.DATE: 'DateField',
FIELD_TYPE.DATETIME: 'DateTimeField',
FIELD_TYPE.DOUBLE: 'FloatField',
@@ -85,7 +85,7 @@ DATA_TYPES_REVERSE = {
FIELD_TYPE.LONG: 'IntegerField',
FIELD_TYPE.LONGLONG: 'IntegerField',
FIELD_TYPE.SHORT: 'IntegerField',
- FIELD_TYPE.STRING: 'TextField',
+ FIELD_TYPE.STRING: 'CharField',
FIELD_TYPE.TIMESTAMP: 'DateTimeField',
FIELD_TYPE.TINY: 'IntegerField',
FIELD_TYPE.TINY_BLOB: 'TextField',
diff --git a/django/db/backends/mysql_old/__init__.py b/django/db/backends/mysql_old/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/db/backends/mysql_old/__init__.py
diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py
new file mode 100644
index 0000000000..ac3b75efde
--- /dev/null
+++ b/django/db/backends/mysql_old/base.py
@@ -0,0 +1,240 @@
+"""
+MySQL database backend for Django.
+
+Requires MySQLdb: http://sourceforge.net/projects/mysql-python
+"""
+
+from django.db.backends import util
+try:
+ import MySQLdb as Database
+except ImportError, e:
+ from django.core.exceptions import ImproperlyConfigured
+ raise ImproperlyConfigured, "Error loading MySQLdb module: %s" % e
+from MySQLdb.converters import conversions
+from MySQLdb.constants import FIELD_TYPE
+import types
+import re
+
+DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
+
+django_conversions = conversions.copy()
+django_conversions.update({
+ types.BooleanType: util.rev_typecast_boolean,
+ FIELD_TYPE.DATETIME: util.typecast_timestamp,
+ FIELD_TYPE.DATE: util.typecast_date,
+ FIELD_TYPE.TIME: util.typecast_time,
+ FIELD_TYPE.DECIMAL: util.typecast_decimal,
+})
+
+# This should match the numerical portion of the version numbers (we can treat
+# versions like 5.0.24 and 5.0.24a as the same). Based on the list of version
+# at http://dev.mysql.com/doc/refman/4.1/en/news.html and
+# http://dev.mysql.com/doc/refman/5.0/en/news.html .
+server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
+
+# This is an extra debug layer over MySQL queries, to display warnings.
+# It's only used when DEBUG=True.
+class MysqlDebugWrapper:
+ def __init__(self, cursor):
+ self.cursor = cursor
+
+ def execute(self, sql, params=()):
+ try:
+ return self.cursor.execute(sql, params)
+ except Database.Warning, w:
+ self.cursor.execute("SHOW WARNINGS")
+ raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+ def executemany(self, sql, param_list):
+ try:
+ return self.cursor.executemany(sql, param_list)
+ except Database.Warning, w:
+ self.cursor.execute("SHOW WARNINGS")
+ raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+ def __getattr__(self, attr):
+ if attr in self.__dict__:
+ return self.__dict__[attr]
+ else:
+ return getattr(self.cursor, attr)
+
+try:
+ # Only exists in Python 2.4+
+ from threading import local
+except ImportError:
+ # Import copy of _thread_local.py from Python 2.4
+ from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+ def __init__(self, **kwargs):
+ self.connection = None
+ self.queries = []
+ self.server_version = None
+ self.options = kwargs
+
+ def _valid_connection(self):
+ if self.connection is not None:
+ try:
+ self.connection.ping()
+ return True
+ except DatabaseError:
+ self.connection.close()
+ self.connection = None
+ return False
+
+ def cursor(self):
+ from django.conf import settings
+ if not self._valid_connection():
+ kwargs = {
+ 'user': settings.DATABASE_USER,
+ 'db': settings.DATABASE_NAME,
+ 'passwd': settings.DATABASE_PASSWORD,
+ 'conv': django_conversions,
+ }
+ if settings.DATABASE_HOST.startswith('/'):
+ kwargs['unix_socket'] = settings.DATABASE_HOST
+ else:
+ kwargs['host'] = settings.DATABASE_HOST
+ if settings.DATABASE_PORT:
+ kwargs['port'] = int(settings.DATABASE_PORT)
+ kwargs.update(self.options)
+ self.connection = Database.connect(**kwargs)
+ cursor = self.connection.cursor()
+ if self.connection.get_server_info() >= '4.1':
+ cursor.execute("SET NAMES 'utf8'")
+ else:
+ cursor = self.connection.cursor()
+ if settings.DEBUG:
+ return util.CursorDebugWrapper(MysqlDebugWrapper(cursor), self)
+ return cursor
+
+ def _commit(self):
+ if self.connection is not None:
+ self.connection.commit()
+
+ def _rollback(self):
+ if self.connection is not None:
+ try:
+ self.connection.rollback()
+ except Database.NotSupportedError:
+ pass
+
+ def close(self):
+ if self.connection is not None:
+ self.connection.close()
+ self.connection = None
+
+ def get_server_version(self):
+ if not self.server_version:
+ if not self._valid_connection():
+ self.cursor()
+ m = server_version_re.match(self.connection.get_server_info())
+ if not m:
+ raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
+ self.server_version = tuple([int(x) for x in m.groups()])
+ return self.server_version
+
+supports_constraints = True
+
+def quote_name(name):
+ if name.startswith("`") and name.endswith("`"):
+ return name # Quoting once is enough.
+ return "`%s`" % name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+ return cursor.lastrowid
+
+def get_date_extract_sql(lookup_type, table_name):
+ # lookup_type is 'year', 'month', 'day'
+ # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
+ return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+ # lookup_type is 'year', 'month', 'day'
+ fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
+ format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape.
+ format_def = ('0000-', '01', '-01', ' 00:', '00', ':00')
+ try:
+ i = fields.index(lookup_type) + 1
+ except ValueError:
+ sql = field_name
+ else:
+ format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]])
+ sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
+ return sql
+
+def get_limit_offset_sql(limit, offset=None):
+ sql = "LIMIT "
+ if offset and offset != 0:
+ sql += "%s," % offset
+ return sql + str(limit)
+
+def get_random_function_sql():
+ return "RAND()"
+
+def get_deferrable_sql():
+ return ""
+
+def get_fulltext_search_sql(field_name):
+ return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
+
+def get_drop_foreignkey_sql():
+ return "DROP FOREIGN KEY"
+
+def get_pk_default_value():
+ return "DEFAULT"
+
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+
+ """
+ # NB: The generated SQL below is specific to MySQL
+ # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+ # to clear all tables of all data
+ if tables:
+ sql = ['SET FOREIGN_KEY_CHECKS = 0;'] + \
+ ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables] + \
+ ['SET FOREIGN_KEY_CHECKS = 1;']
+
+ # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements
+ # to reset sequence indices
+ sql.extend(["%s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('TABLE'),
+ style.SQL_TABLE(quote_name(sequence['table'])),
+ style.SQL_KEYWORD('AUTO_INCREMENT'),
+ style.SQL_FIELD('= 1'),
+ ) for sequence in sequences])
+ return sql
+ else:
+ return []
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ # No sequence reset required
+ return []
+
+OPERATOR_MAPPING = {
+ 'exact': '= %s',
+ 'iexact': 'LIKE %s',
+ 'contains': 'LIKE BINARY %s',
+ 'icontains': 'LIKE %s',
+ 'gt': '> %s',
+ 'gte': '>= %s',
+ 'lt': '< %s',
+ 'lte': '<= %s',
+ 'startswith': 'LIKE BINARY %s',
+ 'endswith': 'LIKE BINARY %s',
+ 'istartswith': 'LIKE %s',
+ 'iendswith': 'LIKE %s',
+}
diff --git a/django/db/backends/mysql_old/client.py b/django/db/backends/mysql_old/client.py
new file mode 100644
index 0000000000..f9d6297b8e
--- /dev/null
+++ b/django/db/backends/mysql_old/client.py
@@ -0,0 +1,14 @@
+from django.conf import settings
+import os
+
+def runshell():
+ args = ['']
+ args += ["--user=%s" % settings.DATABASE_USER]
+ if settings.DATABASE_PASSWORD:
+ args += ["--password=%s" % settings.DATABASE_PASSWORD]
+ if settings.DATABASE_HOST:
+ args += ["--host=%s" % settings.DATABASE_HOST]
+ if settings.DATABASE_PORT:
+ args += ["--port=%s" % settings.DATABASE_PORT]
+ args += [settings.DATABASE_NAME]
+ os.execvp('mysql', args)
diff --git a/django/db/backends/mysql_old/creation.py b/django/db/backends/mysql_old/creation.py
new file mode 100644
index 0000000000..1b23fbff6e
--- /dev/null
+++ b/django/db/backends/mysql_old/creation.py
@@ -0,0 +1,30 @@
+# This dictionary maps Field objects to their associated MySQL column
+# types, as strings. Column-type strings can contain format strings; they'll
+# be interpolated against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPES = {
+ 'AutoField': 'integer AUTO_INCREMENT',
+ 'BooleanField': 'bool',
+ 'CharField': 'varchar(%(maxlength)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'DateField': 'date',
+ 'DateTimeField': 'datetime',
+ 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'FileField': 'varchar(100)',
+ 'FilePathField': 'varchar(100)',
+ 'FloatField': 'double precision',
+ 'ImageField': 'varchar(100)',
+ 'IntegerField': 'integer',
+ 'IPAddressField': 'char(15)',
+ 'ManyToManyField': None,
+ 'NullBooleanField': 'bool',
+ 'OneToOneField': 'integer',
+ 'PhoneNumberField': 'varchar(20)',
+ 'PositiveIntegerField': 'integer UNSIGNED',
+ 'PositiveSmallIntegerField': 'smallint UNSIGNED',
+ 'SlugField': 'varchar(%(maxlength)s)',
+ 'SmallIntegerField': 'smallint',
+ 'TextField': 'longtext',
+ 'TimeField': 'time',
+ 'USStateField': 'varchar(2)',
+}
diff --git a/django/db/backends/mysql_old/introspection.py b/django/db/backends/mysql_old/introspection.py
new file mode 100644
index 0000000000..cb5b8320d9
--- /dev/null
+++ b/django/db/backends/mysql_old/introspection.py
@@ -0,0 +1,95 @@
+from django.db.backends.mysql_old.base import quote_name
+from MySQLdb import ProgrammingError, OperationalError
+from MySQLdb.constants import FIELD_TYPE
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+def get_table_list(cursor):
+ "Returns a list of table names in the current database."
+ cursor.execute("SHOW TABLES")
+ return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+ "Returns a description of the table, with the DB-API cursor.description interface."
+ cursor.execute("SELECT * FROM %s LIMIT 1" % quote_name(table_name))
+ return cursor.description
+
+def _name_to_index(cursor, table_name):
+ """
+ Returns a dictionary of {field_name: field_index} for the given table.
+ Indexes are 0-based.
+ """
+ return dict([(d[0], i) for i, d in enumerate(get_table_description(cursor, table_name))])
+
+def get_relations(cursor, table_name):
+ """
+ Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+ representing all relationships to the given table. Indexes are 0-based.
+ """
+ my_field_dict = _name_to_index(cursor, table_name)
+ constraints = []
+ relations = {}
+ try:
+ # This should work for MySQL 5.0.
+ cursor.execute("""
+ SELECT column_name, referenced_table_name, referenced_column_name
+ FROM information_schema.key_column_usage
+ WHERE table_name = %s
+ AND table_schema = DATABASE()
+ AND referenced_table_name IS NOT NULL
+ AND referenced_column_name IS NOT NULL""", [table_name])
+ constraints.extend(cursor.fetchall())
+ except (ProgrammingError, OperationalError):
+ # Fall back to "SHOW CREATE TABLE", for previous MySQL versions.
+ # Go through all constraints and save the equal matches.
+ cursor.execute("SHOW CREATE TABLE %s" % quote_name(table_name))
+ for row in cursor.fetchall():
+ pos = 0
+ while True:
+ match = foreign_key_re.search(row[1], pos)
+ if match == None:
+ break
+ pos = match.end()
+ constraints.append(match.groups())
+
+ for my_fieldname, other_table, other_field in constraints:
+ other_field_index = _name_to_index(cursor, other_table)[other_field]
+ my_field_index = my_field_dict[my_fieldname]
+ relations[my_field_index] = (other_field_index, other_table)
+
+ return relations
+
+def get_indexes(cursor, table_name):
+ """
+ Returns a dictionary of fieldname -> infodict for the given table,
+ where each infodict is in the format:
+ {'primary_key': boolean representing whether it's the primary key,
+ 'unique': boolean representing whether it's a unique index}
+ """
+ cursor.execute("SHOW INDEX FROM %s" % quote_name(table_name))
+ indexes = {}
+ for row in cursor.fetchall():
+ indexes[row[4]] = {'primary_key': (row[2] == 'PRIMARY'), 'unique': not bool(row[1])}
+ return indexes
+
+DATA_TYPES_REVERSE = {
+ FIELD_TYPE.BLOB: 'TextField',
+ FIELD_TYPE.CHAR: 'CharField',
+ FIELD_TYPE.DECIMAL: 'DecimalField',
+ FIELD_TYPE.DATE: 'DateField',
+ FIELD_TYPE.DATETIME: 'DateTimeField',
+ FIELD_TYPE.DOUBLE: 'FloatField',
+ FIELD_TYPE.FLOAT: 'FloatField',
+ FIELD_TYPE.INT24: 'IntegerField',
+ FIELD_TYPE.LONG: 'IntegerField',
+ FIELD_TYPE.LONGLONG: 'IntegerField',
+ FIELD_TYPE.SHORT: 'IntegerField',
+ FIELD_TYPE.STRING: 'TextField',
+ FIELD_TYPE.TIMESTAMP: 'DateTimeField',
+ FIELD_TYPE.TINY: 'IntegerField',
+ FIELD_TYPE.TINY_BLOB: 'TextField',
+ FIELD_TYPE.MEDIUM_BLOB: 'TextField',
+ FIELD_TYPE.LONG_BLOB: 'TextField',
+ FIELD_TYPE.VAR_STRING: 'CharField',
+}
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index 3a13f39546..2bc88bb7b9 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -12,6 +12,7 @@ except ImportError, e:
raise ImproperlyConfigured, "Error loading cx_Oracle module: %s" % e
DatabaseError = Database.Error
+IntegrityError = Database.IntegrityError
try:
# Only exists in Python 2.4+
@@ -43,10 +44,11 @@ class DatabaseWrapper(local):
return FormatStylePlaceholderCursor(self.connection)
def _commit(self):
- self.connection.commit()
+ if self.connection is not None:
+ self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
try:
self.connection.rollback()
except Database.NotSupportedError:
@@ -108,6 +110,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "DBMS_RANDOM.RANDOM"
+def get_deferrable_sql():
+ return " DEFERRABLE INITIALLY DEFERRED"
+
def get_fulltext_search_sql(field_name):
raise NotImplementedError
@@ -117,6 +122,24 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "DEFAULT"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+ """
+ # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+ # TODO - SQL not actually tested against Oracle yet!
+ # TODO - autoincrement indices reset required? See other get_sql_flush() implementations
+ sql = ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables]
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ # No sequence reset required
+ return []
+
OPERATOR_MAPPING = {
'exact': '= %s',
'iexact': 'LIKE %s',
diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index d45ceb64f5..14a864ac28 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -5,9 +5,10 @@ DATA_TYPES = {
'CommaSeparatedIntegerField': 'varchar2(%(maxlength)s)',
'DateField': 'date',
'DateTimeField': 'date',
+ 'DecimalField': 'number(%(max_digits)s, %(decimal_places)s)',
'FileField': 'varchar2(100)',
'FilePathField': 'varchar2(100)',
- 'FloatField': 'number(%(max_digits)s, %(decimal_places)s)',
+ 'FloatField': 'double precision',
'ImageField': 'varchar2(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
@@ -21,6 +22,5 @@ DATA_TYPES = {
'SmallIntegerField': 'smallint',
'TextField': 'long',
'TimeField': 'timestamp',
- 'URLField': 'varchar(200)',
'USStateField': 'varchar(2)',
}
diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py
index ecc8f372a8..7634206178 100644
--- a/django/db/backends/oracle/introspection.py
+++ b/django/db/backends/oracle/introspection.py
@@ -46,5 +46,5 @@ DATA_TYPES_REVERSE = {
1114: 'DateTimeField',
1184: 'DateTimeField',
1266: 'TimeField',
- 1700: 'FloatField',
+ 1700: 'DecimalField',
}
diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py
index e44bc0b560..fedbb6b7f1 100644
--- a/django/db/backends/postgresql/base.py
+++ b/django/db/backends/postgresql/base.py
@@ -12,6 +12,7 @@ except ImportError, e:
raise ImproperlyConfigured, "Error loading psycopg module: %s" % e
DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
try:
# Only exists in Python 2.4+
@@ -20,6 +21,40 @@ except ImportError:
# Import copy of _thread_local.py from Python 2.4
from django.utils._threading_local import local
+def smart_basestring(s, charset):
+ if isinstance(s, unicode):
+ return s.encode(charset)
+ return s
+
+class UnicodeCursorWrapper(object):
+ """
+ A thin wrapper around psycopg cursors that allows them to accept Unicode
+ strings as params.
+
+ This is necessary because psycopg doesn't apply any DB quoting to
+ parameters that are Unicode strings. If a param is Unicode, this will
+ convert it to a bytestring using DEFAULT_CHARSET before passing it to
+ psycopg.
+ """
+ def __init__(self, cursor, charset):
+ self.cursor = cursor
+ self.charset = charset
+
+ def execute(self, sql, params=()):
+ return self.cursor.execute(sql, [smart_basestring(p, self.charset) for p in params])
+
+ def executemany(self, sql, param_list):
+ new_param_list = [tuple([smart_basestring(p, self.charset) for p in params]) for params in param_list]
+ return self.cursor.executemany(sql, new_param_list)
+
+ def __getattr__(self, attr):
+ if attr in self.__dict__:
+ return self.__dict__[attr]
+ else:
+ return getattr(self.cursor, attr)
+
+postgres_version = None
+
class DatabaseWrapper(local):
def __init__(self, **kwargs):
self.connection = None
@@ -28,7 +63,9 @@ class DatabaseWrapper(local):
def cursor(self):
from django.conf import settings
+ set_tz = False
if self.connection is None:
+ set_tz = True
if settings.DATABASE_NAME == '':
from django.core.exceptions import ImproperlyConfigured
raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
@@ -44,16 +81,23 @@ class DatabaseWrapper(local):
self.connection = Database.connect(conn_string, **self.options)
self.connection.set_isolation_level(1) # make transactions transparent to all cursors
cursor = self.connection.cursor()
- cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+ if set_tz:
+ cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+ cursor = UnicodeCursorWrapper(cursor, settings.DEFAULT_CHARSET)
+ global postgres_version
+ if not postgres_version:
+ cursor.execute("SELECT version()")
+ postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')]
if settings.DEBUG:
return util.CursorDebugWrapper(cursor, self)
return cursor
def _commit(self):
- return self.connection.commit()
+ if self.connection is not None:
+ return self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
return self.connection.rollback()
def close(self):
@@ -103,6 +147,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "RANDOM()"
+def get_deferrable_sql():
+ return " DEFERRABLE INITIALLY DEFERRED"
+
def get_fulltext_search_sql(field_name):
raise NotImplementedError
@@ -112,6 +159,91 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "DEFAULT"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+
+ """
+ if tables:
+ if postgres_version[0] >= 8 and postgres_version[1] >= 1:
+ # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to* in order to be able to
+ # truncate tables referenced by a foreign key in any other table. The result is a
+ # single SQL TRUNCATE statement.
+ sql = ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(', '.join([quote_name(table) for table in tables]))
+ )]
+ else:
+ # Older versions of Postgres can't do TRUNCATE in a single call, so they must use
+ # a simple delete.
+ sql = ['%s %s %s;' % \
+ (style.SQL_KEYWORD('DELETE'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables]
+
+ # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements
+ # to reset sequence indices
+ for sequence_info in sequences:
+ table_name = sequence_info['table']
+ column_name = sequence_info['column']
+ if column_name and len(column_name)>0:
+ # sequence name in this case will be <table>_<column>_seq
+ sql.append("%s %s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('SEQUENCE'),
+ style.SQL_FIELD(quote_name('%s_%s_seq' % (table_name, column_name))),
+ style.SQL_KEYWORD('RESTART'),
+ style.SQL_KEYWORD('WITH'),
+ style.SQL_FIELD('1')
+ )
+ )
+ else:
+ # sequence name in this case will be <table>_id_seq
+ sql.append("%s %s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('SEQUENCE'),
+ style.SQL_FIELD(quote_name('%s_id_seq' % table_name)),
+ style.SQL_KEYWORD('RESTART'),
+ style.SQL_KEYWORD('WITH'),
+ style.SQL_FIELD('1')
+ )
+ )
+ return sql
+ else:
+ return []
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ from django.db import models
+ output = []
+ for model in model_list:
+ # Use `coalesce` to set the sequence for each model to the max pk value if there are records,
+ # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
+ # if there are records (as the max pk value is already in use), otherwise set it to false.
+ for f in model._meta.fields:
+ if isinstance(f, models.AutoField):
+ output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+ (style.SQL_KEYWORD('SELECT'),
+ style.SQL_FIELD(quote_name('%s_%s_seq' % (model._meta.db_table, f.column))),
+ style.SQL_FIELD(quote_name(f.column)),
+ style.SQL_FIELD(quote_name(f.column)),
+ style.SQL_KEYWORD('IS NOT'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_TABLE(quote_name(model._meta.db_table))))
+ break # Only one AutoField is allowed per model, so don't bother continuing.
+ for f in model._meta.many_to_many:
+ output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+ (style.SQL_KEYWORD('SELECT'),
+ style.SQL_FIELD(quote_name('%s_id_seq' % f.m2m_db_table())),
+ style.SQL_FIELD(quote_name('id')),
+ style.SQL_FIELD(quote_name('id')),
+ style.SQL_KEYWORD('IS NOT'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_TABLE(f.m2m_db_table())))
+ return output
+
# Register these custom typecasts, because Django expects dates/times to be
# in Python's native (standard-library) datetime/time format, whereas psycopg
# use mx.DateTime by default.
@@ -122,6 +254,7 @@ except AttributeError:
Database.register_type(Database.new_type((1083,1266), "TIME", util.typecast_time))
Database.register_type(Database.new_type((1114,1184), "TIMESTAMP", util.typecast_timestamp))
Database.register_type(Database.new_type((16,), "BOOLEAN", util.typecast_boolean))
+Database.register_type(Database.new_type((1700,), "NUMERIC", util.typecast_decimal))
OPERATOR_MAPPING = {
'exact': '= %s',
diff --git a/django/db/backends/postgresql/creation.py b/django/db/backends/postgresql/creation.py
index 65a804ec40..4646b68ab8 100644
--- a/django/db/backends/postgresql/creation.py
+++ b/django/db/backends/postgresql/creation.py
@@ -9,9 +9,10 @@ DATA_TYPES = {
'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
'DateField': 'date',
'DateTimeField': 'timestamp with time zone',
+ 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'FileField': 'varchar(100)',
'FilePathField': 'varchar(100)',
- 'FloatField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'FloatField': 'double precision',
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'inet',
@@ -25,6 +26,5 @@ DATA_TYPES = {
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
- 'URLField': 'varchar(200)',
'USStateField': 'varchar(2)',
}
diff --git a/django/db/backends/postgresql/introspection.py b/django/db/backends/postgresql/introspection.py
index 6e1d60c4ff..2605490afd 100644
--- a/django/db/backends/postgresql/introspection.py
+++ b/django/db/backends/postgresql/introspection.py
@@ -72,6 +72,7 @@ DATA_TYPES_REVERSE = {
21: 'SmallIntegerField',
23: 'IntegerField',
25: 'TextField',
+ 701: 'FloatField',
869: 'IPAddressField',
1043: 'CharField',
1082: 'DateField',
@@ -79,5 +80,5 @@ DATA_TYPES_REVERSE = {
1114: 'DateTimeField',
1184: 'DateTimeField',
1266: 'TimeField',
- 1700: 'FloatField',
+ 1700: 'DecimalField',
}
diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py
index 04322332dc..d9ad363ac1 100644
--- a/django/db/backends/postgresql_psycopg2/base.py
+++ b/django/db/backends/postgresql_psycopg2/base.py
@@ -12,6 +12,7 @@ except ImportError, e:
raise ImproperlyConfigured, "Error loading psycopg2 module: %s" % e
DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
try:
# Only exists in Python 2.4+
@@ -20,6 +21,8 @@ except ImportError:
# Import copy of _thread_local.py from Python 2.4
from django.utils._threading_local import local
+postgres_version = None
+
class DatabaseWrapper(local):
def __init__(self, **kwargs):
self.connection = None
@@ -28,7 +31,9 @@ class DatabaseWrapper(local):
def cursor(self):
from django.conf import settings
+ set_tz = False
if self.connection is None:
+ set_tz = True
if settings.DATABASE_NAME == '':
from django.core.exceptions import ImproperlyConfigured
raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
@@ -45,16 +50,22 @@ class DatabaseWrapper(local):
self.connection.set_isolation_level(1) # make transactions transparent to all cursors
cursor = self.connection.cursor()
cursor.tzinfo_factory = None
- cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+ if set_tz:
+ cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+ global postgres_version
+ if not postgres_version:
+ cursor.execute("SELECT version()")
+ postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')]
if settings.DEBUG:
return util.CursorDebugWrapper(cursor, self)
return cursor
def _commit(self):
- return self.connection.commit()
+ if self.connection is not None:
+ return self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
return self.connection.rollback()
def close(self):
@@ -96,6 +107,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "RANDOM()"
+def get_deferrable_sql():
+ return " DEFERRABLE INITIALLY DEFERRED"
+
def get_fulltext_search_sql(field_name):
raise NotImplementedError
@@ -105,6 +119,88 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "DEFAULT"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+ """
+ if tables:
+ if postgres_version[0] >= 8 and postgres_version[1] >= 1:
+ # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to* in order to be able to
+ # truncate tables referenced by a foreign key in any other table. The result is a
+ # single SQL TRUNCATE statement
+ sql = ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(', '.join([quote_name(table) for table in tables]))
+ )]
+ else:
+ sql = ['%s %s %s;' % \
+ (style.SQL_KEYWORD('DELETE'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables]
+
+ # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements
+ # to reset sequence indices
+ for sequence in sequences:
+ table_name = sequence['table']
+ column_name = sequence['column']
+ if column_name and len(column_name) > 0:
+ # sequence name in this case will be <table>_<column>_seq
+ sql.append("%s %s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('SEQUENCE'),
+ style.SQL_FIELD(quote_name('%s_%s_seq' % (table_name, column_name))),
+ style.SQL_KEYWORD('RESTART'),
+ style.SQL_KEYWORD('WITH'),
+ style.SQL_FIELD('1')
+ )
+ )
+ else:
+ # sequence name in this case will be <table>_id_seq
+ sql.append("%s %s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('SEQUENCE'),
+ style.SQL_FIELD(quote_name('%s_id_seq' % table_name)),
+ style.SQL_KEYWORD('RESTART'),
+ style.SQL_KEYWORD('WITH'),
+ style.SQL_FIELD('1')
+ )
+ )
+ return sql
+ else:
+ return []
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ from django.db import models
+ output = []
+ for model in model_list:
+ # Use `coalesce` to set the sequence for each model to the max pk value if there are records,
+ # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
+ # if there are records (as the max pk value is already in use), otherwise set it to false.
+ for f in model._meta.fields:
+ if isinstance(f, models.AutoField):
+ output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+ (style.SQL_KEYWORD('SELECT'),
+ style.SQL_FIELD(quote_name('%s_%s_seq' % (model._meta.db_table, f.column))),
+ style.SQL_FIELD(quote_name(f.column)),
+ style.SQL_FIELD(quote_name(f.column)),
+ style.SQL_KEYWORD('IS NOT'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_TABLE(quote_name(model._meta.db_table))))
+ break # Only one AutoField is allowed per model, so don't bother continuing.
+ for f in model._meta.many_to_many:
+ output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+ (style.SQL_KEYWORD('SELECT'),
+ style.SQL_FIELD(quote_name('%s_id_seq' % f.m2m_db_table())),
+ style.SQL_FIELD(quote_name('id')),
+ style.SQL_FIELD(quote_name('id')),
+ style.SQL_KEYWORD('IS NOT'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_TABLE(f.m2m_db_table())))
+ return output
+
OPERATOR_MAPPING = {
'exact': '= %s',
'iexact': 'ILIKE %s',
diff --git a/django/db/backends/postgresql_psycopg2/introspection.py b/django/db/backends/postgresql_psycopg2/introspection.py
index a546da8c45..aa45fe7db7 100644
--- a/django/db/backends/postgresql_psycopg2/introspection.py
+++ b/django/db/backends/postgresql_psycopg2/introspection.py
@@ -72,6 +72,7 @@ DATA_TYPES_REVERSE = {
21: 'SmallIntegerField',
23: 'IntegerField',
25: 'TextField',
+ 701: 'FloatField',
869: 'IPAddressField',
1043: 'CharField',
1082: 'DateField',
@@ -79,5 +80,5 @@ DATA_TYPES_REVERSE = {
1114: 'DateTimeField',
1184: 'DateTimeField',
1266: 'TimeField',
- 1700: 'FloatField',
+ 1700: 'DecimalField',
}
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py
index 891320160f..5cd67a32f5 100644
--- a/django/db/backends/sqlite3/base.py
+++ b/django/db/backends/sqlite3/base.py
@@ -17,7 +17,13 @@ except ImportError, e:
module = 'sqlite3'
raise ImproperlyConfigured, "Error loading %s module: %s" % (module, e)
+try:
+ import decimal
+except ImportError:
+ from django.utils import _decimal as decimal # for Python 2.3
+
DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
Database.register_converter("bool", lambda s: str(s) == '1')
Database.register_converter("time", util.typecast_time)
@@ -25,6 +31,8 @@ Database.register_converter("date", util.typecast_date)
Database.register_converter("datetime", util.typecast_timestamp)
Database.register_converter("timestamp", util.typecast_timestamp)
Database.register_converter("TIMESTAMP", util.typecast_timestamp)
+Database.register_converter("decimal", util.typecast_decimal)
+Database.register_adapter(decimal.Decimal, util.rev_typecast_decimal)
def utf8rowFactory(cursor, row):
def utf8(s):
@@ -67,10 +75,11 @@ class DatabaseWrapper(local):
return cursor
def _commit(self):
- self.connection.commit()
+ if self.connection is not None:
+ self.connection.commit()
def _rollback(self):
- if self.connection:
+ if self.connection is not None:
self.connection.rollback()
def close(self):
@@ -139,6 +148,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql():
return "RANDOM()"
+def get_deferrable_sql():
+ return ""
+
def get_fulltext_search_sql(field_name):
raise NotImplementedError
@@ -148,6 +160,29 @@ def get_drop_foreignkey_sql():
def get_pk_default_value():
return "NULL"
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+
+ """
+ # NB: The generated SQL below is specific to SQLite
+ # Note: The DELETE FROM... SQL generated below works for SQLite databases
+ # because constraints don't exist
+ sql = ['%s %s %s;' % \
+ (style.SQL_KEYWORD('DELETE'),
+ style.SQL_KEYWORD('FROM'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables]
+ # Note: No requirement for reset of auto-incremented indices (cf. other
+ # get_sql_flush() implementations). Just return SQL at this point
+ return sql
+
+def get_sql_sequence_reset(style, model_list):
+ "Returns a list of the SQL statements to reset sequences for the given models."
+ # No sequence reset required
+ return []
+
def _sqlite_date_trunc(lookup_type, dt):
try:
dt = util.typecast_timestamp(dt)
diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py
index e845179e64..e63046ab7d 100644
--- a/django/db/backends/sqlite3/creation.py
+++ b/django/db/backends/sqlite3/creation.py
@@ -8,9 +8,10 @@ DATA_TYPES = {
'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
+ 'DecimalField': 'decimal',
'FileField': 'varchar(100)',
'FilePathField': 'varchar(100)',
- 'FloatField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'FloatField': 'real',
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
@@ -24,6 +25,5 @@ DATA_TYPES = {
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
- 'URLField': 'varchar(200)',
'USStateField': 'varchar(2)',
}
diff --git a/django/db/backends/util.py b/django/db/backends/util.py
index d8f86fef4f..81c752e664 100644
--- a/django/db/backends/util.py
+++ b/django/db/backends/util.py
@@ -1,6 +1,11 @@
import datetime
from time import time
+try:
+ import decimal
+except ImportError:
+ from django.utils import _decimal as decimal # for Python 2.3
+
class CursorDebugWrapper(object):
def __init__(self, cursor, db):
self.cursor = cursor
@@ -33,7 +38,7 @@ class CursorDebugWrapper(object):
})
def __getattr__(self, attr):
- if self.__dict__.has_key(attr):
+ if attr in self.__dict__:
return self.__dict__[attr]
else:
return getattr(self.cursor, attr)
@@ -85,6 +90,11 @@ def typecast_boolean(s):
if not s: return False
return str(s)[0].lower() == 't'
+def typecast_decimal(s):
+ if s is None or s == '':
+ return None
+ return decimal.Decimal(s)
+
###############################################
# Converters from Python to database (string) #
###############################################
@@ -92,6 +102,11 @@ def typecast_boolean(s):
def rev_typecast_boolean(obj, d):
return obj and '1' or '0'
+def rev_typecast_decimal(d):
+ if d is None:
+ return None
+ return str(d)
+
##################################################################################
# Helper functions for dictfetch* for databases that don't natively support them #
##################################################################################
diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py
index 0308dd047a..6c3abb6b59 100644
--- a/django/db/models/__init__.py
+++ b/django/db/models/__init__.py
@@ -8,7 +8,6 @@ from django.db.models.manager import Manager
from django.db.models.base import Model, AdminOptions
from django.db.models.fields import *
from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED
-from django.db.models.fields.generic import GenericRelation, GenericRel, GenericForeignKey
from django.db.models import signals
from django.utils.functional import curry
from django.utils.text import capfirst
@@ -27,27 +26,3 @@ def permalink(func):
viewname = bits[0]
return reverse(bits[0], None, *bits[1:3])
return inner
-
-class LazyDate(object):
- """
- Use in limit_choices_to to compare the field to dates calculated at run time
- instead of when the model is loaded. For example::
-
- ... limit_choices_to = {'date__gt' : models.LazyDate(days=-3)} ...
-
- which will limit the choices to dates greater than three days ago.
- """
- def __init__(self, **kwargs):
- self.delta = datetime.timedelta(**kwargs)
-
- def __str__(self):
- return str(self.__get_value__())
-
- def __repr__(self):
- return "<LazyDate: %s>" % self.delta
-
- def __get_value__(self):
- return (datetime.datetime.now() + self.delta).date()
-
- def __getattr__(self, attr):
- return getattr(self.__get_value__(), attr)
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 70569a2561..a8e6303e1c 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -13,6 +13,7 @@ from django.dispatch import dispatcher
from django.utils.datastructures import SortedDict
from django.utils.functional import curry
from django.conf import settings
+from itertools import izip
import types
import sys
import os
@@ -21,8 +22,13 @@ class ModelBase(type):
"Metaclass for all models"
def __new__(cls, name, bases, attrs):
# If this isn't a subclass of Model, don't do anything special.
- if not bases or bases == (object,):
- return type.__new__(cls, name, bases, attrs)
+ try:
+ if not filter(lambda b: issubclass(b, Model), bases):
+ return super(ModelBase, cls).__new__(cls, name, bases, attrs)
+ except NameError:
+ # 'Model' isn't defined yet, meaning we're looking at Django's own
+ # Model class, defined below.
+ return super(ModelBase, cls).__new__(cls, name, bases, attrs)
# Create the class.
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
@@ -36,11 +42,11 @@ class ModelBase(type):
new_class._meta.parents.append(base)
new_class._meta.parents.extend(base._meta.parents)
- model_module = sys.modules[new_class.__module__]
if getattr(new_class._meta, 'app_label', None) is None:
# Figure out the app_label by looking one level up.
# For 'django.contrib.sites.models', this would be 'sites'.
+ model_module = sys.modules[new_class.__module__]
new_class._meta.app_label = model_module.__name__.split('.')[-2]
# Bail out early if we have already created this class.
@@ -63,7 +69,7 @@ class ModelBase(type):
if getattr(new_class._meta, 'row_level_permissions', False):
from django.contrib.auth.models import RowLevelPermission
- gen_rel = django.db.models.GenericRelation(RowLevelPermission, object_id_field="model_id", content_type_field="model_ct")
+ gen_rel = django.contrib.contenttypes.generic.GenericRelation(RowLevelPermission, object_id_field="model_id", content_type_field="model_ct")
new_class.add_to_class("row_level_permissions", gen_rel)
new_class._prepare()
@@ -95,41 +101,74 @@ class Model(object):
def __init__(self, *args, **kwargs):
dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs)
- for f in self._meta.fields:
- if isinstance(f.rel, ManyToOneRel):
- try:
- # Assume object instance was passed in.
- rel_obj = kwargs.pop(f.name)
- except KeyError:
+
+ # There is a rather weird disparity here; if kwargs, it's set, then args
+ # overrides it. It should be one or the other; don't duplicate the work
+ # The reason for the kwargs check is that standard iterator passes in by
+ # args, and nstantiation for iteration is 33% faster.
+ args_len = len(args)
+ if args_len > len(self._meta.fields):
+ # Daft, but matches old exception sans the err msg.
+ raise IndexError("Number of args exceeds number of fields")
+
+ fields_iter = iter(self._meta.fields)
+ if not kwargs:
+ # The ordering of the izip calls matter - izip throws StopIteration
+ # when an iter throws it. So if the first iter throws it, the second
+ # is *not* consumed. We rely on this, so don't change the order
+ # without changing the logic.
+ for val, field in izip(args, fields_iter):
+ setattr(self, field.attname, val)
+ else:
+ # Slower, kwargs-ready version.
+ for val, field in izip(args, fields_iter):
+ setattr(self, field.attname, val)
+ kwargs.pop(field.name, None)
+ # Maintain compatibility with existing calls.
+ if isinstance(field.rel, ManyToOneRel):
+ kwargs.pop(field.attname, None)
+
+ # Now we're left with the unprocessed fields that *must* come from
+ # keywords, or default.
+
+ for field in fields_iter:
+ if kwargs:
+ if isinstance(field.rel, ManyToOneRel):
try:
- # Object instance wasn't passed in -- must be an ID.
- val = kwargs.pop(f.attname)
+ # Assume object instance was passed in.
+ rel_obj = kwargs.pop(field.name)
except KeyError:
- val = f.get_default()
- else:
- # Object instance was passed in.
- # Special case: You can pass in "None" for related objects if it's allowed.
- if rel_obj is None and f.null:
- val = None
- else:
try:
- val = getattr(rel_obj, f.rel.get_related_field().attname)
- except AttributeError:
- raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj))
- setattr(self, f.attname, val)
+ # Object instance wasn't passed in -- must be an ID.
+ val = kwargs.pop(field.attname)
+ except KeyError:
+ val = field.get_default()
+ else:
+ # Object instance was passed in. Special case: You can
+ # pass in "None" for related objects if it's allowed.
+ if rel_obj is None and field.null:
+ val = None
+ else:
+ try:
+ val = getattr(rel_obj, field.rel.get_related_field().attname)
+ except AttributeError:
+ raise TypeError("Invalid value: %r should be a %s instance, not a %s" %
+ (field.name, field.rel.to, type(rel_obj)))
+ else:
+ val = kwargs.pop(field.attname, field.get_default())
else:
- val = kwargs.pop(f.attname, f.get_default())
- setattr(self, f.attname, val)
- for prop in kwargs.keys():
- try:
- if isinstance(getattr(self.__class__, prop), property):
- setattr(self, prop, kwargs.pop(prop))
- except AttributeError:
- pass
+ val = field.get_default()
+ setattr(self, field.attname, val)
+
if kwargs:
- raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
- for i, arg in enumerate(args):
- setattr(self, self._meta.fields[i].attname, arg)
+ for prop in kwargs.keys():
+ try:
+ if isinstance(getattr(self.__class__, prop), property):
+ setattr(self, prop, kwargs.pop(prop))
+ except AttributeError:
+ pass
+ if kwargs:
+ raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
dispatcher.send(signal=signals.post_init, sender=self.__class__, instance=self)
def add_to_class(cls, name, value):
@@ -327,7 +366,7 @@ class Model(object):
def _get_FIELD_size(self, field):
return os.path.getsize(self._get_FIELD_filename(field))
- def _save_FIELD_file(self, field, filename, raw_contents):
+ def _save_FIELD_file(self, field, filename, raw_contents, save=True):
directory = field.get_directory_name()
try: # Create the date-based directory if it doesn't exist.
os.makedirs(os.path.join(settings.MEDIA_ROOT, directory))
@@ -362,8 +401,9 @@ class Model(object):
if field.height_field:
setattr(self, field.height_field, height)
- # Save the object, because it has changed.
- self.save()
+ # Save the object because it has changed unless save is False
+ if save:
+ self.save()
_save_FIELD_file.alters_data = True
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index fe317ac24f..136ce31b8b 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -10,6 +10,10 @@ from django.utils.itercompat import tee
from django.utils.text import capfirst
from django.utils.translation import gettext, gettext_lazy
import datetime, os, time
+try:
+ import decimal
+except ImportError:
+ from django.utils import _decimal as decimal # for Python 2.3
class NOT_PROVIDED:
pass
@@ -67,7 +71,7 @@ class Field(object):
def __init__(self, verbose_name=None, name=None, primary_key=False,
maxlength=None, unique=False, blank=False, null=False, db_index=False,
- core=False, rel=None, default=NOT_PROVIDED, editable=True,
+ core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True,
prepopulate_from=None, unique_for_date=None, unique_for_month=None,
unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
help_text='', db_column=None):
@@ -78,6 +82,7 @@ class Field(object):
self.blank, self.null = blank, null
self.core, self.rel, self.default = core, rel, default
self.editable = editable
+ self.serialize = serialize
self.validator_list = validator_list or []
self.prepopulate_from = prepopulate_from
self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
@@ -164,7 +169,7 @@ class Field(object):
def get_db_prep_lookup(self, lookup_type, value):
"Returns field's value prepared for database lookup."
- if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'year', 'month', 'day', 'search'):
+ if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'month', 'day', 'search'):
return [value]
elif lookup_type in ('range', 'in'):
return value
@@ -178,7 +183,13 @@ class Field(object):
return ["%%%s" % prep_for_like_query(value)]
elif lookup_type == 'isnull':
return []
- raise TypeError, "Field has invalid lookup: %s" % lookup_type
+ elif lookup_type == 'year':
+ try:
+ value = int(value)
+ except ValueError:
+ raise ValueError("The __year lookup type requires an integer argument")
+ return ['%s-01-01 00:00:00' % value, '%s-12-31 23:59:59.999999' % value]
+ raise TypeError("Field has invalid lookup: %s" % lookup_type)
def has_default(self):
"Returns a boolean of whether this field has a default value."
@@ -334,10 +345,17 @@ class Field(object):
return self._choices
choices = property(_get_choices)
- def formfield(self):
+ def formfield(self, form_class=forms.CharField, **kwargs):
"Returns a django.newforms.Field instance for this database Field."
- # TODO: This is just a temporary default during development.
- return forms.CharField(required=not self.blank, label=capfirst(self.verbose_name))
+ defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
+ if self.choices:
+ defaults['widget'] = forms.Select(choices=self.get_choices())
+ defaults.update(kwargs)
+ return form_class(**defaults)
+
+ def value_from_object(self, obj):
+ "Returns the value of this field in the given model instance."
+ return getattr(obj, self.attname)
class AutoField(Field):
empty_strings_allowed = False
@@ -375,7 +393,7 @@ class AutoField(Field):
super(AutoField, self).contribute_to_class(cls, name)
cls._meta.has_auto_field = True
- def formfield(self):
+ def formfield(self, **kwargs):
return None
class BooleanField(Field):
@@ -392,8 +410,10 @@ class BooleanField(Field):
def get_manipulator_field_objs(self):
return [oldforms.CheckboxField]
- def formfield(self):
- return forms.BooleanField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.BooleanField}
+ defaults.update(kwargs)
+ return super(BooleanField, self).formfield(**defaults)
class CharField(Field):
def get_manipulator_field_objs(self):
@@ -409,8 +429,10 @@ class CharField(Field):
raise validators.ValidationError, gettext_lazy("This field cannot be null.")
return str(value)
- def formfield(self):
- return forms.CharField(max_length=self.maxlength, required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'max_length': self.maxlength}
+ defaults.update(kwargs)
+ return super(CharField, self).formfield(**defaults)
# TODO: Maybe move this into contrib, because it's specialized.
class CommaSeparatedIntegerField(CharField):
@@ -428,6 +450,8 @@ class DateField(Field):
Field.__init__(self, verbose_name, name, **kwargs)
def to_python(self, value):
+ if value is None:
+ return value
if isinstance(value, datetime.datetime):
return value.date()
if isinstance(value, datetime.date):
@@ -479,15 +503,19 @@ class DateField(Field):
def get_manipulator_field_objs(self):
return [oldforms.DateField]
- def flatten_data(self, follow, obj = None):
+ def flatten_data(self, follow, obj=None):
val = self._get_val_from_obj(obj)
return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')}
- def formfield(self):
- return forms.DateField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.DateField}
+ defaults.update(kwargs)
+ return super(DateField, self).formfield(**defaults)
class DateTimeField(DateField):
def to_python(self, value):
+ if value is None:
+ return value
if isinstance(value, datetime.datetime):
return value
if isinstance(value, datetime.date):
@@ -544,8 +572,69 @@ class DateTimeField(DateField):
return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''),
time_field: (val is not None and val.strftime("%H:%M:%S") or '')}
- def formfield(self):
- return forms.DateTimeField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.DateTimeField}
+ defaults.update(kwargs)
+ return super(DateTimeField, self).formfield(**defaults)
+
+class DecimalField(Field):
+ empty_strings_allowed = False
+ def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
+ self.max_digits, self.decimal_places = max_digits, decimal_places
+ Field.__init__(self, verbose_name, name, **kwargs)
+
+ def to_python(self, value):
+ if value is None:
+ return value
+ try:
+ return decimal.Decimal(value)
+ except decimal.InvalidOperation:
+ raise validators.ValidationError, gettext("This value must be a decimal number.")
+
+ def _format(self, value):
+ if isinstance(value, basestring):
+ return value
+ else:
+ return self.format_number(value)
+
+ def format_number(self, value):
+ """
+ Formats a number into a string with the requisite number of digits and
+ decimal places.
+ """
+ num_chars = self.max_digits
+ # Allow for a decimal point
+ if self.decimal_places > 0:
+ num_chars += 1
+ # Allow for a minus sign
+ if value < 0:
+ num_chars += 1
+
+ return "%.*f" % (self.decimal_places, value)
+
+ def get_db_prep_save(self, value):
+ if value is not None:
+ value = self._format(value)
+ return super(DecimalField, self).get_db_prep_save(value)
+
+ def get_db_prep_lookup(self, lookup_type, value):
+ if lookup_type == 'range':
+ value = [self._format(v) for v in value]
+ else:
+ value = self._format(value)
+ return super(DecimalField, self).get_db_prep_lookup(lookup_type, value)
+
+ def get_manipulator_field_objs(self):
+ return [curry(oldforms.DecimalField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
+
+ def formfield(self, **kwargs):
+ defaults = {
+ 'max_digits': self.max_digits,
+ 'decimal_places': self.decimal_places,
+ 'form_class': forms.DecimalField,
+ }
+ defaults.update(kwargs)
+ return super(DecimalField, self).formfield(**defaults)
class EmailField(CharField):
def __init__(self, *args, **kwargs):
@@ -561,8 +650,10 @@ class EmailField(CharField):
def validate(self, field_data, all_data):
validators.isValidEmail(field_data, all_data)
- def formfield(self):
- return forms.EmailField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.EmailField}
+ defaults.update(kwargs)
+ return super(EmailField, self).formfield(**defaults)
class FileField(Field):
def __init__(self, verbose_name=None, name=None, upload_to='', **kwargs):
@@ -610,7 +701,7 @@ class FileField(Field):
setattr(cls, 'get_%s_filename' % self.name, curry(cls._get_FIELD_filename, field=self))
setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self))
setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self))
- setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents: instance._save_FIELD_file(self, filename, raw_contents))
+ setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents, save=True: instance._save_FIELD_file(self, filename, raw_contents, save))
dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls)
def delete_file(self, instance):
@@ -628,14 +719,14 @@ class FileField(Field):
def get_manipulator_field_names(self, name_prefix):
return [name_prefix + self.name + '_file', name_prefix + self.name]
- def save_file(self, new_data, new_object, original_object, change, rel):
+ def save_file(self, new_data, new_object, original_object, change, rel, save=True):
upload_field_name = self.get_manipulator_field_names('')[0]
if new_data.get(upload_field_name, False):
func = getattr(new_object, 'save_%s_file' % self.name)
if rel:
- func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"])
+ func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"], save)
else:
- func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"])
+ func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"], save)
def get_directory_name(self):
return os.path.normpath(datetime.datetime.now().strftime(self.upload_to))
@@ -655,12 +746,14 @@ class FilePathField(Field):
class FloatField(Field):
empty_strings_allowed = False
- def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
- self.max_digits, self.decimal_places = max_digits, decimal_places
- Field.__init__(self, verbose_name, name, **kwargs)
def get_manipulator_field_objs(self):
- return [curry(oldforms.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
+ return [oldforms.FloatField]
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.FloatField}
+ defaults.update(kwargs)
+ return super(FloatField, self).formfield(**defaults)
class ImageField(FileField):
def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):
@@ -679,12 +772,12 @@ class ImageField(FileField):
if not self.height_field:
setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self))
- def save_file(self, new_data, new_object, original_object, change, rel):
- FileField.save_file(self, new_data, new_object, original_object, change, rel)
+ def save_file(self, new_data, new_object, original_object, change, rel, save=True):
+ FileField.save_file(self, new_data, new_object, original_object, change, rel, save)
# If the image has height and/or width field(s) and they haven't
# changed, set the width and/or height field(s) back to their original
# values.
- if change and (self.width_field or self.height_field):
+ if change and (self.width_field or self.height_field) and save:
if self.width_field:
setattr(new_object, self.width_field, getattr(original_object, self.width_field))
if self.height_field:
@@ -696,8 +789,10 @@ class IntegerField(Field):
def get_manipulator_field_objs(self):
return [oldforms.IntegerField]
- def formfield(self):
- return forms.IntegerField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.IntegerField}
+ defaults.update(kwargs)
+ return super(IntegerField, self).formfield(**defaults)
class IPAddressField(Field):
def __init__(self, *args, **kwargs):
@@ -715,6 +810,13 @@ class NullBooleanField(Field):
kwargs['null'] = True
Field.__init__(self, *args, **kwargs)
+ def to_python(self, value):
+ if value in (None, True, False): return value
+ if value in ('None'): return None
+ if value in ('t', 'True', '1'): return True
+ if value in ('f', 'False', '0'): return False
+ raise validators.ValidationError, gettext("This value must be either None, True or False.")
+
def get_manipulator_field_objs(self):
return [oldforms.NullBooleanField]
@@ -725,6 +827,12 @@ class PhoneNumberField(IntegerField):
def validate(self, field_data, all_data):
validators.isValidPhone(field_data, all_data)
+ def formfield(self, **kwargs):
+ from django.contrib.localflavor.us.forms import USPhoneNumberField
+ defaults = {'form_class': USPhoneNumberField}
+ defaults.update(kwargs)
+ return super(PhoneNumberField, self).formfield(**defaults)
+
class PositiveIntegerField(IntegerField):
def get_manipulator_field_objs(self):
return [oldforms.PositiveIntegerField]
@@ -738,7 +846,7 @@ class SlugField(Field):
kwargs['maxlength'] = kwargs.get('maxlength', 50)
kwargs.setdefault('validator_list', []).append(validators.isSlug)
# Set db_index=True unless it's been set manually.
- if not kwargs.has_key('db_index'):
+ if 'db_index' not in kwargs:
kwargs['db_index'] = True
Field.__init__(self, *args, **kwargs)
@@ -753,6 +861,11 @@ class TextField(Field):
def get_manipulator_field_objs(self):
return [oldforms.LargeTextField]
+ def formfield(self, **kwargs):
+ defaults = {'widget': forms.Textarea}
+ defaults.update(kwargs)
+ return super(TextField, self).formfield(**defaults)
+
class TimeField(Field):
empty_strings_allowed = False
def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
@@ -781,7 +894,7 @@ class TimeField(Field):
if value is not None:
# MySQL will throw a warning if microseconds are given, because it
# doesn't support microseconds.
- if settings.DATABASE_ENGINE == 'mysql':
+ if settings.DATABASE_ENGINE == 'mysql' and hasattr(value, 'microsecond'):
value = value.replace(microsecond=0)
value = str(value)
return Field.get_db_prep_save(self, value)
@@ -793,26 +906,40 @@ class TimeField(Field):
val = self._get_val_from_obj(obj)
return {self.attname: (val is not None and val.strftime("%H:%M:%S") or '')}
- def formfield(self):
- return forms.TimeField(required=not self.blank, label=capfirst(self.verbose_name))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.TimeField}
+ defaults.update(kwargs)
+ return super(TimeField, self).formfield(**defaults)
-class URLField(Field):
+class URLField(CharField):
def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
+ kwargs['maxlength'] = kwargs.get('maxlength', 200)
if verify_exists:
kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
self.verify_exists = verify_exists
- Field.__init__(self, verbose_name, name, **kwargs)
+ CharField.__init__(self, verbose_name, name, **kwargs)
def get_manipulator_field_objs(self):
return [oldforms.URLField]
- def formfield(self):
- return forms.URLField(required=not self.blank, verify_exists=self.verify_exists, label=capfirst(self.verbose_name))
+ def get_internal_type(self):
+ return "CharField"
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.URLField, 'verify_exists': self.verify_exists}
+ defaults.update(kwargs)
+ return super(URLField, self).formfield(**defaults)
class USStateField(Field):
def get_manipulator_field_objs(self):
return [oldforms.USStateField]
+ def formfield(self, **kwargs):
+ from django.contrib.localflavor.us.forms import USStateSelect
+ defaults = {'widget': USStateSelect}
+ defaults.update(kwargs)
+ return super(USStateField, self).formfield(**defaults)
+
class XMLField(TextField):
def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
self.schema_path = schema_path
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 797ef05be1..0739d0461a 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -2,10 +2,12 @@ from django.db import backend, transaction
from django.db.models import signals, get_model
from django.db.models.fields import AutoField, Field, IntegerField, get_ul_class
from django.db.models.related import RelatedObject
+from django.utils.text import capfirst
from django.utils.translation import gettext_lazy, string_concat, ngettext
from django.utils.functional import curry
from django.core import validators
from django import oldforms
+from django import newforms as forms
from django.dispatch import dispatcher
# For Python 2.3
@@ -314,18 +316,20 @@ def create_many_related_manager(superclass):
# join_table: name of the m2m link table
# source_col_name: the PK colname in join_table for the source object
# target_col_name: the PK colname in join_table for the target object
- # *objs - objects to add
+ # *objs - objects to add. Either object instances, or primary keys of object instances.
from django.db import connection
# If there aren't any objects, there is nothing to do.
if objs:
# Check that all the objects are of the right type
+ new_ids = set()
for obj in objs:
- if not isinstance(obj, self.model):
- raise ValueError, "objects to add() must be %s instances" % self.model._meta.object_name
+ if isinstance(obj, self.model):
+ new_ids.add(obj._get_pk_val())
+ else:
+ new_ids.add(obj)
# Add the newly created or already existing objects to the join table.
# First find out which items are already added, to avoid adding them twice
- new_ids = set([obj._get_pk_val() for obj in objs])
cursor = connection.cursor()
cursor.execute("SELECT %s FROM %s WHERE %s = %%s AND %s IN (%s)" % \
(target_col_name, self.join_table, source_col_name,
@@ -352,14 +356,16 @@ def create_many_related_manager(superclass):
# If there aren't any objects, there is nothing to do.
if objs:
# Check that all the objects are of the right type
+ old_ids = set()
for obj in objs:
- if not isinstance(obj, self.model):
- raise ValueError, "objects to remove() must be %s instances" % self.model._meta.object_name
+ if isinstance(obj, self.model):
+ old_ids.add(obj._get_pk_val())
+ else:
+ old_ids.add(obj)
# Remove the specified objects from the join table
- old_ids = set([obj._get_pk_val() for obj in objs])
cursor = connection.cursor()
cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \
- (self.join_table, source_col_name,
+ (self.join_table, source_col_name,
target_col_name, ",".join(['%s'] * len(old_ids))),
[self._pk_val] + list(old_ids))
transaction.commit_unless_managed()
@@ -468,7 +474,7 @@ class ForeignKey(RelatedField, Field):
to_field = to_field or to._meta.pk.name
kwargs['verbose_name'] = kwargs.get('verbose_name', '')
- if kwargs.has_key('edit_inline_type'):
+ if 'edit_inline_type' in kwargs:
import warnings
warnings.warn("edit_inline_type is deprecated. Use edit_inline instead.")
kwargs['edit_inline'] = kwargs.pop('edit_inline_type')
@@ -546,6 +552,11 @@ class ForeignKey(RelatedField, Field):
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.ModelChoiceField, 'queryset': self.rel.to._default_manager.all()}
+ defaults.update(kwargs)
+ return super(ForeignKey, self).formfield(**defaults)
+
class OneToOneField(RelatedField, IntegerField):
def __init__(self, to, to_field=None, **kwargs):
try:
@@ -556,7 +567,7 @@ class OneToOneField(RelatedField, IntegerField):
to_field = to_field or to._meta.pk.name
kwargs['verbose_name'] = kwargs.get('verbose_name', '')
- if kwargs.has_key('edit_inline_type'):
+ if 'edit_inline_type' in kwargs:
import warnings
warnings.warn("edit_inline_type is deprecated. Use edit_inline instead.")
kwargs['edit_inline'] = kwargs.pop('edit_inline_type')
@@ -607,6 +618,11 @@ class OneToOneField(RelatedField, IntegerField):
if not cls._meta.one_to_one_field:
cls._meta.one_to_one_field = self
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.ModelChoiceField, 'queryset': self.rel.to._default_manager.all()}
+ defaults.update(kwargs)
+ return super(OneToOneField, self).formfield(**defaults)
+
class ManyToManyField(RelatedField, Field):
def __init__(self, to, **kwargs):
kwargs['verbose_name'] = kwargs.get('verbose_name', None)
@@ -617,6 +633,7 @@ class ManyToManyField(RelatedField, Field):
limit_choices_to=kwargs.pop('limit_choices_to', None),
raw_id_admin=kwargs.pop('raw_id_admin', False),
symmetrical=kwargs.pop('symmetrical', True))
+ self.db_table = kwargs.pop('db_table', None)
if kwargs["rel"].raw_id_admin:
kwargs.setdefault("validator_list", []).append(self.isValidIDList)
Field.__init__(self, **kwargs)
@@ -639,7 +656,10 @@ class ManyToManyField(RelatedField, Field):
def _get_m2m_db_table(self, opts):
"Function that can be curried to provide the m2m table name for this relation"
- return '%s_%s' % (opts.db_table, self.name)
+ if self.db_table:
+ return self.db_table
+ else:
+ return '%s_%s' % (opts.db_table, self.name)
def _get_m2m_column_name(self, related):
"Function that can be curried to provide the source column name for the m2m table"
@@ -713,6 +733,19 @@ class ManyToManyField(RelatedField, Field):
def set_attributes_from_rel(self):
pass
+ def value_from_object(self, obj):
+ "Returns the value of this field in the given model instance."
+ return getattr(obj, self.attname).all()
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.ModelMultipleChoiceField, 'queryset': self.rel.to._default_manager.all()}
+ defaults.update(kwargs)
+ # If initial is passed in, it's a list of related objects, but the
+ # MultipleChoiceField takes a list of IDs.
+ if defaults.get('initial') is not None:
+ defaults['initial'] = [i._get_pk_val() for i in defaults['initial']]
+ return super(ManyToManyField, self).formfield(**defaults)
+
class ManyToOneRel(object):
def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None,
max_num_in_admin=None, num_extra_on_change=1, edit_inline=False,
diff --git a/django/db/models/loading.py b/django/db/models/loading.py
index f4aff2438b..224f5e8451 100644
--- a/django/db/models/loading.py
+++ b/django/db/models/loading.py
@@ -103,7 +103,7 @@ def register_models(app_label, *models):
# in the _app_models dictionary
model_name = model._meta.object_name.lower()
model_dict = _app_models.setdefault(app_label, {})
- if model_dict.has_key(model_name):
+ if model_name in model_dict:
# The same model may be imported via different paths (e.g.
# appname.models and project.appname.models). We use the source
# filename as a means to detect identity.
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index 6005874516..b60eed262a 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -1,4 +1,4 @@
-from django.db.models.query import QuerySet
+from django.db.models.query import QuerySet, EmptyQuerySet
from django.dispatch import dispatcher
from django.db.models import signals
from django.db.models.fields import FieldDoesNotExist
@@ -41,12 +41,18 @@ class Manager(object):
#######################
# PROXIES TO QUERYSET #
#######################
+
+ def get_empty_query_set(self):
+ return EmptyQuerySet(self.model)
def get_query_set(self):
"""Returns a new QuerySet object. Subclasses can override this method
to easily customise the behaviour of the Manager.
"""
return QuerySet(self.model)
+
+ def none(self):
+ return self.get_empty_query_set()
def all(self):
return self.get_query_set()
diff --git a/django/db/models/manipulators.py b/django/db/models/manipulators.py
index e9dfa7037c..d5fc5f725e 100644
--- a/django/db/models/manipulators.py
+++ b/django/db/models/manipulators.py
@@ -96,14 +96,16 @@ class AutomaticManipulator(oldforms.Manipulator):
if self.change:
params[self.opts.pk.attname] = self.obj_key
- # First, save the basic object itself.
+ # First, create the basic object itself.
new_object = self.model(**params)
- new_object.save()
- # Now that the object's been saved, save any uploaded files.
+ # Now that the object's been created, save any uploaded files.
for f in self.opts.fields:
if isinstance(f, FileField):
- f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False)
+ f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False, save=False)
+
+ # Now save the object
+ new_object.save()
# Calculate which primary fields have changed.
if self.change:
diff --git a/django/db/models/options.py b/django/db/models/options.py
index ee253ff451..556168e7d0 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -85,6 +85,7 @@ class Options(object):
self.fields.insert(bisect(self.fields, field), field)
if not self.pk and field.primary_key:
self.pk = field
+ field.serialize = False
def __repr__(self):
return '<Options for %s>' % self.object_name
@@ -140,7 +141,7 @@ class Options(object):
def get_follow(self, override=None):
follow = {}
for f in self.fields + self.many_to_many + self.get_all_related_objects():
- if override and override.has_key(f.name):
+ if override and f.name in override:
child_override = override[f.name]
else:
child_override = None
@@ -182,7 +183,7 @@ class Options(object):
# TODO: follow
if not hasattr(self, '_field_types'):
self._field_types = {}
- if not self._field_types.has_key(field_type):
+ if field_type not in self._field_types:
try:
# First check self.fields.
for f in self.fields:
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 53ed63ae5b..a6e702be18 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1,8 +1,9 @@
from django.db import backend, connection, transaction
from django.db.models.fields import DateField, FieldDoesNotExist
-from django.db.models import signals
+from django.db.models import signals, loading
from django.dispatch import dispatcher
from django.utils.datastructures import SortedDict
+from django.contrib.contenttypes import generic
import operator
import re
@@ -25,6 +26,9 @@ QUERY_TERMS = (
# Larger values are slightly faster at the expense of more storage space.
GET_ITERATOR_CHUNK_SIZE = 100
+class EmptyResultSet(Exception):
+ pass
+
####################
# HELPER FUNCTIONS #
####################
@@ -80,6 +84,7 @@ class QuerySet(object):
self._filters = Q()
self._order_by = None # Ordering, e.g. ('date', '-name'). If None, use model's ordering.
self._select_related = False # Whether to fill cache for related objects.
+ self._max_related_depth = 0 # Maximum "depth" for select_related
self._distinct = False # Whether the query should use SELECT DISTINCT.
self._select = {} # Dictionary of attname -> SQL.
self._where = [] # List of extra WHERE clauses to use.
@@ -104,6 +109,8 @@ class QuerySet(object):
def __getitem__(self, k):
"Retrieve an item or slice from the set of results."
+ if not isinstance(k, (slice, int)):
+ raise TypeError
assert (not isinstance(k, slice) and (k >= 0)) \
or (isinstance(k, slice) and (k.start is None or k.start >= 0) and (k.stop is None or k.stop >= 0)), \
"Negative indexing is not supported."
@@ -163,12 +170,16 @@ class QuerySet(object):
def iterator(self):
"Performs the SELECT database lookup of this QuerySet."
+ try:
+ select, sql, params = self._get_sql_clause()
+ except EmptyResultSet:
+ raise StopIteration
+
# self._select is a dictionary, and dictionaries' key order is
# undefined, so we convert it to a list of tuples.
extra_select = self._select.items()
cursor = connection.cursor()
- select, sql, params = self._get_sql_clause()
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
fill_cache = self._select_related
index_end = len(self.model._meta.fields)
@@ -178,7 +189,8 @@ class QuerySet(object):
raise StopIteration
for row in rows:
if fill_cache:
- obj, index_end = get_cached_row(self.model, row, 0)
+ obj, index_end = get_cached_row(klass=self.model, row=row,
+ index_start=0, max_depth=self._max_related_depth)
else:
obj = self.model(*row[:index_end])
for i, k in enumerate(extra_select):
@@ -186,13 +198,31 @@ class QuerySet(object):
yield obj
def count(self):
- "Performs a SELECT COUNT() and returns the number of records as an integer."
+ """
+ Performs a SELECT COUNT() and returns the number of records as an
+ integer.
+
+ If the queryset is already cached (i.e. self._result_cache is set) this
+ simply returns the length of the cached results set to avoid multiple
+ SELECT COUNT(*) calls.
+ """
+ if self._result_cache is not None:
+ return len(self._result_cache)
+
counter = self._clone()
counter._order_by = ()
+ counter._select_related = False
+
+ offset = counter._offset
+ limit = counter._limit
counter._offset = None
counter._limit = None
- counter._select_related = False
- select, sql, params = counter._get_sql_clause()
+
+ try:
+ select, sql, params = counter._get_sql_clause()
+ except EmptyResultSet:
+ return 0
+
cursor = connection.cursor()
if self._distinct:
id_col = "%s.%s" % (backend.quote_name(self.model._meta.db_table),
@@ -200,7 +230,16 @@ class QuerySet(object):
cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params)
else:
cursor.execute("SELECT COUNT(*)" + sql, params)
- return cursor.fetchone()[0]
+ count = cursor.fetchone()[0]
+
+ # Apply any offset and limit constraints manually, since using LIMIT or
+ # OFFSET in SQL doesn't change the output of COUNT.
+ if offset:
+ count = max(0, count - offset)
+ if limit:
+ count = min(limit, count)
+
+ return count
def get(self, *args, **kwargs):
"Performs the SELECT and returns a single object matching the given keyword arguments."
@@ -359,9 +398,9 @@ class QuerySet(object):
else:
return self._filter_or_exclude(None, **filter_obj)
- def select_related(self, true_or_false=True):
+ def select_related(self, true_or_false=True, depth=0):
"Returns a new QuerySet instance with '_select_related' modified."
- return self._clone(_select_related=true_or_false)
+ return self._clone(_select_related=true_or_false, _max_related_depth=depth)
def order_by(self, *field_names):
"Returns a new QuerySet instance with the ordering changed."
@@ -395,6 +434,7 @@ class QuerySet(object):
c._filters = self._filters
c._order_by = self._order_by
c._select_related = self._select_related
+ c._max_related_depth = self._max_related_depth
c._distinct = self._distinct
c._select = self._select.copy()
c._where = self._where[:]
@@ -448,7 +488,10 @@ class QuerySet(object):
# Add additional tables and WHERE clauses based on select_related.
if self._select_related:
- fill_table_cache(opts, select, tables, where, opts.db_table, [opts.db_table])
+ fill_table_cache(opts, select, tables, where,
+ old_prefix=opts.db_table,
+ cache_tables_seen=[opts.db_table],
+ max_depth=self._max_related_depth)
# Add any additional SELECTs.
if self._select:
@@ -509,22 +552,42 @@ class QuerySet(object):
return select, " ".join(sql), params
class ValuesQuerySet(QuerySet):
- def iterator(self):
- # select_related and select aren't supported in values().
+ def __init__(self, *args, **kwargs):
+ super(ValuesQuerySet, self).__init__(*args, **kwargs)
+ # select_related isn't supported in values().
self._select_related = False
- self._select = {}
+
+ def iterator(self):
+ try:
+ select, sql, params = self._get_sql_clause()
+ except EmptyResultSet:
+ raise StopIteration
# self._fields is a list of field names to fetch.
if self._fields:
- columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
+ #columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
+ if not self._select:
+ columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
+ else:
+ columns = []
+ for f in self._fields:
+ if f in [field.name for field in self.model._meta.fields]:
+ columns.append( self.model._meta.get_field(f, many_to_many=False).column )
+ elif not self._select.has_key( f ):
+ raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f )
+
field_names = self._fields
else: # Default to all fields.
columns = [f.column for f in self.model._meta.fields]
field_names = [f.attname for f in self.model._meta.fields]
- cursor = connection.cursor()
- select, sql, params = self._get_sql_clause()
select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
+
+ # Add any additional SELECTs.
+ if self._select:
+ select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()])
+
+ cursor = connection.cursor()
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
while 1:
rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
@@ -545,7 +608,12 @@ class DateQuerySet(QuerySet):
if self._field.null:
self._where.append('%s.%s IS NOT NULL' % \
(backend.quote_name(self.model._meta.db_table), backend.quote_name(self._field.column)))
- select, sql, params = self._get_sql_clause()
+
+ try:
+ select, sql, params = self._get_sql_clause()
+ except EmptyResultSet:
+ raise StopIteration
+
sql = 'SELECT %s %s GROUP BY 1 ORDER BY 1 %s' % \
(backend.get_date_trunc_sql(self._kind, '%s.%s' % (backend.quote_name(self.model._meta.db_table),
backend.quote_name(self._field.column))), sql, self._order)
@@ -563,6 +631,25 @@ class DateQuerySet(QuerySet):
c._order = self._order
return c
+class EmptyQuerySet(QuerySet):
+ def __init__(self, model=None):
+ super(EmptyQuerySet, self).__init__(model)
+ self._result_cache = []
+
+ def count(self):
+ return 0
+
+ def delete(self):
+ pass
+
+ def _clone(self, klass=None, **kwargs):
+ c = super(EmptyQuerySet, self)._clone(klass, **kwargs)
+ c._result_cache = []
+ return c
+
+ def _get_sql_clause(self):
+ raise EmptyResultSet
+
class QOperator(object):
"Base class for QAnd and QOr"
def __init__(self, *args):
@@ -571,10 +658,14 @@ class QOperator(object):
def get_sql(self, opts):
joins, where, params = SortedDict(), [], []
for val in self.args:
- joins2, where2, params2 = val.get_sql(opts)
- joins.update(joins2)
- where.extend(where2)
- params.extend(params2)
+ try:
+ joins2, where2, params2 = val.get_sql(opts)
+ joins.update(joins2)
+ where.extend(where2)
+ params.extend(params2)
+ except EmptyResultSet:
+ if not isinstance(self, QOr):
+ raise EmptyResultSet
if where:
return joins, ['(%s)' % self.operator.join(where)], params
return joins, [], params
@@ -628,8 +719,11 @@ class QNot(Q):
self.q = q
def get_sql(self, opts):
- joins, where, params = self.q.get_sql(opts)
- where2 = ['(NOT (%s))' % " AND ".join(where)]
+ try:
+ joins, where, params = self.q.get_sql(opts)
+ where2 = ['(NOT (%s))' % " AND ".join(where)]
+ except EmptyResultSet:
+ return SortedDict(), [], []
return joins, where2, params
def get_where_clause(lookup_type, table_prefix, field_name, value):
@@ -641,10 +735,14 @@ def get_where_clause(lookup_type, table_prefix, field_name, value):
except KeyError:
pass
if lookup_type == 'in':
- return '%s%s IN (%s)' % (table_prefix, field_name, ','.join(['%s' for v in value]))
- elif lookup_type == 'range':
+ in_string = ','.join(['%s' for id in value])
+ if in_string:
+ return '%s%s IN (%s)' % (table_prefix, field_name, in_string)
+ else:
+ raise EmptyResultSet
+ elif lookup_type in ('range', 'year'):
return '%s%s BETWEEN %%s AND %%s' % (table_prefix, field_name)
- elif lookup_type in ('year', 'month', 'day'):
+ elif lookup_type in ('month', 'day'):
return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name)
elif lookup_type == 'isnull':
return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
@@ -652,21 +750,33 @@ def get_where_clause(lookup_type, table_prefix, field_name, value):
return backend.get_fulltext_search_sql(table_prefix + field_name)
raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
-def get_cached_row(klass, row, index_start):
- "Helper function that recursively returns an object with cache filled"
+def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0):
+ """Helper function that recursively returns an object with cache filled"""
+
+ # If we've got a max_depth set and we've exceeded that depth, bail now.
+ if max_depth and cur_depth > max_depth:
+ return None
+
index_end = index_start + len(klass._meta.fields)
obj = klass(*row[index_start:index_end])
for f in klass._meta.fields:
if f.rel and not f.null:
- rel_obj, index_end = get_cached_row(f.rel.to, row, index_end)
- setattr(obj, f.get_cache_name(), rel_obj)
+ cached_row = get_cached_row(f.rel.to, row, index_end, max_depth, cur_depth+1)
+ if cached_row:
+ rel_obj, index_end = cached_row
+ setattr(obj, f.get_cache_name(), rel_obj)
return obj, index_end
-def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen):
+def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen, max_depth=0, cur_depth=0):
"""
Helper function that recursively populates the select, tables and where (in
place) for select_related queries.
"""
+
+ # If we've got a max_depth set and we've exceeded that depth, bail now.
+ if max_depth and cur_depth > max_depth:
+ return None
+
qn = backend.quote_name
for f in opts.fields:
if f.rel and not f.null:
@@ -681,12 +791,12 @@ def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen)
where.append('%s.%s = %s.%s' % \
(qn(old_prefix), qn(f.column), qn(db_table), qn(f.rel.get_related_field().column)))
select.extend(['%s.%s' % (qn(db_table), qn(f2.column)) for f2 in f.rel.to._meta.fields])
- fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen)
+ fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen, max_depth, cur_depth+1)
def parse_lookup(kwarg_items, opts):
# Helper function that handles converting API kwargs
# (e.g. "name__exact": "tom") to SQL.
- # Returns a tuple of (tables, joins, where, params).
+ # Returns a tuple of (joins, where, params).
# 'joins' is a sorted dictionary describing the tables that must be joined
# to complete the query. The dictionary is sorted because creation order
@@ -725,12 +835,14 @@ def parse_lookup(kwarg_items, opts):
if len(path) < 1:
raise TypeError, "Cannot parse keyword query %r" % kwarg
-
+
if value is None:
# Interpret '__exact=None' as the sql '= NULL'; otherwise, reject
# all uses of None as a query value.
if lookup_type != 'exact':
raise ValueError, "Cannot use None as a query value"
+ elif callable(value):
+ value = value()
joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None)
joins.update(joins2)
@@ -755,6 +867,13 @@ def find_field(name, field_list, related_query):
return None
return matches[0]
+def field_choices(field_list, related_query):
+ if related_query:
+ choices = [f.field.related_query_name() for f in field_list]
+ else:
+ choices = [f.name for f in field_list]
+ return choices
+
def lookup_inner(path, lookup_type, value, opts, table, column):
qn = backend.quote_name
joins, where, params = SortedDict(), [], []
@@ -827,13 +946,23 @@ def lookup_inner(path, lookup_type, value, opts, table, column):
new_opts = field.rel.to._meta
new_column = new_opts.pk.column
join_column = field.column
-
- raise FieldFound
+ raise FieldFound
+ elif path:
+ # For regular fields, if there are still items on the path,
+ # an error has been made. We munge "name" so that the error
+ # properly identifies the cause of the problem.
+ name += LOOKUP_SEPARATOR + path[0]
+ else:
+ raise FieldFound
except FieldFound: # Match found, loop has been shortcut.
pass
else: # No match found.
- raise TypeError, "Cannot resolve keyword '%s' into field" % name
+ choices = field_choices(current_opts.many_to_many, False) + \
+ field_choices(current_opts.get_all_related_many_to_many_objects(), True) + \
+ field_choices(current_opts.get_all_related_objects(), True) + \
+ field_choices(current_opts.fields, False)
+ raise TypeError, "Cannot resolve keyword '%s' into field. Choices are: %s" % (name, ", ".join(choices))
# Check whether an intermediate join is required between current_table
# and new_table.
@@ -926,18 +1055,26 @@ def delete_objects(seen_objs):
pk_list = [pk for pk,instance in seen_objs[cls]]
for related in cls._meta.get_all_related_many_to_many_objects():
- for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
- cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
- (qn(related.field.m2m_db_table()),
- qn(related.field.m2m_reverse_name()),
- ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
- pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+ if not isinstance(related.field, generic.GenericRelation):
+ for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+ cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
+ (qn(related.field.m2m_db_table()),
+ qn(related.field.m2m_reverse_name()),
+ ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
+ pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
for f in cls._meta.many_to_many:
+ if isinstance(f, generic.GenericRelation):
+ from django.contrib.contenttypes.models import ContentType
+ query_extra = 'AND %s=%%s' % f.rel.to._meta.get_field(f.content_type_field_name).column
+ args_extra = [ContentType.objects.get_for_model(cls).id]
+ else:
+ query_extra = ''
+ args_extra = []
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
- cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
+ cursor.execute(("DELETE FROM %s WHERE %s IN (%s)" % \
(qn(f.m2m_db_table()), qn(f.m2m_column_name()),
- ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
- pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+ ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]]))) + query_extra,
+ pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE] + args_extra)
for field in cls._meta.fields:
if field.rel and field.null and field.rel.to in seen_objs:
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
diff --git a/django/db/models/related.py b/django/db/models/related.py
index ac1ec50ca2..2c1dc5c516 100644
--- a/django/db/models/related.py
+++ b/django/db/models/related.py
@@ -1,7 +1,7 @@
class BoundRelatedObject(object):
def __init__(self, related_object, field_mapping, original):
self.relation = related_object
- self.field_mappings = field_mapping[related_object.opts.module_name]
+ self.field_mappings = field_mapping[related_object.name]
def template_name(self):
raise NotImplementedError
@@ -16,7 +16,7 @@ class RelatedObject(object):
self.opts = model._meta
self.field = field
self.edit_inline = field.rel.edit_inline
- self.name = self.opts.module_name
+ self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
self.var_name = self.opts.object_name.lower()
def flatten_data(self, follow, obj=None):
@@ -68,7 +68,10 @@ class RelatedObject(object):
# object
return [attr]
else:
- return [None] * self.field.rel.num_in_admin
+ if self.field.rel.min_num_in_admin:
+ return [None] * max(self.field.rel.num_in_admin, self.field.rel.min_num_in_admin)
+ else:
+ return [None] * self.field.rel.num_in_admin
def get_db_prep_lookup(self, lookup_type, value):
# Defer to the actual field definition for db prep
@@ -101,12 +104,12 @@ class RelatedObject(object):
attr = getattr(manipulator.original_object, self.get_accessor_name())
count = attr.count()
count += self.field.rel.num_extra_on_change
- if self.field.rel.min_num_in_admin:
- count = max(count, self.field.rel.min_num_in_admin)
- if self.field.rel.max_num_in_admin:
- count = min(count, self.field.rel.max_num_in_admin)
else:
count = self.field.rel.num_in_admin
+ if self.field.rel.min_num_in_admin:
+ count = max(count, self.field.rel.min_num_in_admin)
+ if self.field.rel.max_num_in_admin:
+ count = min(count, self.field.rel.max_num_in_admin)
else:
count = 1
diff --git a/django/db/transaction.py b/django/db/transaction.py
index 4a0658e1c3..bb90713525 100644
--- a/django/db/transaction.py
+++ b/django/db/transaction.py
@@ -46,12 +46,12 @@ def enter_transaction_management():
when no current block is running).
"""
thread_ident = thread.get_ident()
- if state.has_key(thread_ident) and state[thread_ident]:
+ if thread_ident in state and state[thread_ident]:
state[thread_ident].append(state[thread_ident][-1])
else:
state[thread_ident] = []
state[thread_ident].append(settings.TRANSACTIONS_MANAGED)
- if not dirty.has_key(thread_ident):
+ if thread_ident not in dirty:
dirty[thread_ident] = False
def leave_transaction_management():
@@ -61,7 +61,7 @@ def leave_transaction_management():
those from outside. (Commits are on connection level.)
"""
thread_ident = thread.get_ident()
- if state.has_key(thread_ident) and state[thread_ident]:
+ if thread_ident in state and state[thread_ident]:
del state[thread_ident][-1]
else:
raise TransactionManagementError("This code isn't under transaction management")
@@ -84,7 +84,7 @@ def set_dirty():
changes waiting for commit.
"""
thread_ident = thread.get_ident()
- if dirty.has_key(thread_ident):
+ if thread_ident in dirty:
dirty[thread_ident] = True
else:
raise TransactionManagementError("This code isn't under transaction management")
@@ -96,7 +96,7 @@ def set_clean():
should happen.
"""
thread_ident = thread.get_ident()
- if dirty.has_key(thread_ident):
+ if thread_ident in dirty:
dirty[thread_ident] = False
else:
raise TransactionManagementError("This code isn't under transaction management")
@@ -106,7 +106,7 @@ def is_managed():
Checks whether the transaction manager is in manual or in auto state.
"""
thread_ident = thread.get_ident()
- if state.has_key(thread_ident):
+ if thread_ident in state:
if state[thread_ident]:
return state[thread_ident][-1]
return settings.TRANSACTIONS_MANAGED
diff --git a/django/dispatch/dispatcher.py b/django/dispatch/dispatcher.py
index 1a617b5946..029c59fd3f 100644
--- a/django/dispatch/dispatcher.py
+++ b/django/dispatch/dispatcher.py
@@ -25,7 +25,6 @@ Internal attributes:
deletion, (considerably speeds up the cleanup process
vs. the original code.)
"""
-from __future__ import generators
import types, weakref
from django.dispatch import saferef, robustapply, errors
@@ -33,11 +32,6 @@ __author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
__cvsid__ = "$Id: dispatcher.py,v 1.9 2005/09/17 04:55:57 mcfletch Exp $"
__version__ = "$Revision: 1.9 $"[11:-2]
-try:
- True
-except NameError:
- True = 1==1
- False = 1==0
class _Parameter:
"""Used to represent default parameter values."""
@@ -140,10 +134,9 @@ def connect(receiver, signal=Any, sender=Any, weak=True):
if weak:
receiver = saferef.safeRef(receiver, onDelete=_removeReceiver)
senderkey = id(sender)
- if connections.has_key(senderkey):
- signals = connections[senderkey]
- else:
- connections[senderkey] = signals = {}
+
+ signals = connections.setdefault(senderkey, {})
+
# Keep track of senders for cleanup.
# Is Anonymous something we want to clean up?
if sender not in (None, Anonymous, Any):
@@ -251,10 +244,10 @@ def getReceivers( sender = Any, signal = Any ):
to retrieve the actual receiver objects as an iterable
object.
"""
- try:
- return connections[id(sender)][signal]
- except KeyError:
- return []
+ existing = connections.get(id(sender))
+ if existing is not None:
+ return existing.get(signal, [])
+ return []
def liveReceivers(receivers):
"""Filter sequence of receivers to get resolved, live receivers
@@ -278,30 +271,48 @@ def liveReceivers(receivers):
def getAllReceivers( sender = Any, signal = Any ):
"""Get list of all receivers from global tables
- This gets all receivers which should receive
+ This gets all dereferenced receivers which should receive
the given signal from sender, each receiver should
be produced only once by the resulting generator
"""
receivers = {}
- for set in (
- # Get receivers that receive *this* signal from *this* sender.
- getReceivers( sender, signal ),
- # Add receivers that receive *any* signal from *this* sender.
- getReceivers( sender, Any ),
- # Add receivers that receive *this* signal from *any* sender.
- getReceivers( Any, signal ),
- # Add receivers that receive *any* signal from *any* sender.
- getReceivers( Any, Any ),
- ):
- for receiver in set:
- if receiver: # filter out dead instance-method weakrefs
- try:
- if not receivers.has_key( receiver ):
- receivers[receiver] = 1
- yield receiver
- except TypeError:
- # dead weakrefs raise TypeError on hash...
- pass
+ # Get receivers that receive *this* signal from *this* sender.
+ # Add receivers that receive *any* signal from *this* sender.
+ # Add receivers that receive *this* signal from *any* sender.
+ # Add receivers that receive *any* signal from *any* sender.
+ l = []
+ i = id(sender)
+ if i in connections:
+ sender_receivers = connections[i]
+ if signal in sender_receivers:
+ l.extend(sender_receivers[signal])
+ if signal is not Any and Any in sender_receivers:
+ l.extend(sender_receivers[Any])
+
+ if sender is not Any:
+ i = id(Any)
+ if i in connections:
+ sender_receivers = connections[i]
+ if sender_receivers is not None:
+ if signal in sender_receivers:
+ l.extend(sender_receivers[signal])
+ if signal is not Any and Any in sender_receivers:
+ l.extend(sender_receivers[Any])
+
+ for receiver in l:
+ try:
+ if not receiver in receivers:
+ if isinstance(receiver, WEAKREF_TYPES):
+ receiver = receiver()
+ # this should only (rough guess) be possible if somehow, deref'ing
+ # triggered a wipe.
+ if receiver is None:
+ continue
+ receivers[receiver] = 1
+ yield receiver
+ except TypeError:
+ # dead weakrefs raise TypeError on hash...
+ pass
def send(signal=Any, sender=Anonymous, *arguments, **named):
"""Send signal from sender to all connected receivers.
@@ -340,7 +351,7 @@ def send(signal=Any, sender=Anonymous, *arguments, **named):
# Call each receiver with whatever arguments it can accept.
# Return a list of tuple pairs [(receiver, response), ... ].
responses = []
- for receiver in liveReceivers(getAllReceivers(sender, signal)):
+ for receiver in getAllReceivers(sender, signal):
response = robustapply.robustApply(
receiver,
signal=signal,
@@ -350,6 +361,8 @@ def send(signal=Any, sender=Anonymous, *arguments, **named):
)
responses.append((receiver, response))
return responses
+
+
def sendExact( signal=Any, sender=Anonymous, *arguments, **named ):
"""Send signal only to those receivers registered for exact message
@@ -421,33 +434,18 @@ def _cleanupConnections(senderkey, signal):
def _removeSender(senderkey):
"""Remove senderkey from connections."""
_removeBackrefs(senderkey)
- try:
- del connections[senderkey]
- except KeyError:
- pass
- # Senderkey will only be in senders dictionary if sender
- # could be weakly referenced.
- try:
- del senders[senderkey]
- except:
- pass
+
+ connections.pop(senderkey, None)
+ senders.pop(senderkey, None)
def _removeBackrefs( senderkey):
"""Remove all back-references to this senderkey"""
- try:
- signals = connections[senderkey]
- except KeyError:
- signals = None
- else:
- items = signals.items()
- def allReceivers( ):
- for signal,set in items:
- for item in set:
- yield item
- for receiver in allReceivers():
+ for receiver_list in connections.pop(senderkey, {}).values():
+ for receiver in receiver_list:
_killBackref( receiver, senderkey )
+
def _removeOldBackRefs(senderkey, signal, receiver, receivers):
"""Kill old sendersBack references from receiver
@@ -483,13 +481,13 @@ def _removeOldBackRefs(senderkey, signal, receiver, receivers):
def _killBackref( receiver, senderkey ):
"""Do the actual removal of back reference from receiver to senderkey"""
receiverkey = id(receiver)
- set = sendersBack.get( receiverkey, () )
- while senderkey in set:
+ receivers_list = sendersBack.get( receiverkey, () )
+ while senderkey in receivers_list:
try:
- set.remove( senderkey )
+ receivers_list.remove( senderkey )
except:
break
- if not set:
+ if not receivers_list:
try:
del sendersBack[ receiverkey ]
except KeyError:
diff --git a/django/http/__init__.py b/django/http/__init__.py
index 48f10329fd..a8c8afe433 100644
--- a/django/http/__init__.py
+++ b/django/http/__init__.py
@@ -29,12 +29,12 @@ class HttpRequest(object):
def __getitem__(self, key):
for d in (self.POST, self.GET):
- if d.has_key(key):
+ if key in d:
return d[key]
raise KeyError, "%s not found in either POST or GET" % key
def has_key(self, key):
- return self.GET.has_key(key) or self.POST.has_key(key)
+ return key in self.GET or key in self.POST
def get_full_path(self):
return ''
@@ -52,12 +52,12 @@ def parse_file_upload(header_dict, post_data):
POST = MultiValueDict()
FILES = MultiValueDict()
for submessage in msg.get_payload():
- if isinstance(submessage, email.Message.Message):
+ if submessage and isinstance(submessage, email.Message.Message):
name_dict = parse_header(submessage['Content-Disposition'])[1]
# name_dict is something like {'name': 'file', 'filename': 'test.txt'} for file uploads
# or {'name': 'blah'} for POST fields
# We assume all uploaded files have a 'filename' set.
- if name_dict.has_key('filename'):
+ if 'filename' in name_dict:
assert type([]) != type(submessage.get_payload()), "Nested MIME messages are not supported"
if not name_dict['filename'].strip():
continue
@@ -66,7 +66,7 @@ def parse_file_upload(header_dict, post_data):
filename = name_dict['filename'][name_dict['filename'].rfind("\\")+1:]
FILES.appendlist(name_dict['name'], {
'filename': filename,
- 'content-type': (submessage.has_key('Content-Type') and submessage['Content-Type'] or None),
+ 'content-type': 'Content-Type' in submessage and submessage['Content-Type'] or None,
'content': submessage.get_payload(),
})
else:
@@ -91,6 +91,10 @@ class QueryDict(MultiValueDict):
self._assert_mutable()
MultiValueDict.__setitem__(self, key, value)
+ def __delitem__(self, key):
+ self._assert_mutable()
+ super(QueryDict, self).__delitem__(key)
+
def __copy__(self):
result = self.__class__('', mutable=True)
for key, value in dict.items(self):
@@ -117,9 +121,9 @@ class QueryDict(MultiValueDict):
self._assert_mutable()
MultiValueDict.update(self, other_dict)
- def pop(self, key):
+ def pop(self, key, *args):
self._assert_mutable()
- return MultiValueDict.pop(self, key)
+ return MultiValueDict.pop(self, key, *args)
def popitem(self):
self._assert_mutable()
@@ -155,12 +159,15 @@ def parse_cookie(cookie):
class HttpResponse(object):
"A basic HTTP response, with content and dictionary-accessed headers"
+
+ status_code = 200
+
def __init__(self, content='', mimetype=None):
from django.conf import settings
self._charset = settings.DEFAULT_CHARSET
if not mimetype:
mimetype = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE, settings.DEFAULT_CHARSET)
- if hasattr(content, '__iter__'):
+ if not isinstance(content, basestring) and hasattr(content, '__iter__'):
self._container = content
self._is_string = False
else:
@@ -168,7 +175,6 @@ class HttpResponse(object):
self._is_string = True
self.headers = {'Content-Type': mimetype}
self.cookies = SimpleCookie()
- self.status_code = 200
def __str__(self):
"Full HTTP message, including headers"
@@ -216,6 +222,12 @@ class HttpResponse(object):
content = ''.join(self._container)
if isinstance(content, unicode):
content = content.encode(self._charset)
+
+ # If self._container was an iterator, we have just exhausted it, so we
+ # need to save the results for anything else that needs access
+ if not self._is_string:
+ self._container = [content]
+ self._is_string = True
return content
def _set_content(self, value):
@@ -225,14 +237,10 @@ class HttpResponse(object):
content = property(_get_content, _set_content)
def __iter__(self):
- self._iterator = self._container.__iter__()
- return self
-
- def next(self):
- chunk = self._iterator.next()
- if isinstance(chunk, unicode):
- chunk = chunk.encode(self._charset)
- return chunk
+ for chunk in self._container:
+ if isinstance(chunk, unicode):
+ chunk = chunk.encode(self._charset)
+ yield chunk
def close(self):
if hasattr(self._container, 'close'):
@@ -254,47 +262,49 @@ class HttpResponse(object):
return sum([len(chunk) for chunk in self._container])
class HttpResponseRedirect(HttpResponse):
+ status_code = 302
+
def __init__(self, redirect_to):
HttpResponse.__init__(self)
self['Location'] = quote(redirect_to, safe=RESERVED_CHARS)
- self.status_code = 302
class HttpResponsePermanentRedirect(HttpResponse):
+ status_code = 301
+
def __init__(self, redirect_to):
HttpResponse.__init__(self)
self['Location'] = quote(redirect_to, safe=RESERVED_CHARS)
- self.status_code = 301
class HttpResponseNotModified(HttpResponse):
- def __init__(self):
- HttpResponse.__init__(self)
- self.status_code = 304
+ status_code = 304
+
+class HttpResponseBadRequest(HttpResponse):
+ status_code = 400
class HttpResponseNotFound(HttpResponse):
- def __init__(self, *args, **kwargs):
- HttpResponse.__init__(self, *args, **kwargs)
- self.status_code = 404
+ status_code = 404
class HttpResponseForbidden(HttpResponse):
- def __init__(self, *args, **kwargs):
- HttpResponse.__init__(self, *args, **kwargs)
- self.status_code = 403
+ status_code = 403
class HttpResponseNotAllowed(HttpResponse):
+ status_code = 405
+
def __init__(self, permitted_methods):
HttpResponse.__init__(self)
self['Allow'] = ', '.join(permitted_methods)
- self.status_code = 405
class HttpResponseGone(HttpResponse):
+ status_code = 410
+
def __init__(self, *args, **kwargs):
HttpResponse.__init__(self, *args, **kwargs)
- self.status_code = 410
class HttpResponseServerError(HttpResponse):
+ status_code = 500
+
def __init__(self, *args, **kwargs):
HttpResponse.__init__(self, *args, **kwargs)
- self.status_code = 500
def get_host(request):
"Gets the HTTP host from the environment or request headers."
diff --git a/django/middleware/cache.py b/django/middleware/cache.py
index 58800b24da..a88b4956b2 100644
--- a/django/middleware/cache.py
+++ b/django/middleware/cache.py
@@ -10,7 +10,7 @@ class CacheMiddleware(object):
Only parameter-less GET or HEAD-requests with status code 200 are cached.
If CACHE_MIDDLEWARE_ANONYMOUS_ONLY is set to True, only anonymous requests
- (i.e., those node made by a logged-in user) will be cached. This is a
+ (i.e., those not made by a logged-in user) will be cached. This is a
simple and effective way of avoiding the caching of the Django admin (and
any other user-specific content).
diff --git a/django/middleware/common.py b/django/middleware/common.py
index 6283214fad..9610e1e952 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -11,7 +11,8 @@ class CommonMiddleware(object):
- Forbids access to User-Agents in settings.DISALLOWED_USER_AGENTS
- URL rewriting: Based on the APPEND_SLASH and PREPEND_WWW settings,
- this middleware appends missing slashes and/or prepends missing "www."s.
+ this middleware appends missing slashes and/or prepends missing
+ "www."s.
- ETags: If the USE_ETAGS setting is set, ETags will be calculated from
the entire page content and Not Modified responses will be returned
@@ -25,7 +26,7 @@ class CommonMiddleware(object):
"""
# Check for denied User-Agents
- if request.META.has_key('HTTP_USER_AGENT'):
+ if 'HTTP_USER_AGENT' in request.META:
for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
if user_agent_regex.search(request.META['HTTP_USER_AGENT']):
return http.HttpResponseForbidden('<h1>Forbidden</h1>')
@@ -66,14 +67,19 @@ class CommonMiddleware(object):
path = request.get_full_path()
if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer):
ua = request.META.get('HTTP_USER_AGENT', '<none>')
+ ip = request.META.get('REMOTE_ADDR', '<none>')
mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain),
- "Referrer: %s\nRequested URL: %s\nUser agent: %s\n" % (referer, request.get_full_path(), ua))
+ "Referrer: %s\nRequested URL: %s\nUser agent: %s\nIP address: %s\n" \
+ % (referer, request.get_full_path(), ua, ip))
return response
# Use ETags, if requested.
if settings.USE_ETAGS:
- etag = md5.new(response.content).hexdigest()
- if request.META.get('HTTP_IF_NONE_MATCH') == etag:
+ if response.has_header('ETag'):
+ etag = response['ETag']
+ else:
+ etag = md5.new(response.content).hexdigest()
+ if response.status_code >= 200 and response.status_code < 300 and request.META.get('HTTP_IF_NONE_MATCH') == etag:
response = http.HttpResponseNotModified()
else:
response['ETag'] = etag
diff --git a/django/newforms/extras/widgets.py b/django/newforms/extras/widgets.py
index 1011934fb8..724dcd9b50 100644
--- a/django/newforms/extras/widgets.py
+++ b/django/newforms/extras/widgets.py
@@ -2,9 +2,10 @@
Extra HTML Widget classes
"""
+import datetime
+
from django.newforms.widgets import Widget, Select
from django.utils.dates import MONTHS
-import datetime
__all__ = ('SelectDateWidget',)
diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index 5c6d46ddac..b73dd181e6 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -2,21 +2,25 @@
Field classes
"""
-from django.utils.translation import gettext
-from util import ValidationError, smart_unicode
-from widgets import TextInput, PasswordInput, CheckboxInput, Select, SelectMultiple
import datetime
import re
import time
+from django.utils.translation import gettext
+from django.utils.encoding import smart_unicode
+
+from util import ErrorList, ValidationError
+from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple
+
__all__ = (
'Field', 'CharField', 'IntegerField',
'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
'DEFAULT_TIME_INPUT_FORMATS', 'TimeField',
'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField',
'RegexField', 'EmailField', 'URLField', 'BooleanField',
- 'ChoiceField', 'MultipleChoiceField',
- 'ComboField',
+ 'ChoiceField', 'NullBooleanField', 'MultipleChoiceField',
+ 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
+ 'SplitDateTimeField',
)
# These values, if given to to_python(), will trigger the self.required check.
@@ -27,16 +31,36 @@ try:
except NameError:
from sets import Set as set # Python 2.3 fallback
+try:
+ from decimal import Decimal
+except ImportError:
+ from django.utils._decimal import Decimal # Python 2.3 fallback
+
class Field(object):
widget = TextInput # Default widget to use when rendering this type of Field.
+ hidden_widget = HiddenInput # Default widget to use when rendering this as "hidden".
# Tracks each time a Field instance is created. Used to retain order.
creation_counter = 0
- def __init__(self, required=True, widget=None, label=None):
+ def __init__(self, required=True, widget=None, label=None, initial=None, help_text=None):
+ # required -- Boolean that specifies whether the field is required.
+ # True by default.
+ # widget -- A Widget class, or instance of a Widget class, that should
+ # be used for this Field when displaying it. Each Field has a
+ # default Widget that it'll use if you don't specify this. In
+ # most cases, the default widget is TextInput.
+ # label -- A verbose name for this field, for use in displaying this
+ # field in a form. By default, Django will use a "pretty"
+ # version of the form field name, if the Field is part of a
+ # Form.
+ # initial -- A value to use in this Field's initial display. This value
+ # is *not* used as a fallback if data isn't given.
+ # help_text -- An optional string to use as "help text" for this Field.
if label is not None:
label = smart_unicode(label)
- self.required, self.label = required, label
+ self.required, self.label, self.initial = required, label, initial
+ self.help_text = smart_unicode(help_text or '')
widget = widget or self.widget
if isinstance(widget, type):
widget = widget()
@@ -72,17 +96,15 @@ class Field(object):
return {}
class CharField(Field):
- def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None):
+ def __init__(self, max_length=None, min_length=None, *args, **kwargs):
self.max_length, self.min_length = max_length, min_length
- Field.__init__(self, required, widget, label)
+ super(CharField, self).__init__(*args, **kwargs)
def clean(self, value):
"Validates max_length and min_length. Returns a Unicode object."
- Field.clean(self, value)
+ super(CharField, self).clean(value)
if value in EMPTY_VALUES:
- value = u''
- if not self.required:
- return value
+ return u''
value = smart_unicode(value)
if self.max_length is not None and len(value) > self.max_length:
raise ValidationError(gettext(u'Ensure this value has at most %d characters.') % self.max_length)
@@ -95,18 +117,18 @@ class CharField(Field):
return {'maxlength': str(self.max_length)}
class IntegerField(Field):
- def __init__(self, max_value=None, min_value=None, required=True, widget=None, label=None):
+ def __init__(self, max_value=None, min_value=None, *args, **kwargs):
self.max_value, self.min_value = max_value, min_value
- Field.__init__(self, required, widget, label)
+ super(IntegerField, self).__init__(*args, **kwargs)
def clean(self, value):
"""
Validates that int() can be called on the input. Returns the result
- of int().
+ of int(). Returns None for empty values.
"""
super(IntegerField, self).clean(value)
- if not self.required and value in EMPTY_VALUES:
- return u''
+ if value in EMPTY_VALUES:
+ return None
try:
value = int(value)
except (ValueError, TypeError):
@@ -117,6 +139,67 @@ class IntegerField(Field):
raise ValidationError(gettext(u'Ensure this value is greater than or equal to %s.') % self.min_value)
return value
+class FloatField(Field):
+ def __init__(self, max_value=None, min_value=None, *args, **kwargs):
+ self.max_value, self.min_value = max_value, min_value
+ Field.__init__(self, *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Validates that float() can be called on the input. Returns a float.
+ Returns None for empty values.
+ """
+ super(FloatField, self).clean(value)
+ if not self.required and value in EMPTY_VALUES:
+ return None
+ try:
+ value = float(value)
+ except (ValueError, TypeError):
+ raise ValidationError(gettext('Enter a number.'))
+ if self.max_value is not None and value > self.max_value:
+ raise ValidationError(gettext('Ensure this value is less than or equal to %s.') % self.max_value)
+ if self.min_value is not None and value < self.min_value:
+ raise ValidationError(gettext('Ensure this value is greater than or equal to %s.') % self.min_value)
+ return value
+
+decimal_re = re.compile(r'^-?(?P<digits>\d+)(\.(?P<decimals>\d+))?$')
+
+class DecimalField(Field):
+ def __init__(self, max_value=None, min_value=None, max_digits=None, decimal_places=None, *args, **kwargs):
+ self.max_value, self.min_value = max_value, min_value
+ self.max_digits, self.decimal_places = max_digits, decimal_places
+ Field.__init__(self, *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Validates that the input is a decimal number. Returns a Decimal
+ instance. Returns None for empty values. Ensures that there are no more
+ than max_digits in the number, and no more than decimal_places digits
+ after the decimal point.
+ """
+ super(DecimalField, self).clean(value)
+ if not self.required and value in EMPTY_VALUES:
+ return None
+ value = value.strip()
+ match = decimal_re.search(value)
+ if not match:
+ raise ValidationError(gettext('Enter a number.'))
+ else:
+ value = Decimal(value)
+ digits = len(match.group('digits') or '')
+ decimals = len(match.group('decimals') or '')
+ if self.max_value is not None and value > self.max_value:
+ raise ValidationError(gettext('Ensure this value is less than or equal to %s.') % self.max_value)
+ if self.min_value is not None and value < self.min_value:
+ raise ValidationError(gettext('Ensure this value is greater than or equal to %s.') % self.min_value)
+ if self.max_digits is not None and (digits + decimals) > self.max_digits:
+ raise ValidationError(gettext('Ensure that there are no more than %s digits in total.') % self.max_digits)
+ if self.decimal_places is not None and decimals > self.decimal_places:
+ raise ValidationError(gettext('Ensure that there are no more than %s decimal places.') % self.decimal_places)
+ if self.max_digits is not None and self.decimal_places is not None and digits > (self.max_digits - self.decimal_places):
+ raise ValidationError(gettext('Ensure that there are no more than %s digits before the decimal point.') % (self.max_digits - self.decimal_places))
+ return value
+
DEFAULT_DATE_INPUT_FORMATS = (
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
'%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
@@ -126,8 +209,8 @@ DEFAULT_DATE_INPUT_FORMATS = (
)
class DateField(Field):
- def __init__(self, input_formats=None, required=True, widget=None, label=None):
- Field.__init__(self, required, widget, label)
+ def __init__(self, input_formats=None, *args, **kwargs):
+ super(DateField, self).__init__(*args, **kwargs)
self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
def clean(self, value):
@@ -135,7 +218,7 @@ class DateField(Field):
Validates that the input can be converted to a date. Returns a Python
datetime.date object.
"""
- Field.clean(self, value)
+ super(DateField, self).clean(value)
if value in EMPTY_VALUES:
return None
if isinstance(value, datetime.datetime):
@@ -155,8 +238,8 @@ DEFAULT_TIME_INPUT_FORMATS = (
)
class TimeField(Field):
- def __init__(self, input_formats=None, required=True, widget=None, label=None):
- Field.__init__(self, required, widget, label)
+ def __init__(self, input_formats=None, *args, **kwargs):
+ super(TimeField, self).__init__(*args, **kwargs)
self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS
def clean(self, value):
@@ -164,7 +247,7 @@ class TimeField(Field):
Validates that the input can be converted to a time. Returns a Python
datetime.time object.
"""
- Field.clean(self, value)
+ super(TimeField, self).clean(value)
if value in EMPTY_VALUES:
return None
if isinstance(value, datetime.time):
@@ -189,8 +272,8 @@ DEFAULT_DATETIME_INPUT_FORMATS = (
)
class DateTimeField(Field):
- def __init__(self, input_formats=None, required=True, widget=None, label=None):
- Field.__init__(self, required, widget, label)
+ def __init__(self, input_formats=None, *args, **kwargs):
+ super(DateTimeField, self).__init__(*args, **kwargs)
self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
def clean(self, value):
@@ -198,7 +281,7 @@ class DateTimeField(Field):
Validates that the input can be converted to a datetime. Returns a
Python datetime.datetime object.
"""
- Field.clean(self, value)
+ super(DateTimeField, self).clean(value)
if value in EMPTY_VALUES:
return None
if isinstance(value, datetime.datetime):
@@ -213,14 +296,13 @@ class DateTimeField(Field):
raise ValidationError(gettext(u'Enter a valid date/time.'))
class RegexField(Field):
- def __init__(self, regex, max_length=None, min_length=None, error_message=None,
- required=True, widget=None, label=None):
+ def __init__(self, regex, max_length=None, min_length=None, error_message=None, *args, **kwargs):
"""
regex can be either a string or a compiled regular expression object.
error_message is an optional error message to use, if
'Enter a valid value' is too generic for you.
"""
- Field.__init__(self, required, widget, label)
+ super(RegexField, self).__init__(*args, **kwargs)
if isinstance(regex, basestring):
regex = re.compile(regex)
self.regex = regex
@@ -232,10 +314,11 @@ class RegexField(Field):
Validates that the input matches the regular expression. Returns a
Unicode object.
"""
- Field.clean(self, value)
- if value in EMPTY_VALUES: value = u''
+ super(RegexField, self).clean(value)
+ if value in EMPTY_VALUES:
+ value = u''
value = smart_unicode(value)
- if not self.required and value == u'':
+ if value == u'':
return value
if self.max_length is not None and len(value) > self.max_length:
raise ValidationError(gettext(u'Ensure this value has at most %d characters.') % self.max_length)
@@ -251,8 +334,9 @@ email_re = re.compile(
r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain
class EmailField(RegexField):
- def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None):
- RegexField.__init__(self, email_re, max_length, min_length, gettext(u'Enter a valid e-mail address.'), required, widget, label)
+ def __init__(self, max_length=None, min_length=None, *args, **kwargs):
+ RegexField.__init__(self, email_re, max_length, min_length,
+ gettext(u'Enter a valid e-mail address.'), *args, **kwargs)
url_re = re.compile(
r'^https?://' # http:// or https://
@@ -268,14 +352,16 @@ except ImportError:
URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
class URLField(RegexField):
- def __init__(self, max_length=None, min_length=None, required=True, verify_exists=False, widget=None, label=None,
- validator_user_agent=URL_VALIDATOR_USER_AGENT):
- RegexField.__init__(self, url_re, max_length, min_length, gettext(u'Enter a valid URL.'), required, widget, label)
+ def __init__(self, max_length=None, min_length=None, verify_exists=False,
+ validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs):
+ super(URLField, self).__init__(url_re, max_length, min_length, gettext(u'Enter a valid URL.'), *args, **kwargs)
self.verify_exists = verify_exists
self.user_agent = validator_user_agent
def clean(self, value):
- value = RegexField.clean(self, value)
+ value = super(URLField, self).clean(value)
+ if value == u'':
+ return value
if self.verify_exists:
import urllib2
from django.conf import settings
@@ -300,33 +386,55 @@ class BooleanField(Field):
def clean(self, value):
"Returns a Python boolean object."
- Field.clean(self, value)
+ super(BooleanField, self).clean(value)
return bool(value)
+class NullBooleanField(BooleanField):
+ """
+ A field whose valid values are None, True and False. Invalid values are
+ cleaned to None.
+ """
+ widget = NullBooleanSelect
+
+ def clean(self, value):
+ return {True: True, False: False}.get(value, None)
+
class ChoiceField(Field):
- def __init__(self, choices=(), required=True, widget=Select, label=None):
- if isinstance(widget, type):
- widget = widget(choices=choices)
- Field.__init__(self, required, widget, label)
+ widget = Select
+
+ def __init__(self, choices=(), required=True, widget=None, label=None, initial=None, help_text=None):
+ super(ChoiceField, self).__init__(required, widget, label, initial, help_text)
self.choices = choices
+ def _get_choices(self):
+ return self._choices
+
+ def _set_choices(self, value):
+ # Setting choices also sets the choices on the widget.
+ # choices can be any iterable, but we call list() on it because
+ # it will be consumed more than once.
+ self._choices = self.widget.choices = list(value)
+
+ choices = property(_get_choices, _set_choices)
+
def clean(self, value):
"""
Validates that the input is in self.choices.
"""
- value = Field.clean(self, value)
- if value in EMPTY_VALUES: value = u''
+ value = super(ChoiceField, self).clean(value)
+ if value in EMPTY_VALUES:
+ value = u''
value = smart_unicode(value)
- if not self.required and value == u'':
+ if value == u'':
return value
valid_values = set([str(k) for k, v in self.choices])
if value not in valid_values:
- raise ValidationError(gettext(u'Select a valid choice. %s is not one of the available choices.') % value)
+ raise ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
return value
class MultipleChoiceField(ChoiceField):
- def __init__(self, choices=(), required=True, widget=SelectMultiple, label=None):
- ChoiceField.__init__(self, choices, required, widget, label)
+ hidden_widget = MultipleHiddenInput
+ widget = SelectMultiple
def clean(self, value):
"""
@@ -350,8 +458,11 @@ class MultipleChoiceField(ChoiceField):
return new_value
class ComboField(Field):
- def __init__(self, fields=(), required=True, widget=None, label=None):
- Field.__init__(self, required, widget, label)
+ """
+ A Field whose clean() method calls multiple Field clean() methods.
+ """
+ def __init__(self, fields=(), *args, **kwargs):
+ super(ComboField, self).__init__(*args, **kwargs)
# Set 'required' to False on the individual fields, because the
# required validation will be handled by ComboField, not by those
# individual fields.
@@ -364,7 +475,88 @@ class ComboField(Field):
Validates the given value against all of self.fields, which is a
list of Field instances.
"""
- Field.clean(self, value)
+ super(ComboField, self).clean(value)
for field in self.fields:
value = field.clean(value)
return value
+
+class MultiValueField(Field):
+ """
+ A Field that is composed of multiple Fields.
+
+ Its clean() method takes a "decompressed" list of values. Each value in
+ this list is cleaned by the corresponding field -- the first value is
+ cleaned by the first field, the second value is cleaned by the second
+ field, etc. Once all fields are cleaned, the list of clean values is
+ "compressed" into a single value.
+
+ Subclasses should implement compress(), which specifies how a list of
+ valid values should be converted to a single value. Subclasses should not
+ have to implement clean().
+
+ You'll probably want to use this with MultiWidget.
+ """
+ def __init__(self, fields=(), *args, **kwargs):
+ super(MultiValueField, self).__init__(*args, **kwargs)
+ # Set 'required' to False on the individual fields, because the
+ # required validation will be handled by MultiValueField, not by those
+ # individual fields.
+ for f in fields:
+ f.required = False
+ self.fields = fields
+
+ def clean(self, value):
+ """
+ Validates every value in the given list. A value is validated against
+ the corresponding Field in self.fields.
+
+ For example, if this MultiValueField was instantiated with
+ fields=(DateField(), TimeField()), clean() would call
+ DateField.clean(value[0]) and TimeField.clean(value[1]).
+ """
+ clean_data = []
+ errors = ErrorList()
+ if self.required and not value:
+ raise ValidationError(gettext(u'This field is required.'))
+ elif not self.required and not value:
+ return self.compress([])
+ if not isinstance(value, (list, tuple)):
+ raise ValidationError(gettext(u'Enter a list of values.'))
+ for i, field in enumerate(self.fields):
+ try:
+ field_value = value[i]
+ except IndexError:
+ field_value = None
+ if self.required and field_value in EMPTY_VALUES:
+ raise ValidationError(gettext(u'This field is required.'))
+ try:
+ clean_data.append(field.clean(field_value))
+ except ValidationError, e:
+ # Collect all validation errors in a single list, which we'll
+ # raise at the end of clean(), rather than raising a single
+ # exception for the first error we encounter.
+ errors.extend(e.messages)
+ if errors:
+ raise ValidationError(errors)
+ return self.compress(clean_data)
+
+ def compress(self, data_list):
+ """
+ Returns a single value for the given list of values. The values can be
+ assumed to be valid.
+
+ For example, if this MultiValueField was instantiated with
+ fields=(DateField(), TimeField()), this might return a datetime
+ object created by combining the date and time in data_list.
+ """
+ raise NotImplementedError('Subclasses must implement this method.')
+
+class SplitDateTimeField(MultiValueField):
+ def __init__(self, *args, **kwargs):
+ fields = (DateField(), TimeField())
+ super(SplitDateTimeField, self).__init__(fields, *args, **kwargs)
+
+ def compress(self, data_list):
+ if data_list:
+ return datetime.datetime.combine(*data_list)
+ return None
diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index 201cce3868..6ebebded4b 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -2,11 +2,15 @@
Form classes
"""
-from django.utils.datastructures import SortedDict, MultiValueDict
+import copy
+
+from django.utils.datastructures import SortedDict
from django.utils.html import escape
+from django.utils.encoding import StrAndUnicode
+
from fields import Field
-from widgets import TextInput, Textarea, HiddenInput
-from util import StrAndUnicode, ErrorDict, ErrorList, ValidationError
+from widgets import TextInput, Textarea
+from util import flatatt, ErrorDict, ErrorList, ValidationError
__all__ = ('BaseForm', 'Form')
@@ -26,12 +30,26 @@ class SortedDictFromList(SortedDict):
self.keyOrder = [d[0] for d in data]
dict.__init__(self, dict(data))
+ def copy(self):
+ return SortedDictFromList([(k, copy.copy(v)) for k, v in self.items()])
+
class DeclarativeFieldsMetaclass(type):
- "Metaclass that converts Field attributes to a dictionary called 'fields'."
+ """
+ Metaclass that converts Field attributes to a dictionary called
+ 'base_fields', taking into account parent class 'base_fields' as well.
+ """
def __new__(cls, name, bases, attrs):
- fields = [(name, attrs.pop(name)) for name, obj in attrs.items() if isinstance(obj, Field)]
+ fields = [(field_name, attrs.pop(field_name)) for field_name, obj in attrs.items() if isinstance(obj, Field)]
fields.sort(lambda x, y: cmp(x[1].creation_counter, y[1].creation_counter))
- attrs['fields'] = SortedDictFromList(fields)
+
+ # If this class is subclassing another Form, add that Form's fields.
+ # Note that we loop over the bases in *reverse*. This is necessary in
+ # order to preserve the correct order of fields.
+ for base in bases[::-1]:
+ if hasattr(base, 'base_fields'):
+ fields = base.base_fields.items() + fields
+
+ attrs['base_fields'] = SortedDictFromList(fields)
return type.__new__(cls, name, bases, attrs)
class BaseForm(StrAndUnicode):
@@ -39,13 +57,20 @@ class BaseForm(StrAndUnicode):
# class is different than Form. See the comments by the Form class for more
# information. Any improvements to the form API should be made to *this*
# class, not to the Form class.
- def __init__(self, data=None, auto_id='id_%s', prefix=None):
- self.ignore_errors = data is None
+ def __init__(self, data=None, auto_id='id_%s', prefix=None, initial=None):
+ self.is_bound = data is not None
self.data = data or {}
self.auto_id = auto_id
self.prefix = prefix
- self.clean_data = None # Stores the data after clean() has been called.
- self.__errors = None # Stores the errors after clean() has been called.
+ self.initial = initial or {}
+ self._errors = None # Stores the errors after clean() has been called.
+
+ # The base_fields class attribute is the *class-wide* definition of
+ # fields. Because a particular *instance* of the class might want to
+ # alter self.fields, we create self.fields here by copying base_fields.
+ # Instances should always modify self.fields; they should not modify
+ # self.base_fields.
+ self.fields = self.base_fields.copy()
def __unicode__(self):
return self.as_table()
@@ -62,19 +87,19 @@ class BaseForm(StrAndUnicode):
raise KeyError('Key %r not found in Form' % name)
return BoundField(self, field, name)
- def _errors(self):
+ def _get_errors(self):
"Returns an ErrorDict for self.data"
- if self.__errors is None:
+ if self._errors is None:
self.full_clean()
- return self.__errors
- errors = property(_errors)
+ return self._errors
+ errors = property(_get_errors)
def is_valid(self):
"""
Returns True if the form has no errors. Otherwise, False. If errors are
being ignored, returns False.
"""
- return not self.ignore_errors and not bool(self.errors)
+ return self.is_bound and not bool(self.errors)
def add_prefix(self, field_name):
"""
@@ -85,13 +110,13 @@ class BaseForm(StrAndUnicode):
"""
return self.prefix and ('%s-%s' % (self.prefix, field_name)) or field_name
- def _html_output(self, normal_row, error_row, row_ender, errors_on_separate_row):
+ def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row):
"Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
output, hidden_fields = [], []
for name, field in self.fields.items():
bf = BoundField(self, field, name)
- bf_errors = bf.errors # Cache in local variable.
+ bf_errors = ErrorList([escape(error) for error in bf.errors]) # Escape and cache in local variable.
if bf.is_hidden:
if bf_errors:
top_errors.extend(['(Hidden field %s) %s' % (name, e) for e in bf_errors])
@@ -99,8 +124,19 @@ class BaseForm(StrAndUnicode):
else:
if errors_on_separate_row and bf_errors:
output.append(error_row % bf_errors)
- label = bf.label and bf.label_tag(escape(bf.label + ':')) or ''
- output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': bf})
+ if bf.label:
+ label = escape(bf.label)
+ # Only add a colon if the label does not end in punctuation.
+ if label[-1] not in ':?.!':
+ label += ':'
+ label = bf.label_tag(label) or ''
+ else:
+ label = ''
+ if field.help_text:
+ help_text = help_text_html % field.help_text
+ else:
+ help_text = u''
+ output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': unicode(bf), 'help_text': help_text})
if top_errors:
output.insert(0, error_row % top_errors)
if hidden_fields: # Insert any hidden fields in the last row.
@@ -115,15 +151,15 @@ class BaseForm(StrAndUnicode):
def as_table(self):
"Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
- return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', False)
+ return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', u'<br />%s', False)
def as_ul(self):
"Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
- return self._html_output(u'<li>%(errors)s%(label)s %(field)s</li>', u'<li>%s</li>', '</li>', False)
+ return self._html_output(u'<li>%(errors)s%(label)s %(field)s%(help_text)s</li>', u'<li>%s</li>', '</li>', u' %s', False)
def as_p(self):
"Returns this form rendered as HTML <p>s."
- return self._html_output(u'<p>%(label)s %(field)s</p>', u'<p>%s</p>', '</p>', True)
+ return self._html_output(u'<p>%(label)s %(field)s%(help_text)s</p>', u'<p>%s</p>', '</p>', u' %s', True)
def non_field_errors(self):
"""
@@ -135,13 +171,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.
"""
- self.clean_data = {}
- errors = ErrorDict()
- if self.ignore_errors: # Stop further processing.
- self.__errors = errors
+ self._errors = ErrorDict()
+ if not self.is_bound: # Stop further processing.
return
+ 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
@@ -149,19 +185,20 @@ 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
+ self._errors[name] = e.messages
+ if name in self.cleaned_data:
+ del self.cleaned_data[name]
try:
- self.clean_data = self.clean()
+ self.cleaned_data = self.clean()
except ValidationError, e:
- errors[NON_FIELD_ERRORS] = e.messages
- if errors:
- self.clean_data = None
- self.__errors = errors
+ self._errors[NON_FIELD_ERRORS] = e.messages
+ if self._errors:
+ delattr(self, 'cleaned_data')
def clean(self):
"""
@@ -170,7 +207,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."
@@ -192,6 +229,7 @@ class BoundField(StrAndUnicode):
self.label = pretty_name(name)
else:
self.label = self.field.label
+ self.help_text = field.help_text or ''
def __unicode__(self):
"Renders this field as an HTML widget."
@@ -200,9 +238,9 @@ class BoundField(StrAndUnicode):
value = self.as_widget(self.field.widget)
if not isinstance(value, basestring):
# Some Widget render() methods -- notably RadioSelect -- return a
- # "special" object rather than a string. Call the __str__() on that
+ # "special" object rather than a string. Call __unicode__() on that
# object to get its rendered value.
- value = value.__str__()
+ value = unicode(value)
return value
def _errors(self):
@@ -216,9 +254,15 @@ class BoundField(StrAndUnicode):
def as_widget(self, widget, attrs=None):
attrs = attrs or {}
auto_id = self.auto_id
- if auto_id and not attrs.has_key('id') and not widget.attrs.has_key('id'):
+ if auto_id and 'id' not in attrs and 'id' not in widget.attrs:
attrs['id'] = auto_id
- return widget.render(self.html_name, self.data, attrs=attrs)
+ if not self.form.is_bound:
+ data = self.form.initial.get(self.name, self.field.initial)
+ if callable(data):
+ data = data()
+ else:
+ data = self.data
+ return widget.render(self.html_name, data, attrs=attrs)
def as_text(self, attrs=None):
"""
@@ -234,24 +278,29 @@ class BoundField(StrAndUnicode):
"""
Returns a string of HTML for representing this as an <input type="hidden">.
"""
- return self.as_widget(HiddenInput(), attrs)
+ return self.as_widget(self.field.hidden_widget(), attrs)
def _data(self):
- "Returns the data for this BoundField, or None if it wasn't given."
+ """
+ Returns the data for this BoundField, or None if it wasn't given.
+ """
return self.field.widget.value_from_datadict(self.form.data, self.html_name)
data = property(_data)
- def label_tag(self, contents=None):
+ def label_tag(self, contents=None, attrs=None):
"""
Wraps the given contents in a <label>, if the field has an ID attribute.
Does not HTML-escape the contents. If contents aren't given, uses the
field's HTML-escaped label.
+
+ If attrs are given, they're used as HTML attributes on the <label> tag.
"""
contents = contents or escape(self.label)
widget = self.field.widget
id_ = widget.attrs.get('id') or self.auto_id
if id_:
- contents = '<label for="%s">%s</label>' % (widget.id_for_label(id_), contents)
+ attrs = attrs and flatatt(attrs) or ''
+ contents = '<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, contents)
return contents
def _is_hidden(self):
diff --git a/django/newforms/models.py b/django/newforms/models.py
index 6b111d7ee1..d51b06c78c 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -3,36 +3,196 @@ Helper functions for creating Form classes from Django models
and database field objects.
"""
-from forms import BaseForm, DeclarativeFieldsMetaclass, SortedDictFromList
+from django.utils.translation import gettext
-__all__ = ('form_for_model', 'form_for_fields')
+from util import ValidationError
+from forms import BaseForm, SortedDictFromList
+from fields import Field, ChoiceField
+from widgets import Select, SelectMultiple, MultipleHiddenInput
-def create(self, save=True):
- "Creates and returns model instance according to self.clean_data."
- if self.errors:
- raise ValueError("The %s could not be created because the data didn't validate." % self._model._meta.object_name)
- obj = self._model(**self.clean_data)
- if save:
- obj.save()
- return obj
+__all__ = (
+ 'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
+ 'ModelChoiceField', 'ModelMultipleChoiceField'
+)
-def form_for_model(model, form=None):
+def save_instance(form, instance, fields=None, fail_message='saved', commit=True):
+ """
+ Saves bound Form ``form``'s cleaned_data into model instance ``instance``.
+
+ If commit=True, then the changes to ``instance`` will be saved to the
+ database. Returns ``instance``.
+ """
+ from django.db import models
+ 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))
+ cleaned_data = form.cleaned_data
+ for f in opts.fields:
+ 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, 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 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
+ # exception in that case.
+ return instance
+
+def make_model_save(model, fields, fail_message):
+ "Returns the save() method for a Form."
+ def save(self, commit=True):
+ return save_instance(self, model(), fields, fail_message, commit)
+ return save
+
+def make_instance_save(instance, fields, fail_message):
+ "Returns the save() method for a Form."
+ def save(self, commit=True):
+ return save_instance(self, instance, fields, fail_message, commit)
+ return save
+
+def form_for_model(model, form=BaseForm, fields=None, formfield_callback=lambda f: f.formfield()):
"""
Returns a Form class for the given Django model class.
- Provide 'form' if you want to use a custom BaseForm subclass.
+ Provide ``form`` if you want to use a custom BaseForm subclass.
+
+ Provide ``formfield_callback`` if you want to define different logic for
+ determining the formfield for a given database field. It's a callable that
+ takes a database Field instance and returns a form Field instance.
"""
opts = model._meta
field_list = []
for f in opts.fields + opts.many_to_many:
- formfield = f.formfield()
+ if not f.editable:
+ continue
+ if fields and not f.name in fields:
+ continue
+ formfield = formfield_callback(f)
if formfield:
field_list.append((f.name, formfield))
- fields = SortedDictFromList(field_list)
- form = form or BaseForm
- return type(opts.object_name + 'Form', (form,), {'fields': fields, '_model': model, 'create': create})
+ base_fields = SortedDictFromList(field_list)
+ return type(opts.object_name + 'Form', (form,),
+ {'base_fields': base_fields, '_model': model, 'save': make_model_save(model, fields, 'created')})
+
+def form_for_instance(instance, form=BaseForm, fields=None, formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)):
+ """
+ Returns a Form class for the given Django model instance.
+
+ Provide ``form`` if you want to use a custom BaseForm subclass.
+
+ Provide ``formfield_callback`` if you want to define different logic for
+ determining the formfield for a given database field. It's a callable that
+ takes a database Field instance, plus **kwargs, and returns a form Field
+ instance with the given kwargs (i.e. 'initial').
+ """
+ model = instance.__class__
+ opts = model._meta
+ field_list = []
+ for f in opts.fields + opts.many_to_many:
+ if not f.editable:
+ continue
+ if fields and not f.name in fields:
+ continue
+ current_value = f.value_from_object(instance)
+ formfield = formfield_callback(f, initial=current_value)
+ if formfield:
+ field_list.append((f.name, formfield))
+ base_fields = SortedDictFromList(field_list)
+ return type(opts.object_name + 'InstanceForm', (form,),
+ {'base_fields': base_fields, '_model': model, 'save': make_instance_save(instance, fields, 'changed')})
def form_for_fields(field_list):
"Returns a Form class for the given list of Django database field instances."
- fields = SortedDictFromList([(f.name, f.formfield()) for f in field_list])
- return type('FormForFields', (BaseForm,), {'fields': fields})
+ fields = SortedDictFromList([(f.name, f.formfield()) for f in field_list if f.editable])
+ return type('FormForFields', (BaseForm,), {'base_fields': fields})
+
+class QuerySetIterator(object):
+ def __init__(self, queryset, empty_label, cache_choices):
+ self.queryset, self.empty_label, self.cache_choices = queryset, empty_label, cache_choices
+
+ def __iter__(self):
+ if self.empty_label is not None:
+ yield (u"", self.empty_label)
+ for obj in self.queryset:
+ yield (obj._get_pk_val(), str(obj))
+ # Clear the QuerySet cache if required.
+ if not self.cache_choices:
+ self.queryset._result_cache = None
+
+class ModelChoiceField(ChoiceField):
+ "A ChoiceField whose choices are a model QuerySet."
+ # This class is a subclass of ChoiceField for purity, but it doesn't
+ # actually use any of ChoiceField's implementation.
+ def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
+ required=True, widget=Select, label=None, initial=None, help_text=None):
+ self.queryset = queryset
+ self.empty_label = empty_label
+ self.cache_choices = cache_choices
+ # Call Field instead of ChoiceField __init__() because we don't need
+ # ChoiceField.__init__().
+ Field.__init__(self, required, widget, label, initial, help_text)
+ self.widget.choices = self.choices
+
+ def _get_choices(self):
+ # If self._choices is set, then somebody must have manually set
+ # the property self.choices. In this case, just return self._choices.
+ if hasattr(self, '_choices'):
+ return self._choices
+ # Otherwise, execute the QuerySet in self.queryset to determine the
+ # choices dynamically. Return a fresh QuerySetIterator that has not
+ # been consumed. Note that we're instantiating a new QuerySetIterator
+ # *each* time _get_choices() is called (and, thus, each time
+ # self.choices is accessed) so that we can ensure the QuerySet has not
+ # been consumed.
+ return QuerySetIterator(self.queryset, self.empty_label, self.cache_choices)
+
+ def _set_choices(self, value):
+ # This method is copied from ChoiceField._set_choices(). It's necessary
+ # because property() doesn't allow a subclass to overwrite only
+ # _get_choices without implementing _set_choices.
+ self._choices = self.widget.choices = list(value)
+
+ choices = property(_get_choices, _set_choices)
+
+ def clean(self, value):
+ Field.clean(self, value)
+ if value in ('', None):
+ return None
+ try:
+ value = self.queryset.model._default_manager.get(pk=value)
+ except self.queryset.model.DoesNotExist:
+ raise ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
+ return value
+
+class ModelMultipleChoiceField(ModelChoiceField):
+ "A MultipleChoiceField whose choices are a model QuerySet."
+ hidden_widget = MultipleHiddenInput
+ def __init__(self, queryset, cache_choices=False, required=True,
+ widget=SelectMultiple, label=None, initial=None, help_text=None):
+ super(ModelMultipleChoiceField, self).__init__(queryset, None, cache_choices,
+ required, widget, label, initial, help_text)
+
+ def clean(self, value):
+ if self.required and not value:
+ raise ValidationError(gettext(u'This field is required.'))
+ elif not self.required and not value:
+ return []
+ if not isinstance(value, (list, tuple)):
+ raise ValidationError(gettext(u'Enter a list of values.'))
+ final_values = []
+ for val in value:
+ try:
+ obj = self.queryset.model._default_manager.get(pk=val)
+ except self.queryset.model.DoesNotExist:
+ raise ValidationError(gettext(u'Select a valid choice. %s is not one of the available choices.') % val)
+ else:
+ final_values.append(obj)
+ return final_values
diff --git a/django/newforms/util.py b/django/newforms/util.py
index a78623a17b..891585cba2 100644
--- a/django/newforms/util.py
+++ b/django/newforms/util.py
@@ -1,21 +1,14 @@
-from django.conf import settings
+from django.utils.html import escape
+from django.utils.encoding import smart_unicode
-def smart_unicode(s):
- if not isinstance(s, basestring):
- s = unicode(str(s))
- elif not isinstance(s, unicode):
- s = unicode(s, settings.DEFAULT_CHARSET)
- return s
-
-class StrAndUnicode(object):
+def flatatt(attrs):
"""
- A class whose __str__ returns its __unicode__ as a bytestring
- according to settings.DEFAULT_CHARSET.
-
- Useful as a mix-in.
+ Convert a dictionary of attributes to a single string.
+ The returned string will contain a leading space followed by key="value",
+ XML-style pairs. It is assumed that the keys do not need to be XML-escaped.
+ If the passed dictionary is empty, then return an empty string.
"""
- def __str__(self):
- return self.__unicode__().encode(settings.DEFAULT_CHARSET)
+ return u''.join([u' %s="%s"' % (k, escape(v)) for k, v in attrs.items()])
class ErrorDict(dict):
"""
diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py
index 996e353775..6ee3177a25 100644
--- a/django/newforms/widgets.py
+++ b/django/newforms/widgets.py
@@ -2,31 +2,35 @@
HTML Widget classes
"""
-__all__ = (
- 'Widget', 'TextInput', 'PasswordInput', 'HiddenInput', 'FileInput',
- 'Textarea', 'CheckboxInput',
- 'Select', 'SelectMultiple', 'RadioSelect', 'CheckboxSelectMultiple',
-)
-
-from util import StrAndUnicode, smart_unicode
-from django.utils.datastructures import MultiValueDict
-from django.utils.html import escape
-from itertools import chain
-
try:
set # Only available in Python 2.4+
except NameError:
from sets import Set as set # Python 2.3 fallback
+from itertools import chain
-# Converts a dictionary to a single string with key="value", XML-style with
-# a leading space. Assumes keys do not need to be XML-escaped.
-flatatt = lambda attrs: u''.join([u' %s="%s"' % (k, escape(v)) for k, v in attrs.items()])
+from django.utils.datastructures import MultiValueDict
+from django.utils.html import escape
+from django.utils.translation import gettext
+from django.utils.encoding import StrAndUnicode, smart_unicode
+
+from util import flatatt
+
+__all__ = (
+ 'Widget', 'TextInput', 'PasswordInput',
+ 'HiddenInput', 'MultipleHiddenInput',
+ 'FileInput', 'Textarea', 'CheckboxInput',
+ 'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
+ 'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
+)
class Widget(object):
is_hidden = False # Determines whether this corresponds to an <input type="hidden">.
def __init__(self, attrs=None):
- self.attrs = attrs or {}
+ if attrs is not None:
+ self.attrs = attrs.copy()
+ else:
+ self.attrs = {}
def render(self, name, value, attrs=None):
"""
@@ -83,14 +87,48 @@ class TextInput(Input):
class PasswordInput(Input):
input_type = 'password'
+ def __init__(self, attrs=None, render_value=True):
+ self.attrs = attrs or {}
+ self.render_value = render_value
+
+ def render(self, name, value, attrs=None):
+ if not self.render_value: value=None
+ return super(PasswordInput, self).render(name, value, attrs)
+
class HiddenInput(Input):
input_type = 'hidden'
is_hidden = True
+class MultipleHiddenInput(HiddenInput):
+ """
+ A widget that handles <input type="hidden"> for fields that have a list
+ of values.
+ """
+ def __init__(self, attrs=None, choices=()):
+ # choices can be any iterable
+ self.attrs = attrs or {}
+ self.choices = choices
+
+ def render(self, name, value, attrs=None, choices=()):
+ if value is None: value = []
+ final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
+ return u'\n'.join([(u'<input%s />' % flatatt(dict(value=smart_unicode(v), **final_attrs))) for v in value])
+
+ def value_from_datadict(self, data, name):
+ if isinstance(data, MultiValueDict):
+ return data.getlist(name)
+ return data.get(name, None)
+
class FileInput(Input):
input_type = 'file'
class Textarea(Widget):
+ def __init__(self, attrs=None):
+ # The 'rows' and 'cols' attributes are required for HTML correctness.
+ self.attrs = {'cols': '40', 'rows': '10'}
+ if attrs:
+ self.attrs.update(attrs)
+
def render(self, name, value, attrs=None):
if value is None: value = ''
value = smart_unicode(value)
@@ -118,9 +156,11 @@ class CheckboxInput(Widget):
class Select(Widget):
def __init__(self, attrs=None, choices=()):
- # choices can be any iterable
self.attrs = attrs or {}
- self.choices = choices
+ # choices can be any iterable, but we may need to render this widget
+ # multiple times. Thus, collapse it into a list so it can be consumed
+ # more than once.
+ self.choices = list(choices)
def render(self, name, value, attrs=None, choices=()):
if value is None: value = ''
@@ -134,6 +174,25 @@ class Select(Widget):
output.append(u'</select>')
return u'\n'.join(output)
+class NullBooleanSelect(Select):
+ """
+ A Select Widget intended to be used with NullBooleanField.
+ """
+ def __init__(self, attrs=None):
+ choices = ((u'1', gettext('Unknown')), (u'2', gettext('Yes')), (u'3', gettext('No')))
+ super(NullBooleanSelect, self).__init__(attrs, choices)
+
+ def render(self, name, value, attrs=None, choices=()):
+ try:
+ value = {True: u'2', False: u'3', u'2': u'2', u'3': u'3'}[value]
+ except KeyError:
+ value = u'1'
+ return super(NullBooleanSelect, self).render(name, value, attrs, choices)
+
+ def value_from_datadict(self, data, name):
+ value = data.get(name, None)
+ return {u'2': True, u'3': False, True: True, False: False}.get(value, None)
+
class SelectMultiple(Widget):
def __init__(self, attrs=None, choices=()):
# choices can be any iterable
@@ -162,17 +221,18 @@ class RadioInput(StrAndUnicode):
def __init__(self, name, value, attrs, choice, index):
self.name, self.value = name, value
self.attrs = attrs
- self.choice_value, self.choice_label = choice
+ self.choice_value = smart_unicode(choice[0])
+ self.choice_label = smart_unicode(choice[1])
self.index = index
def __unicode__(self):
return u'<label>%s %s</label>' % (self.tag(), self.choice_label)
def is_checked(self):
- return self.value == smart_unicode(self.choice_value)
+ return self.value == self.choice_value
def tag(self):
- if self.attrs.has_key('id'):
+ if 'id' in self.attrs:
self.attrs['id'] = '%s_%s' % (self.attrs['id'], self.index)
final_attrs = dict(self.attrs, type='radio', name=self.name, value=self.choice_value)
if self.is_checked():
@@ -202,8 +262,8 @@ class RadioSelect(Select):
"Returns a RadioFieldRenderer instance rather than a Unicode string."
if value is None: value = ''
str_value = smart_unicode(value) # Normalize to string.
- attrs = attrs or {}
- return RadioFieldRenderer(name, str_value, attrs, list(chain(self.choices, choices)))
+ final_attrs = self.build_attrs(attrs)
+ return RadioFieldRenderer(name, str_value, final_attrs, list(chain(self.choices, choices)))
def id_for_label(self, id_):
# RadioSelect is represented by multiple <input type="radio"> fields,
@@ -218,11 +278,16 @@ class RadioSelect(Select):
class CheckboxSelectMultiple(SelectMultiple):
def render(self, name, value, attrs=None, choices=()):
if value is None: value = []
+ has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
output = [u'<ul>']
str_values = set([smart_unicode(v) for v in value]) # Normalize to strings.
- cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
- for option_value, option_label in chain(self.choices, choices):
+ for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
+ # If an ID attribute was given, add a numeric index as a suffix,
+ # so that the checkboxes don't all have the same ID attribute.
+ if has_id:
+ final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
+ cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
option_value = smart_unicode(option_value)
rendered_cb = cb.render(name, option_value)
output.append(u'<li><label>%s %s</label></li>' % (rendered_cb, escape(smart_unicode(option_label))))
@@ -235,3 +300,77 @@ class CheckboxSelectMultiple(SelectMultiple):
id_ += '_0'
return id_
id_for_label = classmethod(id_for_label)
+
+class MultiWidget(Widget):
+ """
+ A widget that is composed of multiple widgets.
+
+ Its render() method takes a "decompressed" list of values, not a single
+ value. Each value in this list is rendered in the corresponding widget --
+ the first value is rendered in the first widget, the second value is
+ rendered in the second widget, etc.
+
+ Subclasses should implement decompress(), which specifies how a single
+ value should be converted to a list of values. Subclasses should not
+ have to implement clean().
+
+ Subclasses may implement format_output(), which takes the list of rendered
+ widgets and returns HTML that formats them any way you'd like.
+
+ You'll probably want to use this with MultiValueField.
+ """
+ def __init__(self, widgets, attrs=None):
+ self.widgets = [isinstance(w, type) and w() or w for w in widgets]
+ super(MultiWidget, self).__init__(attrs)
+
+ def render(self, name, value, attrs=None):
+ # value is a list of values, each corresponding to a widget
+ # in self.widgets.
+ if not isinstance(value, list):
+ value = self.decompress(value)
+ output = []
+ final_attrs = self.build_attrs(attrs)
+ id_ = final_attrs.get('id', None)
+ for i, widget in enumerate(self.widgets):
+ try:
+ widget_value = value[i]
+ except IndexError:
+ widget_value = None
+ if id_:
+ final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
+ output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
+ return self.format_output(output)
+
+ def id_for_label(self, id_):
+ # See the comment for RadioSelect.id_for_label()
+ if id_:
+ id_ += '_0'
+ return id_
+ id_for_label = classmethod(id_for_label)
+
+ def value_from_datadict(self, data, name):
+ return [widget.value_from_datadict(data, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
+
+ def format_output(self, rendered_widgets):
+ return u''.join(rendered_widgets)
+
+ def decompress(self, value):
+ """
+ Returns a list of decompressed values for the given compressed value.
+ The given value can be assumed to be valid, but not necessarily
+ non-empty.
+ """
+ raise NotImplementedError('Subclasses must implement this method.')
+
+class SplitDateTimeWidget(MultiWidget):
+ """
+ A Widget that splits datetime input into two <input type="text"> boxes.
+ """
+ def __init__(self, attrs=None):
+ widgets = (TextInput(attrs=attrs), TextInput(attrs=attrs))
+ super(SplitDateTimeWidget, self).__init__(widgets, attrs)
+
+ def decompress(self, value):
+ if value:
+ return [value.date(), value.time()]
+ return [None, None]
diff --git a/django/oldforms/__init__.py b/django/oldforms/__init__.py
index 0b9ac05edb..ea1f425ad3 100644
--- a/django/oldforms/__init__.py
+++ b/django/oldforms/__init__.py
@@ -130,7 +130,9 @@ class FormWrapper(object):
if self.edit_inline:
self.fill_inline_collections()
for inline_collection in self._inline_collections:
- if inline_collection.name == key:
+ # The 'orig_name' comparison is for backwards compatibility
+ # with hand-crafted forms.
+ if inline_collection.name == key or (':' not in key and inline_collection.orig_name == key):
return inline_collection
raise KeyError, "Could not find Formfield or InlineObjectCollection named %r" % key
@@ -226,6 +228,9 @@ class InlineObjectCollection(object):
self.errors = errors
self._collections = None
self.name = rel_obj.name
+ # This is the name used prior to fixing #1839. Needs for backwards
+ # compatibility.
+ self.orig_name = rel_obj.opts.module_name
def __len__(self):
self.fill()
@@ -304,6 +309,10 @@ class FormField(object):
return data
html2python = staticmethod(html2python)
+ def iter_render(self, data):
+ # this even needed?
+ return (self.render(data),)
+
def render(self, data):
raise NotImplementedError
@@ -324,7 +333,7 @@ class FormField(object):
def convert_post_data(self, new_data):
name = self.get_member_name()
- if new_data.has_key(self.field_name):
+ if self.field_name in new_data:
d = new_data.getlist(self.field_name)
try:
converted_data = [self.__class__.html2python(data) for data in d]
@@ -569,7 +578,7 @@ class NullBooleanField(SelectField):
"This SelectField provides 'Yes', 'No' and 'Unknown', mapping results to True, False or None"
def __init__(self, field_name, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
- SelectField.__init__(self, field_name, choices=[('1', 'Unknown'), ('2', 'Yes'), ('3', 'No')],
+ SelectField.__init__(self, field_name, choices=[('1', _('Unknown')), ('2', _('Yes')), ('3', _('No'))],
is_required=is_required, validator_list=validator_list)
def render(self, data):
@@ -745,14 +754,27 @@ class PositiveSmallIntegerField(IntegerField):
raise validators.CriticalValidationError, gettext("Enter a whole number between 0 and 32,767.")
class FloatField(TextField):
+ def __init__(self, field_name, is_required=False, validator_list=None):
+ if validator_list is None: validator_list = []
+ validator_list = [validators.isValidFloat] + validator_list
+ TextField.__init__(self, field_name, is_required=is_required, validator_list=validator_list)
+
+ def html2python(data):
+ if data == '' or data is None:
+ return None
+ return float(data)
+ html2python = staticmethod(html2python)
+
+class DecimalField(TextField):
def __init__(self, field_name, max_digits, decimal_places, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
self.max_digits, self.decimal_places = max_digits, decimal_places
- validator_list = [self.isValidFloat] + validator_list
- TextField.__init__(self, field_name, max_digits+2, max_digits+2, is_required, validator_list)
+ validator_list = [self.isValidDecimal] + validator_list
+ # Initialise the TextField, making sure it's large enough to fit the number with a - sign and a decimal point.
+ super(DecimalField, self).__init__(field_name, max_digits+2, max_digits+2, is_required, validator_list)
- def isValidFloat(self, field_data, all_data):
- v = validators.IsValidFloat(self.max_digits, self.decimal_places)
+ def isValidDecimal(self, field_data, all_data):
+ v = validators.IsValidDecimal(self.max_digits, self.decimal_places)
try:
v(field_data, all_data)
except validators.ValidationError, e:
@@ -761,7 +783,14 @@ class FloatField(TextField):
def html2python(data):
if data == '' or data is None:
return None
- return float(data)
+ try:
+ import decimal
+ except ImportError:
+ from django.utils import _decimal as decimal
+ try:
+ return decimal.Decimal(data)
+ except decimal.InvalidOperation, e:
+ raise ValueError, e
html2python = staticmethod(html2python)
####################
@@ -918,7 +947,8 @@ class FilePathField(SelectField):
for root, dirs, files in os.walk(path):
for f in files:
if match is None or match_re.search(f):
- choices.append((os.path.join(root, f), f))
+ f = os.path.join(root, f)
+ choices.append((f, f.replace(path, "", 1)))
else:
try:
for f in os.listdir(path):
@@ -958,7 +988,9 @@ class USStateField(TextField):
raise validators.CriticalValidationError, e.messages
def html2python(data):
- return data.upper() # Should always be stored in upper case
+ if data:
+ return data.upper() # Should always be stored in upper case
+ return data
html2python = staticmethod(html2python)
class CommaSeparatedIntegerField(TextField):
diff --git a/django/shortcuts/__init__.py b/django/shortcuts/__init__.py
index 76d54917ad..3a0f6a0091 100644
--- a/django/shortcuts/__init__.py
+++ b/django/shortcuts/__init__.py
@@ -4,20 +4,29 @@
from django.template import loader
from django.http import HttpResponse, Http404
-
+from django.db.models.manager import Manager
def render_to_response(*args, **kwargs):
- return HttpResponse(loader.render_to_string(*args, **kwargs))
+ return HttpResponse(loader.render_to_iter(*args, **kwargs))
load_and_render = render_to_response # For backwards compatibility.
def get_object_or_404(klass, *args, **kwargs):
+ if isinstance(klass, Manager):
+ manager = klass
+ klass = manager.model
+ else:
+ manager = klass._default_manager
try:
- return klass._default_manager.get(*args, **kwargs)
+ return manager.get(*args, **kwargs)
except klass.DoesNotExist:
- raise Http404
+ raise Http404('No %s matches the given query.' % klass._meta.object_name)
def get_list_or_404(klass, *args, **kwargs):
- obj_list = list(klass._default_manager.filter(*args, **kwargs))
+ if isinstance(klass, Manager):
+ manager = klass
+ else:
+ manager = klass._default_manager
+ obj_list = list(manager.filter(*args, **kwargs))
if not obj_list:
- raise Http404
+ raise Http404('No %s matches the given query.' % manager.model._meta.object_name)
return obj_list
diff --git a/django/template/__init__.py b/django/template/__init__.py
index 7718801684..7495eea878 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -55,6 +55,7 @@ times with multiple contexts)
'\n<html>\n\n</html>\n'
"""
import re
+import types
from inspect import getargspec
from django.conf import settings
from django.template.context import Context, RequestContext, ContextPopException
@@ -91,12 +92,18 @@ UNKNOWN_SOURCE="&lt;unknown source&gt;"
tag_re = re.compile('(%s.*?%s|%s.*?%s|%s.*?%s)' % (re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END),
re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END),
re.escape(COMMENT_TAG_START), re.escape(COMMENT_TAG_END)))
+# matches if the string is valid number
+number_re = re.compile(r'[-+]?(\d+|\d*\.\d+)$')
# global dictionary of libraries that have been loaded using get_library
libraries = {}
# global list of libraries to load by default for a new parser
builtins = []
+# True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means
+# uninitialised.
+invalid_var_format_string = None
+
class TemplateSyntaxError(Exception):
def __str__(self):
try:
@@ -117,7 +124,13 @@ class TemplateDoesNotExist(Exception):
pass
class VariableDoesNotExist(Exception):
- pass
+
+ def __init__(self, msg, params=()):
+ self.msg = msg
+ self.params = params
+
+ def __str__(self):
+ return self.msg % self.params
class InvalidTemplateLibrary(Exception):
pass
@@ -155,9 +168,12 @@ class Template(object):
for subnode in node:
yield subnode
- def render(self, context):
+ def iter_render(self, context):
"Display stage -- can be called many times"
- return self.nodelist.render(context)
+ return self.nodelist.iter_render(context)
+
+ def render(self, context):
+ return ''.join(self.iter_render(context))
def compile_string(template_string, origin):
"Compiles template_string into NodeList ready for rendering"
@@ -185,18 +201,27 @@ class Lexer(object):
def tokenize(self):
"Return a list of tokens from a given template_string"
- # remove all empty strings, because the regex has a tendency to add them
- bits = filter(None, tag_re.split(self.template_string))
- return map(self.create_token, bits)
-
- def create_token(self,token_string):
- "Convert the given token string into a new Token object and return it"
- if token_string.startswith(VARIABLE_TAG_START):
- token = Token(TOKEN_VAR, token_string[len(VARIABLE_TAG_START):-len(VARIABLE_TAG_END)].strip())
- elif token_string.startswith(BLOCK_TAG_START):
- token = Token(TOKEN_BLOCK, token_string[len(BLOCK_TAG_START):-len(BLOCK_TAG_END)].strip())
- elif token_string.startswith(COMMENT_TAG_START):
- token = Token(TOKEN_COMMENT, '')
+ in_tag = False
+ result = []
+ for bit in tag_re.split(self.template_string):
+ if bit:
+ result.append(self.create_token(bit, in_tag))
+ in_tag = not in_tag
+ return result
+
+ def create_token(self, token_string, in_tag):
+ """
+ Convert the given token string into a new Token object and return it.
+ If in_tag is True, we are processing something that matched a tag,
+ otherwise it should be treated as a literal string.
+ """
+ if in_tag:
+ if token_string.startswith(VARIABLE_TAG_START):
+ token = Token(TOKEN_VAR, token_string[len(VARIABLE_TAG_START):-len(VARIABLE_TAG_END)].strip())
+ elif token_string.startswith(BLOCK_TAG_START):
+ token = Token(TOKEN_BLOCK, token_string[len(BLOCK_TAG_START):-len(BLOCK_TAG_END)].strip())
+ elif token_string.startswith(COMMENT_TAG_START):
+ token = Token(TOKEN_COMMENT, '')
else:
token = Token(TOKEN_TEXT, token_string)
return token
@@ -207,22 +232,22 @@ class DebugLexer(Lexer):
def tokenize(self):
"Return a list of tokens from a given template_string"
- token_tups, upto = [], 0
+ result, upto = [], 0
for match in tag_re.finditer(self.template_string):
start, end = match.span()
if start > upto:
- token_tups.append( (self.template_string[upto:start], (upto, start)) )
+ result.append(self.create_token(self.template_string[upto:start], (upto, start), False))
upto = start
- token_tups.append( (self.template_string[start:end], (start,end)) )
+ result.append(self.create_token(self.template_string[start:end], (start, end), True))
upto = end
last_bit = self.template_string[upto:]
if last_bit:
- token_tups.append( (last_bit, (upto, upto + len(last_bit))) )
- return [self.create_token(tok, (self.origin, loc)) for tok, loc in token_tups]
+ result.append(self.create_token(last_bit, (upto, upto + len(last_bit)), False))
+ return result
- def create_token(self, token_string, source):
- token = super(DebugLexer, self).create_token(token_string)
- token.source = source
+ def create_token(self, token_string, source, in_tag):
+ token = super(DebugLexer, self).create_token(token_string, in_tag)
+ token.source = self.origin, source
return token
class Parser(object):
@@ -330,7 +355,7 @@ class Parser(object):
return FilterExpression(token, self)
def find_filter(self, filter_name):
- if self.filters.has_key(filter_name):
+ if filter_name in self.filters:
return self.filters[filter_name]
else:
raise TemplateSyntaxError, "Invalid filter: '%s'" % filter_name
@@ -458,7 +483,7 @@ class TokenParser(object):
while i < len(subject) and subject[i] != c:
i += 1
if i >= len(subject):
- raise TemplateSyntaxError, "Searching for value. Unexpected end of string in column %d: %s" % subject
+ raise TemplateSyntaxError, "Searching for value. Unexpected end of string in column %d: %s" % (i, subject)
i += 1
s = subject[p:i]
while i < len(subject) and subject[i] in (' ', '\t'):
@@ -467,9 +492,6 @@ class TokenParser(object):
self.pointer = i
return s
-
-
-
filter_raw_string = r"""
^%(i18n_open)s"(?P<i18n_constant>%(str)s)"%(i18n_close)s|
^"(?P<constant>%(str)s)"|
@@ -547,7 +569,7 @@ class FilterExpression(object):
filters.append( (filter_func,args))
upto = match.end()
if upto != len(token):
- raise TemplateSyntaxError, "Could not parse the remainder: %s" % token[upto:]
+ raise TemplateSyntaxError, "Could not parse the remainder: '%s' from '%s'" % (token[upto:], token)
self.var, self.filters = var, filters
def resolve(self, context, ignore_failures=False):
@@ -558,6 +580,11 @@ class FilterExpression(object):
obj = None
else:
if settings.TEMPLATE_STRING_IF_INVALID:
+ global invalid_var_format_string
+ if invalid_var_format_string is None:
+ invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
+ if invalid_var_format_string:
+ return settings.TEMPLATE_STRING_IF_INVALID % self.var
return settings.TEMPLATE_STRING_IF_INVALID
else:
obj = settings.TEMPLATE_STRING_IF_INVALID
@@ -574,6 +601,8 @@ class FilterExpression(object):
def args_check(name, func, provided):
provided = list(provided)
plen = len(provided)
+ # Check to see if a decorator is providing the real function.
+ func = getattr(func, '_decorated_function', func)
args, varargs, varkw, defaults = getargspec(func)
# First argument is filter input.
args.pop(0)
@@ -624,12 +653,9 @@ def resolve_variable(path, context):
(The example assumes VARIABLE_ATTRIBUTE_SEPARATOR is '.')
"""
- if path[0].isdigit():
+ if number_re.match(path):
number_type = '.' in path and float or int
- try:
- current = number_type(path)
- except ValueError:
- current = settings.TEMPLATE_STRING_IF_INVALID
+ current = number_type(path)
elif path[0] in ('"', "'") and path[0] == path[-1]:
current = path[1:-1]
else:
@@ -659,8 +685,12 @@ def resolve_variable(path, context):
except (TypeError, AttributeError):
try: # list-index lookup
current = current[int(bits[0])]
- except (IndexError, ValueError, KeyError):
- raise VariableDoesNotExist, "Failed lookup for key [%s] in %r" % (bits[0], current) # missing attribute
+ except (IndexError, # list index out of range
+ ValueError, # invalid literal for int()
+ KeyError, # current is a dict without `int(bits[0])` key
+ TypeError, # unsubscriptable object
+ ):
+ raise VariableDoesNotExist("Failed lookup for key [%s] in %r", (bits[0], current)) # missing attribute
except Exception, e:
if getattr(e, 'silent_variable_failure', False):
current = settings.TEMPLATE_STRING_IF_INVALID
@@ -669,10 +699,26 @@ def resolve_variable(path, context):
del bits[0]
return current
+class NodeBase(type):
+ def __new__(cls, name, bases, attrs):
+ """
+ Ensures that either a 'render' or 'render_iter' method is defined on
+ any Node sub-class. This avoids potential infinite loops at runtime.
+ """
+ if not (isinstance(attrs.get('render'), types.FunctionType) or
+ isinstance(attrs.get('iter_render'), types.FunctionType)):
+ raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.')
+ return type.__new__(cls, name, bases, attrs)
+
class Node(object):
+ __metaclass__ = NodeBase
+
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
"Return the node rendered as a string"
- pass
+ return ''.join(self.iter_render(context))
def __iter__(self):
yield self
@@ -688,13 +734,12 @@ class Node(object):
class NodeList(list):
def render(self, context):
- bits = []
+ return ''.join(self.iter_render(context))
+
+ def iter_render(self, context):
for node in self:
- if isinstance(node, Node):
- bits.append(self.render_node(node, context))
- else:
- bits.append(node)
- return ''.join(bits)
+ for chunk in node.iter_render(context):
+ yield chunk
def get_nodes_by_type(self, nodetype):
"Return a list of all nodes of the given type"
@@ -703,24 +748,25 @@ class NodeList(list):
nodes.extend(node.get_nodes_by_type(nodetype))
return nodes
- def render_node(self, node, context):
- return(node.render(context))
-
class DebugNodeList(NodeList):
- def render_node(self, node, context):
- try:
- result = node.render(context)
- except TemplateSyntaxError, e:
- if not hasattr(e, 'source'):
- e.source = node.source
- raise
- except Exception, e:
- from sys import exc_info
- wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e)
- wrapped.source = node.source
- wrapped.exc_info = exc_info()
- raise wrapped
- return result
+ def iter_render(self, context):
+ for node in self:
+ if not isinstance(node, Node):
+ yield node
+ continue
+ try:
+ for chunk in node.iter_render(context):
+ yield chunk
+ except TemplateSyntaxError, e:
+ if not hasattr(e, 'source'):
+ e.source = node.source
+ raise
+ except Exception, e:
+ from sys import exc_info
+ wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e)
+ wrapped.source = node.source
+ wrapped.exc_info = exc_info()
+ raise wrapped
class TextNode(Node):
def __init__(self, s):
@@ -729,6 +775,9 @@ class TextNode(Node):
def __repr__(self):
return "<Text Node: '%s'>" % self.s[:25]
+ def iter_render(self, context):
+ return (self.s,)
+
def render(self, context):
return self.s
@@ -752,6 +801,9 @@ class VariableNode(Node):
else:
return output
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
output = self.filter_expression.resolve(context)
return self.encode_output(output)
@@ -806,7 +858,7 @@ class Library(object):
raise InvalidTemplateLibrary, "Unsupported arguments to Library.tag: (%r, %r)", (name, compile_function)
def tag_function(self,func):
- self.tags[func.__name__] = func
+ self.tags[getattr(func, "_decorated_function", func).__name__] = func
return func
def filter(self, name=None, filter_func=None):
@@ -830,7 +882,7 @@ class Library(object):
raise InvalidTemplateLibrary, "Unsupported arguments to Library.filter: (%r, %r)", (name, filter_func)
def filter_function(self, func):
- self.filters[func.__name__] = func
+ self.filters[getattr(func, "_decorated_function", func).__name__] = func
return func
def simple_tag(self,func):
@@ -840,13 +892,16 @@ class Library(object):
def __init__(self, vars_to_resolve):
self.vars_to_resolve = vars_to_resolve
+ #def iter_render(self, context):
+ # return (self.render(context),)
+
def render(self, context):
resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
return func(*resolved_vars)
- compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, SimpleNode)
+ compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, SimpleNode)
compile_func.__doc__ = func.__doc__
- self.tag(func.__name__, compile_func)
+ self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
return func
def inclusion_tag(self, file_name, context_class=Context, takes_context=False):
@@ -862,7 +917,7 @@ class Library(object):
def __init__(self, vars_to_resolve):
self.vars_to_resolve = vars_to_resolve
- def render(self, context):
+ def iter_render(self, context):
resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
if takes_context:
args = [context] + resolved_vars
@@ -878,11 +933,11 @@ class Library(object):
else:
t = get_template(file_name)
self.nodelist = t.nodelist
- return self.nodelist.render(context_class(dict))
+ return self.nodelist.iter_render(context_class(dict))
- compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, InclusionNode)
+ compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
compile_func.__doc__ = func.__doc__
- self.tag(func.__name__, compile_func)
+ self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
return func
return dec
diff --git a/django/template/context.py b/django/template/context.py
index ba23e95ab7..59650b05fe 100644
--- a/django/template/context.py
+++ b/django/template/context.py
@@ -35,7 +35,7 @@ class Context(object):
def __getitem__(self, key):
"Get a variable's value, starting at the current context and going upward"
for d in self.dicts:
- if d.has_key(key):
+ if key in d:
return d[key]
raise KeyError(key)
@@ -45,13 +45,16 @@ class Context(object):
def has_key(self, key):
for d in self.dicts:
- if d.has_key(key):
+ if key in d:
return True
return False
+ def __contains__(self, key):
+ return self.has_key(key)
+
def get(self, key, otherwise=None):
for d in self.dicts:
- if d.has_key(key):
+ if key in d:
return d[key]
return otherwise
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 969ef7b28b..bbaceba24a 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -2,12 +2,44 @@
from django.template import resolve_variable, Library
from django.conf import settings
-from django.utils.translation import gettext
+from django.utils.translation import gettext, ngettext
import re
import random as random_module
register = Library()
+#######################
+# STRING DECORATOR #
+#######################
+
+def smart_string(obj):
+ # FUTURE: Unicode strings should probably be normalized to a specific
+ # encoding and non-unicode strings should be converted to unicode too.
+# if isinstance(obj, unicode):
+# obj = obj.encode(settings.DEFAULT_CHARSET)
+# else:
+# obj = unicode(obj, settings.DEFAULT_CHARSET)
+ # FUTURE: Replace dumb string logic below with cool unicode logic above.
+ if not isinstance(obj, basestring):
+ obj = str(obj)
+ return obj
+
+def stringfilter(func):
+ """
+ Decorator for filters which should only receive strings. The object passed
+ as the first positional argument will be converted to a string.
+ """
+ def _dec(*args, **kwargs):
+ if args:
+ args = list(args)
+ args[0] = smart_string(args[0])
+ return func(*args, **kwargs)
+
+ # Include a reference to the real function (used to check original
+ # arguments by the template parser).
+ _dec._decorated_function = getattr(func, '_decorated_function', func)
+ return _dec
+
###################
# STRINGS #
###################
@@ -16,31 +48,52 @@ register = Library()
def addslashes(value):
"Adds slashes - useful for passing strings to JavaScript, for example."
return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'")
+addslashes = stringfilter(addslashes)
def capfirst(value):
"Capitalizes the first character of the value"
- value = str(value)
return value and value[0].upper() + value[1:]
-
+capfirst = stringfilter(capfirst)
+
def fix_ampersands(value):
"Replaces ampersands with ``&amp;`` entities"
from django.utils.html import fix_ampersands
return fix_ampersands(value)
-
-def floatformat(text):
- """
- Displays a floating point number as 34.2 (with one decimal place) -- but
- only if there's a point to be displayed
+fix_ampersands = stringfilter(fix_ampersands)
+
+def floatformat(text, arg=-1):
+ """
+ If called without an argument, displays a floating point
+ number as 34.2 -- but only if there's a point to be displayed.
+ With a positive numeric argument, it displays that many decimal places
+ always.
+ With a negative numeric argument, it will display that many decimal
+ places -- but only if there's places to be displayed.
+ Examples:
+
+ * num1 = 34.23234
+ * num2 = 34.00000
+ * num1|floatformat results in 34.2
+ * num2|floatformat is 34
+ * num1|floatformat:3 is 34.232
+ * num2|floatformat:3 is 34.000
+ * num1|floatformat:-3 is 34.232
+ * num2|floatformat:-3 is 34
"""
try:
f = float(text)
except ValueError:
return ''
+ try:
+ d = int(arg)
+ except ValueError:
+ return smart_string(f)
m = f - int(f)
- if m:
- return '%.1f' % f
- else:
+ if not m and d < 0:
return '%d' % int(f)
+ else:
+ formatstr = '%%.%df' % abs(d)
+ return formatstr % f
def linenumbers(value):
"Displays text with line numbers"
@@ -51,22 +104,26 @@ def linenumbers(value):
for i, line in enumerate(lines):
lines[i] = ("%0" + width + "d. %s") % (i + 1, escape(line))
return '\n'.join(lines)
+linenumbers = stringfilter(linenumbers)
def lower(value):
"Converts a string into all lowercase"
return value.lower()
+lower = stringfilter(lower)
def make_list(value):
"""
Returns the value turned into a list. For an integer, it's a list of
digits. For a string, it's a list of characters.
"""
- return list(str(value))
+ return list(value)
+make_list = stringfilter(make_list)
def slugify(value):
"Converts to lowercase, removes non-alpha chars and converts spaces to hyphens"
value = re.sub('[^\w\s-]', '', value).strip().lower()
return re.sub('[-\s]+', '-', value)
+slugify = stringfilter(slugify)
def stringformat(value, arg):
"""
@@ -78,13 +135,14 @@ def stringformat(value, arg):
of Python string formatting
"""
try:
- return ("%" + arg) % value
+ return ("%" + str(arg)) % value
except (ValueError, TypeError):
return ""
def title(value):
"Converts a string into titlecase"
return re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title())
+title = stringfilter(title)
def truncatewords(value, arg):
"""
@@ -100,20 +158,42 @@ def truncatewords(value, arg):
if not isinstance(value, basestring):
value = str(value)
return truncate_words(value, length)
+truncatewords = stringfilter(truncatewords)
+
+def truncatewords_html(value, arg):
+ """
+ Truncates HTML after a certain number of words
+
+ Argument: Number of words to truncate after
+ """
+ from django.utils.text import truncate_html_words
+ try:
+ length = int(arg)
+ except ValueError: # invalid literal for int()
+ return value # Fail silently.
+ if not isinstance(value, basestring):
+ value = str(value)
+ return truncate_html_words(value, length)
+truncatewords_html = stringfilter(truncatewords_html)
def upper(value):
"Converts a string into all uppercase"
return value.upper()
+upper = stringfilter(upper)
def urlencode(value):
"Escapes a value for use in a URL"
import urllib
+ if not isinstance(value, basestring):
+ value = str(value)
return urllib.quote(value)
+urlencode = stringfilter(urlencode)
def urlize(value):
"Converts URLs in plain text into clickable links"
from django.utils.html import urlize
return urlize(value, nofollow=True)
+urlize = stringfilter(urlize)
def urlizetrunc(value, limit):
"""
@@ -124,10 +204,12 @@ def urlizetrunc(value, limit):
"""
from django.utils.html import urlize
return urlize(value, trim_url_limit=int(limit), nofollow=True)
+urlizetrunc = stringfilter(urlizetrunc)
def wordcount(value):
"Returns the number of words"
return len(value.split())
+wordcount = stringfilter(wordcount)
def wordwrap(value, arg):
"""
@@ -136,7 +218,8 @@ def wordwrap(value, arg):
Argument: number of characters to wrap the text at.
"""
from django.utils.text import wrap
- return wrap(str(value), int(arg))
+ return wrap(value, int(arg))
+wordwrap = stringfilter(wordwrap)
def ljust(value, arg):
"""
@@ -144,7 +227,8 @@ def ljust(value, arg):
Argument: field size
"""
- return str(value).ljust(int(arg))
+ return value.ljust(int(arg))
+ljust = stringfilter(ljust)
def rjust(value, arg):
"""
@@ -152,15 +236,18 @@ def rjust(value, arg):
Argument: field size
"""
- return str(value).rjust(int(arg))
+ return value.rjust(int(arg))
+rjust = stringfilter(rjust)
def center(value, arg):
"Centers the value in a field of a given width"
- return str(value).center(int(arg))
+ return value.center(int(arg))
+center = stringfilter(center)
def cut(value, arg):
"Removes all values of arg from the given string"
return value.replace(arg, '')
+cut = stringfilter(cut)
###################
# HTML STRINGS #
@@ -170,15 +257,18 @@ def escape(value):
"Escapes a string's HTML"
from django.utils.html import escape
return escape(value)
+escape = stringfilter(escape)
def linebreaks(value):
"Converts newlines into <p> and <br />s"
from django.utils.html import linebreaks
return linebreaks(value)
+linebreaks = stringfilter(linebreaks)
def linebreaksbr(value):
"Converts newlines into <br />s"
return value.replace('\n', '<br />')
+linebreaksbr = stringfilter(linebreaksbr)
def removetags(value, tags):
"Removes a space separated list of [X]HTML tags from the output"
@@ -189,13 +279,13 @@ def removetags(value, tags):
value = starttag_re.sub('', value)
value = endtag_re.sub('', value)
return value
+removetags = stringfilter(removetags)
def striptags(value):
"Strips all [X]HTML tags"
from django.utils.html import strip_tags
- if not isinstance(value, basestring):
- value = str(value)
return strip_tags(value)
+striptags = stringfilter(striptags)
###################
# LISTS #
@@ -230,7 +320,7 @@ def first(value):
def join(value, arg):
"Joins a list with a string, like Python's ``str.join(list)``"
try:
- return arg.join(map(str, value))
+ return arg.join(map(smart_string, value))
except AttributeError: # fail silently but nicely
return value
@@ -427,12 +517,12 @@ def filesizeformat(bytes):
return "0 bytes"
if bytes < 1024:
- return "%d byte%s" % (bytes, bytes != 1 and 's' or '')
+ return ngettext("%(size)d byte", "%(size)d bytes", bytes) % {'size': bytes}
if bytes < 1024 * 1024:
- return "%.1f KB" % (bytes / 1024)
+ return gettext("%.1f KB") % (bytes / 1024)
if bytes < 1024 * 1024 * 1024:
- return "%.1f MB" % (bytes / (1024 * 1024))
- return "%.1f GB" % (bytes / (1024 * 1024 * 1024))
+ return gettext("%.1f MB") % (bytes / (1024 * 1024))
+ return gettext("%.1f GB") % (bytes / (1024 * 1024 * 1024))
def pluralize(value, arg='s'):
"""
@@ -516,6 +606,7 @@ register.filter(timesince)
register.filter(timeuntil)
register.filter(title)
register.filter(truncatewords)
+register.filter(truncatewords_html)
register.filter(unordered_list)
register.filter(upper)
register.filter(urlencode)
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 3f3f4bda56..77fac6bec5 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -4,13 +4,22 @@ from django.template import Node, NodeList, Template, Context, resolve_variable
from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, SINGLE_BRACE_START, SINGLE_BRACE_END, COMMENT_TAG_START, COMMENT_TAG_END
from django.template import get_library, Library, InvalidTemplateLibrary
from django.conf import settings
+from django.utils.itercompat import groupby
import sys
+import re
+
+if not hasattr(__builtins__, 'reversed'):
+ # For Python 2.3.
+ # From http://www.python.org/doc/current/tut/node11.html
+ def reversed(data):
+ for index in xrange(len(data)-1, -1, -1):
+ yield data[index]
register = Library()
class CommentNode(Node):
- def render(self, context):
- return ''
+ def iter_render(self, context):
+ return ()
class CycleNode(Node):
def __init__(self, cyclevars, variable_name=None):
@@ -19,6 +28,9 @@ class CycleNode(Node):
self.counter = -1
self.variable_name = variable_name
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
self.counter += 1
value = self.cyclevars[self.counter % self.cyclevars_len]
@@ -27,26 +39,32 @@ class CycleNode(Node):
return value
class DebugNode(Node):
- def render(self, context):
+ def iter_render(self, context):
from pprint import pformat
- output = [pformat(val) for val in context]
- output.append('\n\n')
- output.append(pformat(sys.modules))
- return ''.join(output)
+ for val in context:
+ yield pformat(val)
+ yield "\n\n"
+ yield pformat(sys.modules)
class FilterNode(Node):
def __init__(self, filter_expr, nodelist):
self.filter_expr, self.nodelist = filter_expr, nodelist
- def render(self, context):
+ def iter_render(self, context):
output = self.nodelist.render(context)
# apply filters
- return self.filter_expr.resolve(Context({'var': output}))
+ context.update({'var': output})
+ filtered = self.filter_expr.resolve(context)
+ context.pop()
+ return (filtered,)
class FirstOfNode(Node):
def __init__(self, vars):
self.vars = vars
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
for var in self.vars:
try:
@@ -58,8 +76,8 @@ class FirstOfNode(Node):
return ''
class ForNode(Node):
- def __init__(self, loopvar, sequence, reversed, nodelist_loop):
- self.loopvar, self.sequence = loopvar, sequence
+ def __init__(self, loopvars, sequence, reversed, nodelist_loop):
+ self.loopvars, self.sequence = loopvars, sequence
self.reversed = reversed
self.nodelist_loop = nodelist_loop
@@ -69,7 +87,7 @@ class ForNode(Node):
else:
reversed = ''
return "<For Node: for %s in %s, tail_len: %d%s>" % \
- (self.loopvar, self.sequence, len(self.nodelist_loop), reversed)
+ (', '.join( self.loopvars ), self.sequence, len(self.nodelist_loop), reversed)
def __iter__(self):
for node in self.nodelist_loop:
@@ -82,28 +100,24 @@ class ForNode(Node):
nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype))
return nodes
- def render(self, context):
- nodelist = NodeList()
- if context.has_key('forloop'):
+ def iter_render(self, context):
+ if 'forloop' in context:
parentloop = context['forloop']
else:
parentloop = {}
context.push()
try:
values = self.sequence.resolve(context, True)
+ if values is None:
+ values = ()
+ elif not hasattr(values, '__len__'):
+ values = list(values)
except VariableDoesNotExist:
- values = []
- if values is None:
- values = []
- if not hasattr(values, '__len__'):
- values = list(values)
+ values = ()
len_values = len(values)
if self.reversed:
- # From http://www.python.org/doc/current/tut/node11.html
- def reverse(data):
- for index in range(len(data)-1, -1, -1):
- yield data[index]
- values = reverse(values)
+ values = reversed(values)
+ unpack = len(self.loopvars) > 1
for i, item in enumerate(values):
context['forloop'] = {
# shortcuts for current loop iteration number
@@ -117,11 +131,26 @@ class ForNode(Node):
'last': (i == len_values - 1),
'parentloop': parentloop,
}
- context[self.loopvar] = item
+ if unpack:
+ # If there are multiple loop variables, unpack the item into
+ # them.
+ context.update(dict(zip(self.loopvars, item)))
+ else:
+ context[self.loopvars[0]] = item
+
+ # We inline this to avoid the overhead since ForNode is pretty
+ # common.
for node in self.nodelist_loop:
- nodelist.append(node.render(context))
+ for chunk in node.iter_render(context):
+ yield chunk
+ if unpack:
+ # The loop variables were pushed on to the context so pop them
+ # off again. This is necessary because the tag lets the length
+ # of loopvars differ to the length of each set of items and we
+ # don't want to leave any vars from the previous loop on the
+ # context.
+ context.pop()
context.pop()
- return nodelist.render(context)
class IfChangedNode(Node):
def __init__(self, nodelist, *varlist):
@@ -129,8 +158,8 @@ class IfChangedNode(Node):
self._last_seen = None
self._varlist = varlist
- def render(self, context):
- if context.has_key('forloop') and context['forloop']['first']:
+ def iter_render(self, context):
+ if 'forloop' in context and context['forloop']['first']:
self._last_seen = None
try:
if self._varlist:
@@ -140,18 +169,16 @@ class IfChangedNode(Node):
else:
compare_to = self.nodelist.render(context)
except VariableDoesNotExist:
- compare_to = None
+ compare_to = None
if compare_to != self._last_seen:
firstloop = (self._last_seen == None)
self._last_seen = compare_to
context.push()
context['ifchanged'] = {'firstloop': firstloop}
- content = self.nodelist.render(context)
+ for chunk in self.nodelist.iter_render(context):
+ yield chunk
context.pop()
- return content
- else:
- return ''
class IfEqualNode(Node):
def __init__(self, var1, var2, nodelist_true, nodelist_false, negate):
@@ -162,7 +189,7 @@ class IfEqualNode(Node):
def __repr__(self):
return "<IfEqualNode>"
- def render(self, context):
+ def iter_render(self, context):
try:
val1 = resolve_variable(self.var1, context)
except VariableDoesNotExist:
@@ -172,8 +199,8 @@ class IfEqualNode(Node):
except VariableDoesNotExist:
val2 = None
if (self.negate and val1 != val2) or (not self.negate and val1 == val2):
- return self.nodelist_true.render(context)
- return self.nodelist_false.render(context)
+ return self.nodelist_true.iter_render(context)
+ return self.nodelist_false.iter_render(context)
class IfNode(Node):
def __init__(self, bool_exprs, nodelist_true, nodelist_false, link_type):
@@ -198,7 +225,7 @@ class IfNode(Node):
nodes.extend(self.nodelist_false.get_nodes_by_type(nodetype))
return nodes
- def render(self, context):
+ def iter_render(self, context):
if self.link_type == IfNode.LinkTypes.or_:
for ifnot, bool_expr in self.bool_exprs:
try:
@@ -206,8 +233,8 @@ class IfNode(Node):
except VariableDoesNotExist:
value = None
if (value and not ifnot) or (ifnot and not value):
- return self.nodelist_true.render(context)
- return self.nodelist_false.render(context)
+ return self.nodelist_true.iter_render(context)
+ return self.nodelist_false.iter_render(context)
else:
for ifnot, bool_expr in self.bool_exprs:
try:
@@ -215,8 +242,8 @@ class IfNode(Node):
except VariableDoesNotExist:
value = None
if not ((value and not ifnot) or (ifnot and not value)):
- return self.nodelist_false.render(context)
- return self.nodelist_true.render(context)
+ return self.nodelist_false.iter_render(context)
+ return self.nodelist_true.iter_render(context)
class LinkTypes:
and_ = 0,
@@ -227,21 +254,16 @@ class RegroupNode(Node):
self.target, self.expression = target, expression
self.var_name = var_name
- def render(self, context):
+ def iter_render(self, context):
obj_list = self.target.resolve(context, True)
if obj_list == None: # target_var wasn't found in context; fail silently
context[self.var_name] = []
- return ''
- output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]}
- for obj in obj_list:
- grouper = self.expression.resolve(Context({'var': obj}), True)
- # TODO: Is this a sensible way to determine equality?
- if output and repr(output[-1]['grouper']) == repr(grouper):
- output[-1]['list'].append(obj)
- else:
- output.append({'grouper': grouper, 'list': [obj]})
- context[self.var_name] = output
- return ''
+ return ()
+ # List of dictionaries in the format
+ # {'grouper': 'key', 'list': [list of contents]}.
+ context[self.var_name] = [{'grouper':key, 'list':list(val)} for key, val in
+ groupby(obj_list, lambda v, f=self.expression.resolve: f(v, True))]
+ return ()
def include_is_allowed(filepath):
for root in settings.ALLOWED_INCLUDE_ROOTS:
@@ -253,10 +275,10 @@ class SsiNode(Node):
def __init__(self, filepath, parsed):
self.filepath, self.parsed = filepath, parsed
- def render(self, context):
+ def iter_render(self, context):
if not include_is_allowed(self.filepath):
if settings.DEBUG:
- return "[Didn't have permission to include file]"
+ return ("[Didn't have permission to include file]",)
else:
return '' # Fail silently for invalid includes.
try:
@@ -267,23 +289,25 @@ class SsiNode(Node):
output = ''
if self.parsed:
try:
- t = Template(output, name=self.filepath)
- return t.render(context)
+ return Template(output, name=self.filepath).iter_render(context)
except TemplateSyntaxError, e:
if settings.DEBUG:
return "[Included template had syntax error: %s]" % e
else:
return '' # Fail silently for invalid included templates.
- return output
+ return (output,)
class LoadNode(Node):
- def render(self, context):
- return ''
+ def iter_render(self, context):
+ return ()
class NowNode(Node):
def __init__(self, format_string):
self.format_string = format_string
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
from datetime import datetime
from django.utils.dateformat import DateFormat
@@ -312,15 +336,40 @@ class TemplateTagNode(Node):
def __init__(self, tagtype):
self.tagtype = tagtype
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
return self.mapping.get(self.tagtype, '')
+class URLNode(Node):
+ def __init__(self, view_name, args, kwargs):
+ self.view_name = view_name
+ self.args = args
+ self.kwargs = kwargs
+
+ def iter_render(self, context):
+ from django.core.urlresolvers import reverse, NoReverseMatch
+ args = [arg.resolve(context) for arg in self.args]
+ kwargs = dict([(k, v.resolve(context)) for k, v in self.kwargs.items()])
+ try:
+ return (reverse(self.view_name, args=args, kwargs=kwargs),)
+ except NoReverseMatch:
+ try:
+ project_name = settings.SETTINGS_MODULE.split('.')[0]
+ return reverse(project_name + '.' + self.view_name, args=args, kwargs=kwargs)
+ except NoReverseMatch:
+ return ()
+
class WidthRatioNode(Node):
def __init__(self, val_expr, max_expr, max_width):
self.val_expr = val_expr
self.max_expr = max_expr
self.max_width = max_width
+ def iter_render(self, context):
+ return (self.render(context),)
+
def render(self, context):
try:
value = self.val_expr.resolve(context)
@@ -335,6 +384,23 @@ class WidthRatioNode(Node):
return ''
return str(int(round(ratio)))
+class WithNode(Node):
+ def __init__(self, var, name, nodelist):
+ self.var = var
+ self.name = name
+ self.nodelist = nodelist
+
+ def __repr__(self):
+ return "<WithNode>"
+
+ def iter_render(self, context):
+ val = self.var.resolve(context)
+ context.push()
+ context[self.name] = val
+ for chunk in self.nodelist.iter_render(context):
+ yield chunk
+ context.pop()
+
#@register.tag
def comment(parser, token):
"""
@@ -393,7 +459,7 @@ def cycle(parser, token):
name = args[1]
if not hasattr(parser, '_namedCycleNodes'):
raise TemplateSyntaxError("No named cycles in template: '%s' is not defined" % name)
- if not parser._namedCycleNodes.has_key(name):
+ if name not in parser._namedCycleNodes:
raise TemplateSyntaxError("Named cycle '%s' does not exist" % name)
return parser._namedCycleNodes[name]
@@ -416,6 +482,15 @@ def cycle(parser, token):
cycle = register.tag(cycle)
def debug(parser, token):
+ """
+ Output a whole load of debugging information, including the current context and imported modules.
+
+ Sample usage::
+
+ <pre>
+ {% debug %}
+ </pre>
+ """
return DebugNode()
debug = register.tag(debug)
@@ -438,7 +513,7 @@ def do_filter(parser, token):
nodelist = parser.parse(('endfilter',))
parser.delete_first_token()
return FilterNode(filter_expr, nodelist)
-filter = register.tag("filter", do_filter)
+do_filter = register.tag("filter", do_filter)
#@register.tag
def firstof(parser, token):
@@ -482,8 +557,14 @@ def do_for(parser, token):
{% endfor %}
</ul>
- You can also loop over a list in reverse by using
+ You can loop over a list in reverse by using
``{% for obj in list reversed %}``.
+
+ You can also unpack multiple values from a two-dimensional array::
+
+ {% for key,value in dict.items %}
+ {{ key }}: {{ value }}
+ {% endfor %}
The for loop sets a number of variables available within the loop:
@@ -504,36 +585,26 @@ def do_for(parser, token):
"""
bits = token.contents.split()
- if len(bits) == 5 and bits[4] != 'reversed':
- raise TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents
- if len(bits) not in (4, 5):
- raise TemplateSyntaxError, "'for' statements should have either four or five words: %s" % token.contents
- if bits[2] != 'in':
- raise TemplateSyntaxError, "'for' statement must contain 'in' as the second word: %s" % token.contents
- loopvar = bits[1]
- sequence = parser.compile_filter(bits[3])
- reversed = (len(bits) == 5)
+ if len(bits) < 4:
+ raise TemplateSyntaxError, "'for' statements should have at least four words: %s" % token.contents
+
+ reversed = bits[-1] == 'reversed'
+ in_index = reversed and -3 or -2
+ if bits[in_index] != 'in':
+ raise TemplateSyntaxError, "'for' statements should use the format 'for x in y': %s" % token.contents
+
+ loopvars = re.sub(r' *, *', ',', ' '.join(bits[1:in_index])).split(',')
+ for var in loopvars:
+ if not var or ' ' in var:
+ raise TemplateSyntaxError, "'for' tag received an invalid argument: %s" % token.contents
+
+ sequence = parser.compile_filter(bits[in_index+1])
nodelist_loop = parser.parse(('endfor',))
parser.delete_first_token()
- return ForNode(loopvar, sequence, reversed, nodelist_loop)
+ return ForNode(loopvars, sequence, reversed, nodelist_loop)
do_for = register.tag("for", do_for)
def do_ifequal(parser, token, negate):
- """
- Output the contents of the block if the two arguments equal/don't equal each other.
-
- Examples::
-
- {% ifequal user.id comment.user_id %}
- ...
- {% endifequal %}
-
- {% ifnotequal user.id comment.user_id %}
- ...
- {% else %}
- ...
- {% endifnotequal %}
- """
bits = list(token.split_contents())
if len(bits) != 3:
raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
@@ -549,11 +620,27 @@ def do_ifequal(parser, token, negate):
#@register.tag
def ifequal(parser, token):
+ """
+ Output the contents of the block if the two arguments equal each other.
+
+ Examples::
+
+ {% ifequal user.id comment.user_id %}
+ ...
+ {% endifequal %}
+
+ {% ifnotequal user.id comment.user_id %}
+ ...
+ {% else %}
+ ...
+ {% endifnotequal %}
+ """
return do_ifequal(parser, token, False)
ifequal = register.tag(ifequal)
#@register.tag
def ifnotequal(parser, token):
+ """Output the contents of the block if the two arguments are not equal. See ifequal."""
return do_ifequal(parser, token, True)
ifnotequal = register.tag(ifnotequal)
@@ -566,8 +653,8 @@ def do_if(parser, token):
::
- {% if althlete_list %}
- Number of athletes: {{ althete_list|count }}
+ {% if athlete_list %}
+ Number of athletes: {{ athlete_list|count }}
{% else %}
No athletes.
{% endif %}
@@ -798,7 +885,7 @@ def regroup(parser, token):
if lastbits_reversed[1][::-1] != 'as':
raise TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'"
- expression = parser.compile_filter('var.%s' % lastbits_reversed[2][::-1])
+ expression = parser.compile_filter(lastbits_reversed[2][::-1])
var_name = lastbits_reversed[0][::-1]
return RegroupNode(target, expression, var_name)
@@ -806,7 +893,7 @@ regroup = register.tag(regroup)
def spaceless(parser, token):
"""
- Normalize whitespace between HTML tags to a single space. This includes tab
+ Removes whitespace between HTML tags. This includes tab
characters and newlines.
Example usage::
@@ -819,7 +906,7 @@ def spaceless(parser, token):
This example would return this HTML::
- <p> <a href="foo/">Foo</a> </p>
+ <p><a href="foo/">Foo</a></p>
Only space between *tags* is normalized -- not space between tags and text. In
this example, the space around ``Hello`` won't be stripped::
@@ -862,12 +949,58 @@ def templatetag(parser, token):
if len(bits) != 2:
raise TemplateSyntaxError, "'templatetag' statement takes one argument"
tag = bits[1]
- if not TemplateTagNode.mapping.has_key(tag):
+ if tag not in TemplateTagNode.mapping:
raise TemplateSyntaxError, "Invalid templatetag argument: '%s'. Must be one of: %s" % \
(tag, TemplateTagNode.mapping.keys())
return TemplateTagNode(tag)
templatetag = register.tag(templatetag)
+def url(parser, token):
+ """
+ Returns an absolute URL matching given view with its parameters.
+
+ This is a way to define links that aren't tied to a particular URL configuration::
+
+ {% url path.to.some_view arg1,arg2,name1=value1 %}
+
+ The first argument is a path to a view. It can be an absolute python path
+ or just ``app_name.view_name`` without the project name if the view is
+ located inside the project. Other arguments are comma-separated values
+ that will be filled in place of positional and keyword arguments in the
+ URL. All arguments for the URL should be present.
+
+ For example if you have a view ``app_name.client`` taking client's id and
+ the corresponding line in a URLconf looks like this::
+
+ ('^client/(\d+)/$', 'app_name.client')
+
+ and this app's URLconf is included into the project's URLconf under some
+ path::
+
+ ('^clients/', include('project_name.app_name.urls'))
+
+ then in a template you can create a link for a certain client like this::
+
+ {% url app_name.client client.id %}
+
+ The URL will look like ``/clients/client/123/``.
+ """
+ bits = token.contents.split(' ', 2)
+ if len(bits) < 2:
+ raise TemplateSyntaxError, "'%s' takes at least one argument (path to a view)" % bits[0]
+ args = []
+ kwargs = {}
+ if len(bits) > 2:
+ for arg in bits[2].split(','):
+ if '=' in arg:
+ k, v = arg.split('=', 1)
+ k = k.strip()
+ kwargs[k] = parser.compile_filter(v)
+ else:
+ args.append(parser.compile_filter(arg))
+ return URLNode(bits[1], args, kwargs)
+url = register.tag(url)
+
#@register.tag
def widthratio(parser, token):
"""
@@ -893,3 +1026,25 @@ def widthratio(parser, token):
return WidthRatioNode(parser.compile_filter(this_value_expr),
parser.compile_filter(max_value_expr), max_width)
widthratio = register.tag(widthratio)
+
+#@register.tag
+def do_with(parser, token):
+ """
+ Add a value to the context (inside of this block) for caching and easy
+ access.
+
+ For example::
+
+ {% with person.some_sql_method as total %}
+ {{ total }} object{{ total|pluralize }}
+ {% endwith %}
+ """
+ bits = list(token.split_contents())
+ if len(bits) != 4 or bits[2] != "as":
+ raise TemplateSyntaxError, "%r expected format is 'value as name'" % bits[0]
+ var = parser.compile_filter(bits[1])
+ name = bits[3]
+ nodelist = parser.parse(('endwith',))
+ parser.delete_first_token()
+ return WithNode(var, name, nodelist)
+do_with = register.tag('with', do_with)
diff --git a/django/template/loader.py b/django/template/loader.py
index 03e6f8d49d..45cf5a9d7c 100644
--- a/django/template/loader.py
+++ b/django/template/loader.py
@@ -87,14 +87,12 @@ def get_template_from_string(source, origin=None, name=None):
"""
return Template(source, origin, name)
-def render_to_string(template_name, dictionary=None, context_instance=None):
+def _render_setup(template_name, dictionary=None, context_instance=None):
"""
- Loads the given template_name and renders it with the given dictionary as
- context. The template_name may be a string to load a single template using
- get_template, or it may be a tuple to use select_template to find one of
- the templates in the list. Returns a string.
+ Common setup code for render_to_string and render_to_iter.
"""
- dictionary = dictionary or {}
+ if dictionary is None:
+ dictionary = {}
if isinstance(template_name, (list, tuple)):
t = select_template(template_name)
else:
@@ -103,7 +101,28 @@ def render_to_string(template_name, dictionary=None, context_instance=None):
context_instance.update(dictionary)
else:
context_instance = Context(dictionary)
- return t.render(context_instance)
+ return t, context_instance
+
+def render_to_string(template_name, dictionary=None, context_instance=None):
+ """
+ Loads the given template_name and renders it with the given dictionary as
+ context. The template_name may be a string to load a single template using
+ get_template, or it may be a tuple to use select_template to find one of
+ the templates in the list. Returns a string.
+ """
+ t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance)
+ return t.render(c)
+
+def render_to_iter(template_name, dictionary=None, context_instance=None):
+ """
+ Loads the given template_name and renders it with the given dictionary as
+ context. The template_name may be a string to load a single template using
+ get_template, or it may be a tuple to use select_template to find one of
+ the templates in the list. Returns a string.
+ """
+ t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance)
+ return t.iter_render(c)
+
def select_template(template_name_list):
"Given a list of template names, returns the first that can be loaded."
diff --git a/django/template/loader_tags.py b/django/template/loader_tags.py
index e329b1bb36..d12d0b55ad 100644
--- a/django/template/loader_tags.py
+++ b/django/template/loader_tags.py
@@ -15,14 +15,14 @@ class BlockNode(Node):
def __repr__(self):
return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist)
- def render(self, context):
+ def iter_render(self, context):
context.push()
# Save context in case of block.super().
self.context = context
context['block'] = self
- result = self.nodelist.render(context)
+ for chunk in self.nodelist.iter_render(context):
+ yield chunk
context.pop()
- return result
def super(self):
if self.parent:
@@ -59,7 +59,7 @@ class ExtendsNode(Node):
else:
return get_template_from_string(source, origin, parent)
- def render(self, context):
+ def iter_render(self, context):
compiled_parent = self.get_parent(context)
parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode)
parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
@@ -79,7 +79,7 @@ class ExtendsNode(Node):
parent_block.parent = block_node.parent
parent_block.add_parent(parent_block.nodelist)
parent_block.nodelist = block_node.nodelist
- return compiled_parent.render(context)
+ return compiled_parent.iter_render(context)
class ConstantIncludeNode(Node):
def __init__(self, template_path):
@@ -91,27 +91,26 @@ class ConstantIncludeNode(Node):
raise
self.template = None
- def render(self, context):
+ def iter_render(self, context):
if self.template:
- return self.template.render(context)
- else:
- return ''
+ return self.template.iter_render(context)
+ return ()
class IncludeNode(Node):
def __init__(self, template_name):
self.template_name = template_name
- def render(self, context):
+ def iter_render(self, context):
try:
template_name = resolve_variable(self.template_name, context)
t = get_template(template_name)
- return t.render(context)
+ return t.iter_render(context)
except TemplateSyntaxError, e:
if settings.TEMPLATE_DEBUG:
raise
- return ''
+ return ()
except:
- return '' # Fail silently for invalid included templates.
+ return () # Fail silently for invalid included templates.
def do_block(parser, token):
"""
@@ -129,7 +128,7 @@ def do_block(parser, token):
parser.__loaded_blocks.append(block_name)
except AttributeError: # parser.__loaded_blocks isn't a list yet
parser.__loaded_blocks = [block_name]
- nodelist = parser.parse(('endblock',))
+ nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
parser.delete_first_token()
return BlockNode(block_name, nodelist)
diff --git a/django/test/__init__.py b/django/test/__init__.py
index e69de29bb2..554e72bad3 100644
--- a/django/test/__init__.py
+++ b/django/test/__init__.py
@@ -0,0 +1,6 @@
+"""
+Django Unit Test and Doctest framework.
+"""
+
+from django.test.client import Client
+from django.test.testcases import TestCase
diff --git a/django/test/doctest.py b/django/test/_doctest.py
index 3b364f0a75..8777a2cbba 100644
--- a/django/test/doctest.py
+++ b/django/test/_doctest.py
@@ -1,3 +1,8 @@
+# This is a slightly modified version of the doctest.py that shipped with Python 2.4
+# It incorporates changes that have been submitted the the Python ticket tracker
+# as ticket #1521051. These changes allow for a DoctestRunner and Doctest base
+# class to be specified when constructing a DoctestSuite.
+
# Module doctest.
# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
# Major enhancements and refactoring by:
diff --git a/django/test/client.py b/django/test/client.py
index 6e0b443f83..e4fd54c23b 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -1,11 +1,22 @@
+import datetime
+import sys
from cStringIO import StringIO
+from urlparse import urlparse
+from django.conf import settings
+from django.contrib.auth import authenticate, login
+from django.contrib.sessions.models import Session
+from django.contrib.sessions.middleware import SessionWrapper
from django.core.handlers.base import BaseHandler
from django.core.handlers.wsgi import WSGIRequest
+from django.core.signals import got_request_exception
from django.dispatch import dispatcher
-from django.http import urlencode, SimpleCookie
+from django.http import urlencode, SimpleCookie, HttpRequest
from django.test import signals
from django.utils.functional import curry
+BOUNDARY = 'BoUnDaRyStRiNg'
+MULTIPART_CONTENT = 'multipart/form-data; boundary=%s' % BOUNDARY
+
class ClientHandler(BaseHandler):
"""
A HTTP Handler that can be used for testing purposes.
@@ -54,14 +65,19 @@ def encode_multipart(boundary, data):
if isinstance(value, file):
lines.extend([
'--' + boundary,
- 'Content-Disposition: form-data; name="%s"' % key,
- '',
- '--' + boundary,
- 'Content-Disposition: form-data; name="%s_file"; filename="%s"' % (key, value.name),
+ 'Content-Disposition: form-data; name="%s"; filename="%s"' % (key, value.name),
'Content-Type: application/octet-stream',
'',
value.read()
])
+ elif hasattr(value, '__iter__'):
+ for item in value:
+ lines.extend([
+ '--' + boundary,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ str(item)
+ ])
else:
lines.extend([
'--' + boundary,
@@ -97,8 +113,25 @@ class Client:
def __init__(self, **defaults):
self.handler = ClientHandler()
self.defaults = defaults
- self.cookie = SimpleCookie()
-
+ self.cookies = SimpleCookie()
+ self.exc_info = None
+
+ def store_exc_info(self, *args, **kwargs):
+ """
+ Utility method that can be used to store exceptions when they are
+ generated by a view.
+ """
+ self.exc_info = sys.exc_info()
+
+ def _session(self):
+ "Obtain the current session variables"
+ if 'django.contrib.sessions' in settings.INSTALLED_APPS:
+ cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
+ if cookie:
+ return SessionWrapper(cookie.value)
+ return {}
+ session = property(_session)
+
def request(self, **request):
"""
The master request method. Composes the environment dictionary
@@ -108,7 +141,7 @@ class Client:
"""
environ = {
- 'HTTP_COOKIE': self.cookie,
+ 'HTTP_COOKIE': self.cookies,
'PATH_INFO': '/',
'QUERY_STRING': '',
'REQUEST_METHOD': 'GET',
@@ -126,6 +159,9 @@ class Client:
on_template_render = curry(store_rendered_templates, data)
dispatcher.connect(on_template_render, signal=signals.template_rendered)
+ # Capture exceptions created by the handler
+ dispatcher.connect(self.store_exc_info, signal=got_request_exception)
+
response = self.handler(environ)
# Add any rendered template detail to the response
@@ -140,8 +176,13 @@ class Client:
else:
setattr(response, detail, None)
+ # Look for a signalled exception and reraise it
+ if self.exc_info:
+ raise self.exc_info[1], None, self.exc_info[2]
+
+ # Update persistent cookie data
if response.cookies:
- self.cookie.update(response.cookies)
+ self.cookies.update(response.cookies)
return response
@@ -158,59 +199,53 @@ class Client:
return self.request(**r)
- def post(self, path, data={}, **extra):
+ def post(self, path, data={}, content_type=MULTIPART_CONTENT, **extra):
"Request a response from the server using POST."
- BOUNDARY = 'BoUnDaRyStRiNg'
+ if content_type is MULTIPART_CONTENT:
+ post_data = encode_multipart(BOUNDARY, data)
+ else:
+ post_data = data
- encoded = encode_multipart(BOUNDARY, data)
- stream = StringIO(encoded)
r = {
- 'CONTENT_LENGTH': len(encoded),
- 'CONTENT_TYPE': 'multipart/form-data; boundary=%s' % BOUNDARY,
+ 'CONTENT_LENGTH': len(post_data),
+ 'CONTENT_TYPE': content_type,
'PATH_INFO': path,
'REQUEST_METHOD': 'POST',
- 'wsgi.input': stream,
+ 'wsgi.input': StringIO(post_data),
}
r.update(extra)
return self.request(**r)
- def login(self, path, username, password, **extra):
- """
- A specialized sequence of GET and POST to log into a view that
- is protected by a @login_required access decorator.
-
- path should be the URL of the page that is login protected.
+ def login(self, **credentials):
+ """Set the Client to appear as if it has sucessfully logged into a site.
- Returns the response from GETting the requested URL after
- login is complete. Returns False if login process failed.
+ Returns True if login is possible; False if the provided credentials
+ are incorrect, or if the Sessions framework is not available.
"""
- # First, GET the page that is login protected.
- # This page will redirect to the login page.
- response = self.get(path)
- if response.status_code != 302:
- return False
-
- login_path, data = response['Location'].split('?')
- next = data.split('=')[1]
-
- # Second, GET the login page; required to set up cookies
- response = self.get(login_path, **extra)
- if response.status_code != 200:
- return False
-
- # Last, POST the login data.
- form_data = {
- 'username': username,
- 'password': password,
- 'next' : next,
- }
- response = self.post(login_path, data=form_data, **extra)
-
- # Login page should 302 redirect to the originally requested page
- if response.status_code != 302 or response['Location'] != path:
+ user = authenticate(**credentials)
+ if user and 'django.contrib.sessions' in settings.INSTALLED_APPS:
+ obj = Session.objects.get_new_session_object()
+
+ # Create a fake request to store login details
+ request = HttpRequest()
+ request.session = SessionWrapper(obj.session_key)
+ login(request, user)
+
+ # Set the cookie to represent the session
+ self.cookies[settings.SESSION_COOKIE_NAME] = obj.session_key
+ self.cookies[settings.SESSION_COOKIE_NAME]['max-age'] = None
+ self.cookies[settings.SESSION_COOKIE_NAME]['path'] = '/'
+ self.cookies[settings.SESSION_COOKIE_NAME]['domain'] = settings.SESSION_COOKIE_DOMAIN
+ self.cookies[settings.SESSION_COOKIE_NAME]['secure'] = settings.SESSION_COOKIE_SECURE or None
+ self.cookies[settings.SESSION_COOKIE_NAME]['expires'] = None
+
+ # Set the session values
+ Session.objects.save(obj.session_key, request.session._session,
+ datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
+
+ return True
+ else:
return False
-
- # Since we are logged in, request the actual page again
- return self.get(path)
+
diff --git a/django/test/simple.py b/django/test/simple.py
index 88e6b49925..5f7f86f220 100644
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -1,6 +1,6 @@
-import unittest, doctest
+import unittest
from django.conf import settings
-from django.core import management
+from django.test import _doctest as doctest
from django.test.utils import setup_test_environment, teardown_test_environment
from django.test.utils import create_test_db, destroy_test_db
from django.test.testcases import OutputChecker, DocTestRunner
@@ -50,9 +50,12 @@ def build_suite(app_module):
pass
else:
# The module exists, so there must be an import error in the
- # test module itself. We don't need the module; close the file
- # handle returned by find_module.
- mod[0].close()
+ # test module itself. We don't need the module; so if the
+ # module was a single file module (i.e., tests.py), close the file
+ # handle returned by find_module. Otherwise, the test module
+ # is a directory, and there is nothing to close.
+ if mod[0]:
+ mod[0].close()
raise
return suite
@@ -64,6 +67,8 @@ def run_tests(module_list, verbosity=1, extra_tests=[]):
looking for doctests and unittests in models.py or tests.py within
the module. A list of 'extra' tests may also be provided; these tests
will be added to the test suite.
+
+ Returns the number of tests that failed.
"""
setup_test_environment()
@@ -78,8 +83,10 @@ def run_tests(module_list, verbosity=1, extra_tests=[]):
old_name = settings.DATABASE_NAME
create_test_db(verbosity)
- management.syncdb(verbosity, interactive=False)
- unittest.TextTestRunner(verbosity=verbosity).run(suite)
+ result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
destroy_test_db(old_name, verbosity)
teardown_test_environment()
+
+ return len(result.failures) + len(result.errors)
+ \ No newline at end of file
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 1cfef6f19e..2bc1b5a5f8 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -1,6 +1,11 @@
-import re, doctest, unittest
+import re, unittest
+from urlparse import urlparse
from django.db import transaction
-
+from django.core import management, mail
+from django.db.models import get_apps
+from django.test import _doctest as doctest
+from django.test.client import Client
+
normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
class OutputChecker(doctest.OutputChecker):
@@ -28,3 +33,117 @@ class DocTestRunner(doctest.DocTestRunner):
from django.db import transaction
transaction.rollback_unless_managed()
+class TestCase(unittest.TestCase):
+ def _pre_setup(self):
+ """Perform any pre-test setup. This includes:
+
+ * If the Test Case class has a 'fixtures' member, clearing the
+ database and installing the named fixtures at the start of each test.
+ * Clearing the mail test outbox.
+
+ """
+ management.flush(verbosity=0, interactive=False)
+ if hasattr(self, 'fixtures'):
+ management.load_data(self.fixtures, verbosity=0)
+ mail.outbox = []
+
+ def __call__(self, result=None):
+ """
+ Wrapper around default __call__ method to perform common Django test
+ set up. This means that user-defined Test Cases aren't required to
+ include a call to super().setUp().
+ """
+ self.client = Client()
+ self._pre_setup()
+ super(TestCase, self).__call__(result)
+
+ def assertRedirects(self, response, expected_path, status_code=302, target_status_code=200):
+ """Assert that a response redirected to a specific URL, and that the
+ redirect URL can be loaded.
+
+ """
+ self.assertEqual(response.status_code, status_code,
+ "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,
+ "Response redirected to '%s', expected '%s'" % (path, expected_path))
+ 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, 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,
+ (i.e., the HTTP status code was as expected), and that ``text`` occurs ``count``
+ times in the content of the response.
+
+ """
+ self.assertEqual(response.status_code, status_code,
+ "Couldn't retrieve page: Response code was %d (expected %d)'" %
+ (response.status_code, status_code))
+ real_count = response.content.count(text)
+ self.assertEqual(real_count, count,
+ "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count))
+
+ def assertFormError(self, response, form, field, errors):
+ "Assert that a form used to render the response has a specific field error"
+ if not response.context:
+ self.fail('Response did not use any contexts to render the response')
+
+ # If there is a single context, put it into a list to simplify processing
+ if not isinstance(response.context, list):
+ contexts = [response.context]
+ else:
+ contexts = response.context
+
+ # If a single error string is provided, make it a list to simplify processing
+ if not isinstance(errors, list):
+ errors = [errors]
+
+ # Search all contexts for the error.
+ found_form = False
+ for i,context in enumerate(contexts):
+ if form in context:
+ found_form = True
+ for err in errors:
+ if field:
+ if field in context[form].errors:
+ self.failUnless(err in context[form].errors[field],
+ "The field '%s' on form '%s' in context %d does not contain the error '%s' (actual errors: %s)" %
+ (field, form, i, err, list(context[form].errors[field])))
+ elif field in context[form].fields:
+ self.fail("The field '%s' on form '%s' in context %d contains no errors" %
+ (field, form, i))
+ else:
+ self.fail("The form '%s' in context %d does not contain the field '%s'" % (form, i, field))
+ else:
+ self.failUnless(err in context[form].non_field_errors(),
+ "The form '%s' in context %d does not contain the non-field error '%s' (actual errors: %s)" %
+ (form, i, err, list(context[form].non_field_errors())))
+ if not found_form:
+ self.fail("The form '%s' was not used to render the response" % form)
+
+ def assertTemplateUsed(self, response, template_name):
+ "Assert that the template with the provided name was used in rendering the response"
+ if isinstance(response.template, list):
+ template_names = [t.name for t in response.template]
+ self.failUnless(template_name in template_names,
+ "Template '%s' was not one of the templates used to render the response. Templates used: %s" %
+ (template_name, template_names))
+ elif response.template:
+ self.assertEqual(template_name, response.template.name,
+ "Template '%s' was not used to render the response. Actual template was '%s'" %
+ (template_name, response.template.name))
+ else:
+ self.fail('No templates used to render the response')
+
+ def assertTemplateNotUsed(self, response, template_name):
+ "Assert that the template with the provided name was NOT used in rendering the response"
+ if isinstance(response.template, list):
+ self.failIf(template_name in [t.name for t in response.template],
+ "Template '%s' was used unexpectedly in rendering the response" % template_name)
+ elif response.template:
+ self.assertNotEqual(template_name, response.template.name,
+ "Template '%s' was used unexpectedly in rendering the response" % template_name)
+
diff --git a/django/test/utils.py b/django/test/utils.py
index 039a6dd7a2..303a223183 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -1,6 +1,7 @@
import sys, time
from django.conf import settings
from django.db import connection, transaction, backend
+from django.core import management, mail
from django.dispatch import dispatcher
from django.test import signals
from django.template import Template
@@ -10,30 +11,72 @@ from django.template import Template
TEST_DATABASE_PREFIX = 'test_'
def instrumented_test_render(self, context):
- """An instrumented Template render method, providing a signal
- that can be intercepted by the test system Client
-
+ """
+ An instrumented Template render method, providing a signal that can be
+ intercepted by the test system Client.
"""
dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context)
return self.nodelist.render(context)
+
+def instrumented_test_iter_render(self, context):
+ """
+ An instrumented Template iter_render method, providing a signal that can be
+ intercepted by the test system Client.
+ """
+ for chunk in self.nodelist.iter_render(context):
+ yield chunk
+ dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context)
+class TestSMTPConnection(object):
+ """A substitute SMTP connection for use during test sessions.
+ The test connection stores email messages in a dummy outbox,
+ rather than sending them out on the wire.
+
+ """
+ def __init__(*args, **kwargs):
+ pass
+ def open(self):
+ "Mock the SMTPConnection open() interface"
+ pass
+ def close(self):
+ "Mock the SMTPConnection close() interface"
+ pass
+ def send_messages(self, messages):
+ "Redirect messages to the dummy outbox"
+ mail.outbox.extend(messages)
+
def setup_test_environment():
"""Perform any global pre-test setup. This involves:
- Installing the instrumented test renderer
+ - Diverting the email sending functions to a test buffer
"""
Template.original_render = Template.render
+ Template.original_iter_render = Template.iter_render
Template.render = instrumented_test_render
+ Template.iter_render = instrumented_test_render
+
+ mail.original_SMTPConnection = mail.SMTPConnection
+ mail.SMTPConnection = TestSMTPConnection
+
+ mail.outbox = []
def teardown_test_environment():
"""Perform any global post-test teardown. This involves:
- Restoring the original test renderer
+ - Restoring the email sending functions
"""
Template.render = Template.original_render
- del Template.original_render
+ Template.iter_render = Template.original_iter_render
+ del Template.original_render, Template.original_iter_render
+
+ mail.SMTPConnection = mail.original_SMTPConnection
+ del mail.original_SMTPConnection
+
+ del mail.outbox
def _set_autocommit(connection):
"Make sure a connection is in autocommit mode."
@@ -42,6 +85,20 @@ def _set_autocommit(connection):
elif hasattr(connection.connection, "set_isolation_level"):
connection.connection.set_isolation_level(0)
+def get_mysql_create_suffix():
+ suffix = []
+ if settings.TEST_DATABASE_CHARSET:
+ suffix.append('CHARACTER SET %s' % settings.TEST_DATABASE_CHARSET)
+ if settings.TEST_DATABASE_COLLATION:
+ suffix.append('COLLATE %s' % settings.TEST_DATABASE_COLLATION)
+ return ' '.join(suffix)
+
+def get_postgresql_create_suffix():
+ assert settings.TEST_DATABASE_COLLATION is None, "PostgreSQL does not support collation setting at database creation time."
+ if settings.TEST_DATABASE_CHARSET:
+ return "WITH ENCODING '%s'" % settings.TEST_DATABASE_CHARSET
+ return ''
+
def create_test_db(verbosity=1, autoclobber=False):
if verbosity >= 1:
print "Creating test database..."
@@ -50,6 +107,12 @@ def create_test_db(verbosity=1, autoclobber=False):
if settings.DATABASE_ENGINE == "sqlite3":
TEST_DATABASE_NAME = ":memory:"
else:
+ suffix = {
+ 'postgresql': get_postgresql_create_suffix,
+ 'postgresql_psycopg2': get_postgresql_create_suffix,
+ 'mysql': get_mysql_create_suffix,
+ 'mysql_old': get_mysql_create_suffix,
+ }.get(settings.DATABASE_ENGINE, lambda: '')()
if settings.TEST_DATABASE_NAME:
TEST_DATABASE_NAME = settings.TEST_DATABASE_NAME
else:
@@ -61,7 +124,7 @@ def create_test_db(verbosity=1, autoclobber=False):
cursor = connection.cursor()
_set_autocommit(connection)
try:
- cursor.execute("CREATE DATABASE %s" % backend.quote_name(TEST_DATABASE_NAME))
+ cursor.execute("CREATE DATABASE %s %s" % (backend.quote_name(TEST_DATABASE_NAME), suffix))
except Exception, e:
sys.stderr.write("Got an error creating the test database: %s\n" % e)
if not autoclobber:
@@ -73,7 +136,7 @@ def create_test_db(verbosity=1, autoclobber=False):
cursor.execute("DROP DATABASE %s" % backend.quote_name(TEST_DATABASE_NAME))
if verbosity >= 1:
print "Creating test database..."
- cursor.execute("CREATE DATABASE %s" % backend.quote_name(TEST_DATABASE_NAME))
+ cursor.execute("CREATE DATABASE %s %s" % (backend.quote_name(TEST_DATABASE_NAME), suffix))
except Exception, e:
sys.stderr.write("Got an error recreating the test database: %s\n" % e)
sys.exit(2)
@@ -84,6 +147,8 @@ def create_test_db(verbosity=1, autoclobber=False):
connection.close()
settings.DATABASE_NAME = TEST_DATABASE_NAME
+ management.syncdb(verbosity, interactive=False)
+
# Get a cursor (even though we don't need one yet). This has
# the side effect of initializing the test database.
cursor = connection.cursor()
diff --git a/django/utils/_decimal.py b/django/utils/_decimal.py
new file mode 100644
index 0000000000..677d26bb32
--- /dev/null
+++ b/django/utils/_decimal.py
@@ -0,0 +1,3079 @@
+# Copyright (c) 2004 Python Software Foundation.
+# All rights reserved.
+
+# Written by Eric Price <eprice at tjhsst.edu>
+# and Facundo Batista <facundo at taniquetil.com.ar>
+# and Raymond Hettinger <python at rcn.com>
+# and Aahz <aahz at pobox.com>
+# and Tim Peters
+
+# This module is currently Py2.3 compatible and should be kept that way
+# unless a major compelling advantage arises. IOW, 2.3 compatibility is
+# strongly preferred, but not guaranteed.
+
+# Also, this module should be kept in sync with the latest updates of
+# the IBM specification as it evolves. Those updates will be treated
+# as bug fixes (deviation from the spec is a compatibility, usability
+# bug) and will be backported. At this point the spec is stabilizing
+# and the updates are becoming fewer, smaller, and less significant.
+
+"""
+This is a Py2.3 implementation of decimal floating point arithmetic based on
+the General Decimal Arithmetic Specification:
+
+ www2.hursley.ibm.com/decimal/decarith.html
+
+and IEEE standard 854-1987:
+
+ www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
+
+Decimal floating point has finite precision with arbitrarily large bounds.
+
+The purpose of the module is to support arithmetic using familiar
+"schoolhouse" rules and to avoid the some of tricky representation
+issues associated with binary floating point. The package is especially
+useful for financial applications or for contexts where users have
+expectations that are at odds with binary floating point (for instance,
+in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
+of the expected Decimal("0.00") returned by decimal floating point).
+
+Here are some examples of using the decimal module:
+
+>>> from decimal import *
+>>> setcontext(ExtendedContext)
+>>> Decimal(0)
+Decimal("0")
+>>> Decimal("1")
+Decimal("1")
+>>> Decimal("-.0123")
+Decimal("-0.0123")
+>>> Decimal(123456)
+Decimal("123456")
+>>> Decimal("123.45e12345678901234567890")
+Decimal("1.2345E+12345678901234567892")
+>>> Decimal("1.33") + Decimal("1.27")
+Decimal("2.60")
+>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
+Decimal("-2.20")
+>>> dig = Decimal(1)
+>>> print dig / Decimal(3)
+0.333333333
+>>> getcontext().prec = 18
+>>> print dig / Decimal(3)
+0.333333333333333333
+>>> print dig.sqrt()
+1
+>>> print Decimal(3).sqrt()
+1.73205080756887729
+>>> print Decimal(3) ** 123
+4.85192780976896427E+58
+>>> inf = Decimal(1) / Decimal(0)
+>>> print inf
+Infinity
+>>> neginf = Decimal(-1) / Decimal(0)
+>>> print neginf
+-Infinity
+>>> print neginf + inf
+NaN
+>>> print neginf * inf
+-Infinity
+>>> print dig / 0
+Infinity
+>>> getcontext().traps[DivisionByZero] = 1
+>>> print dig / 0
+Traceback (most recent call last):
+ ...
+ ...
+ ...
+DivisionByZero: x / 0
+>>> c = Context()
+>>> c.traps[InvalidOperation] = 0
+>>> print c.flags[InvalidOperation]
+0
+>>> c.divide(Decimal(0), Decimal(0))
+Decimal("NaN")
+>>> c.traps[InvalidOperation] = 1
+>>> print c.flags[InvalidOperation]
+1
+>>> c.flags[InvalidOperation] = 0
+>>> print c.flags[InvalidOperation]
+0
+>>> print c.divide(Decimal(0), Decimal(0))
+Traceback (most recent call last):
+ ...
+ ...
+ ...
+InvalidOperation: 0 / 0
+>>> print c.flags[InvalidOperation]
+1
+>>> c.flags[InvalidOperation] = 0
+>>> c.traps[InvalidOperation] = 0
+>>> print c.divide(Decimal(0), Decimal(0))
+NaN
+>>> print c.flags[InvalidOperation]
+1
+>>>
+"""
+
+__all__ = [
+ # Two major classes
+ 'Decimal', 'Context',
+
+ # Contexts
+ 'DefaultContext', 'BasicContext', 'ExtendedContext',
+
+ # Exceptions
+ 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
+ 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
+
+ # Constants for use in setting up contexts
+ 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
+ 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
+
+ # Functions for manipulating contexts
+ 'setcontext', 'getcontext'
+]
+
+import copy as _copy
+
+#Rounding
+ROUND_DOWN = 'ROUND_DOWN'
+ROUND_HALF_UP = 'ROUND_HALF_UP'
+ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
+ROUND_CEILING = 'ROUND_CEILING'
+ROUND_FLOOR = 'ROUND_FLOOR'
+ROUND_UP = 'ROUND_UP'
+ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
+
+#Rounding decision (not part of the public API)
+NEVER_ROUND = 'NEVER_ROUND' # Round in division (non-divmod), sqrt ONLY
+ALWAYS_ROUND = 'ALWAYS_ROUND' # Every operation rounds at end.
+
+#Errors
+
+class DecimalException(ArithmeticError):
+ """Base exception class.
+
+ Used exceptions derive from this.
+ If an exception derives from another exception besides this (such as
+ Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
+ called if the others are present. This isn't actually used for
+ anything, though.
+
+ handle -- Called when context._raise_error is called and the
+ trap_enabler is set. First argument is self, second is the
+ context. More arguments can be given, those being after
+ the explanation in _raise_error (For example,
+ context._raise_error(NewError, '(-x)!', self._sign) would
+ call NewError().handle(context, self._sign).)
+
+ To define a new exception, it should be sufficient to have it derive
+ from DecimalException.
+ """
+ def handle(self, context, *args):
+ pass
+
+
+class Clamped(DecimalException):
+ """Exponent of a 0 changed to fit bounds.
+
+ This occurs and signals clamped if the exponent of a result has been
+ altered in order to fit the constraints of a specific concrete
+ representation. This may occur when the exponent of a zero result would
+ be outside the bounds of a representation, or when a large normal
+ number would have an encoded exponent that cannot be represented. In
+ this latter case, the exponent is reduced to fit and the corresponding
+ number of zero digits are appended to the coefficient ("fold-down").
+ """
+
+
+class InvalidOperation(DecimalException):
+ """An invalid operation was performed.
+
+ Various bad things cause this:
+
+ Something creates a signaling NaN
+ -INF + INF
+ 0 * (+-)INF
+ (+-)INF / (+-)INF
+ x % 0
+ (+-)INF % x
+ x._rescale( non-integer )
+ sqrt(-x) , x > 0
+ 0 ** 0
+ x ** (non-integer)
+ x ** (+-)INF
+ An operand is invalid
+ """
+ def handle(self, context, *args):
+ if args:
+ if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
+ return Decimal( (args[1]._sign, args[1]._int, 'n') )
+ return NaN
+
+class ConversionSyntax(InvalidOperation):
+ """Trying to convert badly formed string.
+
+ This occurs and signals invalid-operation if an string is being
+ converted to a number and it does not conform to the numeric string
+ syntax. The result is [0,qNaN].
+ """
+
+ def handle(self, context, *args):
+ return (0, (0,), 'n') #Passed to something which uses a tuple.
+
+class DivisionByZero(DecimalException, ZeroDivisionError):
+ """Division by 0.
+
+ This occurs and signals division-by-zero if division of a finite number
+ by zero was attempted (during a divide-integer or divide operation, or a
+ power operation with negative right-hand operand), and the dividend was
+ not zero.
+
+ The result of the operation is [sign,inf], where sign is the exclusive
+ or of the signs of the operands for divide, or is 1 for an odd power of
+ -0, for power.
+ """
+
+ def handle(self, context, sign, double = None, *args):
+ if double is not None:
+ return (Infsign[sign],)*2
+ return Infsign[sign]
+
+class DivisionImpossible(InvalidOperation):
+ """Cannot perform the division adequately.
+
+ This occurs and signals invalid-operation if the integer result of a
+ divide-integer or remainder operation had too many digits (would be
+ longer than precision). The result is [0,qNaN].
+ """
+
+ def handle(self, context, *args):
+ return (NaN, NaN)
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError):
+ """Undefined result of division.
+
+ This occurs and signals invalid-operation if division by zero was
+ attempted (during a divide-integer, divide, or remainder operation), and
+ the dividend is also zero. The result is [0,qNaN].
+ """
+
+ def handle(self, context, tup=None, *args):
+ if tup is not None:
+ return (NaN, NaN) #for 0 %0, 0 // 0
+ return NaN
+
+class Inexact(DecimalException):
+ """Had to round, losing information.
+
+ This occurs and signals inexact whenever the result of an operation is
+ not exact (that is, it needed to be rounded and any discarded digits
+ were non-zero), or if an overflow or underflow condition occurs. The
+ result in all cases is unchanged.
+
+ The inexact signal may be tested (or trapped) to determine if a given
+ operation (or sequence of operations) was inexact.
+ """
+ pass
+
+class InvalidContext(InvalidOperation):
+ """Invalid context. Unknown rounding, for example.
+
+ This occurs and signals invalid-operation if an invalid context was
+ detected during an operation. This can occur if contexts are not checked
+ on creation and either the precision exceeds the capability of the
+ underlying concrete representation or an unknown or unsupported rounding
+ was specified. These aspects of the context need only be checked when
+ the values are required to be used. The result is [0,qNaN].
+ """
+
+ def handle(self, context, *args):
+ return NaN
+
+class Rounded(DecimalException):
+ """Number got rounded (not necessarily changed during rounding).
+
+ This occurs and signals rounded whenever the result of an operation is
+ rounded (that is, some zero or non-zero digits were discarded from the
+ coefficient), or if an overflow or underflow condition occurs. The
+ result in all cases is unchanged.
+
+ The rounded signal may be tested (or trapped) to determine if a given
+ operation (or sequence of operations) caused a loss of precision.
+ """
+ pass
+
+class Subnormal(DecimalException):
+ """Exponent < Emin before rounding.
+
+ This occurs and signals subnormal whenever the result of a conversion or
+ operation is subnormal (that is, its adjusted exponent is less than
+ Emin, before any rounding). The result in all cases is unchanged.
+
+ The subnormal signal may be tested (or trapped) to determine if a given
+ or operation (or sequence of operations) yielded a subnormal result.
+ """
+ pass
+
+class Overflow(Inexact, Rounded):
+ """Numerical overflow.
+
+ This occurs and signals overflow if the adjusted exponent of a result
+ (from a conversion or from an operation that is not an attempt to divide
+ by zero), after rounding, would be greater than the largest value that
+ can be handled by the implementation (the value Emax).
+
+ The result depends on the rounding mode:
+
+ For round-half-up and round-half-even (and for round-half-down and
+ round-up, if implemented), the result of the operation is [sign,inf],
+ where sign is the sign of the intermediate result. For round-down, the
+ result is the largest finite number that can be represented in the
+ current precision, with the sign of the intermediate result. For
+ round-ceiling, the result is the same as for round-down if the sign of
+ the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
+ the result is the same as for round-down if the sign of the intermediate
+ result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
+ will also be raised.
+ """
+
+ def handle(self, context, sign, *args):
+ if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
+ ROUND_HALF_DOWN, ROUND_UP):
+ return Infsign[sign]
+ if sign == 0:
+ if context.rounding == ROUND_CEILING:
+ return Infsign[sign]
+ return Decimal((sign, (9,)*context.prec,
+ context.Emax-context.prec+1))
+ if sign == 1:
+ if context.rounding == ROUND_FLOOR:
+ return Infsign[sign]
+ return Decimal( (sign, (9,)*context.prec,
+ context.Emax-context.prec+1))
+
+
+class Underflow(Inexact, Rounded, Subnormal):
+ """Numerical underflow with result rounded to 0.
+
+ This occurs and signals underflow if a result is inexact and the
+ adjusted exponent of the result would be smaller (more negative) than
+ the smallest value that can be handled by the implementation (the value
+ Emin). That is, the result is both inexact and subnormal.
+
+ The result after an underflow will be a subnormal number rounded, if
+ necessary, so that its exponent is not less than Etiny. This may result
+ in 0 with the sign of the intermediate result and an exponent of Etiny.
+
+ In all cases, Inexact, Rounded, and Subnormal will also be raised.
+ """
+
+# List of public traps and flags
+_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
+ Underflow, InvalidOperation, Subnormal]
+
+# Map conditions (per the spec) to signals
+_condition_map = {ConversionSyntax:InvalidOperation,
+ DivisionImpossible:InvalidOperation,
+ DivisionUndefined:InvalidOperation,
+ InvalidContext:InvalidOperation}
+
+##### Context Functions #######################################
+
+# The getcontext() and setcontext() function manage access to a thread-local
+# current context. Py2.4 offers direct support for thread locals. If that
+# is not available, use threading.currentThread() which is slower but will
+# work for older Pythons. If threads are not part of the build, create a
+# mock threading object with threading.local() returning the module namespace.
+
+try:
+ import threading
+except ImportError:
+ # Python was compiled without threads; create a mock object instead
+ import sys
+ class MockThreading:
+ def local(self, sys=sys):
+ return sys.modules[__name__]
+ threading = MockThreading()
+ del sys, MockThreading
+
+try:
+ threading.local
+
+except AttributeError:
+
+ #To fix reloading, force it to create a new context
+ #Old contexts have different exceptions in their dicts, making problems.
+ if hasattr(threading.currentThread(), '__decimal_context__'):
+ del threading.currentThread().__decimal_context__
+
+ def setcontext(context):
+ """Set this thread's context to context."""
+ if context in (DefaultContext, BasicContext, ExtendedContext):
+ context = context.copy()
+ context.clear_flags()
+ threading.currentThread().__decimal_context__ = context
+
+ def getcontext():
+ """Returns this thread's context.
+
+ If this thread does not yet have a context, returns
+ a new context and sets this thread's context.
+ New contexts are copies of DefaultContext.
+ """
+ try:
+ return threading.currentThread().__decimal_context__
+ except AttributeError:
+ context = Context()
+ threading.currentThread().__decimal_context__ = context
+ return context
+
+else:
+
+ local = threading.local()
+ if hasattr(local, '__decimal_context__'):
+ del local.__decimal_context__
+
+ def getcontext(_local=local):
+ """Returns this thread's context.
+
+ If this thread does not yet have a context, returns
+ a new context and sets this thread's context.
+ New contexts are copies of DefaultContext.
+ """
+ try:
+ return _local.__decimal_context__
+ except AttributeError:
+ context = Context()
+ _local.__decimal_context__ = context
+ return context
+
+ def setcontext(context, _local=local):
+ """Set this thread's context to context."""
+ if context in (DefaultContext, BasicContext, ExtendedContext):
+ context = context.copy()
+ context.clear_flags()
+ _local.__decimal_context__ = context
+
+ del threading, local # Don't contaminate the namespace
+
+
+##### Decimal class ###########################################
+
+class Decimal(object):
+ """Floating point class for decimal arithmetic."""
+
+ __slots__ = ('_exp','_int','_sign', '_is_special')
+ # Generally, the value of the Decimal instance is given by
+ # (-1)**_sign * _int * 10**_exp
+ # Special values are signified by _is_special == True
+
+ # We're immutable, so use __new__ not __init__
+ def __new__(cls, value="0", context=None):
+ """Create a decimal point instance.
+
+ >>> Decimal('3.14') # string input
+ Decimal("3.14")
+ >>> Decimal((0, (3, 1, 4), -2)) # tuple input (sign, digit_tuple, exponent)
+ Decimal("3.14")
+ >>> Decimal(314) # int or long
+ Decimal("314")
+ >>> Decimal(Decimal(314)) # another decimal instance
+ Decimal("314")
+ """
+
+ self = object.__new__(cls)
+ self._is_special = False
+
+ # From an internal working value
+ if isinstance(value, _WorkRep):
+ self._sign = value.sign
+ self._int = tuple(map(int, str(value.int)))
+ self._exp = int(value.exp)
+ return self
+
+ # From another decimal
+ if isinstance(value, Decimal):
+ self._exp = value._exp
+ self._sign = value._sign
+ self._int = value._int
+ self._is_special = value._is_special
+ return self
+
+ # From an integer
+ if isinstance(value, (int,long)):
+ if value >= 0:
+ self._sign = 0
+ else:
+ self._sign = 1
+ self._exp = 0
+ self._int = tuple(map(int, str(abs(value))))
+ return self
+
+ # tuple/list conversion (possibly from as_tuple())
+ if isinstance(value, (list,tuple)):
+ if len(value) != 3:
+ raise ValueError, 'Invalid arguments'
+ if value[0] not in (0,1):
+ raise ValueError, 'Invalid sign'
+ for digit in value[1]:
+ if not isinstance(digit, (int,long)) or digit < 0:
+ raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
+
+ self._sign = value[0]
+ self._int = tuple(value[1])
+ if value[2] in ('F','n','N'):
+ self._exp = value[2]
+ self._is_special = True
+ else:
+ self._exp = int(value[2])
+ return self
+
+ if isinstance(value, float):
+ raise TypeError("Cannot convert float to Decimal. " +
+ "First convert the float to a string")
+
+ # Other argument types may require the context during interpretation
+ if context is None:
+ context = getcontext()
+
+ # From a string
+ # REs insist on real strings, so we can too.
+ if isinstance(value, basestring):
+ if _isinfinity(value):
+ self._exp = 'F'
+ self._int = (0,)
+ self._is_special = True
+ if _isinfinity(value) == 1:
+ self._sign = 0
+ else:
+ self._sign = 1
+ return self
+ if _isnan(value):
+ sig, sign, diag = _isnan(value)
+ self._is_special = True
+ if len(diag) > context.prec: #Diagnostic info too long
+ self._sign, self._int, self._exp = \
+ context._raise_error(ConversionSyntax)
+ return self
+ if sig == 1:
+ self._exp = 'n' #qNaN
+ else: #sig == 2
+ self._exp = 'N' #sNaN
+ self._sign = sign
+ self._int = tuple(map(int, diag)) #Diagnostic info
+ return self
+ try:
+ self._sign, self._int, self._exp = _string2exact(value)
+ except ValueError:
+ self._is_special = True
+ self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
+ return self
+
+ raise TypeError("Cannot convert %r to Decimal" % value)
+
+ def _isnan(self):
+ """Returns whether the number is not actually one.
+
+ 0 if a number
+ 1 if NaN
+ 2 if sNaN
+ """
+ if self._is_special:
+ exp = self._exp
+ if exp == 'n':
+ return 1
+ elif exp == 'N':
+ return 2
+ return 0
+
+ def _isinfinity(self):
+ """Returns whether the number is infinite
+
+ 0 if finite or not a number
+ 1 if +INF
+ -1 if -INF
+ """
+ if self._exp == 'F':
+ if self._sign:
+ return -1
+ return 1
+ return 0
+
+ def _check_nans(self, other = None, context=None):
+ """Returns whether the number is not actually one.
+
+ if self, other are sNaN, signal
+ if self, other are NaN return nan
+ return 0
+
+ Done before operations.
+ """
+
+ self_is_nan = self._isnan()
+ if other is None:
+ other_is_nan = False
+ else:
+ other_is_nan = other._isnan()
+
+ if self_is_nan or other_is_nan:
+ if context is None:
+ context = getcontext()
+
+ if self_is_nan == 2:
+ return context._raise_error(InvalidOperation, 'sNaN',
+ 1, self)
+ if other_is_nan == 2:
+ return context._raise_error(InvalidOperation, 'sNaN',
+ 1, other)
+ if self_is_nan:
+ return self
+
+ return other
+ return 0
+
+ def __nonzero__(self):
+ """Is the number non-zero?
+
+ 0 if self == 0
+ 1 if self != 0
+ """
+ if self._is_special:
+ return 1
+ return sum(self._int) != 0
+
+ def __cmp__(self, other, context=None):
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ return 1 # Comparison involving NaN's always reports self > other
+
+ # INF = INF
+ return cmp(self._isinfinity(), other._isinfinity())
+
+ if not self and not other:
+ return 0 #If both 0, sign comparison isn't certain.
+
+ #If different signs, neg one is less
+ if other._sign < self._sign:
+ return -1
+ if self._sign < other._sign:
+ return 1
+
+ self_adjusted = self.adjusted()
+ other_adjusted = other.adjusted()
+ if self_adjusted == other_adjusted and \
+ self._int + (0,)*(self._exp - other._exp) == \
+ other._int + (0,)*(other._exp - self._exp):
+ return 0 #equal, except in precision. ([0]*(-x) = [])
+ elif self_adjusted > other_adjusted and self._int[0] != 0:
+ return (-1)**self._sign
+ elif self_adjusted < other_adjusted and other._int[0] != 0:
+ return -((-1)**self._sign)
+
+ # Need to round, so make sure we have a valid context
+ if context is None:
+ context = getcontext()
+
+ context = context._shallow_copy()
+ rounding = context._set_rounding(ROUND_UP) #round away from 0
+
+ flags = context._ignore_all_flags()
+ res = self.__sub__(other, context=context)
+
+ context._regard_flags(*flags)
+
+ context.rounding = rounding
+
+ if not res:
+ return 0
+ elif res._sign:
+ return -1
+ return 1
+
+ def __eq__(self, other):
+ if not isinstance(other, (Decimal, int, long)):
+ return NotImplemented
+ return self.__cmp__(other) == 0
+
+ def __ne__(self, other):
+ if not isinstance(other, (Decimal, int, long)):
+ return NotImplemented
+ return self.__cmp__(other) != 0
+
+ def compare(self, other, context=None):
+ """Compares one to another.
+
+ -1 => a < b
+ 0 => a = b
+ 1 => a > b
+ NaN => one is NaN
+ Like __cmp__, but returns Decimal instances.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ #compare(NaN, NaN) = NaN
+ if (self._is_special or other and other._is_special):
+ ans = self._check_nans(other, context)
+ if ans:
+ return ans
+
+ return Decimal(self.__cmp__(other, context))
+
+ def __hash__(self):
+ """x.__hash__() <==> hash(x)"""
+ # Decimal integers must hash the same as the ints
+ # Non-integer decimals are normalized and hashed as strings
+ # Normalization assures that hast(100E-1) == hash(10)
+ if self._is_special:
+ if self._isnan():
+ raise TypeError('Cannot hash a NaN value.')
+ return hash(str(self))
+ i = int(self)
+ if self == Decimal(i):
+ return hash(i)
+ assert self.__nonzero__() # '-0' handled by integer case
+ return hash(str(self.normalize()))
+
+ def as_tuple(self):
+ """Represents the number as a triple tuple.
+
+ To show the internals exactly as they are.
+ """
+ return (self._sign, self._int, self._exp)
+
+ def __repr__(self):
+ """Represents the number as an instance of Decimal."""
+ # Invariant: eval(repr(d)) == d
+ return 'Decimal("%s")' % str(self)
+
+ def __str__(self, eng = 0, context=None):
+ """Return string representation of the number in scientific notation.
+
+ Captures all of the information in the underlying representation.
+ """
+
+ if self._is_special:
+ if self._isnan():
+ minus = '-'*self._sign
+ if self._int == (0,):
+ info = ''
+ else:
+ info = ''.join(map(str, self._int))
+ if self._isnan() == 2:
+ return minus + 'sNaN' + info
+ return minus + 'NaN' + info
+ if self._isinfinity():
+ minus = '-'*self._sign
+ return minus + 'Infinity'
+
+ if context is None:
+ context = getcontext()
+
+ tmp = map(str, self._int)
+ numdigits = len(self._int)
+ leftdigits = self._exp + numdigits
+ if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
+ if self._exp < 0 and self._exp >= -6: #short, no need for e/E
+ s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
+ return s
+ #exp is closest mult. of 3 >= self._exp
+ exp = ((self._exp - 1)// 3 + 1) * 3
+ if exp != self._exp:
+ s = '0.'+'0'*(exp - self._exp)
+ else:
+ s = '0'
+ if exp != 0:
+ if context.capitals:
+ s += 'E'
+ else:
+ s += 'e'
+ if exp > 0:
+ s += '+' #0.0e+3, not 0.0e3
+ s += str(exp)
+ s = '-'*self._sign + s
+ return s
+ if eng:
+ dotplace = (leftdigits-1)%3+1
+ adjexp = leftdigits -1 - (leftdigits-1)%3
+ else:
+ adjexp = leftdigits-1
+ dotplace = 1
+ if self._exp == 0:
+ pass
+ elif self._exp < 0 and adjexp >= 0:
+ tmp.insert(leftdigits, '.')
+ elif self._exp < 0 and adjexp >= -6:
+ tmp[0:0] = ['0'] * int(-leftdigits)
+ tmp.insert(0, '0.')
+ else:
+ if numdigits > dotplace:
+ tmp.insert(dotplace, '.')
+ elif numdigits < dotplace:
+ tmp.extend(['0']*(dotplace-numdigits))
+ if adjexp:
+ if not context.capitals:
+ tmp.append('e')
+ else:
+ tmp.append('E')
+ if adjexp > 0:
+ tmp.append('+')
+ tmp.append(str(adjexp))
+ if eng:
+ while tmp[0:1] == ['0']:
+ tmp[0:1] = []
+ if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
+ tmp[0:0] = ['0']
+ if self._sign:
+ tmp.insert(0, '-')
+
+ return ''.join(tmp)
+
+ def to_eng_string(self, context=None):
+ """Convert to engineering-type string.
+
+ Engineering notation has an exponent which is a multiple of 3, so there
+ are up to 3 digits left of the decimal place.
+
+ Same rules for when in exponential and when as a value as in __str__.
+ """
+ return self.__str__(eng=1, context=context)
+
+ def __neg__(self, context=None):
+ """Returns a copy with the sign switched.
+
+ Rounds, if it has reason.
+ """
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ if not self:
+ # -Decimal('0') is Decimal('0'), not Decimal('-0')
+ sign = 0
+ elif self._sign:
+ sign = 0
+ else:
+ sign = 1
+
+ if context is None:
+ context = getcontext()
+ if context._rounding_decision == ALWAYS_ROUND:
+ return Decimal((sign, self._int, self._exp))._fix(context)
+ return Decimal( (sign, self._int, self._exp))
+
+ def __pos__(self, context=None):
+ """Returns a copy, unless it is a sNaN.
+
+ Rounds the number (if more then precision digits)
+ """
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ sign = self._sign
+ if not self:
+ # + (-0) = 0
+ sign = 0
+
+ if context is None:
+ context = getcontext()
+
+ if context._rounding_decision == ALWAYS_ROUND:
+ ans = self._fix(context)
+ else:
+ ans = Decimal(self)
+ ans._sign = sign
+ return ans
+
+ def __abs__(self, round=1, context=None):
+ """Returns the absolute value of self.
+
+ If the second argument is 0, do not round.
+ """
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ if not round:
+ if context is None:
+ context = getcontext()
+ context = context._shallow_copy()
+ context._set_rounding_decision(NEVER_ROUND)
+
+ if self._sign:
+ ans = self.__neg__(context=context)
+ else:
+ ans = self.__pos__(context=context)
+
+ return ans
+
+ def __add__(self, other, context=None):
+ """Returns self + other.
+
+ -INF + INF (or the reverse) cause InvalidOperation errors.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if context is None:
+ context = getcontext()
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ return ans
+
+ if self._isinfinity():
+ #If both INF, same sign => same as both, opposite => error.
+ if self._sign != other._sign and other._isinfinity():
+ return context._raise_error(InvalidOperation, '-INF + INF')
+ return Decimal(self)
+ if other._isinfinity():
+ return Decimal(other) #Can't both be infinity here
+
+ shouldround = context._rounding_decision == ALWAYS_ROUND
+
+ exp = min(self._exp, other._exp)
+ negativezero = 0
+ if context.rounding == ROUND_FLOOR and self._sign != other._sign:
+ #If the answer is 0, the sign should be negative, in this case.
+ negativezero = 1
+
+ if not self and not other:
+ sign = min(self._sign, other._sign)
+ if negativezero:
+ sign = 1
+ return Decimal( (sign, (0,), exp))
+ if not self:
+ exp = max(exp, other._exp - context.prec-1)
+ ans = other._rescale(exp, watchexp=0, context=context)
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+ if not other:
+ exp = max(exp, self._exp - context.prec-1)
+ ans = self._rescale(exp, watchexp=0, context=context)
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+
+ op1 = _WorkRep(self)
+ op2 = _WorkRep(other)
+ op1, op2 = _normalize(op1, op2, shouldround, context.prec)
+
+ result = _WorkRep()
+ if op1.sign != op2.sign:
+ # Equal and opposite
+ if op1.int == op2.int:
+ if exp < context.Etiny():
+ exp = context.Etiny()
+ context._raise_error(Clamped)
+ return Decimal((negativezero, (0,), exp))
+ if op1.int < op2.int:
+ op1, op2 = op2, op1
+ #OK, now abs(op1) > abs(op2)
+ if op1.sign == 1:
+ result.sign = 1
+ op1.sign, op2.sign = op2.sign, op1.sign
+ else:
+ result.sign = 0
+ #So we know the sign, and op1 > 0.
+ elif op1.sign == 1:
+ result.sign = 1
+ op1.sign, op2.sign = (0, 0)
+ else:
+ result.sign = 0
+ #Now, op1 > abs(op2) > 0
+
+ if op2.sign == 0:
+ result.int = op1.int + op2.int
+ else:
+ result.int = op1.int - op2.int
+
+ result.exp = op1.exp
+ ans = Decimal(result)
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+
+ __radd__ = __add__
+
+ def __sub__(self, other, context=None):
+ """Return self + (-other)"""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context=context)
+ if ans:
+ return ans
+
+ # -Decimal(0) = Decimal(0), which we don't want since
+ # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
+ # so we change the sign directly to a copy
+ tmp = Decimal(other)
+ tmp._sign = 1-tmp._sign
+
+ return self.__add__(tmp, context=context)
+
+ def __rsub__(self, other, context=None):
+ """Return other + (-self)"""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ tmp = Decimal(self)
+ tmp._sign = 1 - tmp._sign
+ return other.__add__(tmp, context=context)
+
+ def _increment(self, round=1, context=None):
+ """Special case of add, adding 1eExponent
+
+ Since it is common, (rounding, for example) this adds
+ (sign)*one E self._exp to the number more efficiently than add.
+
+ For example:
+ Decimal('5.624e10')._increment() == Decimal('5.625e10')
+ """
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ return Decimal(self) # Must be infinite, and incrementing makes no difference
+
+ L = list(self._int)
+ L[-1] += 1
+ spot = len(L)-1
+ while L[spot] == 10:
+ L[spot] = 0
+ if spot == 0:
+ L[0:0] = [1]
+ break
+ L[spot-1] += 1
+ spot -= 1
+ ans = Decimal((self._sign, L, self._exp))
+
+ if context is None:
+ context = getcontext()
+ if round and context._rounding_decision == ALWAYS_ROUND:
+ ans = ans._fix(context)
+ return ans
+
+ def __mul__(self, other, context=None):
+ """Return self * other.
+
+ (+-) INF * 0 (or its reverse) raise InvalidOperation.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if context is None:
+ context = getcontext()
+
+ resultsign = self._sign ^ other._sign
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ return ans
+
+ if self._isinfinity():
+ if not other:
+ return context._raise_error(InvalidOperation, '(+-)INF * 0')
+ return Infsign[resultsign]
+
+ if other._isinfinity():
+ if not self:
+ return context._raise_error(InvalidOperation, '0 * (+-)INF')
+ return Infsign[resultsign]
+
+ resultexp = self._exp + other._exp
+ shouldround = context._rounding_decision == ALWAYS_ROUND
+
+ # Special case for multiplying by zero
+ if not self or not other:
+ ans = Decimal((resultsign, (0,), resultexp))
+ if shouldround:
+ #Fixing in case the exponent is out of bounds
+ ans = ans._fix(context)
+ return ans
+
+ # Special case for multiplying by power of 10
+ if self._int == (1,):
+ ans = Decimal((resultsign, other._int, resultexp))
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+ if other._int == (1,):
+ ans = Decimal((resultsign, self._int, resultexp))
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+
+ op1 = _WorkRep(self)
+ op2 = _WorkRep(other)
+
+ ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp))
+ if shouldround:
+ ans = ans._fix(context)
+
+ return ans
+ __rmul__ = __mul__
+
+ def __div__(self, other, context=None):
+ """Return self / other."""
+ return self._divide(other, context=context)
+ __truediv__ = __div__
+
+ def _divide(self, other, divmod = 0, context=None):
+ """Return a / b, to context.prec precision.
+
+ divmod:
+ 0 => true division
+ 1 => (a //b, a%b)
+ 2 => a //b
+ 3 => a%b
+
+ Actually, if divmod is 2 or 3 a tuple is returned, but errors for
+ computing the other value are not raised.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ if divmod in (0, 1):
+ return NotImplemented
+ return (NotImplemented, NotImplemented)
+
+ if context is None:
+ context = getcontext()
+
+ sign = self._sign ^ other._sign
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ if divmod:
+ return (ans, ans)
+ return ans
+
+ if self._isinfinity() and other._isinfinity():
+ if divmod:
+ return (context._raise_error(InvalidOperation,
+ '(+-)INF // (+-)INF'),
+ context._raise_error(InvalidOperation,
+ '(+-)INF % (+-)INF'))
+ return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
+
+ if self._isinfinity():
+ if divmod == 1:
+ return (Infsign[sign],
+ context._raise_error(InvalidOperation, 'INF % x'))
+ elif divmod == 2:
+ return (Infsign[sign], NaN)
+ elif divmod == 3:
+ return (Infsign[sign],
+ context._raise_error(InvalidOperation, 'INF % x'))
+ return Infsign[sign]
+
+ if other._isinfinity():
+ if divmod:
+ return (Decimal((sign, (0,), 0)), Decimal(self))
+ context._raise_error(Clamped, 'Division by infinity')
+ return Decimal((sign, (0,), context.Etiny()))
+
+ # Special cases for zeroes
+ if not self and not other:
+ if divmod:
+ return context._raise_error(DivisionUndefined, '0 / 0', 1)
+ return context._raise_error(DivisionUndefined, '0 / 0')
+
+ if not self:
+ if divmod:
+ otherside = Decimal(self)
+ otherside._exp = min(self._exp, other._exp)
+ return (Decimal((sign, (0,), 0)), otherside)
+ exp = self._exp - other._exp
+ if exp < context.Etiny():
+ exp = context.Etiny()
+ context._raise_error(Clamped, '0e-x / y')
+ if exp > context.Emax:
+ exp = context.Emax
+ context._raise_error(Clamped, '0e+x / y')
+ return Decimal( (sign, (0,), exp) )
+
+ if not other:
+ if divmod:
+ return context._raise_error(DivisionByZero, 'divmod(x,0)',
+ sign, 1)
+ return context._raise_error(DivisionByZero, 'x / 0', sign)
+
+ #OK, so neither = 0, INF or NaN
+
+ shouldround = context._rounding_decision == ALWAYS_ROUND
+
+ #If we're dividing into ints, and self < other, stop.
+ #self.__abs__(0) does not round.
+ if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
+
+ if divmod == 1 or divmod == 3:
+ exp = min(self._exp, other._exp)
+ ans2 = self._rescale(exp, context=context, watchexp=0)
+ if shouldround:
+ ans2 = ans2._fix(context)
+ return (Decimal( (sign, (0,), 0) ),
+ ans2)
+
+ elif divmod == 2:
+ #Don't round the mod part, if we don't need it.
+ return (Decimal( (sign, (0,), 0) ), Decimal(self))
+
+ op1 = _WorkRep(self)
+ op2 = _WorkRep(other)
+ op1, op2, adjust = _adjust_coefficients(op1, op2)
+ res = _WorkRep( (sign, 0, (op1.exp - op2.exp)) )
+ if divmod and res.exp > context.prec + 1:
+ return context._raise_error(DivisionImpossible)
+
+ prec_limit = 10 ** context.prec
+ while 1:
+ while op2.int <= op1.int:
+ res.int += 1
+ op1.int -= op2.int
+ if res.exp == 0 and divmod:
+ if res.int >= prec_limit and shouldround:
+ return context._raise_error(DivisionImpossible)
+ otherside = Decimal(op1)
+ frozen = context._ignore_all_flags()
+
+ exp = min(self._exp, other._exp)
+ otherside = otherside._rescale(exp, context=context, watchexp=0)
+ context._regard_flags(*frozen)
+ if shouldround:
+ otherside = otherside._fix(context)
+ return (Decimal(res), otherside)
+
+ if op1.int == 0 and adjust >= 0 and not divmod:
+ break
+ if res.int >= prec_limit and shouldround:
+ if divmod:
+ return context._raise_error(DivisionImpossible)
+ shouldround=1
+ # Really, the answer is a bit higher, so adding a one to
+ # the end will make sure the rounding is right.
+ if op1.int != 0:
+ res.int *= 10
+ res.int += 1
+ res.exp -= 1
+
+ break
+ res.int *= 10
+ res.exp -= 1
+ adjust += 1
+ op1.int *= 10
+ op1.exp -= 1
+
+ if res.exp == 0 and divmod and op2.int > op1.int:
+ #Solves an error in precision. Same as a previous block.
+
+ if res.int >= prec_limit and shouldround:
+ return context._raise_error(DivisionImpossible)
+ otherside = Decimal(op1)
+ frozen = context._ignore_all_flags()
+
+ exp = min(self._exp, other._exp)
+ otherside = otherside._rescale(exp, context=context)
+
+ context._regard_flags(*frozen)
+
+ return (Decimal(res), otherside)
+
+ ans = Decimal(res)
+ if shouldround:
+ ans = ans._fix(context)
+ return ans
+
+ def __rdiv__(self, other, context=None):
+ """Swaps self/other and returns __div__."""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ return other.__div__(self, context=context)
+ __rtruediv__ = __rdiv__
+
+ def __divmod__(self, other, context=None):
+ """
+ (self // other, self % other)
+ """
+ return self._divide(other, 1, context)
+
+ def __rdivmod__(self, other, context=None):
+ """Swaps self/other and returns __divmod__."""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ return other.__divmod__(self, context=context)
+
+ def __mod__(self, other, context=None):
+ """
+ self % other
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ return ans
+
+ if self and not other:
+ return context._raise_error(InvalidOperation, 'x % 0')
+
+ return self._divide(other, 3, context)[1]
+
+ def __rmod__(self, other, context=None):
+ """Swaps self/other and returns __mod__."""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ return other.__mod__(self, context=context)
+
+ def remainder_near(self, other, context=None):
+ """
+ Remainder nearest to 0- abs(remainder-near) <= other/2
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ ans = self._check_nans(other, context)
+ if ans:
+ return ans
+ if self and not other:
+ return context._raise_error(InvalidOperation, 'x % 0')
+
+ if context is None:
+ context = getcontext()
+ # If DivisionImpossible causes an error, do not leave Rounded/Inexact
+ # ignored in the calling function.
+ context = context._shallow_copy()
+ flags = context._ignore_flags(Rounded, Inexact)
+ #keep DivisionImpossible flags
+ (side, r) = self.__divmod__(other, context=context)
+
+ if r._isnan():
+ context._regard_flags(*flags)
+ return r
+
+ context = context._shallow_copy()
+ rounding = context._set_rounding_decision(NEVER_ROUND)
+
+ if other._sign:
+ comparison = other.__div__(Decimal(-2), context=context)
+ else:
+ comparison = other.__div__(Decimal(2), context=context)
+
+ context._set_rounding_decision(rounding)
+ context._regard_flags(*flags)
+
+ s1, s2 = r._sign, comparison._sign
+ r._sign, comparison._sign = 0, 0
+
+ if r < comparison:
+ r._sign, comparison._sign = s1, s2
+ #Get flags now
+ self.__divmod__(other, context=context)
+ return r._fix(context)
+ r._sign, comparison._sign = s1, s2
+
+ rounding = context._set_rounding_decision(NEVER_ROUND)
+
+ (side, r) = self.__divmod__(other, context=context)
+ context._set_rounding_decision(rounding)
+ if r._isnan():
+ return r
+
+ decrease = not side._iseven()
+ rounding = context._set_rounding_decision(NEVER_ROUND)
+ side = side.__abs__(context=context)
+ context._set_rounding_decision(rounding)
+
+ s1, s2 = r._sign, comparison._sign
+ r._sign, comparison._sign = 0, 0
+ if r > comparison or decrease and r == comparison:
+ r._sign, comparison._sign = s1, s2
+ context.prec += 1
+ if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
+ context.prec -= 1
+ return context._raise_error(DivisionImpossible)[1]
+ context.prec -= 1
+ if self._sign == other._sign:
+ r = r.__sub__(other, context=context)
+ else:
+ r = r.__add__(other, context=context)
+ else:
+ r._sign, comparison._sign = s1, s2
+
+ return r._fix(context)
+
+ def __floordiv__(self, other, context=None):
+ """self // other"""
+ return self._divide(other, 2, context)[0]
+
+ def __rfloordiv__(self, other, context=None):
+ """Swaps self/other and returns __floordiv__."""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ return other.__floordiv__(self, context=context)
+
+ def __float__(self):
+ """Float representation."""
+ return float(str(self))
+
+ def __int__(self):
+ """Converts self to an int, truncating if necessary."""
+ if self._is_special:
+ if self._isnan():
+ context = getcontext()
+ return context._raise_error(InvalidContext)
+ elif self._isinfinity():
+ raise OverflowError, "Cannot convert infinity to long"
+ if self._exp >= 0:
+ s = ''.join(map(str, self._int)) + '0'*self._exp
+ else:
+ s = ''.join(map(str, self._int))[:self._exp]
+ if s == '':
+ s = '0'
+ sign = '-'*self._sign
+ return int(sign + s)
+
+ def __long__(self):
+ """Converts to a long.
+
+ Equivalent to long(int(self))
+ """
+ return long(self.__int__())
+
+ def _fix(self, context):
+ """Round if it is necessary to keep self within prec precision.
+
+ Rounds and fixes the exponent. Does not raise on a sNaN.
+
+ Arguments:
+ self - Decimal instance
+ context - context used.
+ """
+ if self._is_special:
+ return self
+ if context is None:
+ context = getcontext()
+ prec = context.prec
+ ans = self._fixexponents(context)
+ if len(ans._int) > prec:
+ ans = ans._round(prec, context=context)
+ ans = ans._fixexponents(context)
+ return ans
+
+ def _fixexponents(self, context):
+ """Fix the exponents and return a copy with the exponent in bounds.
+ Only call if known to not be a special value.
+ """
+ folddown = context._clamp
+ Emin = context.Emin
+ ans = self
+ ans_adjusted = ans.adjusted()
+ if ans_adjusted < Emin:
+ Etiny = context.Etiny()
+ if ans._exp < Etiny:
+ if not ans:
+ ans = Decimal(self)
+ ans._exp = Etiny
+ context._raise_error(Clamped)
+ return ans
+ ans = ans._rescale(Etiny, context=context)
+ #It isn't zero, and exp < Emin => subnormal
+ context._raise_error(Subnormal)
+ if context.flags[Inexact]:
+ context._raise_error(Underflow)
+ else:
+ if ans:
+ #Only raise subnormal if non-zero.
+ context._raise_error(Subnormal)
+ else:
+ Etop = context.Etop()
+ if folddown and ans._exp > Etop:
+ context._raise_error(Clamped)
+ ans = ans._rescale(Etop, context=context)
+ else:
+ Emax = context.Emax
+ if ans_adjusted > Emax:
+ if not ans:
+ ans = Decimal(self)
+ ans._exp = Emax
+ context._raise_error(Clamped)
+ return ans
+ context._raise_error(Inexact)
+ context._raise_error(Rounded)
+ return context._raise_error(Overflow, 'above Emax', ans._sign)
+ return ans
+
+ def _round(self, prec=None, rounding=None, context=None):
+ """Returns a rounded version of self.
+
+ You can specify the precision or rounding method. Otherwise, the
+ context determines it.
+ """
+
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ if self._isinfinity():
+ return Decimal(self)
+
+ if context is None:
+ context = getcontext()
+
+ if rounding is None:
+ rounding = context.rounding
+ if prec is None:
+ prec = context.prec
+
+ if not self:
+ if prec <= 0:
+ dig = (0,)
+ exp = len(self._int) - prec + self._exp
+ else:
+ dig = (0,) * prec
+ exp = len(self._int) + self._exp - prec
+ ans = Decimal((self._sign, dig, exp))
+ context._raise_error(Rounded)
+ return ans
+
+ if prec == 0:
+ temp = Decimal(self)
+ temp._int = (0,)+temp._int
+ prec = 1
+ elif prec < 0:
+ exp = self._exp + len(self._int) - prec - 1
+ temp = Decimal( (self._sign, (0, 1), exp))
+ prec = 1
+ else:
+ temp = Decimal(self)
+
+ numdigits = len(temp._int)
+ if prec == numdigits:
+ return temp
+
+ # See if we need to extend precision
+ expdiff = prec - numdigits
+ if expdiff > 0:
+ tmp = list(temp._int)
+ tmp.extend([0] * expdiff)
+ ans = Decimal( (temp._sign, tmp, temp._exp - expdiff))
+ return ans
+
+ #OK, but maybe all the lost digits are 0.
+ lostdigits = self._int[expdiff:]
+ if lostdigits == (0,) * len(lostdigits):
+ ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
+ #Rounded, but not Inexact
+ context._raise_error(Rounded)
+ return ans
+
+ # Okay, let's round and lose data
+
+ this_function = getattr(temp, self._pick_rounding_function[rounding])
+ #Now we've got the rounding function
+
+ if prec != context.prec:
+ context = context._shallow_copy()
+ context.prec = prec
+ ans = this_function(prec, expdiff, context)
+ context._raise_error(Rounded)
+ context._raise_error(Inexact, 'Changed in rounding')
+
+ return ans
+
+ _pick_rounding_function = {}
+
+ def _round_down(self, prec, expdiff, context):
+ """Also known as round-towards-0, truncate."""
+ return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
+
+ def _round_half_up(self, prec, expdiff, context, tmp = None):
+ """Rounds 5 up (away from 0)"""
+
+ if tmp is None:
+ tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
+ if self._int[prec] >= 5:
+ tmp = tmp._increment(round=0, context=context)
+ if len(tmp._int) > prec:
+ return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
+ return tmp
+
+ def _round_half_even(self, prec, expdiff, context):
+ """Round 5 to even, rest to nearest."""
+
+ tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
+ half = (self._int[prec] == 5)
+ if half:
+ for digit in self._int[prec+1:]:
+ if digit != 0:
+ half = 0
+ break
+ if half:
+ if self._int[prec-1] & 1 == 0:
+ return tmp
+ return self._round_half_up(prec, expdiff, context, tmp)
+
+ def _round_half_down(self, prec, expdiff, context):
+ """Round 5 down"""
+
+ tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
+ half = (self._int[prec] == 5)
+ if half:
+ for digit in self._int[prec+1:]:
+ if digit != 0:
+ half = 0
+ break
+ if half:
+ return tmp
+ return self._round_half_up(prec, expdiff, context, tmp)
+
+ def _round_up(self, prec, expdiff, context):
+ """Rounds away from 0."""
+ tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
+ for digit in self._int[prec:]:
+ if digit != 0:
+ tmp = tmp._increment(round=1, context=context)
+ if len(tmp._int) > prec:
+ return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
+ else:
+ return tmp
+ return tmp
+
+ def _round_ceiling(self, prec, expdiff, context):
+ """Rounds up (not away from 0 if negative.)"""
+ if self._sign:
+ return self._round_down(prec, expdiff, context)
+ else:
+ return self._round_up(prec, expdiff, context)
+
+ def _round_floor(self, prec, expdiff, context):
+ """Rounds down (not towards 0 if negative)"""
+ if not self._sign:
+ return self._round_down(prec, expdiff, context)
+ else:
+ return self._round_up(prec, expdiff, context)
+
+ def __pow__(self, n, modulo = None, context=None):
+ """Return self ** n (mod modulo)
+
+ If modulo is None (default), don't take it mod modulo.
+ """
+ n = _convert_other(n)
+ if n is NotImplemented:
+ return n
+
+ if context is None:
+ context = getcontext()
+
+ if self._is_special or n._is_special or n.adjusted() > 8:
+ #Because the spot << doesn't work with really big exponents
+ if n._isinfinity() or n.adjusted() > 8:
+ return context._raise_error(InvalidOperation, 'x ** INF')
+
+ ans = self._check_nans(n, context)
+ if ans:
+ return ans
+
+ if not n._isinteger():
+ return context._raise_error(InvalidOperation, 'x ** (non-integer)')
+
+ if not self and not n:
+ return context._raise_error(InvalidOperation, '0 ** 0')
+
+ if not n:
+ return Decimal(1)
+
+ if self == Decimal(1):
+ return Decimal(1)
+
+ sign = self._sign and not n._iseven()
+ n = int(n)
+
+ if self._isinfinity():
+ if modulo:
+ return context._raise_error(InvalidOperation, 'INF % x')
+ if n > 0:
+ return Infsign[sign]
+ return Decimal( (sign, (0,), 0) )
+
+ #with ludicrously large exponent, just raise an overflow and return inf.
+ if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
+ and self:
+
+ tmp = Decimal('inf')
+ tmp._sign = sign
+ context._raise_error(Rounded)
+ context._raise_error(Inexact)
+ context._raise_error(Overflow, 'Big power', sign)
+ return tmp
+
+ elength = len(str(abs(n)))
+ firstprec = context.prec
+
+ if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
+ return context._raise_error(Overflow, 'Too much precision.', sign)
+
+ mul = Decimal(self)
+ val = Decimal(1)
+ context = context._shallow_copy()
+ context.prec = firstprec + elength + 1
+ if n < 0:
+ #n is a long now, not Decimal instance
+ n = -n
+ mul = Decimal(1).__div__(mul, context=context)
+
+ spot = 1
+ while spot <= n:
+ spot <<= 1
+
+ spot >>= 1
+ #Spot is the highest power of 2 less than n
+ while spot:
+ val = val.__mul__(val, context=context)
+ if val._isinfinity():
+ val = Infsign[sign]
+ break
+ if spot & n:
+ val = val.__mul__(mul, context=context)
+ if modulo is not None:
+ val = val.__mod__(modulo, context=context)
+ spot >>= 1
+ context.prec = firstprec
+
+ if context._rounding_decision == ALWAYS_ROUND:
+ return val._fix(context)
+ return val
+
+ def __rpow__(self, other, context=None):
+ """Swaps self/other and returns __pow__."""
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ return other.__pow__(self, context=context)
+
+ def normalize(self, context=None):
+ """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
+
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ dup = self._fix(context)
+ if dup._isinfinity():
+ return dup
+
+ if not dup:
+ return Decimal( (dup._sign, (0,), 0) )
+ end = len(dup._int)
+ exp = dup._exp
+ while dup._int[end-1] == 0:
+ exp += 1
+ end -= 1
+ return Decimal( (dup._sign, dup._int[:end], exp) )
+
+
+ def quantize(self, exp, rounding=None, context=None, watchexp=1):
+ """Quantize self so its exponent is the same as that of exp.
+
+ Similar to self._rescale(exp._exp) but with error checking.
+ """
+ if self._is_special or exp._is_special:
+ ans = self._check_nans(exp, context)
+ if ans:
+ return ans
+
+ if exp._isinfinity() or self._isinfinity():
+ if exp._isinfinity() and self._isinfinity():
+ return self #if both are inf, it is OK
+ if context is None:
+ context = getcontext()
+ return context._raise_error(InvalidOperation,
+ 'quantize with one INF')
+ return self._rescale(exp._exp, rounding, context, watchexp)
+
+ def same_quantum(self, other):
+ """Test whether self and other have the same exponent.
+
+ same as self._exp == other._exp, except NaN == sNaN
+ """
+ if self._is_special or other._is_special:
+ if self._isnan() or other._isnan():
+ return self._isnan() and other._isnan() and True
+ if self._isinfinity() or other._isinfinity():
+ return self._isinfinity() and other._isinfinity() and True
+ return self._exp == other._exp
+
+ def _rescale(self, exp, rounding=None, context=None, watchexp=1):
+ """Rescales so that the exponent is exp.
+
+ exp = exp to scale to (an integer)
+ rounding = rounding version
+ watchexp: if set (default) an error is returned if exp is greater
+ than Emax or less than Etiny.
+ """
+ if context is None:
+ context = getcontext()
+
+ if self._is_special:
+ if self._isinfinity():
+ return context._raise_error(InvalidOperation, 'rescale with an INF')
+
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ if watchexp and (context.Emax < exp or context.Etiny() > exp):
+ return context._raise_error(InvalidOperation, 'rescale(a, INF)')
+
+ if not self:
+ ans = Decimal(self)
+ ans._int = (0,)
+ ans._exp = exp
+ return ans
+
+ diff = self._exp - exp
+ digits = len(self._int) + diff
+
+ if watchexp and digits > context.prec:
+ return context._raise_error(InvalidOperation, 'Rescale > prec')
+
+ tmp = Decimal(self)
+ tmp._int = (0,) + tmp._int
+ digits += 1
+
+ if digits < 0:
+ tmp._exp = -digits + tmp._exp
+ tmp._int = (0,1)
+ digits = 1
+ tmp = tmp._round(digits, rounding, context=context)
+
+ if tmp._int[0] == 0 and len(tmp._int) > 1:
+ tmp._int = tmp._int[1:]
+ tmp._exp = exp
+
+ tmp_adjusted = tmp.adjusted()
+ if tmp and tmp_adjusted < context.Emin:
+ context._raise_error(Subnormal)
+ elif tmp and tmp_adjusted > context.Emax:
+ return context._raise_error(InvalidOperation, 'rescale(a, INF)')
+ return tmp
+
+ def to_integral(self, rounding=None, context=None):
+ """Rounds to the nearest integer, without raising inexact, rounded."""
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+ if self._exp >= 0:
+ return self
+ if context is None:
+ context = getcontext()
+ flags = context._ignore_flags(Rounded, Inexact)
+ ans = self._rescale(0, rounding, context=context)
+ context._regard_flags(flags)
+ return ans
+
+ def sqrt(self, context=None):
+ """Return the square root of self.
+
+ Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
+ Should quadratically approach the right answer.
+ """
+ if self._is_special:
+ ans = self._check_nans(context=context)
+ if ans:
+ return ans
+
+ if self._isinfinity() and self._sign == 0:
+ return Decimal(self)
+
+ if not self:
+ #exponent = self._exp / 2, using round_down.
+ #if self._exp < 0:
+ # exp = (self._exp+1) // 2
+ #else:
+ exp = (self._exp) // 2
+ if self._sign == 1:
+ #sqrt(-0) = -0
+ return Decimal( (1, (0,), exp))
+ else:
+ return Decimal( (0, (0,), exp))
+
+ if context is None:
+ context = getcontext()
+
+ if self._sign == 1:
+ return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
+
+ tmp = Decimal(self)
+
+ expadd = tmp._exp // 2
+ if tmp._exp & 1:
+ tmp._int += (0,)
+ tmp._exp = 0
+ else:
+ tmp._exp = 0
+
+ context = context._shallow_copy()
+ flags = context._ignore_all_flags()
+ firstprec = context.prec
+ context.prec = 3
+ if tmp.adjusted() & 1 == 0:
+ ans = Decimal( (0, (8,1,9), tmp.adjusted() - 2) )
+ ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
+ context=context), context=context)
+ ans._exp -= 1 + tmp.adjusted() // 2
+ else:
+ ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
+ ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
+ context=context), context=context)
+ ans._exp -= 1 + tmp.adjusted() // 2
+
+ #ans is now a linear approximation.
+
+ Emax, Emin = context.Emax, context.Emin
+ context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
+
+ half = Decimal('0.5')
+
+ maxp = firstprec + 2
+ rounding = context._set_rounding(ROUND_HALF_EVEN)
+ while 1:
+ context.prec = min(2*context.prec - 2, maxp)
+ ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
+ context=context), context=context)
+ if context.prec == maxp:
+ break
+
+ #round to the answer's precision-- the only error can be 1 ulp.
+ context.prec = firstprec
+ prevexp = ans.adjusted()
+ ans = ans._round(context=context)
+
+ #Now, check if the other last digits are better.
+ context.prec = firstprec + 1
+ # In case we rounded up another digit and we should actually go lower.
+ if prevexp != ans.adjusted():
+ ans._int += (0,)
+ ans._exp -= 1
+
+
+ lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
+ context._set_rounding(ROUND_UP)
+ if lower.__mul__(lower, context=context) > (tmp):
+ ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
+
+ else:
+ upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
+ context._set_rounding(ROUND_DOWN)
+ if upper.__mul__(upper, context=context) < tmp:
+ ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
+
+ ans._exp += expadd
+
+ context.prec = firstprec
+ context.rounding = rounding
+ ans = ans._fix(context)
+
+ rounding = context._set_rounding_decision(NEVER_ROUND)
+ if not ans.__mul__(ans, context=context) == self:
+ # Only rounded/inexact if here.
+ context._regard_flags(flags)
+ context._raise_error(Rounded)
+ context._raise_error(Inexact)
+ else:
+ #Exact answer, so let's set the exponent right.
+ #if self._exp < 0:
+ # exp = (self._exp +1)// 2
+ #else:
+ exp = self._exp // 2
+ context.prec += ans._exp - exp
+ ans = ans._rescale(exp, context=context)
+ context.prec = firstprec
+ context._regard_flags(flags)
+ context.Emax, context.Emin = Emax, Emin
+
+ return ans._fix(context)
+
+ def max(self, other, context=None):
+ """Returns the larger value.
+
+ like max(self, other) except if one is not a number, returns
+ NaN (and signals if one is sNaN). Also rounds.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ # if one operand is a quiet NaN and the other is number, then the
+ # number is always returned
+ sn = self._isnan()
+ on = other._isnan()
+ if sn or on:
+ if on == 1 and sn != 2:
+ return self
+ if sn == 1 and on != 2:
+ return other
+ return self._check_nans(other, context)
+
+ ans = self
+ c = self.__cmp__(other)
+ if c == 0:
+ # if both operands are finite and equal in numerical value
+ # then an ordering is applied:
+ #
+ # if the signs differ then max returns the operand with the
+ # positive sign and min returns the operand with the negative sign
+ #
+ # if the signs are the same then the exponent is used to select
+ # the result.
+ if self._sign != other._sign:
+ if self._sign:
+ ans = other
+ elif self._exp < other._exp and not self._sign:
+ ans = other
+ elif self._exp > other._exp and self._sign:
+ ans = other
+ elif c == -1:
+ ans = other
+
+ if context is None:
+ context = getcontext()
+ if context._rounding_decision == ALWAYS_ROUND:
+ return ans._fix(context)
+ return ans
+
+ def min(self, other, context=None):
+ """Returns the smaller value.
+
+ like min(self, other) except if one is not a number, returns
+ NaN (and signals if one is sNaN). Also rounds.
+ """
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+
+ if self._is_special or other._is_special:
+ # if one operand is a quiet NaN and the other is number, then the
+ # number is always returned
+ sn = self._isnan()
+ on = other._isnan()
+ if sn or on:
+ if on == 1 and sn != 2:
+ return self
+ if sn == 1 and on != 2:
+ return other
+ return self._check_nans(other, context)
+
+ ans = self
+ c = self.__cmp__(other)
+ if c == 0:
+ # if both operands are finite and equal in numerical value
+ # then an ordering is applied:
+ #
+ # if the signs differ then max returns the operand with the
+ # positive sign and min returns the operand with the negative sign
+ #
+ # if the signs are the same then the exponent is used to select
+ # the result.
+ if self._sign != other._sign:
+ if other._sign:
+ ans = other
+ elif self._exp > other._exp and not self._sign:
+ ans = other
+ elif self._exp < other._exp and self._sign:
+ ans = other
+ elif c == 1:
+ ans = other
+
+ if context is None:
+ context = getcontext()
+ if context._rounding_decision == ALWAYS_ROUND:
+ return ans._fix(context)
+ return ans
+
+ def _isinteger(self):
+ """Returns whether self is an integer"""
+ if self._exp >= 0:
+ return True
+ rest = self._int[self._exp:]
+ return rest == (0,)*len(rest)
+
+ def _iseven(self):
+ """Returns 1 if self is even. Assumes self is an integer."""
+ if self._exp > 0:
+ return 1
+ return self._int[-1+self._exp] & 1 == 0
+
+ def adjusted(self):
+ """Return the adjusted exponent of self"""
+ try:
+ return self._exp + len(self._int) - 1
+ #If NaN or Infinity, self._exp is string
+ except TypeError:
+ return 0
+
+ # support for pickling, copy, and deepcopy
+ def __reduce__(self):
+ return (self.__class__, (str(self),))
+
+ def __copy__(self):
+ if type(self) == Decimal:
+ return self # I'm immutable; therefore I am my own clone
+ return self.__class__(str(self))
+
+ def __deepcopy__(self, memo):
+ if type(self) == Decimal:
+ return self # My components are also immutable
+ return self.__class__(str(self))
+
+##### Context class ###########################################
+
+
+# get rounding method function:
+rounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
+for name in rounding_functions:
+ #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
+ globalname = name[1:].upper()
+ val = globals()[globalname]
+ Decimal._pick_rounding_function[val] = name
+
+del name, val, globalname, rounding_functions
+
+class Context(object):
+ """Contains the context for a Decimal instance.
+
+ Contains:
+ prec - precision (for use in rounding, division, square roots..)
+ rounding - rounding type. (how you round)
+ _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
+ traps - If traps[exception] = 1, then the exception is
+ raised when it is caused. Otherwise, a value is
+ substituted in.
+ flags - When an exception is caused, flags[exception] is incremented.
+ (Whether or not the trap_enabler is set)
+ Should be reset by user of Decimal instance.
+ Emin - Minimum exponent
+ Emax - Maximum exponent
+ capitals - If 1, 1*10^1 is printed as 1E+1.
+ If 0, printed as 1e1
+ _clamp - If 1, change exponents if too high (Default 0)
+ """
+
+ def __init__(self, prec=None, rounding=None,
+ traps=None, flags=None,
+ _rounding_decision=None,
+ Emin=None, Emax=None,
+ capitals=None, _clamp=0,
+ _ignored_flags=None):
+ if flags is None:
+ flags = []
+ if _ignored_flags is None:
+ _ignored_flags = []
+ if not isinstance(flags, dict):
+ flags = dict([(s,s in flags) for s in _signals])
+ del s
+ if traps is not None and not isinstance(traps, dict):
+ traps = dict([(s,s in traps) for s in _signals])
+ del s
+ for name, val in locals().items():
+ if val is None:
+ setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
+ else:
+ setattr(self, name, val)
+ del self.self
+
+ def __repr__(self):
+ """Show the current context."""
+ s = []
+ s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
+ s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
+ s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
+ return ', '.join(s) + ')'
+
+ def clear_flags(self):
+ """Reset all flags to zero"""
+ for flag in self.flags:
+ self.flags[flag] = 0
+
+ def _shallow_copy(self):
+ """Returns a shallow copy from self."""
+ nc = Context(self.prec, self.rounding, self.traps, self.flags,
+ self._rounding_decision, self.Emin, self.Emax,
+ self.capitals, self._clamp, self._ignored_flags)
+ return nc
+
+ def copy(self):
+ """Returns a deep copy from self."""
+ nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
+ self._rounding_decision, self.Emin, self.Emax,
+ self.capitals, self._clamp, self._ignored_flags)
+ return nc
+ __copy__ = copy
+
+ def _raise_error(self, condition, explanation = None, *args):
+ """Handles an error
+
+ If the flag is in _ignored_flags, returns the default response.
+ Otherwise, it increments the flag, then, if the corresponding
+ trap_enabler is set, it reaises the exception. Otherwise, it returns
+ the default value after incrementing the flag.
+ """
+ error = _condition_map.get(condition, condition)
+ if error in self._ignored_flags:
+ #Don't touch the flag
+ return error().handle(self, *args)
+
+ self.flags[error] += 1
+ if not self.traps[error]:
+ #The errors define how to handle themselves.
+ return condition().handle(self, *args)
+
+ # Errors should only be risked on copies of the context
+ #self._ignored_flags = []
+ raise error, explanation
+
+ def _ignore_all_flags(self):
+ """Ignore all flags, if they are raised"""
+ return self._ignore_flags(*_signals)
+
+ def _ignore_flags(self, *flags):
+ """Ignore the flags, if they are raised"""
+ # Do not mutate-- This way, copies of a context leave the original
+ # alone.
+ self._ignored_flags = (self._ignored_flags + list(flags))
+ return list(flags)
+
+ def _regard_flags(self, *flags):
+ """Stop ignoring the flags, if they are raised"""
+ if flags and isinstance(flags[0], (tuple,list)):
+ flags = flags[0]
+ for flag in flags:
+ self._ignored_flags.remove(flag)
+
+ def __hash__(self):
+ """A Context cannot be hashed."""
+ # We inherit object.__hash__, so we must deny this explicitly
+ raise TypeError, "Cannot hash a Context."
+
+ def Etiny(self):
+ """Returns Etiny (= Emin - prec + 1)"""
+ return int(self.Emin - self.prec + 1)
+
+ def Etop(self):
+ """Returns maximum exponent (= Emax - prec + 1)"""
+ return int(self.Emax - self.prec + 1)
+
+ def _set_rounding_decision(self, type):
+ """Sets the rounding decision.
+
+ Sets the rounding decision, and returns the current (previous)
+ rounding decision. Often used like:
+
+ context = context._shallow_copy()
+ # That so you don't change the calling context
+ # if an error occurs in the middle (say DivisionImpossible is raised).
+
+ rounding = context._set_rounding_decision(NEVER_ROUND)
+ instance = instance / Decimal(2)
+ context._set_rounding_decision(rounding)
+
+ This will make it not round for that operation.
+ """
+
+ rounding = self._rounding_decision
+ self._rounding_decision = type
+ return rounding
+
+ def _set_rounding(self, type):
+ """Sets the rounding type.
+
+ Sets the rounding type, and returns the current (previous)
+ rounding type. Often used like:
+
+ context = context.copy()
+ # so you don't change the calling context
+ # if an error occurs in the middle.
+ rounding = context._set_rounding(ROUND_UP)
+ val = self.__sub__(other, context=context)
+ context._set_rounding(rounding)
+
+ This will make it round up for that operation.
+ """
+ rounding = self.rounding
+ self.rounding= type
+ return rounding
+
+ def create_decimal(self, num='0'):
+ """Creates a new Decimal instance but using self as context."""
+ d = Decimal(num, context=self)
+ return d._fix(self)
+
+ #Methods
+ def abs(self, a):
+ """Returns the absolute value of the operand.
+
+ If the operand is negative, the result is the same as using the minus
+ operation on the operand. Otherwise, the result is the same as using
+ the plus operation on the operand.
+
+ >>> ExtendedContext.abs(Decimal('2.1'))
+ Decimal("2.1")
+ >>> ExtendedContext.abs(Decimal('-100'))
+ Decimal("100")
+ >>> ExtendedContext.abs(Decimal('101.5'))
+ Decimal("101.5")
+ >>> ExtendedContext.abs(Decimal('-101.5'))
+ Decimal("101.5")
+ """
+ return a.__abs__(context=self)
+
+ def add(self, a, b):
+ """Return the sum of the two operands.
+
+ >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
+ Decimal("19.00")
+ >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
+ Decimal("1.02E+4")
+ """
+ return a.__add__(b, context=self)
+
+ def _apply(self, a):
+ return str(a._fix(self))
+
+ def compare(self, a, b):
+ """Compares values numerically.
+
+ If the signs of the operands differ, a value representing each operand
+ ('-1' if the operand is less than zero, '0' if the operand is zero or
+ negative zero, or '1' if the operand is greater than zero) is used in
+ place of that operand for the comparison instead of the actual
+ operand.
+
+ The comparison is then effected by subtracting the second operand from
+ the first and then returning a value according to the result of the
+ subtraction: '-1' if the result is less than zero, '0' if the result is
+ zero or negative zero, or '1' if the result is greater than zero.
+
+ >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
+ Decimal("-1")
+ >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
+ Decimal("0")
+ >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
+ Decimal("0")
+ >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
+ Decimal("1")
+ >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
+ Decimal("1")
+ >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
+ Decimal("-1")
+ """
+ return a.compare(b, context=self)
+
+ def divide(self, a, b):
+ """Decimal division in a specified context.
+
+ >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
+ Decimal("0.333333333")
+ >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
+ Decimal("0.666666667")
+ >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
+ Decimal("2.5")
+ >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
+ Decimal("0.1")
+ >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
+ Decimal("1")
+ >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
+ Decimal("4.00")
+ >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
+ Decimal("1.20")
+ >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
+ Decimal("10")
+ >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
+ Decimal("1000")
+ >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
+ Decimal("1.20E+6")
+ """
+ return a.__div__(b, context=self)
+
+ def divide_int(self, a, b):
+ """Divides two numbers and returns the integer part of the result.
+
+ >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
+ Decimal("0")
+ >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
+ Decimal("3")
+ >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
+ Decimal("3")
+ """
+ return a.__floordiv__(b, context=self)
+
+ def divmod(self, a, b):
+ return a.__divmod__(b, context=self)
+
+ def max(self, a,b):
+ """max compares two values numerically and returns the maximum.
+
+ If either operand is a NaN then the general rules apply.
+ Otherwise, the operands are compared as as though by the compare
+ operation. If they are numerically equal then the left-hand operand
+ is chosen as the result. Otherwise the maximum (closer to positive
+ infinity) of the two operands is chosen as the result.
+
+ >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
+ Decimal("3")
+ >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
+ Decimal("3")
+ >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
+ Decimal("1")
+ >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
+ Decimal("7")
+ """
+ return a.max(b, context=self)
+
+ def min(self, a,b):
+ """min compares two values numerically and returns the minimum.
+
+ If either operand is a NaN then the general rules apply.
+ Otherwise, the operands are compared as as though by the compare
+ operation. If they are numerically equal then the left-hand operand
+ is chosen as the result. Otherwise the minimum (closer to negative
+ infinity) of the two operands is chosen as the result.
+
+ >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
+ Decimal("2")
+ >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
+ Decimal("-10")
+ >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
+ Decimal("1.0")
+ >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
+ Decimal("7")
+ """
+ return a.min(b, context=self)
+
+ def minus(self, a):
+ """Minus corresponds to unary prefix minus in Python.
+
+ The operation is evaluated using the same rules as subtract; the
+ operation minus(a) is calculated as subtract('0', a) where the '0'
+ has the same exponent as the operand.
+
+ >>> ExtendedContext.minus(Decimal('1.3'))
+ Decimal("-1.3")
+ >>> ExtendedContext.minus(Decimal('-1.3'))
+ Decimal("1.3")
+ """
+ return a.__neg__(context=self)
+
+ def multiply(self, a, b):
+ """multiply multiplies two operands.
+
+ If either operand is a special value then the general rules apply.
+ Otherwise, the operands are multiplied together ('long multiplication'),
+ resulting in a number which may be as long as the sum of the lengths
+ of the two operands.
+
+ >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
+ Decimal("3.60")
+ >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
+ Decimal("21")
+ >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
+ Decimal("0.72")
+ >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
+ Decimal("-0.0")
+ >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
+ Decimal("4.28135971E+11")
+ """
+ return a.__mul__(b, context=self)
+
+ def normalize(self, a):
+ """normalize reduces an operand to its simplest form.
+
+ Essentially a plus operation with all trailing zeros removed from the
+ result.
+
+ >>> ExtendedContext.normalize(Decimal('2.1'))
+ Decimal("2.1")
+ >>> ExtendedContext.normalize(Decimal('-2.0'))
+ Decimal("-2")
+ >>> ExtendedContext.normalize(Decimal('1.200'))
+ Decimal("1.2")
+ >>> ExtendedContext.normalize(Decimal('-120'))
+ Decimal("-1.2E+2")
+ >>> ExtendedContext.normalize(Decimal('120.00'))
+ Decimal("1.2E+2")
+ >>> ExtendedContext.normalize(Decimal('0.00'))
+ Decimal("0")
+ """
+ return a.normalize(context=self)
+
+ def plus(self, a):
+ """Plus corresponds to unary prefix plus in Python.
+
+ The operation is evaluated using the same rules as add; the
+ operation plus(a) is calculated as add('0', a) where the '0'
+ has the same exponent as the operand.
+
+ >>> ExtendedContext.plus(Decimal('1.3'))
+ Decimal("1.3")
+ >>> ExtendedContext.plus(Decimal('-1.3'))
+ Decimal("-1.3")
+ """
+ return a.__pos__(context=self)
+
+ def power(self, a, b, modulo=None):
+ """Raises a to the power of b, to modulo if given.
+
+ The right-hand operand must be a whole number whose integer part (after
+ any exponent has been applied) has no more than 9 digits and whose
+ fractional part (if any) is all zeros before any rounding. The operand
+ may be positive, negative, or zero; if negative, the absolute value of
+ the power is used, and the left-hand operand is inverted (divided into
+ 1) before use.
+
+ If the increased precision needed for the intermediate calculations
+ exceeds the capabilities of the implementation then an Invalid operation
+ condition is raised.
+
+ If, when raising to a negative power, an underflow occurs during the
+ division into 1, the operation is not halted at that point but
+ continues.
+
+ >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
+ Decimal("8")
+ >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
+ Decimal("0.125")
+ >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
+ Decimal("69.7575744")
+ >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
+ Decimal("0")
+ >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
+ Decimal("0")
+ >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
+ Decimal("1")
+ >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
+ Decimal("Infinity")
+ >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
+ Decimal("Infinity")
+ >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
+ Decimal("0")
+ >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
+ Decimal("-0")
+ >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
+ Decimal("1")
+ >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
+ Decimal("-Infinity")
+ >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
+ Decimal("Infinity")
+ >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
+ Decimal("NaN")
+ """
+ return a.__pow__(b, modulo, context=self)
+
+ def quantize(self, a, b):
+ """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
+
+ The coefficient of the result is derived from that of the left-hand
+ operand. It may be rounded using the current rounding setting (if the
+ exponent is being increased), multiplied by a positive power of ten (if
+ the exponent is being decreased), or is unchanged (if the exponent is
+ already equal to that of the right-hand operand).
+
+ Unlike other operations, if the length of the coefficient after the
+ quantize operation would be greater than precision then an Invalid
+ operation condition is raised. This guarantees that, unless there is an
+ error condition, the exponent of the result of a quantize is always
+ equal to that of the right-hand operand.
+
+ Also unlike other operations, quantize will never raise Underflow, even
+ if the result is subnormal and inexact.
+
+ >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
+ Decimal("2.170")
+ >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
+ Decimal("2.17")
+ >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
+ Decimal("2.2")
+ >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
+ Decimal("2")
+ >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
+ Decimal("0E+1")
+ >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
+ Decimal("-Infinity")
+ >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
+ Decimal("NaN")
+ >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
+ Decimal("-0")
+ >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
+ Decimal("-0E+5")
+ >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
+ Decimal("NaN")
+ >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
+ Decimal("NaN")
+ >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
+ Decimal("217.0")
+ >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
+ Decimal("217")
+ >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
+ Decimal("2.2E+2")
+ >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
+ Decimal("2E+2")
+ """
+ return a.quantize(b, context=self)
+
+ def remainder(self, a, b):
+ """Returns the remainder from integer division.
+
+ The result is the residue of the dividend after the operation of
+ calculating integer division as described for divide-integer, rounded to
+ precision digits if necessary. The sign of the result, if non-zero, is
+ the same as that of the original dividend.
+
+ This operation will fail under the same conditions as integer division
+ (that is, if integer division on the same two operands would fail, the
+ remainder cannot be calculated).
+
+ >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
+ Decimal("2.1")
+ >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
+ Decimal("1")
+ >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
+ Decimal("-1")
+ >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
+ Decimal("0.2")
+ >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
+ Decimal("0.1")
+ >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
+ Decimal("1.0")
+ """
+ return a.__mod__(b, context=self)
+
+ def remainder_near(self, a, b):
+ """Returns to be "a - b * n", where n is the integer nearest the exact
+ value of "x / b" (if two integers are equally near then the even one
+ is chosen). If the result is equal to 0 then its sign will be the
+ sign of a.
+
+ This operation will fail under the same conditions as integer division
+ (that is, if integer division on the same two operands would fail, the
+ remainder cannot be calculated).
+
+ >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
+ Decimal("-0.9")
+ >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
+ Decimal("-2")
+ >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
+ Decimal("1")
+ >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
+ Decimal("-1")
+ >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
+ Decimal("0.2")
+ >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
+ Decimal("0.1")
+ >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
+ Decimal("-0.3")
+ """
+ return a.remainder_near(b, context=self)
+
+ def same_quantum(self, a, b):
+ """Returns True if the two operands have the same exponent.
+
+ The result is never affected by either the sign or the coefficient of
+ either operand.
+
+ >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
+ False
+ >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
+ True
+ >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
+ False
+ >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
+ True
+ """
+ return a.same_quantum(b)
+
+ def sqrt(self, a):
+ """Returns the square root of a non-negative number to context precision.
+
+ If the result must be inexact, it is rounded using the round-half-even
+ algorithm.
+
+ >>> ExtendedContext.sqrt(Decimal('0'))
+ Decimal("0")
+ >>> ExtendedContext.sqrt(Decimal('-0'))
+ Decimal("-0")
+ >>> ExtendedContext.sqrt(Decimal('0.39'))
+ Decimal("0.624499800")
+ >>> ExtendedContext.sqrt(Decimal('100'))
+ Decimal("10")
+ >>> ExtendedContext.sqrt(Decimal('1'))
+ Decimal("1")
+ >>> ExtendedContext.sqrt(Decimal('1.0'))
+ Decimal("1.0")
+ >>> ExtendedContext.sqrt(Decimal('1.00'))
+ Decimal("1.0")
+ >>> ExtendedContext.sqrt(Decimal('7'))
+ Decimal("2.64575131")
+ >>> ExtendedContext.sqrt(Decimal('10'))
+ Decimal("3.16227766")
+ >>> ExtendedContext.prec
+ 9
+ """
+ return a.sqrt(context=self)
+
+ def subtract(self, a, b):
+ """Return the difference between the two operands.
+
+ >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
+ Decimal("0.23")
+ >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
+ Decimal("0.00")
+ >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
+ Decimal("-0.77")
+ """
+ return a.__sub__(b, context=self)
+
+ def to_eng_string(self, a):
+ """Converts a number to a string, using scientific notation.
+
+ The operation is not affected by the context.
+ """
+ return a.to_eng_string(context=self)
+
+ def to_sci_string(self, a):
+ """Converts a number to a string, using scientific notation.
+
+ The operation is not affected by the context.
+ """
+ return a.__str__(context=self)
+
+ def to_integral(self, a):
+ """Rounds to an integer.
+
+ When the operand has a negative exponent, the result is the same
+ as using the quantize() operation using the given operand as the
+ left-hand-operand, 1E+0 as the right-hand-operand, and the precision
+ of the operand as the precision setting, except that no flags will
+ be set. The rounding mode is taken from the context.
+
+ >>> ExtendedContext.to_integral(Decimal('2.1'))
+ Decimal("2")
+ >>> ExtendedContext.to_integral(Decimal('100'))
+ Decimal("100")
+ >>> ExtendedContext.to_integral(Decimal('100.0'))
+ Decimal("100")
+ >>> ExtendedContext.to_integral(Decimal('101.5'))
+ Decimal("102")
+ >>> ExtendedContext.to_integral(Decimal('-101.5'))
+ Decimal("-102")
+ >>> ExtendedContext.to_integral(Decimal('10E+5'))
+ Decimal("1.0E+6")
+ >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
+ Decimal("7.89E+77")
+ >>> ExtendedContext.to_integral(Decimal('-Inf'))
+ Decimal("-Infinity")
+ """
+ return a.to_integral(context=self)
+
+class _WorkRep(object):
+ __slots__ = ('sign','int','exp')
+ # sign: 0 or 1
+ # int: int or long
+ # exp: None, int, or string
+
+ def __init__(self, value=None):
+ if value is None:
+ self.sign = None
+ self.int = 0
+ self.exp = None
+ elif isinstance(value, Decimal):
+ self.sign = value._sign
+ cum = 0
+ for digit in value._int:
+ cum = cum * 10 + digit
+ self.int = cum
+ self.exp = value._exp
+ else:
+ # assert isinstance(value, tuple)
+ self.sign = value[0]
+ self.int = value[1]
+ self.exp = value[2]
+
+ def __repr__(self):
+ return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
+
+ __str__ = __repr__
+
+
+
+def _normalize(op1, op2, shouldround = 0, prec = 0):
+ """Normalizes op1, op2 to have the same exp and length of coefficient.
+
+ Done during addition.
+ """
+ # Yes, the exponent is a long, but the difference between exponents
+ # must be an int-- otherwise you'd get a big memory problem.
+ numdigits = int(op1.exp - op2.exp)
+ if numdigits < 0:
+ numdigits = -numdigits
+ tmp = op2
+ other = op1
+ else:
+ tmp = op1
+ other = op2
+
+
+ if shouldround and numdigits > prec + 1:
+ # Big difference in exponents - check the adjusted exponents
+ tmp_len = len(str(tmp.int))
+ other_len = len(str(other.int))
+ if numdigits > (other_len + prec + 1 - tmp_len):
+ # If the difference in adjusted exps is > prec+1, we know
+ # other is insignificant, so might as well put a 1 after the precision.
+ # (since this is only for addition.) Also stops use of massive longs.
+
+ extend = prec + 2 - tmp_len
+ if extend <= 0:
+ extend = 1
+ tmp.int *= 10 ** extend
+ tmp.exp -= extend
+ other.int = 1
+ other.exp = tmp.exp
+ return op1, op2
+
+ tmp.int *= 10 ** numdigits
+ tmp.exp -= numdigits
+ return op1, op2
+
+def _adjust_coefficients(op1, op2):
+ """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
+
+ Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
+
+ Used on _WorkRep instances during division.
+ """
+ adjust = 0
+ #If op1 is smaller, make it larger
+ while op2.int > op1.int:
+ op1.int *= 10
+ op1.exp -= 1
+ adjust += 1
+
+ #If op2 is too small, make it larger
+ while op1.int >= (10 * op2.int):
+ op2.int *= 10
+ op2.exp -= 1
+ adjust -= 1
+
+ return op1, op2, adjust
+
+##### Helper Functions ########################################
+
+def _convert_other(other):
+ """Convert other to Decimal.
+
+ Verifies that it's ok to use in an implicit construction.
+ """
+ if isinstance(other, Decimal):
+ return other
+ if isinstance(other, (int, long)):
+ return Decimal(other)
+ return NotImplemented
+
+_infinity_map = {
+ 'inf' : 1,
+ 'infinity' : 1,
+ '+inf' : 1,
+ '+infinity' : 1,
+ '-inf' : -1,
+ '-infinity' : -1
+}
+
+def _isinfinity(num):
+ """Determines whether a string or float is infinity.
+
+ +1 for negative infinity; 0 for finite ; +1 for positive infinity
+ """
+ num = str(num).lower()
+ return _infinity_map.get(num, 0)
+
+def _isnan(num):
+ """Determines whether a string or float is NaN
+
+ (1, sign, diagnostic info as string) => NaN
+ (2, sign, diagnostic info as string) => sNaN
+ 0 => not a NaN
+ """
+ num = str(num).lower()
+ if not num:
+ return 0
+
+ #get the sign, get rid of trailing [+-]
+ sign = 0
+ if num[0] == '+':
+ num = num[1:]
+ elif num[0] == '-': #elif avoids '+-nan'
+ num = num[1:]
+ sign = 1
+
+ if num.startswith('nan'):
+ if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
+ return 0
+ return (1, sign, num[3:].lstrip('0'))
+ if num.startswith('snan'):
+ if len(num) > 4 and not num[4:].isdigit():
+ return 0
+ return (2, sign, num[4:].lstrip('0'))
+ return 0
+
+
+##### Setup Specific Contexts ################################
+
+# The default context prototype used by Context()
+# Is mutable, so that new contexts can have different default values
+
+DefaultContext = Context(
+ prec=28, rounding=ROUND_HALF_EVEN,
+ traps=[DivisionByZero, Overflow, InvalidOperation],
+ flags=[],
+ _rounding_decision=ALWAYS_ROUND,
+ Emax=999999999,
+ Emin=-999999999,
+ capitals=1
+)
+
+# Pre-made alternate contexts offered by the specification
+# Don't change these; the user should be able to select these
+# contexts and be able to reproduce results from other implementations
+# of the spec.
+
+BasicContext = Context(
+ prec=9, rounding=ROUND_HALF_UP,
+ traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
+ flags=[],
+)
+
+ExtendedContext = Context(
+ prec=9, rounding=ROUND_HALF_EVEN,
+ traps=[],
+ flags=[],
+)
+
+
+##### Useful Constants (internal use only) ####################
+
+#Reusable defaults
+Inf = Decimal('Inf')
+negInf = Decimal('-Inf')
+
+#Infsign[sign] is infinity w/ that sign
+Infsign = (Inf, negInf)
+
+NaN = Decimal('NaN')
+
+
+##### crud for parsing strings #################################
+import re
+
+# There's an optional sign at the start, and an optional exponent
+# at the end. The exponent has an optional sign and at least one
+# digit. In between, must have either at least one digit followed
+# by an optional fraction, or a decimal point followed by at least
+# one digit. Yuck.
+
+_parser = re.compile(r"""
+# \s*
+ (?P<sign>[-+])?
+ (
+ (?P<int>\d+) (\. (?P<frac>\d*))?
+ |
+ \. (?P<onlyfrac>\d+)
+ )
+ ([eE](?P<exp>[-+]? \d+))?
+# \s*
+ $
+""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
+
+del re
+
+# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
+
+def _string2exact(s):
+ m = _parser(s)
+ if m is None:
+ raise ValueError("invalid literal for Decimal: %r" % s)
+
+ if m.group('sign') == "-":
+ sign = 1
+ else:
+ sign = 0
+
+ exp = m.group('exp')
+ if exp is None:
+ exp = 0
+ else:
+ exp = int(exp)
+
+ intpart = m.group('int')
+ if intpart is None:
+ intpart = ""
+ fracpart = m.group('onlyfrac')
+ else:
+ fracpart = m.group('frac')
+ if fracpart is None:
+ fracpart = ""
+
+ exp -= len(fracpart)
+
+ mantissa = intpart + fracpart
+ tmp = map(int, mantissa)
+ backup = tmp
+ while tmp and tmp[0] == 0:
+ del tmp[0]
+
+ # It's a zero
+ if not tmp:
+ if backup:
+ return (sign, tuple(backup), exp)
+ return (sign, (0,), exp)
+ mantissa = tuple(tmp)
+
+ return (sign, mantissa, exp)
+
+
+if __name__ == '__main__':
+ import doctest, sys
+ doctest.testmod(sys.modules[__name__])
diff --git a/django/utils/cache.py b/django/utils/cache.py
index 5eba302ebe..c8031a409a 100644
--- a/django/utils/cache.py
+++ b/django/utils/cache.py
@@ -86,7 +86,7 @@ def patch_response_headers(response, cache_timeout=None):
def add_never_cache_headers(response):
"""
- Add headers to a response to indicate that
+ Add headers to a response to indicate that
a page should never be cached.
"""
patch_response_headers(response, cache_timeout=-1)
diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py
index cecb4da170..60bc0051a2 100644
--- a/django/utils/datastructures.py
+++ b/django/utils/datastructures.py
@@ -17,7 +17,10 @@ class MergeDict(object):
def __contains__(self, key):
return self.has_key(key)
- def get(self, key, default):
+ def __copy__(self):
+ return self.__class__(*self.dicts)
+
+ def get(self, key, default=None):
try:
return self[key]
except KeyError:
@@ -39,10 +42,14 @@ class MergeDict(object):
def has_key(self, key):
for dict in self.dicts:
- if dict.has_key(key):
+ if key in dict:
return True
return False
+ def copy(self):
+ """ returns a copy of this object"""
+ return self.__copy__()
+
class SortedDict(dict):
"A dictionary that keeps its keys in the order in which they're inserted."
def __init__(self, data=None):
@@ -70,7 +77,7 @@ class SortedDict(dict):
return self.keyOrder[:]
def values(self):
- return [dict.__getitem__(self,k) for k in self.keyOrder]
+ return [dict.__getitem__(self, k) for k in self.keyOrder]
def update(self, dict):
for k, v in dict.items():
@@ -81,6 +88,24 @@ class SortedDict(dict):
self.keyOrder.append(key)
return dict.setdefault(self, key, default)
+ def value_for_index(self, index):
+ "Returns the value of the item at the given zero-based index."
+ return self[self.keyOrder[index]]
+
+ def copy(self):
+ "Returns a copy of this object."
+ # This way of initializing the copy means it works for subclasses, too.
+ obj = self.__class__(self)
+ obj.keyOrder = self.keyOrder
+ return obj
+
+ def __repr__(self):
+ """
+ Replaces the normal dict.__repr__ with a version that returns the keys
+ in their sorted order.
+ """
+ return '{%s}' % ', '.join(['%r: %r' % (k, v) for k, v in self.items()])
+
class MultiValueDictKeyError(KeyError):
pass
@@ -193,7 +218,7 @@ class MultiValueDict(dict):
def update(self, *args, **kwargs):
"update() extends rather than replaces existing key lists. Also accepts keyword args."
if len(args) > 1:
- raise TypeError, "update expected at most 1 arguments, got %d", len(args)
+ raise TypeError, "update expected at most 1 arguments, got %d" % len(args)
if args:
other_dict = args[0]
if isinstance(other_dict, MultiValueDict):
diff --git a/django/utils/dateformat.py b/django/utils/dateformat.py
index 00eb9fe617..a558e3a69f 100644
--- a/django/utils/dateformat.py
+++ b/django/utils/dateformat.py
@@ -13,10 +13,11 @@ Usage:
from django.utils.dates import MONTHS, MONTHS_3, MONTHS_AP, WEEKDAYS
from django.utils.tzinfo import LocalTimezone
+from django.utils.translation import gettext as _
from calendar import isleap, monthrange
import re, time
-re_formatchars = re.compile(r'(?<!\\)([aABdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
+re_formatchars = re.compile(r'(?<!\\)([aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
re_escaped = re.compile(r'\\(.)')
class Formatter(object):
@@ -36,14 +37,14 @@ class TimeFormat(Formatter):
def a(self):
"'a.m.' or 'p.m.'"
if self.data.hour > 11:
- return 'p.m.'
- return 'a.m.'
+ return _('p.m.')
+ return _('a.m.')
def A(self):
"'AM' or 'PM'"
if self.data.hour > 11:
- return 'PM'
- return 'AM'
+ return _('PM')
+ return _('AM')
def B(self):
"Swatch Internet time"
@@ -91,9 +92,9 @@ class TimeFormat(Formatter):
Proprietary extension.
"""
if self.data.minute == 0 and self.data.hour == 0:
- return 'midnight'
+ return _('midnight')
if self.data.minute == 0 and self.data.hour == 12:
- return 'noon'
+ return _('noon')
return '%s %s' % (self.f(), self.a())
def s(self):
@@ -110,6 +111,10 @@ class DateFormat(TimeFormat):
if hasattr(self.data, 'hour') and not self.timezone:
self.timezone = LocalTimezone(dt)
+ def b(self):
+ "Month, textual, 3 letters, lowercase; e.g. 'jan'"
+ return MONTHS_3[self.data.month]
+
def d(self):
"Day of the month, 2 digits with leading zeros; i.e. '01' to '31'"
return '%02d' % self.data.day
diff --git a/django/utils/encoding.py b/django/utils/encoding.py
new file mode 100644
index 0000000000..4774fb0d26
--- /dev/null
+++ b/django/utils/encoding.py
@@ -0,0 +1,32 @@
+from django.conf import settings
+from django.utils.functional import Promise
+
+def smart_unicode(s):
+ if isinstance(s, Promise):
+ # The input is the result of a gettext_lazy() call, or similar. It will
+ # already be encoded in DEFAULT_CHARSET on evaluation and we don't want
+ # to evaluate it until render time.
+ # FIXME: This isn't totally consistent, because it eventually returns a
+ # bytestring rather than a unicode object. It works wherever we use
+ # smart_unicode() at the moment. Fixing this requires work in the
+ # i18n internals.
+ return s
+ if not isinstance(s, basestring,):
+ if hasattr(s, '__unicode__'):
+ s = unicode(s)
+ else:
+ s = unicode(str(s), settings.DEFAULT_CHARSET)
+ elif not isinstance(s, unicode):
+ s = unicode(s, settings.DEFAULT_CHARSET)
+ return s
+
+class StrAndUnicode(object):
+ """
+ A class whose __str__ returns its __unicode__ as a bytestring
+ according to settings.DEFAULT_CHARSET.
+
+ Useful as a mix-in.
+ """
+ def __str__(self):
+ return self.__unicode__().encode(settings.DEFAULT_CHARSET)
+
diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py
index 2eb27a40b7..2c82e9a37a 100644
--- a/django/utils/feedgenerator.py
+++ b/django/utils/feedgenerator.py
@@ -40,7 +40,7 @@ class SyndicationFeed(object):
"Base class for all syndication feeds. Subclasses should provide write()"
def __init__(self, title, link, description, language=None, author_email=None,
author_name=None, author_link=None, subtitle=None, categories=None,
- feed_url=None):
+ feed_url=None, feed_copyright=None):
self.feed = {
'title': title,
'link': link,
@@ -52,12 +52,13 @@ class SyndicationFeed(object):
'subtitle': subtitle,
'categories': categories or (),
'feed_url': feed_url,
+ 'feed_copyright': feed_copyright,
}
self.items = []
def add_item(self, title, link, description, author_email=None,
author_name=None, author_link=None, pubdate=None, comments=None,
- unique_id=None, enclosure=None, categories=()):
+ unique_id=None, enclosure=None, categories=(), item_copyright=None):
"""
Adds an item to the feed. All args are expected to be Python Unicode
objects except pubdate, which is a datetime.datetime object, and
@@ -75,6 +76,7 @@ class SyndicationFeed(object):
'unique_id': unique_id,
'enclosure': enclosure,
'categories': categories or (),
+ 'item_copyright': item_copyright,
})
def num_items(self):
@@ -128,6 +130,9 @@ class RssFeed(SyndicationFeed):
handler.addQuickElement(u"language", self.feed['language'])
for cat in self.feed['categories']:
handler.addQuickElement(u"category", cat)
+ if self.feed['feed_copyright'] is not None:
+ handler.addQuickElement(u"copyright", self.feed['feed_copyright'])
+ handler.addQuickElement(u"lastBuildDate", rfc2822_date(self.latest_post_date()).decode('ascii'))
self.write_items(handler)
self.endChannelElement(handler)
handler.endElement(u"rss")
@@ -163,6 +168,8 @@ class Rss201rev2Feed(RssFeed):
(item['author_email'], item['author_name']))
elif item["author_email"]:
handler.addQuickElement(u"author", item["author_email"])
+ elif item["author_name"]:
+ handler.addQuickElement(u"dc:creator", item["author_name"], {"xmlns:dc": u"http://purl.org/dc/elements/1.1/"})
if item['pubdate'] is not None:
handler.addQuickElement(u"pubDate", rfc2822_date(item['pubdate']).decode('ascii'))
@@ -212,6 +219,8 @@ class Atom1Feed(SyndicationFeed):
handler.addQuickElement(u"subtitle", self.feed['subtitle'])
for cat in self.feed['categories']:
handler.addQuickElement(u"category", "", {u"term": cat})
+ if self.feed['feed_copyright'] is not None:
+ handler.addQuickElement(u"rights", self.feed['feed_copyright'])
self.write_items(handler)
handler.endElement(u"feed")
@@ -252,10 +261,14 @@ class Atom1Feed(SyndicationFeed):
u"length": item['enclosure'].length,
u"type": item['enclosure'].mime_type})
- # Categories:
+ # Categories.
for cat in item['categories']:
handler.addQuickElement(u"category", u"", {u"term": cat})
+ # Rights.
+ if item['item_copyright'] is not None:
+ handler.addQuickElement(u"rights", item['item_copyright'])
+
handler.endElement(u"entry")
# This isolates the decision of what the system default is, so calling code can
diff --git a/django/utils/functional.py b/django/utils/functional.py
index e3c0a3c76b..0c31c1f375 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -42,7 +42,7 @@ def lazy(func, *resultclasses):
res = self.__func(*self.__args, **self.__kw)
return self.__dispatch[type(res)][funcname](res, *args, **kw)
- if not self.__dispatch.has_key(klass):
+ if klass not in self.__dispatch:
self.__dispatch[klass] = {}
self.__dispatch[klass][funcname] = func
return __wrapper__
diff --git a/django/utils/html.py b/django/utils/html.py
index a0d1e82dcf..607362817b 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -1,6 +1,7 @@
"HTML utilities suitable for global use."
import re, string
+from django.utils.encoding import smart_unicode
# Configuration for urlize() function
LEADING_PUNCTUATION = ['(', '<', '&lt;']
@@ -39,8 +40,8 @@ def strip_tags(value):
return re.sub(r'<[^>]*?>', '', value)
def strip_spaces_between_tags(value):
- "Returns the given HTML with spaces between tags normalized to a single space"
- return re.sub(r'>\s+<', '> <', value)
+ "Returns the given HTML with spaces between tags removed"
+ return re.sub(r'>\s+<', '><', value)
def strip_entities(value):
"Returns the given HTML with all entities (&something;) stripped"
diff --git a/django/utils/itercompat.py b/django/utils/itercompat.py
index 370988bedb..48a2d99d3a 100644
--- a/django/utils/itercompat.py
+++ b/django/utils/itercompat.py
@@ -7,7 +7,8 @@ these implementations if necessary.
import itertools
def compat_tee(iterable):
- """Return two independent iterators from a single iterable.
+ """
+ Return two independent iterators from a single iterable.
Based on http://www.python.org/doc/2.3.5/lib/itertools-example.html
"""
@@ -25,7 +26,28 @@ def compat_tee(iterable):
next = iter(iterable).next
return gen(next), gen(next)
+def groupby(iterable, keyfunc=None):
+ """
+ Taken from http://docs.python.org/lib/itertools-functions.html
+ """
+ if keyfunc is None:
+ keyfunc = lambda x:x
+ iterable = iter(iterable)
+ l = [iterable.next()]
+ lastkey = keyfunc(l)
+ for item in iterable:
+ key = keyfunc(item)
+ if key != lastkey:
+ yield lastkey, l
+ lastkey = key
+ l = [item]
+ else:
+ l.append(item)
+ yield lastkey, l
+
if hasattr(itertools, 'tee'):
tee = itertools.tee
else:
tee = compat_tee
+if hasattr(itertools, 'groupby'):
+ groupby = itertools.groupby
diff --git a/django/utils/simplejson/LICENSE.txt b/django/utils/simplejson/LICENSE.txt
index 90251a9f62..1fa4fd5ba2 100644
--- a/django/utils/simplejson/LICENSE.txt
+++ b/django/utils/simplejson/LICENSE.txt
@@ -1,4 +1,4 @@
-simplejson 1.3
+simplejson 1.5
Copyright (c) 2006 Bob Ippolito
Permission is hereby granted, free of charge, to any person obtaining a copy of
diff --git a/django/utils/simplejson/__init__.py b/django/utils/simplejson/__init__.py
index f88329b950..15b7173976 100644
--- a/django/utils/simplejson/__init__.py
+++ b/django/utils/simplejson/__init__.py
@@ -27,6 +27,21 @@ Encoding basic Python object hierarchies::
>>> io.getvalue()
'["streaming API"]'
+Compact encoding::
+
+ >>> import simplejson
+ >>> simplejson.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
+ '[1,2,3,{"4":5,"6":7}]'
+
+Pretty printing::
+
+ >>> import simplejson
+ >>> print simplejson.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
+ {
+ "4": 5,
+ "6": 7
+ }
+
Decoding JSON::
>>> import simplejson
@@ -68,10 +83,10 @@ Extending JSONEncoder::
['[', '2.0', ', ', '1.0', ']']
-Note that the JSON produced by this module is a subset of YAML,
-so it may be used as a serializer for that as well.
+Note that the JSON produced by this module's default settings
+is a subset of YAML, so it may be used as a serializer for that as well.
"""
-__version__ = '1.3'
+__version__ = '1.5'
__all__ = [
'dump', 'dumps', 'load', 'loads',
'JSONDecoder', 'JSONEncoder',
@@ -81,7 +96,7 @@ from django.utils.simplejson.decoder import JSONDecoder
from django.utils.simplejson.encoder import JSONEncoder
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
- allow_nan=True, cls=None, **kw):
+ allow_nan=True, cls=None, indent=None, **kw):
"""
Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).
@@ -105,6 +120,10 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
in strict compliance of the JSON specification, instead of using the
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+ If ``indent`` is a non-negative integer, then JSON array elements and object
+ members will be pretty-printed with that indent level. An indent level
+ of 0 will only insert newlines. ``None`` is the most compact representation.
+
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg.
@@ -112,7 +131,7 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
if cls is None:
cls = JSONEncoder
iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
- check_circular=check_circular, allow_nan=allow_nan,
+ check_circular=check_circular, allow_nan=allow_nan, indent=indent,
**kw).iterencode(obj)
# could accelerate with writelines in some versions of Python, at
# a debuggability cost
@@ -120,7 +139,7 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
fp.write(chunk)
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
- allow_nan=True, cls=None, **kw):
+ allow_nan=True, cls=None, indent=None, separators=None, **kw):
"""
Serialize ``obj`` to a JSON formatted ``str``.
@@ -141,14 +160,26 @@ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
strict compliance of the JSON specification, instead of using the
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+ If ``indent`` is a non-negative integer, then JSON array elements and
+ object members will be pretty-printed with that indent level. An indent
+ level of 0 will only insert newlines. ``None`` is the most compact
+ representation.
+
+ If ``separators`` is an ``(item_separator, dict_separator)`` tuple
+ then it will be used instead of the default ``(', ', ': ')`` separators.
+ ``(',', ':')`` is the most compact JSON representation.
+
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg.
"""
if cls is None:
cls = JSONEncoder
- return cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
- check_circular=check_circular, allow_nan=allow_nan, **kw).encode(obj)
+ return cls(
+ skipkeys=skipkeys, ensure_ascii=ensure_ascii,
+ check_circular=check_circular, allow_nan=allow_nan, indent=indent,
+ separators=separators,
+ **kw).encode(obj)
def load(fp, encoding=None, cls=None, object_hook=None, **kw):
"""
diff --git a/django/utils/simplejson/decoder.py b/django/utils/simplejson/decoder.py
index 684af8c9ad..66f68a200b 100644
--- a/django/utils/simplejson/decoder.py
+++ b/django/utils/simplejson/decoder.py
@@ -127,6 +127,7 @@ def JSONObject(match, context, _w=WHITESPACE.match):
raise ValueError(errmsg("Expecting property name", s, end))
end += 1
encoding = getattr(context, 'encoding', None)
+ iterscan = JSONScanner.iterscan
while True:
key, end = scanstring(s, end, encoding)
end = _w(s, end).end()
@@ -134,7 +135,7 @@ def JSONObject(match, context, _w=WHITESPACE.match):
raise ValueError(errmsg("Expecting : delimiter", s, end))
end = _w(s, end + 1).end()
try:
- value, end = JSONScanner.iterscan(s, idx=end).next()
+ value, end = iterscan(s, idx=end, context=context).next()
except StopIteration:
raise ValueError(errmsg("Expecting object", s, end))
pairs[key] = value
@@ -164,9 +165,10 @@ def JSONArray(match, context, _w=WHITESPACE.match):
nextchar = s[end:end + 1]
if nextchar == ']':
return values, end + 1
+ iterscan = JSONScanner.iterscan
while True:
try:
- value, end = JSONScanner.iterscan(s, idx=end).next()
+ value, end = iterscan(s, idx=end, context=context).next()
except StopIteration:
raise ValueError(errmsg("Expecting object", s, end))
values.append(value)
diff --git a/django/utils/simplejson/encoder.py b/django/utils/simplejson/encoder.py
index bb1aba09f0..c83c6873eb 100644
--- a/django/utils/simplejson/encoder.py
+++ b/django/utils/simplejson/encoder.py
@@ -3,11 +3,11 @@ Implementation of JSONEncoder
"""
import re
-# this should match any kind of infinity
-INFCHARS = re.compile(r'[infINF]')
ESCAPE = re.compile(r'[\x00-\x19\\"\b\f\n\r\t]')
-ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+ESCAPE_ASCII = re.compile(r'([\\"/]|[^\ -~])')
ESCAPE_DCT = {
+ # escape all forward slashes to prevent </script> attack
+ '/': '\\/',
'\\': '\\\\',
'"': '\\"',
'\b': '\\b',
@@ -16,31 +16,31 @@ ESCAPE_DCT = {
'\r': '\\r',
'\t': '\\t',
}
-for i in range(20):
+for i in range(0x20):
ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
+# assume this produces an infinity on all machines (probably not guaranteed)
+INFINITY = float('1e66666')
+
def floatstr(o, allow_nan=True):
- s = str(o)
- # If the first non-sign is a digit then it's not a special value
- if (o < 0.0 and s[1].isdigit()) or s[0].isdigit():
- return s
- elif not allow_nan:
+ # Check for specials. Note that this type of test is processor- and/or
+ # platform-specific, so do tests which don't depend on the internals.
+
+ if o != o:
+ text = 'NaN'
+ elif o == INFINITY:
+ text = 'Infinity'
+ elif o == -INFINITY:
+ text = '-Infinity'
+ else:
+ return str(o)
+
+ if not allow_nan:
raise ValueError("Out of range float values are not JSON compliant: %r"
% (o,))
- # These are the string representations on the platforms I've tried
- if s == 'nan':
- return 'NaN'
- if s == 'inf':
- return 'Infinity'
- if s == '-inf':
- return '-Infinity'
- # NaN should either be inequal to itself, or equal to everything
- if o != o or o == 0.0:
- return 'NaN'
- # Last ditch effort, assume inf
- if o < 0:
- return '-Infinity'
- return 'Infinity'
+
+ return text
+
def encode_basestring(s):
"""
@@ -90,8 +90,11 @@ class JSONEncoder(object):
implementation (to raise ``TypeError``).
"""
__all__ = ['__init__', 'default', 'encode', 'iterencode']
+ item_separator = ', '
+ key_separator = ': '
def __init__(self, skipkeys=False, ensure_ascii=True,
- check_circular=True, allow_nan=True, sort_keys=False):
+ check_circular=True, allow_nan=True, sort_keys=False,
+ indent=None, separators=None):
"""
Constructor for JSONEncoder, with sensible defaults.
@@ -116,6 +119,15 @@ class JSONEncoder(object):
If sort_keys is True, then the output of dictionaries will be
sorted by key; this is useful for regression tests to ensure
that JSON serializations can be compared on a day-to-day basis.
+
+ If indent is a non-negative integer, then JSON array
+ elements and object members will be pretty-printed with that
+ indent level. An indent level of 0 will only insert newlines.
+ None is the most compact representation.
+
+ If specified, separators should be a (item_separator, key_separator)
+ tuple. The default is (', ', ': '). To get the most compact JSON
+ representation you should specify (',', ':') to eliminate whitespace.
"""
self.skipkeys = skipkeys
@@ -123,6 +135,13 @@ class JSONEncoder(object):
self.check_circular = check_circular
self.allow_nan = allow_nan
self.sort_keys = sort_keys
+ self.indent = indent
+ self.current_indent_level = 0
+ if separators is not None:
+ self.item_separator, self.key_separator = separators
+
+ def _newline_indent(self):
+ return '\n' + (' ' * (self.indent * self.current_indent_level))
def _iterencode_list(self, lst, markers=None):
if not lst:
@@ -134,14 +153,25 @@ class JSONEncoder(object):
raise ValueError("Circular reference detected")
markers[markerid] = lst
yield '['
+ if self.indent is not None:
+ self.current_indent_level += 1
+ newline_indent = self._newline_indent()
+ separator = self.item_separator + newline_indent
+ yield newline_indent
+ else:
+ newline_indent = None
+ separator = self.item_separator
first = True
for value in lst:
if first:
first = False
else:
- yield ', '
+ yield separator
for chunk in self._iterencode(value, markers):
yield chunk
+ if newline_indent is not None:
+ self.current_indent_level -= 1
+ yield self._newline_indent()
yield ']'
if markers is not None:
del markers[markerid]
@@ -156,6 +186,15 @@ class JSONEncoder(object):
raise ValueError("Circular reference detected")
markers[markerid] = dct
yield '{'
+ key_separator = self.key_separator
+ if self.indent is not None:
+ self.current_indent_level += 1
+ newline_indent = self._newline_indent()
+ item_separator = self.item_separator + newline_indent
+ yield newline_indent
+ else:
+ newline_indent = None
+ item_separator = self.item_separator
first = True
if self.ensure_ascii:
encoder = encode_basestring_ascii
@@ -165,7 +204,7 @@ class JSONEncoder(object):
if self.sort_keys:
keys = dct.keys()
keys.sort()
- items = [(k,dct[k]) for k in keys]
+ items = [(k, dct[k]) for k in keys]
else:
items = dct.iteritems()
for key, value in items:
@@ -190,11 +229,14 @@ class JSONEncoder(object):
if first:
first = False
else:
- yield ', '
+ yield item_separator
yield encoder(key)
- yield ': '
+ yield key_separator
for chunk in self._iterencode(value, markers):
yield chunk
+ if newline_indent is not None:
+ self.current_indent_level -= 1
+ yield self._newline_indent()
yield '}'
if markers is not None:
del markers[markerid]
diff --git a/django/utils/simplejson/jsonfilter.py b/django/utils/simplejson/jsonfilter.py
new file mode 100644
index 0000000000..d02ae2033a
--- /dev/null
+++ b/django/utils/simplejson/jsonfilter.py
@@ -0,0 +1,40 @@
+from django.utils import simplejson
+import cgi
+
+class JSONFilter(object):
+ def __init__(self, app, mime_type='text/x-json'):
+ self.app = app
+ self.mime_type = mime_type
+
+ def __call__(self, environ, start_response):
+ # Read JSON POST input to jsonfilter.json if matching mime type
+ response = {'status': '200 OK', 'headers': []}
+ def json_start_response(status, headers):
+ response['status'] = status
+ response['headers'].extend(headers)
+ environ['jsonfilter.mime_type'] = self.mime_type
+ if environ.get('REQUEST_METHOD', '') == 'POST':
+ if environ.get('CONTENT_TYPE', '') == self.mime_type:
+ args = [_ for _ in [environ.get('CONTENT_LENGTH')] if _]
+ data = environ['wsgi.input'].read(*map(int, args))
+ environ['jsonfilter.json'] = simplejson.loads(data)
+ res = simplejson.dumps(self.app(environ, json_start_response))
+ jsonp = cgi.parse_qs(environ.get('QUERY_STRING', '')).get('jsonp')
+ if jsonp:
+ content_type = 'text/javascript'
+ res = ''.join(jsonp + ['(', res, ')'])
+ elif 'Opera' in environ.get('HTTP_USER_AGENT', ''):
+ # Opera has bunk XMLHttpRequest support for most mime types
+ content_type = 'text/plain'
+ else:
+ content_type = self.mime_type
+ headers = [
+ ('Content-type', content_type),
+ ('Content-length', len(res)),
+ ]
+ headers.extend(response['headers'])
+ start_response(response['status'], headers)
+ return [res]
+
+def factory(app, global_conf, **kw):
+ return JSONFilter(app, **kw)
diff --git a/django/utils/simplejson/scanner.py b/django/utils/simplejson/scanner.py
index b9244cfed1..64f4999fb5 100644
--- a/django/utils/simplejson/scanner.py
+++ b/django/utils/simplejson/scanner.py
@@ -3,11 +3,12 @@ Iterator based sre token scanner
"""
import sre_parse, sre_compile, sre_constants
from sre_constants import BRANCH, SUBPATTERN
+from re import VERBOSE, MULTILINE, DOTALL
import re
__all__ = ['Scanner', 'pattern']
-FLAGS = (re.VERBOSE | re.MULTILINE | re.DOTALL)
+FLAGS = (VERBOSE | MULTILINE | DOTALL)
class Scanner(object):
def __init__(self, lexicon, flags=FLAGS):
self.actions = [None]
diff --git a/django/utils/synch.py b/django/utils/synch.py
index 6fcd81390e..2e808c1e01 100644
--- a/django/utils/synch.py
+++ b/django/utils/synch.py
@@ -1,6 +1,6 @@
"""
Synchronization primitives:
-
+
- reader-writer lock (preference to writers)
(Contributed to Django by eugene@lazutkin.com)
@@ -14,17 +14,16 @@ except ImportError:
class RWLock:
"""
Classic implementation of reader-writer lock with preference to writers.
-
+
Readers can access a resource simultaneously.
Writers get an exclusive access.
-
+
API is self-descriptive:
reader_enters()
reader_leaves()
writer_enters()
writer_leaves()
"""
-
def __init__(self):
self.mutex = threading.RLock()
self.can_read = threading.Semaphore(0)
@@ -33,7 +32,7 @@ class RWLock:
self.active_writers = 0
self.waiting_readers = 0
self.waiting_writers = 0
-
+
def reader_enters(self):
self.mutex.acquire()
try:
@@ -45,7 +44,7 @@ class RWLock:
finally:
self.mutex.release()
self.can_read.acquire()
-
+
def reader_leaves(self):
self.mutex.acquire()
try:
@@ -56,7 +55,7 @@ class RWLock:
self.can_write.release()
finally:
self.mutex.release()
-
+
def writer_enters(self):
self.mutex.acquire()
try:
@@ -68,7 +67,7 @@ class RWLock:
finally:
self.mutex.release()
self.can_write.acquire()
-
+
def writer_leaves(self):
self.mutex.acquire()
try:
diff --git a/django/utils/text.py b/django/utils/text.py
index 217f42491b..c73ab908f3 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -17,7 +17,7 @@ def wrap(text, width):
pos = len(word) - word.rfind('\n') - 1
for word in it:
if "\n" in word:
- lines = word.splitlines()
+ lines = word.split('\n')
else:
lines = (word,)
pos += len(lines[0]) + 1
@@ -41,6 +41,66 @@ def truncate_words(s, num):
words.append('...')
return ' '.join(words)
+def truncate_html_words(s, num):
+ """
+ Truncates html to a certain number of words (not counting tags and comments).
+ Closes opened tags if they were correctly closed in the given html.
+ """
+ length = int(num)
+ if length <= 0:
+ return ''
+ html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
+ # Set up regular expressions
+ re_words = re.compile(r'&.*?;|<.*?>|([A-Za-z0-9][\w-]*)')
+ re_tag = re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
+ # Count non-HTML words and keep note of open tags
+ pos = 0
+ ellipsis_pos = 0
+ words = 0
+ open_tags = []
+ while words <= length:
+ m = re_words.search(s, pos)
+ if not m:
+ # Checked through whole string
+ break
+ pos = m.end(0)
+ if m.group(1):
+ # It's an actual non-HTML word
+ words += 1
+ if words == length:
+ ellipsis_pos = pos
+ continue
+ # Check for tag
+ tag = re_tag.match(m.group(0))
+ if not tag or ellipsis_pos:
+ # Don't worry about non tags or tags after our truncate point
+ continue
+ closing_tag, tagname, self_closing = tag.groups()
+ tagname = tagname.lower() # Element names are always case-insensitive
+ if self_closing or tagname in html4_singlets:
+ pass
+ elif closing_tag:
+ # Check for match in open tags list
+ try:
+ i = open_tags.index(tagname)
+ except ValueError:
+ pass
+ else:
+ # SGML: An end tag closes, back to the matching start tag, all unclosed intervening start tags with omitted end tags
+ open_tags = open_tags[i+1:]
+ else:
+ # Add it to the start of the open tags list
+ open_tags.insert(0, tagname)
+ if words <= length:
+ # Don't try to close tags if we don't need to truncate
+ return s
+ out = s[:ellipsis_pos] + ' ...'
+ # Close any tags still open
+ for tag in open_tags:
+ out += '</%s>' % tag
+ # Return string
+ return out
+
def get_valid_filename(s):
"""
Returns the given string converted to a string that can be used for a clean
@@ -131,14 +191,15 @@ def smart_split(text):
Supports both single and double quotes, and supports escaping quotes with
backslashes. In the output, strings will keep their initial and trailing
quote marks.
+
>>> list(smart_split('This is "a person\'s" test.'))
['This', 'is', '"a person\'s"', 'test.']
"""
for bit in smart_split_re.finditer(text):
bit = bit.group(0)
- if bit[0] == '"':
+ if bit[0] == '"' and bit[-1] == '"':
yield '"' + bit[1:-1].replace('\\"', '"').replace('\\\\', '\\') + '"'
- elif bit[0] == "'":
+ elif bit[0] == "'" and bit[-1] == "'":
yield "'" + bit[1:-1].replace("\\'", "'").replace("\\\\", "\\") + "'"
else:
yield bit
diff --git a/django/utils/timesince.py b/django/utils/timesince.py
index e69c45c8c1..394f818395 100644
--- a/django/utils/timesince.py
+++ b/django/utils/timesince.py
@@ -1,6 +1,6 @@
import datetime, math, time
from django.utils.tzinfo import LocalTimezone
-from django.utils.translation import ngettext
+from django.utils.translation import ngettext, gettext
def timesince(d, now=None):
"""
@@ -37,14 +37,14 @@ def timesince(d, now=None):
if count != 0:
break
if count < 0:
- return '%d milliseconds' % math.floor((now - d).microseconds / 1000)
- s = '%d %s' % (count, name(count))
+ return gettext('%d milliseconds') % math.floor((now - d).microseconds / 1000)
+ s = gettext('%(number)d %(type)s') % {'number': count, 'type': name(count)}
if i + 1 < len(chunks):
# Now get the second item
seconds2, name2 = chunks[i + 1]
count2 = (since - (seconds * count)) / seconds2
if count2 != 0:
- s += ', %d %s' % (count2, name2(count2))
+ s += gettext(', %(number)d %(type)s') % {'number': count2, 'type': name2(count2)}
return s
def timeuntil(d, now=None):
diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py
index 276e59f4bd..dbb97af76c 100644
--- a/django/utils/translation/__init__.py
+++ b/django/utils/translation/__init__.py
@@ -1,8 +1,97 @@
-from django.conf import settings
+"""
+Internationalization support.
+"""
+from django.utils.functional import lazy
-if settings.USE_I18N:
- from trans_real import *
-else:
- from trans_null import *
+__all__ = ['gettext', 'gettext_noop', 'gettext_lazy', 'ngettext',
+ 'ngettext_lazy', 'string_concat', 'activate', 'deactivate',
+ 'get_language', 'get_language_bidi', 'get_date_formats',
+ 'get_partial_date_formats', 'check_for_language', 'to_locale',
+ 'get_language_from_request', 'install', 'templatize']
+
+# Here be dragons, so a short explanation of the logic won't hurt:
+# We are trying to solve two problems: (1) access settings, in particular
+# settings.USE_I18N, as late as possible, so that modules can be imported
+# without having to first configure Django, and (2) if some other code creates
+# a reference to one of these functions, don't break that reference when we
+# replace the functions with their real counterparts (once we do access the
+# settings).
+
+def delayed_loader(*args, **kwargs):
+ """
+ Replace each real_* function with the corresponding function from either
+ trans_real or trans_null (e.g. real_gettext is replaced with
+ trans_real.gettext or trans_null.gettext). This function is run once, the
+ first time any i18n method is called. It replaces all the i18n methods at
+ once at that time.
+ """
+ import traceback
+ from django.conf import settings
+ if settings.USE_I18N:
+ import trans_real as trans
+ else:
+ import trans_null as trans
+ caller = traceback.extract_stack(limit=2)[0][2]
+ g = globals()
+ for name in __all__:
+ if hasattr(trans, name):
+ g['real_%s' % name] = getattr(trans, name)
+
+ # Make the originally requested function call on the way out the door.
+ return g[caller](*args, **kwargs)
+
+g = globals()
+for name in __all__:
+ g['real_%s' % name] = delayed_loader
+del g, delayed_loader
+
+def gettext_noop(message):
+ return real_gettext_noop(message)
+
+def gettext(message):
+ return real_gettext(message)
+
+
+def ngettext(singular, plural, number):
+ return real_ngettext(singular, plural, number)
+
+def string_concat(*strings):
+ return real_string_concat(*strings)
+
+ngettext_lazy = lazy(ngettext, str, unicode)
+gettext_lazy = lazy(gettext, str, unicode)
+string_concat = lazy(string_concat, str, unicode)
+
+def activate(language):
+ return real_activate(language)
+
+def deactivate():
+ return real_deactivate()
+
+def get_language():
+ return real_get_language()
+
+def get_language_bidi():
+ return real_get_language_bidi()
+
+def get_date_formats():
+ return real_get_date_formats()
+
+def get_partial_date_formats():
+ return real_get_partial_date_formats()
+
+def check_for_language(lang_code):
+ return real_check_for_language(lang_code)
+
+def to_locale(language):
+ return real_to_locale(language)
+
+def get_language_from_request(request):
+ return real_get_language_from_request(request)
+
+def install():
+ return real_install()
+
+def templatize(src):
+ return real_templatize(src)
-del settings
diff --git a/django/utils/translation/trans_null.py b/django/utils/translation/trans_null.py
index 75ad573357..10b07529e3 100644
--- a/django/utils/translation/trans_null.py
+++ b/django/utils/translation/trans_null.py
@@ -9,7 +9,6 @@ def ngettext(singular, plural, number):
return plural
ngettext_lazy = ngettext
-gettext = gettext_noop = gettext_lazy = _ = lambda x: x
string_concat = lambda *strings: ''.join([str(el) for el in strings])
activate = lambda x: None
deactivate = install = lambda: None
@@ -19,6 +18,20 @@ get_date_formats = lambda: (settings.DATE_FORMAT, settings.DATETIME_FORMAT, sett
get_partial_date_formats = lambda: (settings.YEAR_MONTH_FORMAT, settings.MONTH_DAY_FORMAT)
check_for_language = lambda x: True
+TECHNICAL_ID_MAP = {
+ "DATE_WITH_TIME_FULL": settings.DATETIME_FORMAT,
+ "DATE_FORMAT": settings.DATE_FORMAT,
+ "DATETIME_FORMAT": settings.DATETIME_FORMAT,
+ "TIME_FORMAT": settings.TIME_FORMAT,
+ "YEAR_MONTH_FORMAT": settings.YEAR_MONTH_FORMAT,
+ "MONTH_DAY_FORMAT": settings.MONTH_DAY_FORMAT,
+}
+
+def gettext(message):
+ return TECHNICAL_ID_MAP.get(message, message)
+
+gettext_noop = gettext_lazy = _ = gettext
+
def to_locale(language):
p = language.find('-')
if p >= 0:
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index 94df23a8e9..293b4ef9cd 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -3,7 +3,6 @@
import os, re, sys
import gettext as gettext_module
from cStringIO import StringIO
-from django.utils.functional import lazy
try:
import threading
@@ -200,7 +199,7 @@ def deactivate():
will resolve against the default translation object, again.
"""
global _active
- if _active.has_key(currentThread()):
+ if currentThread() in _active:
del _active[currentThread()]
def get_language():
@@ -277,9 +276,6 @@ def ngettext(singular, plural, number):
_default = translation(settings.LANGUAGE_CODE)
return _default.ngettext(singular, plural, number)
-gettext_lazy = lazy(gettext, str)
-ngettext_lazy = lazy(ngettext, str)
-
def check_for_language(lang_code):
"""
Checks whether there is a global language file for the given language code.
@@ -493,4 +489,3 @@ def string_concat(*strings):
"""
return ''.join([str(el) for el in strings])
-string_concat = lazy(string_concat, str)
diff --git a/django/views/debug.py b/django/views/debug.py
index 77b6c2fac2..75b1a26af9 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -2,7 +2,7 @@ from django.conf import settings
from django.template import Template, Context, TemplateDoesNotExist
from django.utils.html import escape
from django.http import HttpResponseServerError, HttpResponseNotFound
-import os, re
+import os, re, sys
HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD|PROFANITIES_LIST')
@@ -90,11 +90,18 @@ def technical_500_response(request, exc_type, exc_value, tb):
exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type, exc_value, tb)
frames = []
while tb is not None:
+ # support for __traceback_hide__ which is used by a few libraries
+ # to hide internal frames.
+ if tb.tb_frame.f_locals.get('__traceback_hide__'):
+ tb = tb.tb_next
+ continue
filename = tb.tb_frame.f_code.co_filename
function = tb.tb_frame.f_code.co_name
lineno = tb.tb_lineno - 1
- pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7)
- if pre_context_lineno:
+ loader = tb.tb_frame.f_globals.get('__loader__')
+ module_name = tb.tb_frame.f_globals.get('__name__')
+ pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7, loader, module_name)
+ if pre_context_lineno is not None:
frames.append({
'tb': tb,
'filename': filename,
@@ -124,11 +131,13 @@ def technical_500_response(request, exc_type, exc_value, tb):
'request': request,
'request_protocol': request.is_secure() and "https" or "http",
'settings': get_safe_settings(),
+ 'sys_executable' : sys.executable,
+ 'sys_version_info' : '%d.%d.%d' % sys.version_info[0:3],
'template_info': template_info,
'template_does_not_exist': template_does_not_exist,
'loader_debug_info': loader_debug_info,
})
- return HttpResponseServerError(t.render(c), mimetype='text/html')
+ return HttpResponseServerError(t.iter_render(c), mimetype='text/html')
def technical_404_response(request, exception):
"Create a technical 404 error response. The exception should be the Http404."
@@ -144,13 +153,14 @@ def technical_404_response(request, exception):
t = Template(TECHNICAL_404_TEMPLATE, name='Technical 404 template')
c = Context({
'root_urlconf': settings.ROOT_URLCONF,
+ 'request_path': request.path[1:], # Trim leading slash
'urlpatterns': tried,
'reason': str(exception),
'request': request,
'request_protocol': request.is_secure() and "https" or "http",
'settings': get_safe_settings(),
})
- return HttpResponseNotFound(t.render(c), mimetype='text/html')
+ return HttpResponseNotFound(t.iter_render(c), mimetype='text/html')
def empty_urlconf(request):
"Create an empty URLconf 404 error response."
@@ -158,25 +168,36 @@ def empty_urlconf(request):
c = Context({
'project_name': settings.SETTINGS_MODULE.split('.')[0]
})
- return HttpResponseNotFound(t.render(c), mimetype='text/html')
+ return HttpResponseNotFound(t.iter_render(c), mimetype='text/html')
-def _get_lines_from_file(filename, lineno, context_lines):
+def _get_lines_from_file(filename, lineno, context_lines, loader=None, module_name=None):
"""
Returns context_lines before and after lineno from file.
Returns (pre_context_lineno, pre_context, context_line, post_context).
"""
- try:
- source = open(filename).readlines()
- lower_bound = max(0, lineno - context_lines)
- upper_bound = lineno + context_lines
+ source = None
+ if loader is not None:
+ source = loader.get_source(module_name).splitlines()
+ else:
+ try:
+ f = open(filename)
+ try:
+ source = f.readlines()
+ finally:
+ f.close()
+ except (OSError, IOError):
+ pass
+ if source is None:
+ return None, [], None, []
- pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
- context_line = source[lineno].strip('\n')
- post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]]
+ lower_bound = max(0, lineno - context_lines)
+ upper_bound = lineno + context_lines
- return lower_bound, pre_context, context_line, post_context
- except (OSError, IOError):
- return None, [], None, []
+ pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
+ context_line = source[lineno].strip('\n')
+ post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]]
+
+ return lower_bound, pre_context, context_line, post_context
#
# Templates are embedded in the file so that we know the error handler will
@@ -313,7 +334,15 @@ TECHNICAL_500_TEMPLATE = """
</tr>
<tr>
<th>Exception Location:</th>
- <td>{{ lastframe.filename }} in {{ lastframe.function }}, line {{ lastframe.lineno }}</td>
+ <td>{{ lastframe.filename|escape }} in {{ lastframe.function|escape }}, line {{ lastframe.lineno }}</td>
+ </tr>
+ <tr>
+ <th>Python Executable:</th>
+ <td>{{ sys_executable|escape }}</td>
+ </tr>
+ <tr>
+ <th>Python Version:</th>
+ <td>{{ sys_version_info }}</td>
</tr>
</table>
</div>
@@ -360,7 +389,7 @@ TECHNICAL_500_TEMPLATE = """
<ul class="traceback">
{% for frame in frames %}
<li class="frame">
- <code>{{ frame.filename }}</code> in <code>{{ frame.function }}</code>
+ <code>{{ frame.filename|escape }}</code> in <code>{{ frame.function|escape }}</code>
{% if frame.context_line %}
<div class="context" id="c{{ frame.id }}">
@@ -591,7 +620,7 @@ TECHNICAL_404_TEMPLATE = """
<li>{{ pattern|escape }}</li>
{% endfor %}
</ol>
- <p>The current URL, <code>{{ request.path|escape }}</code>, didn't match any of these.</p>
+ <p>The current URL, <code>{{ request_path|escape }}</code>, didn't match any of these.</p>
{% else %}
<p>{{ reason|escape }}</p>
{% endif %}
diff --git a/django/views/defaults.py b/django/views/defaults.py
index 8837dc4834..aea54c963f 100644
--- a/django/views/defaults.py
+++ b/django/views/defaults.py
@@ -75,8 +75,8 @@ def page_not_found(request, template_name='404.html'):
request_path
The path of the requested URL (e.g., '/app/pages/bad_page/')
"""
- t = loader.get_template(template_name)
- return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path})))
+ t = loader.get_template(template_name) # You need to create a 404.html template.
+ return http.HttpResponseNotFound(t.iter_render(RequestContext(request, {'request_path': request.path})))
def server_error(request, template_name='500.html'):
"""
@@ -85,5 +85,5 @@ def server_error(request, template_name='500.html'):
Templates: `500.html`
Context: None
"""
- t = loader.get_template(template_name)
- return http.HttpResponseServerError(t.render(Context({})))
+ t = loader.get_template(template_name) # You need to create a 500.html template.
+ return http.HttpResponseServerError(t.iter_render(Context({})))
diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py
index 28987f7544..d1b8e34037 100644
--- a/django/views/generic/create_update.py
+++ b/django/views/generic/create_update.py
@@ -68,7 +68,7 @@ def create_object(request, model, template_name=None,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c))
+ return HttpResponse(t.iter_render(c))
def update_object(request, model, object_id=None, slug=None,
slug_field=None, template_name=None, template_loader=loader,
@@ -141,7 +141,7 @@ def update_object(request, model, object_id=None, slug=None,
c[key] = value()
else:
c[key] = value
- response = HttpResponse(t.render(c))
+ response = HttpResponse(t.iter_render(c))
populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname))
return response
@@ -195,6 +195,6 @@ def delete_object(request, model, post_delete_redirect,
c[key] = value()
else:
c[key] = value
- response = HttpResponse(t.render(c))
+ response = HttpResponse(t.iter_render(c))
populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname))
return response
diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py
index d13c0293be..d4941388dd 100644
--- a/django/views/generic/date_based.py
+++ b/django/views/generic/date_based.py
@@ -44,7 +44,7 @@ def archive_index(request, queryset, date_field, num_latest=15,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def archive_year(request, year, queryset, date_field, template_name=None,
template_loader=loader, extra_context=None, allow_empty=False,
@@ -92,7 +92,7 @@ def archive_year(request, year, queryset, date_field, template_name=None,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def archive_month(request, year, month, queryset, date_field,
month_format='%b', template_name=None, template_loader=loader,
@@ -158,7 +158,7 @@ def archive_month(request, year, month, queryset, date_field,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def archive_week(request, year, week, queryset, date_field,
template_name=None, template_loader=loader,
@@ -206,7 +206,7 @@ def archive_week(request, year, week, queryset, date_field,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def archive_day(request, year, month, day, queryset, date_field,
month_format='%b', day_format='%d', template_name=None,
@@ -270,7 +270,7 @@ def archive_day(request, year, month, day, queryset, date_field,
c[key] = value()
else:
c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def archive_today(request, **kwargs):
"""
@@ -339,6 +339,6 @@ def object_detail(request, year, month, day, queryset, date_field,
c[key] = value()
else:
c[key] = value
- response = HttpResponse(t.render(c), mimetype=mimetype)
+ response = HttpResponse(t.iter_render(c), mimetype=mimetype)
populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
return response
diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py
index 1836ce4a9f..b2a68d61f1 100644
--- a/django/views/generic/list_detail.py
+++ b/django/views/generic/list_detail.py
@@ -33,6 +33,12 @@ def object_list(request, queryset, paginate_by=None, page=None,
number of pages, total
hits
number of objects, total
+ last_on_page
+ the result number of the last of object in the
+ object_list (1-indexed)
+ first_on_page
+ the result number of the first object in the
+ object_list (1-indexed)
"""
if extra_context is None: extra_context = {}
queryset = queryset._clone()
@@ -57,6 +63,8 @@ def object_list(request, queryset, paginate_by=None, page=None,
'page': page,
'next': page + 1,
'previous': page - 1,
+ 'last_on_page': paginator.last_on_page(page - 1),
+ 'first_on_page': paginator.first_on_page(page - 1),
'pages': paginator.pages,
'hits' : paginator.hits,
}, context_processors)
@@ -76,7 +84,7 @@ def object_list(request, queryset, paginate_by=None, page=None,
model = queryset.model
template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
- return HttpResponse(t.render(c), mimetype=mimetype)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def object_detail(request, queryset, object_id=None, slug=None,
slug_field=None, template_name=None, template_name_field=None,
@@ -118,6 +126,6 @@ def object_detail(request, queryset, object_id=None, slug=None,
c[key] = value()
else:
c[key] = value
- response = HttpResponse(t.render(c), mimetype=mimetype)
+ response = HttpResponse(t.iter_render(c), mimetype=mimetype)
populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
return response
diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py
index 355bd25ef8..f4afb07aa0 100644
--- a/django/views/generic/simple.py
+++ b/django/views/generic/simple.py
@@ -1,8 +1,8 @@
from django.shortcuts import render_to_response
-from django.template import RequestContext
+from django.template import loader, RequestContext
from django.http import HttpResponse, HttpResponsePermanentRedirect, HttpResponseGone
-def direct_to_template(request, template, extra_context={}, **kwargs):
+def direct_to_template(request, template, extra_context={}, mimetype=None, **kwargs):
"""
Render a given template with any extra URL parameters in the context as
``{{ params }}``.
@@ -13,7 +13,9 @@ def direct_to_template(request, template, extra_context={}, **kwargs):
dictionary[key] = value()
else:
dictionary[key] = value
- return render_to_response(template, dictionary, context_instance=RequestContext(request))
+ c = RequestContext(request, dictionary)
+ t = loader.get_template(template)
+ return HttpResponse(t.iter_render(c), mimetype=mimetype)
def redirect_to(request, url, **kwargs):
"""
diff --git a/django/views/i18n.py b/django/views/i18n.py
index b5eb32bda3..0fec6b6c6f 100644
--- a/django/views/i18n.py
+++ b/django/views/i18n.py
@@ -9,16 +9,16 @@ def set_language(request):
"""
Redirect to a given url while setting the chosen language in the
session or cookie. The url and the language code need to be
- specified in the GET paramters.
+ specified in the GET parameters.
"""
- lang_code = request.GET['language']
+ lang_code = request.GET.get('language', None)
next = request.GET.get('next', None)
if not next:
next = request.META.get('HTTP_REFERER', None)
if not next:
next = '/'
response = http.HttpResponseRedirect(next)
- if check_for_language(lang_code):
+ if lang_code and check_for_language(lang_code):
if hasattr(request, 'session'):
request.session['django_language'] = lang_code
else:
@@ -97,7 +97,7 @@ def javascript_catalog(request, domain='djangojs', packages=None):
deliver your JavaScript source from Django templates.
"""
if request.GET:
- if request.GET.has_key('language'):
+ if 'language' in request.GET:
if check_for_language(request.GET['language']):
activate(request.GET['language'])
if packages is None:
@@ -136,7 +136,7 @@ def javascript_catalog(request, domain='djangojs', packages=None):
t.update(catalog._catalog)
src = [LibHead]
plural = None
- if t.has_key(''):
+ if '' in t:
for l in t[''].split('\n'):
if l.startswith('Plural-Forms:'):
plural = l.split(':',1)[1].strip()
@@ -155,7 +155,7 @@ def javascript_catalog(request, domain='djangojs', packages=None):
if type(k) in (str, unicode):
csrc.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(v)))
elif type(k) == tuple:
- if not pdict.has_key(k[0]):
+ if k[0] not in pdict:
pdict[k[0]] = k[1]
else:
pdict[k[0]] = max(k[1], pdict[k[0]])
diff --git a/django/views/static.py b/django/views/static.py
index 3ec4ca14a1..1e99c8c50a 100644
--- a/django/views/static.py
+++ b/django/views/static.py
@@ -92,7 +92,7 @@ def directory_index(path, fullpath):
'directory' : path + '/',
'file_list' : files,
})
- return HttpResponse(t.render(c))
+ return HttpResponse(t.iter_render(c))
def was_modified_since(header=None, mtime=0, size=0):
"""
diff --git a/docs/add_ons.txt b/docs/add_ons.txt
index 58c01c4fc0..ffc4f7420f 100644
--- a/docs/add_ons.txt
+++ b/docs/add_ons.txt
@@ -1,13 +1,21 @@
-=====================
-The "contrib" add-ons
-=====================
+============================
+The "django.contrib" add-ons
+============================
Django aims to follow Python's `"batteries included" philosophy`_. It ships
with a variety of extra, optional tools that solve common Web-development
problems.
-This code lives in ``django/contrib`` in the Django distribution. Here's a
-rundown of the packages in ``contrib``:
+This code lives in ``django/contrib`` in the Django distribution. This document
+gives a rundown of the packages in ``contrib``, along with any dependencies
+those packages have.
+
+.. admonition:: Note
+
+ For most of these add-ons -- specifically, the add-ons that include either
+ models or template tags -- you'll need to add the package name (e.g.,
+ ``'django.contrib.admin'``) to your ``INSTALLED_APPS`` setting and re-run
+ ``manage.py syncdb``.
.. _"batteries included" philosophy: http://docs.python.org/tut/node12.html#batteries-included
@@ -17,7 +25,9 @@ admin
The automatic Django administrative interface. For more information, see
`Tutorial 2`_.
-.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+.. _Tutorial 2: ../tutorial02/
+
+Requires the auth_ and contenttypes_ contrib packages to be installed.
auth
====
@@ -26,7 +36,7 @@ Django's authentication framework.
See the `authentication documentation`_.
-.. _authentication documentation: http://www.djangoproject.com/documentation/authentication/
+.. _authentication documentation: ../authentication/
comments
========
@@ -46,13 +56,11 @@ A middleware for preventing Cross Site Request Forgeries
See the `csrf documentation`_.
-.. _csrf documentation: http://www.djangoproject.com/documentation/csrf/
+.. _csrf documentation: ../csrf/
formtools
=========
-**New in Django development version**
-
A set of high-level abstractions for Django forms (django.newforms).
django.contrib.formtools.preview
@@ -137,18 +145,38 @@ A framework for managing simple "flat" HTML content in a database.
See the `flatpages documentation`_.
-.. _flatpages documentation: http://www.djangoproject.com/documentation/flatpages/
+.. _flatpages documentation: ../flatpages/
+
+Requires the sites_ contrib package to be installed as well.
+
+localflavor
+===========
+
+A collection of various Django snippets that are useful only for a particular
+country or culture. For example, ``django.contrib.localflavor.usa.forms``
+contains a ``USZipCodeField`` that you can use to validate U.S. zip codes.
markup
======
-A collection of template filters that implement these common markup languages:
+A collection of template filters that implement common markup languages:
+
+ * ``textile`` -- implements `Textile`_
+ * ``markdown`` -- implements `Markdown`_
+ * ``restructuredtext`` -- implements `ReST (ReStructured Text)`_
+
+In each case, the filter expects formatted markup as a string and returns a
+string representing the marked-up text. For example, the ``textile`` filter
+converts text that is marked-up in Textile format to HTML.
- * Textile
- * Markdown
- * ReST (ReStructured Text)
+To activate these filters, add ``'django.contrib.markup'`` to your
+``INSTALLED_APPS`` setting. Once you've done that, use ``{% load markup %}`` in
+a template, and you'll have access to these filters. For more documentation,
+read the source code in django/contrib/markup/templatetags/markup.py.
-For documentation, read the source code in django/contrib/markup/templatetags/markup.py.
+.. _Textile: http://en.wikipedia.org/wiki/Textile_%28markup_language%29
+.. _Markdown: http://en.wikipedia.org/wiki/Markdown
+.. _ReST (ReStructured Text): http://en.wikipedia.org/wiki/ReStructuredText
redirects
=========
@@ -157,7 +185,7 @@ A framework for managing redirects.
See the `redirects documentation`_.
-.. _redirects documentation: http://www.djangoproject.com/documentation/redirects/
+.. _redirects documentation: ../redirects/
sites
=====
@@ -168,7 +196,7 @@ one or more sites.
See the `sites documentation`_.
-.. _sites documentation: http://www.djangoproject.com/documentation/sites/
+.. _sites documentation: ../sites/
sitemaps
========
@@ -177,7 +205,7 @@ A framework for generating Google sitemap XML files.
See the `sitemaps documentation`_.
-.. _sitemaps documentation: http://www.djangoproject.com/documentation/sitemaps/
+.. _sitemaps documentation: ../sitemaps/
syndication
===========
@@ -186,7 +214,7 @@ A framework for generating syndication feeds, in RSS and Atom, quite easily.
See the `syndication documentation`_.
-.. _syndication documentation: http://www.djangoproject.com/documentation/syndication/
+.. _syndication documentation: ../syndication/
Other add-ons
=============
diff --git a/docs/apache_auth.txt b/docs/apache_auth.txt
index b85057924b..583cb96b39 100644
--- a/docs/apache_auth.txt
+++ b/docs/apache_auth.txt
@@ -65,7 +65,7 @@ are equivalent::
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonOption DJANGO_SETTINGS_MODULE mysite.settings
-.. _authentication system: http://www.djangoproject.com/documentation/authentication/
+.. _authentication system: ../authentication/
.. _Subversion: http://subversion.tigris.org/
.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html
-.. _custom permissions: http://www.djangoproject.com/documentation/authentication/#custom-permissions
+.. _custom permissions: ../authentication/#custom-permissions
diff --git a/docs/api_stability.txt b/docs/api_stability.txt
index 18885fbe63..cfaffeac6b 100644
--- a/docs/api_stability.txt
+++ b/docs/api_stability.txt
@@ -98,26 +98,26 @@ change:
rewrite before Django 1.0. Even if the change isn't quite that drastic,
there will at least be moderate changes.
-.. _caching: http://www.djangoproject.com/documentation/cache/
-.. _custom template tags and libraries: http://www.djangoproject.com/documentation/templates_python/
-.. _database lookup: http://www.djangoproject.com/documentation/db_api/
-.. _django-admin utility: http://www.djangoproject.com/documentation/django_admin/
-.. _fastcgi integration: http://www.djangoproject.com/documentation/fastcgi/
-.. _flatpages: http://www.djangoproject.com/documentation/flatpages/
-.. _generic views: http://www.djangoproject.com/documentation/generic_views/
-.. _internationalization: http://www.djangoproject.com/documentation/i18n/
-.. _legacy database integration: http://www.djangoproject.com/documentation/legacy_databases/
-.. _model definition: http://www.djangoproject.com/documentation/model_api/
-.. _mod_python integration: http://www.djangoproject.com/documentation/modpython/
-.. _redirects: http://www.djangoproject.com/documentation/redirects/
-.. _request/response objects: http://www.djangoproject.com/documentation/request_response/
-.. _sending email: http://www.djangoproject.com/documentation/email/
-.. _sessions: http://www.djangoproject.com/documentation/sessions/
-.. _settings: http://www.djangoproject.com/documentation/settings/
-.. _syndication: http://www.djangoproject.com/documentation/syndication/
-.. _template language: http://www.djangoproject.com/documentation/templates/
-.. _transactions: http://www.djangoproject.com/documentation/transactions/
-.. _url dispatch: http://www.djangoproject.com/documentation/url_dispatch/
-.. _forms and validation: http://www.djangoproject.com/documentation/forms/
-.. _serialization: http://www.djangoproject.com/documentation/serialization/
-.. _authentication: http://www.djangoproject.com/documentation/authentication/
+.. _caching: ../cache/
+.. _custom template tags and libraries: ../templates_python/
+.. _database lookup: ../db-api/
+.. _django-admin utility: ../django-admin/
+.. _fastcgi integration: ../fastcgi/
+.. _flatpages: ../flatpages/
+.. _generic views: ../generic_views/
+.. _internationalization: ../i18n/
+.. _legacy database integration: ../legacy_databases/
+.. _model definition: ../model-api/
+.. _mod_python integration: ../modpython/
+.. _redirects: ../redirects/
+.. _request/response objects: ../request_response/
+.. _sending email: ../email/
+.. _sessions: ../sessions/
+.. _settings: ../settings/
+.. _syndication: ../syndication/
+.. _template language: ../templates/
+.. _transactions: ../transactions/
+.. _url dispatch: ../url_dispatch/
+.. _forms and validation: ../forms/
+.. _serialization: ../serialization/
+.. _authentication: ../authentication/
diff --git a/docs/authentication.txt b/docs/authentication.txt
index 08565e13e1..12b61db538 100644
--- a/docs/authentication.txt
+++ b/docs/authentication.txt
@@ -86,10 +86,10 @@ objects in the same way as any other `Django model`_::
myuser.groups.add(group, group,...)
myuser.groups.remove(group, group,...)
myuser.groups.clear()
- myuser.permissions = [permission_list]
- myuser.permissions.add(permission, permission, ...)
- myuser.permissions.remove(permission, permission, ...]
- myuser.permissions.clear()
+ myuser.user_permissions = [permission_list]
+ myuser.user_permissions.add(permission, permission, ...)
+ myuser.user_permissions.remove(permission, permission, ...]
+ myuser.user_permissions.clear()
In addition to those automatic API methods, ``User`` objects have the following
custom methods:
@@ -144,8 +144,8 @@ custom methods:
Raises ``django.contrib.auth.models.SiteProfileNotAvailable`` if the current site
doesn't allow profiles.
-.. _Django model: http://www.djangoproject.com/documentation/model_api/
-.. _DEFAULT_FROM_EMAIL: http://www.djangoproject.com/documentation/settings/#default-from-email
+.. _Django model: ../model-api/
+.. _DEFAULT_FROM_EMAIL: ../settings/#default-from-email
Manager functions
~~~~~~~~~~~~~~~~~
@@ -204,9 +204,12 @@ The ``password`` attribute of a ``User`` object is a string in this format::
That's hashtype, salt and hash, separated by the dollar-sign character.
-Hashtype is either ``sha1`` (default) or ``md5`` -- the algorithm used to
-perform a one-way hash of the password. Salt is a random string used to salt
-the raw password to create the hash.
+Hashtype is either ``sha1`` (default), ``md5`` or ``crypt`` -- the algorithm
+used to perform a one-way hash of the password. Salt is a random string used
+to salt the raw password to create the hash. Note that the ``crypt`` method is
+only supported on platforms that have the standard Python ``crypt`` module
+available, and ``crypt`` support is only available in the Django development
+version.
For example::
@@ -271,8 +274,8 @@ previous section). You can tell them apart with ``is_authenticated()``, like so:
else:
# Do something for anonymous users.
-.. _request objects: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
-.. _session documentation: http://www.djangoproject.com/documentation/sessions/
+.. _request objects: ../request_response/#httprequest-objects
+.. _session documentation: ../sessions/
How to log a user in
--------------------
@@ -317,6 +320,16 @@ This example shows how you might use both ``authenticate()`` and ``login()``::
else:
# Return an 'invalid login' error message.
+Manually checking a user's password
+-----------------------------------
+
+If you'd like to manually authenticate a user by comparing a
+plain-text password to the hashed password in the database, use the
+convenience function `django.contrib.auth.models.check_password`. It
+takes two arguments: the plain-text password to check, and the full
+value of a user's ``password`` field in the database to check against,
+and returns ``True`` if they match, ``False`` otherwise.
+
How to log a user out
---------------------
@@ -377,27 +390,28 @@ introduced in Python 2.4::
``login_required`` does the following:
- * If the user isn't logged in, redirect to ``/accounts/login/``, passing
- the current absolute URL in the query string as ``next``. For example:
+ * If the user isn't logged in, redirect to ``settings.LOGIN_URL``
+ (``/accounts/login/`` by default), passing the current absolute URL
+ in the query string as ``next``. For example:
``/accounts/login/?next=/polls/3/``.
* If the user is logged in, execute the view normally. The view code is
free to assume the user is logged in.
-Note that you'll need to map the appropriate Django view to ``/accounts/login/``.
-To do this, add the following line to your URLconf::
+Note that you'll need to map the appropriate Django view to ``settings.LOGIN_URL``.
+For example, using the defaults, add the following line to your URLconf::
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
-Here's what ``django.contrib.auth.views.login`` does::
+Here's what ``django.contrib.auth.views.login`` does:
* If called via ``GET``, it displays a login form that POSTs to the same
URL. More on this in a bit.
* If called via ``POST``, it tries to log the user in. If login is
successful, the view redirects to the URL specified in ``next``. If
- ``next`` isn't provided, it redirects to ``/accounts/profile/`` (which is
- currently hard-coded). If login isn't successful, it redisplays the login
- form.
+ ``next`` isn't provided, it redirects to ``settings.LOGIN_REDIRECT_URL``
+ (which defaults to ``/accounts/profile/``). If login isn't successful,
+ it redisplays the login form.
It's your responsibility to provide the login form in a template called
``registration/login.html`` by default. This template gets passed three
@@ -441,8 +455,149 @@ block::
{% endblock %}
-.. _forms documentation: http://www.djangoproject.com/documentation/forms/
-.. _site framework docs: http://www.djangoproject.com/documentation/sites/
+.. _forms documentation: ../forms/
+.. _site framework docs: ../sites/
+
+Other built-in views
+--------------------
+
+In addition to the `login` view, the authentication system includes a
+few other useful built-in views:
+
+``django.contrib.auth.views.logout``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+Logs a user out.
+
+**Optional arguments:**
+
+ * ``template_name``: The full name of a template to display after
+ logging the user out. This will default to
+ ``registration/logged_out.html`` if no argument is supplied.
+
+**Template context:**
+
+ * ``title``: The string "Logged out", localized.
+
+``django.contrib.auth.views.logout_then_login``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+Logs a user out, then redirects to the login page.
+
+**Optional arguments:**
+
+ * ``login_url``: The URL of the login page to redirect to. This
+ will default to ``settings.LOGIN_URL`` if not supplied.
+
+``django.contrib.auth.views.password_change``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+Allows a user to change their password.
+
+**Optional arguments:**
+
+ * ``template_name``: The full name of a template to use for
+ displaying the password change form. This will default to
+ ``registration/password_change_form.html`` if not supplied.
+
+**Template context:**
+
+ * ``form``: The password change form.
+
+``django.contrib.auth.views.password_change_done``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+The page shown after a user has changed their password.
+
+**Optional arguments:**
+
+ * ``template_name``: The full name of a template to use. This will
+ default to ``registration/password_change_done.html`` if not
+ supplied.
+
+``django.contrib.auth.views.password_reset``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+Allows a user to reset their password, and sends them the new password
+in an email.
+
+**Optional arguments:**
+
+ * ``template_name``: The full name of a template to use for
+ displaying the password reset form. This will default to
+ ``registration/password_reset_form.html`` if not supplied.
+
+ * ``email_template_name``: The full name of a template to use for
+ generating the email with the new password. This will default to
+ ``registration/password_reset_email.html`` if not supplied.
+
+**Template context:**
+
+ * ``form``: The form for resetting the user's password.
+
+``django.contrib.auth.views.password_reset_done``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+The page shown after a user has reset their password.
+
+**Optional arguments:**
+
+ * ``template_name``: The full name of a template to use. This will
+ default to ``registration/password_reset_done.html`` if not
+ supplied.
+
+``django.contrib.auth.views.redirect_to_login``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Description:**
+
+Redirects to the login page, and then back to another URL after a
+successful login.
+
+**Required arguments:**
+
+ * ``next``: The URL to redirect to after a successful login.
+
+**Optional arguments:**
+
+ * ``login_url``: The URL of the login page to redirect to. This
+ will default to ``settings.LOGIN_URL`` if not supplied.
+
+Built-in manipulators
+---------------------
+
+If you don't want to use the built-in views, but want the convenience
+of not having to write manipulators for this functionality, the
+authentication system provides several built-in manipulators:
+
+ * ``django.contrib.auth.forms.AdminPasswordChangeForm``: A
+ manipulator used in the admin interface to change a user's
+ password.
+
+ * ``django.contrib.auth.forms.AuthenticationForm``: A manipulator
+ for logging a user in.
+
+ * ``django.contrib.auth.forms.PasswordChangeForm``: A manipulator
+ for allowing a user to change their password.
+
+ * ``django.contrib.auth.forms.PasswordResetForm``: A manipulator
+ for resetting a user's password and emailing the new password to
+ them.
+
+ * ``django.contrib.auth.forms.UserCreationForm``: A manipulator
+ for creating a new user.
Limiting access to logged-in users that pass a test
---------------------------------------------------
@@ -485,7 +640,7 @@ Note that ``user_passes_test`` does not automatically check that the ``User``
is not anonymous.
``user_passes_test()`` takes an optional ``login_url`` argument, which lets you
-specify the URL for your login page (``/accounts/login/`` by default).
+specify the URL for your login page (``settings.LOGIN_URL`` by default).
Example in Python 2.3 syntax::
@@ -529,7 +684,7 @@ parameter. Example::
my_view = permission_required('polls.can_vote', login_url='/loginpage/')(my_view)
As in the ``login_required`` decorator, ``login_url`` defaults to
-``'/accounts/login/'``.
+``settings.LOGIN_URL``.
Limiting access to generic views
--------------------------------
@@ -544,7 +699,7 @@ For example::
def limited_object_detail(*args, **kwargs):
return object_detail(*args, **kwargs)
-.. _generic view: http://www.djangoproject.com/documentation/generic_views/
+.. _generic view: ../generic_views/
Permissions
===========
@@ -575,7 +730,7 @@ Django developers are currently discussing.
Default permissions
-------------------
-Three basic permissions -- add, create and delete -- are automatically created
+Three basic permissions -- add, change and delete -- are automatically created
for each Django model that has a ``class Admin`` set. Behind the scenes, these
permissions are added to the ``auth_permission`` database table when you run
``manage.py syncdb``.
@@ -606,7 +761,7 @@ This example model creates three custom permissions::
The only thing this does is create those extra permissions when you run
``syncdb``.
-.. _model Meta attribute: http://www.djangoproject.com/documentation/model_api/#meta-options
+.. _model Meta attribute: ../model-api/#meta-options
API reference
-------------
@@ -645,7 +800,7 @@ The currently logged-in user and his/her permissions are made available in the
setting contains ``"django.core.context_processors.auth"``, which is default.
For more, see the `RequestContext docs`_.
- .. _RequestContext docs: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
+ .. _RequestContext docs: ../templates_python/#subclassing-context-requestcontext
Users
-----
@@ -691,7 +846,7 @@ Thus, you can check permissions in template ``{% if %}`` statements::
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}
-.. _template context: http://www.djangoproject.com/documentation/templates_python/
+.. _template context: ../templates_python/
Groups
======
@@ -756,7 +911,7 @@ scenes, so any messages will be deleted even if you don't display them.
Finally, note that this messages framework only works with users in the user
database. To send messages to anonymous users, use the `session framework`_.
-.. _session framework: http://www.djangoproject.com/documentation/sessions/
+.. _session framework: ../sessions/
Other authentication sources
============================
@@ -813,13 +968,13 @@ The ``authenticate`` method takes credentials as keyword arguments. Most of
the time, it'll just look like this::
class MyBackend:
- def authenticate(username=None, password=None):
+ def authenticate(self, username=None, password=None):
# Check the username/password and return a User.
But it could also authenticate a token, like so::
class MyBackend:
- def authenticate(token=None):
+ def authenticate(self, token=None):
# Check the token and return a User.
Either way, ``authenticate`` should check the credentials it gets, and it
diff --git a/docs/cache.txt b/docs/cache.txt
index 1795345ed9..e245e100e7 100644
--- a/docs/cache.txt
+++ b/docs/cache.txt
@@ -66,10 +66,19 @@ deleting arbitrary data in the cache. All data is stored directly in memory,
so there's no overhead of database or filesystem usage.
After installing Memcached itself, you'll need to install the Memcached Python
-bindings. They're in a single Python module, memcache.py, available at
-ftp://ftp.tummy.com/pub/python-memcached/ . If that URL is no longer valid,
-just go to the Memcached Web site (http://www.danga.com/memcached/) and get the
-Python bindings from the "Client APIs" section.
+bindings. Two versions of this are available. Choose and install *one* of the
+following modules:
+
+ * The fastest available option is a module called ``cmemcache``, available
+ at http://gijsbert.org/cmemcache/ . (This module is only compatible with
+ the Django development version. Django 0.96 is only compatible with the
+ second option, below.)
+
+ * If you can't install ``cmemcache``, you can install ``python-memcached``,
+ available at ftp://ftp.tummy.com/pub/python-memcached/ . If that URL is
+ no longer valid, just go to the Memcached Web site
+ (http://www.danga.com/memcached/) and get the Python bindings from the
+ "Client APIs" section.
To use Memcached with Django, set ``CACHE_BACKEND`` to
``memcached://ip:port/``, where ``ip`` is the IP address of the Memcached
@@ -250,7 +259,7 @@ Additionally, ``CacheMiddleware`` automatically sets a few headers in each
See the `middleware documentation`_ for more on middleware.
-.. _`middleware documentation`: http://www.djangoproject.com/documentation/middleware/
+.. _`middleware documentation`: ../middleware/
The per-view cache
==================
diff --git a/docs/contributing.txt b/docs/contributing.txt
index de9236f6c1..31409f27bd 100644
--- a/docs/contributing.txt
+++ b/docs/contributing.txt
@@ -122,9 +122,9 @@ Patch style
* Name the patch file with a ``.diff`` extension; this will let the ticket
tracker apply correct syntax highlighting, which is quite helpful.
- * Put the prefix "[patch] " before the title of your ticket. This will make
- it obvious that the ticket includes a patch, and it will add the ticket
- to the `list of tickets with patches`_.
+ * Check the "Has patch" box on the ticket details. This will make it
+ obvious that the ticket includes a patch, and it will add the ticket to
+ the `list of tickets with patches`_.
* The code required to fix a problem or add a feature is an essential part
of a patch, but it is not the only part. A good patch should also include
@@ -151,24 +151,97 @@ Unfortunately, not all bug reports in the `ticket tracker`_ provide all
the `required details`_. A number of tickets have patches, but those patches
don't meet all the requirements of a `good patch`_.
-One way to help out is to *triage* bugs that have been reported by other users.
-Pick an open ticket that is missing some details, and try to replicate the
-problem. Fill in the missing pieces of the report. If the ticket doesn't have
-a patch, create one.
+One way to help out is to *triage* bugs that have been reported by other
+users. A couple of dedicated volunteers work on this regularly, but more help
+is always appreciated.
-Once you've completed all the missing details on the ticket and you have a
-patch with all the required features, e-mail `django-developers`_. Indicate
-that you have triaged a ticket, and recommend a course of action for dealing
-with that ticket.
+Most of the workflow is based around the concept of a ticket's "triage stage".
+This stage describes where in its lifetime a given ticket is at any time.
+Along with a handful of flags, this field easily tells us what and who each
+ticket is waiting on.
-At first, this may require you to be persistent. If you find that your triaged
-ticket still isn't getting attention, occasional polite requests for eyeballs
-to look at your ticket may be necessary. However, as you earn a reputation for
-quality triage work, you should find that it is easier to get the developers'
-attention.
+Since a picture is worth a thousand words, let's start there:
+
+.. image:: http://media.djangoproject.com/img/doc/djangotickets.png
+ :height: 451
+ :width: 590
+ :alt: Django's ticket workflow
+
+We've got two roles here:
+
+ * Core developers: people with commit access who make the decisions and
+ write the bulk of the code.
+
+ * Ticket triagers: community members who keep track of tickets, making
+ sure the tickets are always categorized correctly.
+
+Second, note the four triage stages:
+
+ 1. A ticket starts as "Unreviewed", meaning that a triager has yet to
+ examine the ticket and move it along.
+
+ 2. "Design decision needed" means "this concept requires a design
+ decision," which should be discussed either in the ticket comments or on
+ django-developers.
+
+ 3. Once a ticket is ruled to be approved for fixing, it's moved into the
+ "Accepted" stage. This stage is where all the real work gets done.
+
+ 4. If a ticket has an associated patch (see below), a triager will review the
+ patch. If the patch is complete, it'll be marked as "ready for checkin" so
+ that a core developer knows to review and check in the patches.
+
+The second part of this workflow involves a set of flags the describe what the
+ticket has or needs in order to be "ready for checkin":
+
+ "Has patch"
+ This means the ticket has an associated patch_. These will be
+ reviewed to see if the patch is "good".
+
+ "Needs documentation"
+ This flag is used for tickets with patches that need associated
+ documentation. Complete documentation of features is a prerequisite
+ before we can check a fix into the codebase.
+
+ "Needs tests"
+ This flags the patch as needing associated unit tests. Again, this is a
+ required part of a valid patch.
+
+ "Patch needs improvement"
+ This flag means that although the ticket *has* a patch, it's not quite
+ ready for checkin. This could mean the patch no longer applies
+ cleanly, or that the code doesn't live up to our standards.
+
+A ticket can be resolved in a number of ways:
+
+ "fixed"
+ Used by one of the core developers once a patch has been rolled into
+ Django and the issue is fixed.
+
+ "invalid"
+ Used if the ticket is found to be incorrect or a user error.
+
+ "wontfix"
+ Used when a core developer decides that this request is not
+ appropriate for consideration in Django. This is usually chosen after
+ discussion in the ``django-developers`` mailing list, and you should
+ feel free to join in when it's something you care about.
+
+ "duplicate"
+ Used when another ticket covers the same issue. By closing duplicate
+ tickets, we keep all the discussion in one place, which helps everyone.
+
+ "worksforme"
+ Used when the triage team is unable to replicate the original bug.
+
+If you believe that the ticket was closed in error -- because you're
+still having the issue, or it's popped up somewhere else, or the triagers have
+-- made a mistake, please reopen the ticket and tell us why. Please do not
+reopen tickets that have been marked as "wontfix" by core developers.
.. _required details: `Reporting bugs`_
.. _good patch: `Patch style`_
+.. _patch: `Submitting patches`_
Submitting and maintaining translations
=======================================
@@ -186,7 +259,7 @@ translated, here's what to do:
`i18n documentation`_.
.. _Django i18n mailing list: http://groups.google.com/group/django-i18n/
-.. _i18n documentation: http://www.djangoproject.com/documentation/i18n/
+.. _i18n documentation: ../i18n/
Coding style
============
@@ -206,6 +279,15 @@ Please follow these coding standards when writing code for inclusion in Django:
* Mark all strings for internationalization; see the `i18n documentation`_
for details.
+ * Please don't put your name in the code you contribute. Our policy is to
+ keep contributors' names in the ``AUTHORS`` file distributed with Django
+ -- not scattered throughout the codebase itself. Feel free to include a
+ change to the ``AUTHORS`` file in your patch if you make more than a
+ single trivial change.
+
+Template style
+--------------
+
* In Django template code, put one (and only one) space between the curly
brackets and the tag contents.
@@ -217,6 +299,9 @@ Please follow these coding standards when writing code for inclusion in Django:
{{foo}}
+View style
+----------
+
* In Django views, the first parameter in a view function should be called
``request``.
@@ -230,9 +315,72 @@ Please follow these coding standards when writing code for inclusion in Django:
def my_view(req, foo):
# ...
- * Please don't put your name in the code. While we appreciate all
- contributions to Django, our policy is not to publish individual
- developer names in code -- for instance, at the top of Python modules.
+Model style
+-----------
+
+ * Field names should be all lowercase, using underscores instead of
+ camelCase.
+
+ Do this::
+
+ class Person(models.Model):
+ first_name = models.CharField(maxlength=20)
+ last_name = models.CharField(maxlength=40)
+
+ Don't do this::
+
+ class Person(models.Model):
+ FirstName = models.CharField(maxlength=20)
+ Last_Name = models.CharField(maxlength=40)
+
+ * The ``class Meta`` should appear *after* the fields are defined, with
+ a single blank line separating the fields and the class definition.
+
+ Do this::
+
+ class Person(models.Model):
+ first_name = models.CharField(maxlength=20)
+ last_name = models.CharField(maxlength=40)
+
+ class Meta:
+ verbose_name_plural = 'people'
+
+ Don't do this::
+
+ class Person(models.Model):
+ first_name = models.CharField(maxlength=20)
+ last_name = models.CharField(maxlength=40)
+ class Meta:
+ verbose_name_plural = 'people'
+
+ Don't do this, either::
+
+ class Person(models.Model):
+ class Meta:
+ verbose_name_plural = 'people'
+
+ first_name = models.CharField(maxlength=20)
+ last_name = models.CharField(maxlength=40)
+
+ * The order of model inner classes and standard methods should be as
+ follows (noting that these are not all required):
+
+ * All database fields
+ * ``class Meta``
+ * ``class Admin``
+ * ``def __str__()``
+ * ``def save()``
+ * ``def get_absolute_url()``
+ * Any custom methods
+
+ * If ``choices`` is defined for a given model field, define the choices as
+ a tuple of tuples, with an all-uppercase name, either near the top of the
+ model module or just above the model class. Example::
+
+ GENDER_CHOICES = (
+ ('M', 'Male'),
+ ('F', 'Female'),
+ )
Committing code
===============
@@ -311,7 +459,7 @@ The Django tests all use the testing infrastructure that ships with Django for
testing applications. See `Testing Django applications`_ for an explanation of
how to write new tests.
-.. _Testing Django applications: http://www.djangoproject.com/documentation/testing/
+.. _Testing Django applications: ../testing/
Running the unit tests
----------------------
@@ -321,10 +469,11 @@ To run the tests, ``cd`` to the ``tests/`` directory and type::
./runtests.py --settings=path.to.django.settings
Yes, the unit tests need a settings module, but only for database connection
-info -- the ``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD``.
-You will also need a ``ROOT_URLCONF`` setting (its value is ignored; it just
-needs to be present) and a ``SITE_ID`` setting (any integer value will do) in
-order for all the tests to pass.
+info -- the ``DATABASE_NAME`` (required, but will be ignored),
+``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD`` settings. You
+will also need a ``ROOT_URLCONF`` setting (its value is ignored; it just needs
+to be present) and a ``SITE_ID`` setting (any integer value will do) in order
+for all the tests to pass.
The unit tests will not touch your existing databases; they create a new
database, called ``django_test_db``, which is deleted when the tests are
@@ -438,6 +587,29 @@ Alternatively, you can use a symlink called ``django`` that points to the
location of the branch's ``django`` package. If you want to switch back, just
change the symlink to point to the old code.
+A third option is to use a `path file`_ (``<something>.pth``) which should
+work on all systems (including Windows, which doesn't have symlinks
+available). First, make sure there are no files, directories or symlinks named
+``django`` in your ``site-packages`` directory. Then create a text file named
+``django.pth`` and save it to your ``site-packages`` directory. That file
+should contain a path to your copy of Django on a single line and optional
+comments. Here is an example that points to multiple branches. Just uncomment
+the line for the branch you want to use ('Trunk' in this example) and make
+sure all other lines are commented::
+
+ # Trunk is a svn checkout of:
+ # http://code.djangoproject.com/svn/django/trunk/
+ #
+ /path/to/trunk
+
+ # <branch> is a svn checkout of:
+ # http://code.djangoproject.com/svn/django/branches/<branch>/
+ #
+ #/path/to/<branch>
+
+ # On windows a path may look like this:
+ # C:/path/to/<branch>
+
If you're using Django 0.95 or earlier and installed it using
``python setup.py install``, you'll have a directory called something like
``Django-0.95-py2.4.egg`` instead of ``django``. In this case, edit the file
@@ -445,6 +617,8 @@ If you're using Django 0.95 or earlier and installed it using
file. Then copy the branch's version of the ``django`` directory into
``site-packages``.
+.. _path file: http://docs.python.org/lib/module-site.html
+
Official releases
=================
@@ -548,8 +722,7 @@ requests for commit access are potential flame-war starters, and will be ignored
.. _search the tracker: http://code.djangoproject.com/search
.. _django-users: http://groups.google.com/group/django-users
.. _`#django`: irc://irc.freenode.net/django
-.. _list of tickets with patches: http://code.djangoproject.com/report/12
+.. _list of tickets with patches: http://code.djangoproject.com/query?status=new&status=assigned&status=reopened&has_patch=1&order=priority
.. _PEP 8: http://www.python.org/peps/pep-0008.html
-.. _i18n documentation: http://www.djangoproject.com/documentation/i18n/
.. _i18n branch: http://code.djangoproject.com/browser/django/branches/i18n
.. _`tags/releases`: http://code.djangoproject.com/browser/django/tags/releases
diff --git a/docs/databases.txt b/docs/databases.txt
new file mode 100644
index 0000000000..b73f39843c
--- /dev/null
+++ b/docs/databases.txt
@@ -0,0 +1,165 @@
+===============================
+Notes about supported databases
+===============================
+
+Django attempts to support as many features as possible on all database
+backends. However, not all database backends are alike, and we've had to make
+design decisions on which features to support and which assumptions we can make
+safely.
+
+This file describes some of the features that might be relevant to Django
+usage. Of course, it is not intended as a replacement for server-specific
+documentation or reference manuals.
+
+MySQL notes
+===========
+
+Django expects the database to support transactions, referential integrity,
+and Unicode support (UTF-8 encoding). Fortunately, MySQL_ has all these
+features as available as far back as 3.23. While it may be possible to use
+3.23 or 4.0, you'll probably have less trouble if you use 4.1 or 5.0.
+
+MySQL 4.1
+---------
+
+`MySQL 4.1`_ has greatly improved support for character sets. It is possible to
+set different default character sets on the database, table, and column.
+Previous versions have only a server-wide character set setting. It's also the
+first version where the character set can be changed on the fly. 4.1 also has
+support for views, but Django currently doesn't use views.
+
+MySQL 5.0
+---------
+
+`MySQL 5.0`_ adds the ``information_schema`` database, which contains detailed
+data on all database schema. Django's ``inspectdb`` feature uses this
+``information_schema`` if it's available. 5.0 also has support for stored
+procedures, but Django currently doesn't use stored procedures.
+
+.. _MySQL: http://www.mysql.com/
+.. _MySQL 4.1: http://dev.mysql.com/doc/refman/4.1/en/index.html
+.. _MySQL 5.0: http://dev.mysql.com/doc/refman/5.0/en/index.html
+
+Storage engines
+---------------
+
+MySQL has several `storage engines`_ (previously called table types). You can
+change the default storage engine in the server configuration.
+
+The default engine is MyISAM_. The main drawback of MyISAM is that it doesn't
+currently support transactions or foreign keys. On the plus side, it's
+currently the only engine that supports full-text indexing and searching.
+
+The InnoDB_ engine is fully transactional and supports foreign key references.
+
+The BDB_ engine, like InnoDB, is also fully transactional and supports foreign
+key references. However, its use seems to be deprecated.
+
+`Other storage engines`_, including SolidDB_ and Falcon_, are on the horizon.
+For now, InnoDB is probably your best choice.
+
+.. _storage engines: http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html
+.. _MyISAM: http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html
+.. _BDB: http://dev.mysql.com/doc/refman/5.0/en/bdb-storage-engine.html
+.. _InnoDB: http://dev.mysql.com/doc/refman/5.0/en/innodb.html
+.. _Other storage engines: http://dev.mysql.com/doc/refman/5.1/en/storage-engines-other.html
+.. _SolidDB: http://forge.mysql.com/projects/view.php?id=139
+.. _Falcon: http://dev.mysql.com/doc/falcon/en/index.html
+
+MySQLdb
+-------
+
+`MySQLdb`_ is the Python interface to MySQL. Version 1.2.1p2 or later is
+required for full MySQL support in Django. Earlier versions will not work with
+the ``mysql`` backend.
+
+If you are trying to use an older version of MySQL and the ``mysql_old``
+backend, then 1.2.0 *might* work for you.
+
+.. _MySQLdb: http://sourceforge.net/projects/mysql-python
+
+Creating your database
+----------------------
+
+You can `create your database`_ using the command-line tools and this SQL::
+
+ CREATE DATABASE <dbname> CHARACTER SET utf8;
+
+This ensures all tables and columns will use UTF-8 by default.
+
+.. _create your database: http://dev.mysql.com/doc/refman/5.0/en/create-database.html
+
+Connecting to the database
+--------------------------
+
+Refer to the `settings documentation`_.
+
+Connection settings are used in this order:
+
+ 1. ``DATABASE_OPTIONS``
+ 2. ``DATABASE_NAME``, ``DATABASE_USER``, ``DATABASE_PASSWORD``, ``DATABASE_HOST``,
+ ``DATABASE_PORT``
+ 3. MySQL option files.
+
+In other words, if you set the name of the database in ``DATABASE_OPTIONS``,
+this will take precedence over ``DATABASE_NAME``, which would override
+anything in a `MySQL option file`_.
+
+Here's a sample configuration which uses a MySQL option file::
+
+ # settings.py
+ DATABASE_ENGINE = "mysql"
+ DATABASE_OPTIONS = {
+ 'read_default_file': '/path/to/my.cnf',
+ }
+
+ # my.cnf
+ [client]
+ database = DATABASE_NAME
+ user = DATABASE_USER
+ passwd = DATABASE_PASSWORD
+ default-character-set = utf8
+
+Several other MySQLdb connection options may be useful, such as ``ssl``,
+``use_unicode``, ``init_command``, and ``sql_mode``. Consult the
+`MySQLdb documentation`_ for more details.
+
+.. _settings documentation: http://www.djangoproject.com/documentation/settings/#database-engine
+.. _MySQL option file: http://dev.mysql.com/doc/refman/5.0/en/option-files.html
+.. _MySQLdb documentation: http://mysql-python.sourceforge.net/
+
+Creating your tables
+--------------------
+
+When Django generates the schema, it doesn't specify a storage engine, so
+tables will be created with whatever default storage engine your database
+server is configured for. The easiest solution is to set your database server's
+default storage engine to the desired engine.
+
+If you're using a hosting service and can't change your server's default
+storage engine, you have a couple of options.
+
+ * After the tables are created, execute an ``ALTER TABLE`` statement to
+ convert a table to a new storage engine (such as InnoDB)::
+
+ ALTER TABLE <tablename> ENGINE=INNODB;
+
+ This can be tedious if you have a lot of tables.
+
+ * Another option is to use the ``init_command`` option for MySQLdb prior to
+ creating your tables::
+
+ DATABASE_OPTIONS = {
+ # ...
+ "init_command": "SET storage_engine=INNODB",
+ # ...
+ }
+
+ This sets the default storage engine upon connecting to the database.
+ After your tables have been created, you should remove this option.
+
+ * Another method for changing the storage engine is described in
+ AlterModelOnSyncDB_.
+
+.. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB
+
diff --git a/docs/databrowse.txt b/docs/databrowse.txt
new file mode 100644
index 0000000000..9c03e7e4ea
--- /dev/null
+++ b/docs/databrowse.txt
@@ -0,0 +1,60 @@
+==========
+Databrowse
+==========
+
+Databrowse is a Django application that lets you browse your data.
+
+As the Django admin dynamically creates an admin interface by introspecting
+your models, Databrowse dynamically creates a rich, browsable Web site by
+introspecting your models.
+
+.. admonition:: Note
+
+ Databrowse is **very** new and is currently under active development. It
+ may change substantially before the next Django release.
+
+ With that said, it's easy to use, and it doesn't require writing any
+ code. So you can play around with it today, with very little investment in
+ time or coding.
+
+How to use Databrowse
+=====================
+
+ 1. Point Django at the default Databrowse templates. There are two ways to
+ do this:
+
+ * Add ``'django.contrib.databrowse'`` to your ``INSTALLED_APPS``
+ setting. This will work if your ``TEMPLATE_LOADERS`` setting includes
+ the ``app_directories`` template loader (which is the case by
+ default). See the `template loader docs`_ for more.
+
+ * Otherwise, determine the full filesystem path to the
+ ``django/contrib/databrowse/templates`` directory, and add that
+ directory to your ``TEMPLATE_DIRS`` setting.
+
+ 2. Register a number of models with the Databrowse site::
+
+ from django.contrib import databrowse
+
+ databrowse.site.register(SomeModel)
+ databrowse.site.register(SomeOtherModel)
+
+ Note that you should register the model *classes*, not instances.
+
+ It doesn't matter where you put this, as long as it gets executed at
+ some point. A good place for it is in your URLconf file (``urls.py``).
+
+ 3. Change your URLconf to import the ``databrowse`` module::
+
+ from django.contrib import databrowse
+
+ ...and add the following line to your URLconf::
+
+ (r'^databrowse/(.*)', databrowse.site.root),
+
+ The prefix doesn't matter -- you can use ``databrowse/`` or ``db/`` or
+ whatever you'd like.
+
+ 4. Run the Django server and visit ``/databrowse/`` in your browser.
+
+.. _template loader docs: ../templates_python/#loader-types
diff --git a/docs/db-api.txt b/docs/db-api.txt
index 13a32bd0b8..e7b8183f6c 100644
--- a/docs/db-api.txt
+++ b/docs/db-api.txt
@@ -6,7 +6,7 @@ Once you've created your `data models`_, Django automatically gives you a
database-abstraction API that lets you create, retrieve, update and delete
objects. This document explains that API.
-.. _`data models`: http://www.djangoproject.com/documentation/model_api/
+.. _`data models`: ../model-api/
Throughout this reference, we'll refer to the following models, which comprise
a weblog application::
@@ -85,7 +85,7 @@ There's no way to tell what the value of an ID will be before you call
unless you explicitly specify ``primary_key=True`` on a field. See the
`AutoField documentation`_.)
-.. _AutoField documentation: http://www.djangoproject.com/documentation/model_api/#autofield
+.. _AutoField documentation: ../model-api/#autofield
Explicitly specifying auto-primary-key values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -112,7 +112,7 @@ the previous record in the database::
b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.')
b4.save() # Overrides the previous blog with ID=3!
-See _`How Django knows to UPDATE vs. INSERT`, below, for the reason this
+See `How Django knows to UPDATE vs. INSERT`_, below, for the reason this
happens.
Explicitly specifying auto-primary-key values is mostly useful for bulk-saving
@@ -134,6 +134,15 @@ the database until you explicitly call ``save()``.
The ``save()`` method has no return value.
+Updating ``ForeignKey`` fields works exactly the same way; simply assign an
+object of the right type to the field in question::
+
+ joe = Author.objects.create(name="Joe")
+ entry.author = joe
+ entry.save()
+
+Django will complain if you try to assign an object of the wrong type.
+
How Django knows to UPDATE vs. INSERT
-------------------------------------
@@ -143,8 +152,8 @@ or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django
follows this algorithm:
* If the object's primary key attribute is set to a value that evaluates to
- ``True`` (i.e., a value other than ``None`` or the empty string), Django
- executes a ``SELECT`` query to determine whether a record with the given
+ ``True`` (i.e., a value other than ``None`` or the empty string), Django
+ executes a ``SELECT`` query to determine whether a record with the given
primary key already exists.
* If the record with the given primary key does already exist, Django
executes an ``UPDATE`` query.
@@ -379,7 +388,7 @@ The lookup parameters (``**kwargs``) should be in the format described in
`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the
underlying SQL statement, and the whole thing is enclosed in a ``NOT()``.
-This example excludes all entries whose ``pub_date`` is the current date/time
+This example excludes all entries whose ``pub_date`` is later than 2005-1-3
AND whose ``headline`` is "Hello"::
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
@@ -389,8 +398,8 @@ In SQL terms, that evaluates to::
SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
-This example excludes all entries whose ``pub_date`` is the current date/time
-OR whose ``headline`` is "Hello"::
+This example excludes all entries whose ``pub_date`` is later than 2005-1-3
+AND whose headline is NOT "Hello"::
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
@@ -526,6 +535,21 @@ Examples::
>>> Entry.objects.filter(headline__contains='Lennon').dates('pub_date', 'day')
[datetime.datetime(2005, 3, 20)]
+``none()``
+~~~~~~~~~~
+
+**New in Django development version**
+
+Returns an ``EmptyQuerySet`` -- a ``QuerySet`` that always evaluates to
+an empty list. This can be used in cases where you know that you should
+return an empty result set and your caller is expecting a ``QuerySet``
+object (instead of returning an empty list, for example.)
+
+Examples::
+
+ >>> Entry.objects.none()
+ []
+
``select_related()``
~~~~~~~~~~~~~~~~~~~~
@@ -574,13 +598,28 @@ related ``Person`` *and* the related ``City``::
p = b.author # Doesn't hit the database.
c = p.hometown # Doesn't hit the database.
- sv = Book.objects.get(id=4) # No select_related() in this example.
+ b = Book.objects.get(id=4) # No select_related() in this example.
p = b.author # Hits the database.
c = p.hometown # Hits the database.
Note that ``select_related()`` does not follow foreign keys that have
``null=True``.
+Usually, using ``select_related()`` can vastly improve performance because your
+app can avoid many database calls. However, in situations with deeply nested
+sets of relationships ``select_related()`` can sometimes end up following "too
+many" relations, and can generate queries so large that they end up being slow.
+
+In these situations, you can use the ``depth`` argument to ``select_related()``
+to control how many "levels" of relations ``select_related()`` will actually
+follow::
+
+ b = Book.objects.select_related(depth=1).get(id=4)
+ p = b.author # Doesn't hit the database.
+ c = p.hometown # Requires a database call.
+
+The ``depth`` argument is new in the Django development version.
+
``extra(select=None, where=None, params=None, tables=None)``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -684,7 +723,7 @@ QuerySet methods that do not return QuerySets
The following ``QuerySet`` methods evaluate the ``QuerySet`` and return
something *other than* a ``QuerySet``.
-These methods do not use a cache (see _`Caching and QuerySets` below). Rather,
+These methods do not use a cache (see `Caching and QuerySets`_ below). Rather,
they query the database each time they're called.
``get(**kwargs)``
@@ -876,8 +915,8 @@ The database API supports the following lookup types:
exact
~~~~~
-Exact match. If the value provided for comparison is ``None``, it will
-be interpreted as an SQL ``NULL`` (See isnull_ for more details).
+Exact match. If the value provided for comparison is ``None``, it will
+be interpreted as an SQL ``NULL`` (See isnull_ for more details).
Examples::
@@ -1106,7 +1145,7 @@ such as January 3, July 3, etc.
isnull
~~~~~~
-Takes either ``True`` or ``False``, which correspond to SQL queries of
+Takes either ``True`` or ``False``, which correspond to SQL queries of
``IS NULL`` and ``IS NOT NULL``, respectively.
Example::
@@ -1119,10 +1158,10 @@ SQL equivalent::
.. admonition:: ``__isnull=True`` vs ``__exact=None``
- There is an important difference between ``__isnull=True`` and
+ There is an important difference between ``__isnull=True`` and
``__exact=None``. ``__exact=None`` will *always* return an empty result
- set, because SQL requires that no value is equal to ``NULL``.
- ``__isnull`` determines if the field is currently holding the value
+ set, because SQL requires that no value is equal to ``NULL``.
+ ``__isnull`` determines if the field is currently holding the value
of ``NULL`` without performing a comparison.
search
@@ -1151,7 +1190,7 @@ The pk lookup shortcut
----------------------
For convenience, Django provides a ``pk`` lookup type, which stands for
-"primary_key".
+"primary_key".
In the example ``Blog`` model, the primary key is the ``id`` field, so these
three statements are equivalent::
@@ -1160,14 +1199,14 @@ three statements are equivalent::
Blog.objects.get(id=14) # __exact is implied
Blog.objects.get(pk=14) # pk implies id__exact
-The use of ``pk`` isn't limited to ``__exact`` queries -- any query term
+The use of ``pk`` isn't limited to ``__exact`` queries -- any query term
can be combined with ``pk`` to perform a query on the primary key of a model::
# Get blogs entries with id 1, 4 and 7
Blog.objects.filter(pk__in=[1,4,7])
# Get all blog entries with id > 14
- Blog.objects.filter(pk__gt=14)
-
+ Blog.objects.filter(pk__gt=14)
+
``pk`` lookups also work across joins. For example, these three statements are
equivalent::
@@ -1199,8 +1238,8 @@ whose ``headline`` contains ``'Lennon'``::
Blog.objects.filter(entry__headline__contains='Lennon')
-Escaping parenthesis and underscores in LIKE statements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Escaping percent signs and underscores in LIKE statements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The field lookups that equate to ``LIKE`` SQL statements (``iexact``,
``contains``, ``icontains``, ``startswith``, ``istartswith``, ``endswith``
@@ -1606,6 +1645,15 @@ For example, this deletes all ``Entry`` objects with a ``pub_date`` year of
Entry.objects.filter(pub_date__year=2005).delete()
+When Django deletes an object, it emulates the behavior of the SQL
+constraint ``ON DELETE CASCADE`` -- in other words, any objects which
+had foreign keys pointing at the object to be deleted will be deleted
+along with it. For example::
+
+ b = Blog.objects.get(pk=1)
+ # This will delete the Blog and all of its Entry objects.
+ b.delete()
+
Note that ``delete()`` is the only ``QuerySet`` method that is not exposed on a
``Manager`` itself. This is a safety mechanism to prevent you from accidentally
requesting ``Entry.objects.delete()``, and deleting *all* the entries. If you
@@ -1704,6 +1752,47 @@ For every ``ImageField``, the object will have ``get_FOO_height()`` and
``get_FOO_width()`` methods, where ``FOO`` is the name of the field. This
returns the height (or width) of the image, as an integer, in pixels.
+Shortcuts
+=========
+
+As you develop views, you will discover a number of common idioms in the
+way you use the database API. Django encodes some of these idioms as
+shortcuts that can be used to simplify the process of writing views. These
+functions are in the ``django.shortcuts`` module.
+
+get_object_or_404()
+-------------------
+
+One common idiom to use ``get()`` and raise ``Http404`` if the
+object doesn't exist. This idiom is captured by ``get_object_or_404()``.
+This function takes a Django model as its first argument and an
+arbitrary number of keyword arguments, which it passes to the manager's
+``get()`` function. It raises ``Http404`` if the object doesn't
+exist. For example::
+
+ # Get the Entry with a primary key of 3
+ e = get_object_or_404(Entry, pk=3)
+
+When you provide a model to this shortcut function, the default manager
+is used to execute the underlying ``get()`` query. If you don't want to
+use the default manager, or if you want to search a list of related objects,
+you can provide ``get_object_or_404()`` with a manager object instead.
+For example::
+
+ # Get the author of blog instance `e` with a name of 'Fred'
+ a = get_object_or_404(e.authors, name='Fred')
+
+ # Use a custom manager 'recent_entries' in the search for an
+ # entry with a primary key of 3
+ e = get_object_or_404(Entry.recent_entries, pk=3)
+
+get_list_or_404()
+-----------------
+
+``get_list_or_404`` behaves the same way as ``get_object_or_404()``
+-- except that it uses ``filter()`` instead of ``get()``. It raises
+``Http404`` if the list is empty.
+
Falling back to raw SQL
=======================
@@ -1722,4 +1811,4 @@ interface to your database. You can access your database via other tools,
programming languages or database frameworks; there's nothing Django-specific
about your database.
-.. _Executing custom SQL: http://www.djangoproject.com/documentation/model_api/#executing-custom-sql
+.. _Executing custom SQL: ../model-api/#executing-custom-sql
diff --git a/docs/design_philosophies.txt b/docs/design_philosophies.txt
index 7fdc7ea01b..72aa8ade95 100644
--- a/docs/design_philosophies.txt
+++ b/docs/design_philosophies.txt
@@ -186,7 +186,7 @@ code.
This is the philosophy behind `template inheritance`_.
-.. _template inheritance: http://www.djangoproject.com/documentation/templates/#template-inheritance
+.. _template inheritance: ../templates/#template-inheritance
Be decoupled from HTML
----------------------
diff --git a/docs/distributions.txt b/docs/distributions.txt
new file mode 100644
index 0000000000..4ec265f93c
--- /dev/null
+++ b/docs/distributions.txt
@@ -0,0 +1,78 @@
+===================================
+Third-party distributions of Django
+===================================
+
+Several third-party distributors are now providing versions of Django integrated
+with their package-management systems. These can make installation and upgrading
+much easier for users of Django since the integration includes the ability to
+automatically install dependancies (like database adapters) that Django
+requires.
+
+Typically, these packages are based on the latest stable release of Django, so
+if you want to use the development version of Django you'll need to follow the
+instructions for `installing the development version`_ from our Subversion
+repository.
+
+.. _installing the development version: ../install/#installing-the-development-version
+
+Linux distributions
+===================
+
+Debian
+------
+
+A `packaged version of Django`_ is available for `Debian GNU/Linux`_, and can be
+installed from either the "testing" or the "unstable" repositories by typing
+``apt-get install python-django``.
+
+When you install this package, ``apt`` will recommend installing a database
+adapter; you should select and install the adapter for whichever database you
+plan to use with Django.
+
+.. _Debian GNU/Linux: http://www.debian.org/
+.. _packaged version of Django: http://packages.debian.org/testing/python/python-django
+
+Ubuntu
+------
+
+The Debian ``python-django`` package is also available for `Ubuntu Linux`_, in
+the "universe" repository for Ubuntu 7.04 ("Feisty Fawn"). The `current Ubuntu
+package`_ is also based on Django 0.95.1 and can be installed in the same
+fashion as for Debian.
+
+.. _Ubuntu Linux: http://www.ubuntu.com/
+.. _current Ubuntu package: http://packages.ubuntu.com/feisty/python/python-django
+
+Fedora
+------
+
+A Django package is available for `Fedora Linux`_, in the "Fedora Extras"
+repository. The `current Fedora package`_ is based on Django 0.96, and can be
+installed by typing ``yum install Django``. The previous link is for the i386
+binary. Users of other architectures should be able to use that as a starting
+point to find their preferred version.
+
+.. _Fedora Linux: http://fedora.redhat.com/
+.. _current Fedora package: http://download.fedora.redhat.com/pub/fedora/linux/extras/6/i386/repoview/Django.html
+
+Gentoo
+------
+
+A Django build is available for `Gentoo Linux`_, and is based on Django 0.96.
+The `current Gentoo build`_ can be installed by typing ``emerge django``.
+
+.. _Gentoo Linux: http://www.gentoo.org/
+.. _current Gentoo build: http://packages.gentoo.org/packages/?category=dev-python;name=django
+
+For distributors
+================
+
+If you'd like to package Django for distribution, we'd be happy to help out!
+Please join the `django-developers mailing list`_ and introduce yourself.
+
+We also encourage all distributors to subscribe to the `django-announce mailing
+list`_, which is a (very) low-traffic list for announcing new releases of Django
+and important bugfixes.
+
+.. _django-developers mailing list: http://groups.google.com/group/django-developers/
+.. _django-announce mailing list: http://groups.google.com/group/django-announce/
diff --git a/docs/django-admin.txt b/docs/django-admin.txt
index 7f9682b443..d20db7edc9 100644
--- a/docs/django-admin.txt
+++ b/docs/django-admin.txt
@@ -17,13 +17,21 @@ two things for you before delegating to ``django-admin.py``:
The ``django-admin.py`` script should be on your system path if you installed
Django via its ``setup.py`` utility. If it's not on your path, you can find it in
``site-packages/django/bin`` within your Python installation. Consider
-symlinking to it from some place on your path, such as ``/usr/local/bin``.
+symlinking it from some place on your path, such as ``/usr/local/bin``.
+
+For Windows users, who do not have symlinking functionality available, you
+can copy ``django-admin.py`` to a location on your existing path or edit the
+``PATH`` settings (under ``Settings - Control Panel - System - Advanced - Environment...``)
+to point to its installed location.
Generally, when working on a single Django project, it's easier to use
``manage.py``. Use ``django-admin.py`` with ``DJANGO_SETTINGS_MODULE``, or the
``--settings`` command line option, if you need to switch between multiple
Django settings files.
+The command-line examples throughout this document use ``django-admin.py`` to
+be consistent, but any example can use ``manage.py`` just as well.
+
Usage
=====
@@ -53,7 +61,7 @@ Prints the admin-index template snippet for the given appnames.
Use admin-index template snippets if you want to customize the look and feel of
your admin's index page. See `Tutorial 2`_ for more information.
-.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+.. _Tutorial 2: ../tutorial02/
createcachetable [tablename]
----------------------------
@@ -61,7 +69,7 @@ createcachetable [tablename]
Creates a cache table named ``tablename`` for use with the database cache
backend. See the `cache documentation`_ for more information.
-.. _cache documentation: http://www.djangoproject.com/documentation/cache/
+.. _cache documentation: ../cache/
dbshell
-------
@@ -92,6 +100,30 @@ example, the default settings don't define ``ROOT_URLCONF``, so
Note that Django's default settings live in ``django/conf/global_settings.py``,
if you're ever curious to see the full list of defaults.
+dumpdata [appname appname ...]
+------------------------------
+
+Output to standard output all data in the database associated with the named
+application(s).
+
+By default, the database will be dumped in JSON format. If you want the output
+to be in another format, use the ``--format`` option (e.g., ``format=xml``).
+You may specify any Django serialization backend (including any user specified
+serialization backends named in the ``SERIALIZATION_MODULES`` setting). The
+``--indent`` option can be used to pretty-print the output.
+
+If no application name is provided, all installed applications will be dumped.
+
+The output of ``dumpdata`` can be used as input for ``loaddata``.
+
+flush
+-----
+
+Return the database to the state it was in immediately after syncdb was
+executed. This means that all data will be removed from the database, any
+post-synchronization handlers will be re-executed, and the ``initial_data``
+fixture will be re-installed.
+
inspectdb
---------
@@ -133,10 +165,87 @@ needed.
``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection
only works in PostgreSQL and with certain types of MySQL tables.
-install [appname appname ...]
------------------------------
+loaddata [fixture fixture ...]
+------------------------------
+
+Searches for and loads the contents of the named fixture into the database.
+
+A *Fixture* is a collection of files that contain the serialized contents of
+the database. Each fixture has a unique name; however, the files that
+comprise the fixture can be distributed over multiple directories, in
+multiple applications.
+
+Django will search in three locations for fixtures:
+
+ 1. In the ``fixtures`` directory of every installed application
+ 2. In any directory named in the ``FIXTURE_DIRS`` setting
+ 3. In the literal path named by the fixture
+
+Django will load any and all fixtures it finds in these locations that match
+the provided fixture names.
+
+If the named fixture has a file extension, only fixtures of that type
+will be loaded. For example::
+
+ django-admin.py loaddata mydata.json
+
+would only load JSON fixtures called ``mydata``. The fixture extension
+must correspond to the registered name of a serializer (e.g., ``json`` or
+``xml``).
+
+If you omit the extension, Django will search all available fixture types
+for a matching fixture. For example::
+
+ django-admin.py loaddata mydata
+
+would look for any fixture of any fixture type called ``mydata``. If a fixture
+directory contained ``mydata.json``, that fixture would be loaded
+as a JSON fixture. However, if two fixtures with the same name but different
+fixture type are discovered (for example, if ``mydata.json`` and
+``mydata.xml`` were found in the same fixture directory), fixture
+installation will be aborted, and any data installed in the call to
+``loaddata`` will be removed from the database.
+
+The fixtures that are named can include directory components. These
+directories will be included in the search path. For example::
+
+ django-admin.py loaddata foo/bar/mydata.json
+
+would search ``<appname>/fixtures/foo/bar/mydata.json`` for each installed
+application, ``<dirname>/foo/bar/mydata.json`` for each directory in
+``FIXTURE_DIRS``, and the literal path ``foo/bar/mydata.json``.
+
+Note that the order in which fixture files are processed is undefined. However,
+all fixture data is installed as a single transaction, so data in
+one fixture can reference data in another fixture. If the database backend
+supports row-level constraints, these constraints will be checked at the
+end of the transaction.
+
+The ``dumpdata`` command can be used to generate input for ``loaddata``.
+
+.. admonition:: MySQL and Fixtures
+
+ Unfortunately, MySQL isn't capable of completely supporting all the
+ features of Django fixtures. If you use MyISAM tables, MySQL doesn't
+ support transactions or constraints, so you won't get a rollback if
+ multiple transaction files are found, or validation of fixture data.
+ If you use InnoDB tables, you won't be able to have any forward
+ references in your data files - MySQL doesn't provide a mechanism to
+ defer checking of row constraints until a transaction is committed.
+
+reset [appname appname ...]
+---------------------------
+Executes the equivalent of ``sqlreset`` for the given appnames.
+
+runfcgi [options]
+-----------------
+Starts a set of FastCGI processes suitable for use with any web server
+which supports the FastCGI protocol. See the `FastCGI deployment
+documentation`_ for details. Requires the Python FastCGI module from
+`flup`_.
-Executes the equivalent of ``sqlall`` for the given appnames.
+.. _FastCGI deployment documentation: ../fastcgi/
+.. _flup: http://www.saddi.com/software/flup/
runserver [optional port number, or ipaddr:port]
------------------------------------------------
@@ -186,11 +295,11 @@ Serving static files with the development server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By default, the development server doesn't serve any static files for your site
-(such as CSS files, images, things under ``MEDIA_ROOT_URL`` and so forth). If
+(such as CSS files, images, things under ``MEDIA_URL`` and so forth). If
you want to configure Django to serve static media, read the `serving static files`_
documentation.
-.. _serving static files: http://www.djangoproject.com/documentation/static_files/
+.. _serving static files: ../static_files/
Turning off auto-reload
~~~~~~~~~~~~~~~~~~~~~~~
@@ -223,7 +332,7 @@ sqlall [appname appname ...]
Prints the CREATE TABLE and initial-data SQL statements for the given appnames.
-Refer to the description of ``sqlinitialdata`` for an explanation of how to
+Refer to the description of ``sqlcustom`` for an explanation of how to
specify initial data.
sqlclear [appname appname ...]
@@ -231,27 +340,29 @@ sqlclear [appname appname ...]
Prints the DROP TABLE SQL statements for the given appnames.
-sqlindexes [appname appname ...]
-----------------------------------------
-
-Prints the CREATE INDEX SQL statements for the given appnames.
+sqlcustom [appname appname ...]
+-------------------------------
-sqlinitialdata [appname appname ...]
---------------------------------------------
-
-Prints the initial INSERT SQL statements for the given appnames.
+Prints the custom SQL statements for the given appnames.
For each model in each specified app, this command looks for the file
``<appname>/sql/<modelname>.sql``, where ``<appname>`` is the given appname and
``<modelname>`` is the model's name in lowercase. For example, if you have an
-app ``news`` that includes a ``Story`` model, ``sqlinitialdata`` will attempt
+app ``news`` that includes a ``Story`` model, ``sqlcustom`` will attempt
to read a file ``news/sql/story.sql`` and append it to the output of this
command.
Each of the SQL files, if given, is expected to contain valid SQL. The SQL
files are piped directly into the database after all of the models'
-table-creation statements have been executed. Use this SQL hook to populate
-tables with any necessary initial records, SQL functions or test data.
+table-creation statements have been executed. Use this SQL hook to make any
+table modifications, or insert any SQL functions into the database.
+
+Note that the order in which the SQL files are processed is undefined.
+
+sqlindexes [appname appname ...]
+----------------------------------------
+
+Prints the CREATE INDEX SQL statements for the given appnames.
sqlreset [appname appname ...]
--------------------------------------
@@ -261,7 +372,7 @@ Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given appnames.
sqlsequencereset [appname appname ...]
----------------------------------------------
-Prints the SQL statements for resetting PostgreSQL sequences for the given
+Prints the SQL statements for resetting sequences for the given
appnames.
See http://simon.incutio.com/archive/2004/04/21/postgres for more information.
@@ -292,11 +403,14 @@ this command to install the default apps.
If you're installing the ``django.contrib.auth`` application, ``syncdb`` will
give you the option of creating a superuser immediately.
+``syncdb`` will also search for and install any fixture named ``initial_data``
+with an appropriate extension (e.g. ``json`` or ``xml``). See the
+documentation for ``loaddata`` for details on the specification of fixture
+data files.
+
test
----
-**New in Django development version**
-
Discover and run tests for all installed models. See `Testing Django applications`_ for more information.
.. _testing django applications: ../testing/
@@ -341,17 +455,36 @@ setting the Python path for you.
.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
+--format
+--------
+
+Example usage::
+
+ django-admin.py dumpdata --format=xml
+
+Specifies the output format that will be used. The name provided must be the name
+of a registered serializer.
+
--help
------
Displays a help message that includes a terse list of all available actions and
options.
+--indent
+--------
+
+Example usage::
+
+ django-admin.py dumpdata --indent=4
+
+Specifies the number of spaces that will be used for indentation when
+pretty-printing output. By default, output will *not* be pretty-printed.
+Pretty-printing will only be enabled if the indent option is provided.
+
--noinput
---------
-**New in Django development version**
-
Inform django-admin that the user should NOT be prompted for any input. Useful
if the django-admin script will be executed as an unattended, automated
script.
@@ -374,23 +507,20 @@ Example output::
--verbosity
-----------
-**New in Django development version**
-
Example usage::
django-admin.py syncdb --verbosity=2
-Verbosity determines the amount of notification and debug information that
+Verbosity determines the amount of notification and debug information that
will be printed to the console. '0' is no output, '1' is normal output,
and `2` is verbose output.
--adminmedia
------------
-**New in Django development version**
-
Example usage::
- django-admin.py manage.py --adminmedia=/tmp/new-admin-style/
+
+ django-admin.py --adminmedia=/tmp/new-admin-style/
Tells Django where to find the various CSS and JavaScript files for the admin
interface when running the development server. Normally these files are served
diff --git a/docs/documentation.txt b/docs/documentation.txt
index bacfb176b1..decb066fa1 100644
--- a/docs/documentation.txt
+++ b/docs/documentation.txt
@@ -42,25 +42,25 @@ On the Web
The most recent version of the Django documentation lives at
http://www.djangoproject.com/documentation/ . These HTML pages are generated
-automatically from the text files in source control every 15 minutes. That
-means they reflect the "latest and greatest" in Django -- they include the very
-latest corrections and additions, and they discuss the latest Django features,
+automatically from the text files in source control. That means they reflect
+the "latest and greatest" in Django -- they include the very latest
+corrections and additions, and they discuss the latest Django features,
which may only be available to users of the Django development version. (See
"Differences between versions" below.)
-A key advantage of the Web-based documentation is the comment section at the
-bottom of each document. This is an area for anybody to submit changes,
-corrections and suggestions about the given document. The Django developers
-frequently monitor the comments there and use them to improve the documentation
-for everybody.
+We encourage you to help improve the docs by submitting changes, corrections
+and suggestions in the `ticket system`_. The Django developers actively monitor
+the ticket system and use your feedback to improve the documentation for
+everybody.
-We encourage you to help improve the docs: it's easy! Note, however, that
-comments should explicitly relate to the documentation, rather than asking
-broad tech-support questions. If you need help with your particular Django
-setup, try the `django-users mailing list`_ instead of posting a comment to the
-documentation.
+Note, however, that tickets should explicitly relate to the documentation,
+rather than asking broad tech-support questions. If you need help with your
+particular Django setup, try the `django-users mailing list`_ or the
+`#django IRC channel`_ instead.
+.. _ticket system: http://code.djangoproject.com/simpleticket?component=Documentation
.. _django-users mailing list: http://groups.google.com/group/django-users
+.. _#django IRC channel: irc://irc.freenode.net/django
In plain text
-------------
@@ -94,12 +94,10 @@ Formatting
The text documentation is written in ReST (ReStructured Text) format. That
means it's easy to read but is also formatted in a way that makes it easy to
-convert into other formats, such as HTML. If you're interested, the script that
-converts the ReST text docs into djangoproject.com's HTML lives at
-`djangoproject.com/django_website/apps/docs/parts/build_documentation.py`_ in
-the Django Subversion repository.
+convert into other formats, such as HTML. If you have the `reStructuredText`_
+library installed, you can use ``rst2html`` to generate your own HTML files.
-.. _djangoproject.com/django_website/apps/docs/parts/build_documentation.py: http://code.djangoproject.com/browser/djangoproject.com/django_website/apps/docs/parts/build_documentation.py
+.. _reStructuredText: http://docutils.sourceforge.net/rst.html
Differences between versions
============================
@@ -134,14 +132,6 @@ We follow this policy:
frozen document that says "These docs are frozen for Django version XXX"
and links to the current version of that document.
- * Once a document is frozen for a Django release, we remove comments from
- that page, in favor of having comments on the latest version of that
- document. This is for the sake of maintainability and usability, so that
- users have one, and only one, place to leave comments on a particular
- document. We realize that some people may be stuck on a previous version
- of Django, but we believe the usability problems with multiple versions
- of a document the outweigh the benefits.
-
* The `main documentation Web page`_ includes links to documentation for
all previous versions.
diff --git a/docs/email.txt b/docs/email.txt
index 37a4f38a5e..66948e5294 100644
--- a/docs/email.txt
+++ b/docs/email.txt
@@ -19,13 +19,23 @@ In two lines::
send_mail('Subject here', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
-
+
+Mail is sent using the SMTP host and port specified in the `EMAIL_HOST`_ and
+`EMAIL_PORT`_ settings. The `EMAIL_HOST_USER`_ and `EMAIL_HOST_PASSWORD`_
+settings, if set, are used to authenticate to the SMTP server, and the
+`EMAIL_USE_TLS`_ setting controls whether a secure connection is used.
+
.. note::
- The character set of email sent with ``django.core.mail`` will be set to
+ The character set of e-mail sent with ``django.core.mail`` will be set to
the value of your `DEFAULT_CHARSET setting`_.
-
-.. _DEFAULT_CHARSET setting: ../settings/#DEFAULT_CHARSET
+
+.. _DEFAULT_CHARSET setting: ../settings/#default-charset
+.. _EMAIL_HOST: ../settings/#email-host
+.. _EMAIL_PORT: ../settings/#email-port
+.. _EMAIL_HOST_USER: ../settings/#email-host-user
+.. _EMAIL_HOST_PASSWORD: ../settings/#email-host-password
+.. _EMAIL_USE_TLS: ../settings/#email-use-tls
send_mail()
===========
@@ -34,8 +44,8 @@ The simplest way to send e-mail is using the function
``django.core.mail.send_mail()``. Here's its definition::
send_mail(subject, message, from_email, recipient_list,
- fail_silently=False, auth_user=EMAIL_HOST_USER,
- auth_password=EMAIL_HOST_PASSWORD)
+ fail_silently=False, auth_user=None,
+ auth_password=None)
The ``subject``, ``message``, ``from_email`` and ``recipient_list`` parameters
are required.
@@ -65,7 +75,7 @@ send_mass_mail()
Here's the definition::
send_mass_mail(datatuple, fail_silently=False,
- auth_user=EMAIL_HOST_USER, auth_password=EMAIL_HOST_PASSWORD):
+ auth_user=None, auth_password=None):
``datatuple`` is a tuple in which each element is in this format::
@@ -101,9 +111,9 @@ The "From:" header of the e-mail will be the value of the `SERVER_EMAIL setting`
This method exists for convenience and readability.
-.. _ADMINS setting: http://www.djangoproject.com/documentation/settings/#admins
-.. _EMAIL_SUBJECT_PREFIX setting: http://www.djangoproject.com/documentation/settings/#email-subject-prefix
-.. _SERVER_EMAIL setting: http://www.djangoproject.com/documentation/settings/#server-email
+.. _ADMINS setting: ../settings/#admins
+.. _EMAIL_SUBJECT_PREFIX setting: ../settings/#email-subject-prefix
+.. _SERVER_EMAIL setting: ../settings/#server-email
mail_managers() function
========================
@@ -114,7 +124,7 @@ Here's the definition::
mail_managers(subject, message, fail_silently=False)
-.. _MANAGERS setting: http://www.djangoproject.com/documentation/settings/#managers
+.. _MANAGERS setting: ../settings/#managers
Examples
========
@@ -174,3 +184,72 @@ from the request's POST data, sends that to admin@example.com and redirects to
return HttpResponse('Make sure all fields are entered and valid.')
.. _Header injection: http://securephp.damonkohler.com/index.php/Email_Injection
+
+The EmailMessage and SMTPConnection classes
+===========================================
+
+**New in Django development version**
+
+Django's ``send_mail()`` and ``send_mass_mail()`` functions are actually thin
+wrappers that make use of the ``EmailMessage`` and ``SMTPConnection`` classes
+in ``django.core.mail``. If you ever need to customize the way Django sends
+e-mail, you can subclass these two classes to suit your needs.
+
+.. note::
+ Not all features of the ``EmailMessage`` class are available through the
+ ``send_mail()`` and related wrapper functions. If you wish to use advanced
+ features, such as BCC'ed recipients or multi-part e-mail, you'll need to
+ create ``EmailMessage`` instances directly.
+
+In general, ``EmailMessage`` is responsible for creating the e-mail message
+itself. ``SMTPConnection`` is responsible for the network connection side of
+the operation. This means you can reuse the same connection (an
+``SMTPConnection`` instance) for multiple messages.
+
+The ``EmailMessage`` class is initialized as follows::
+
+ email = EmailMessage(subject, body, from_email, to, bcc, connection)
+
+All of these parameters are optional. If ``from_email`` is omitted, the value
+from ``settings.DEFAULT_FROM_EMAIL`` is used. Both the ``to`` and ``bcc``
+parameters are lists of addresses, as strings.
+
+For example::
+
+ email = EmailMessage('Hello', 'Body goes here', 'from@example.com',
+ ['to1@example.com', 'to2@example.com'],
+ ['bcc@example.com'])
+
+The class has the following methods:
+
+ * ``send()`` sends the message, using either the connection that is
+ specified in the ``connection`` attribute, or creating a new connection
+ if none already exists.
+
+ * ``message()`` constructs a ``django.core.mail.SafeMIMEText`` object (a
+ sub-class of Python's ``email.MIMEText.MIMEText`` class) holding the
+ message to be sent. If you ever need to extend the `EmailMessage` class,
+ you'll probably want to override this method to put the content you wish
+ into the MIME object.
+
+ * ``recipients()`` returns a list of all the recipients of the message,
+ whether they're recorded in the ``to`` or ``bcc`` attributes. This is
+ another method you might need to override when sub-classing, because the
+ SMTP server needs to be told the full list of recipients when the message
+ is sent. If you add another way to specify recipients in your class, they
+ need to be returned from this method as well.
+
+The ``SMTPConnection`` class is initialized with the host, port, username and
+password for the SMTP server. If you don't specify one or more of those
+options, they are read from your settings file.
+
+If you're sending lots of messages at once, the ``send_messages()`` method of
+the ``SMTPConnection`` class is useful. It takes a list of ``EmailMessage``
+instances (or subclasses) and sends them over a single connection. For example,
+if you have a function called ``get_notification_email()`` that returns a
+list of ``EmailMessage`` objects representing some periodic e-mail you wish to
+send out, you could send this with::
+
+ connection = SMTPConnection() # Use default settings for connection
+ messages = get_notification_email()
+ connection.send_messages(messages)
diff --git a/docs/faq.txt b/docs/faq.txt
index eaccc6be43..bdd8c5360e 100644
--- a/docs/faq.txt
+++ b/docs/faq.txt
@@ -63,7 +63,7 @@ at any level -- database servers, caching servers or Web/application servers.
The framework cleanly separates components such as its database layer and
application layer. And it ships with a simple-yet-powerful `cache framework`_.
-.. _`cache framework`: http://www.djangoproject.com/documentation/cache/
+.. _`cache framework`: ../cache/
Who's behind this?
------------------
@@ -191,7 +191,7 @@ Like we said: We're picky.
We've documented our philosophies on the `design philosophies page`_.
-.. _design philosophies page: http://www.djangoproject.com/documentation/design_philosophies/
+.. _design philosophies page: ../design_philosophies/
Do you have any of those nifty "screencast" things?
---------------------------------------------------
@@ -277,9 +277,9 @@ How do I get started?
run into trouble.
.. _`Download the code`: http://www.djangoproject.com/download/
-.. _`installation guide`: http://www.djangoproject.com/documentation/install/
-.. _tutorial: http://www.djangoproject.com/documentation/tutorial1/
-.. _documentation: http://www.djangoproject.com/documentation/
+.. _`installation guide`: ../install/
+.. _tutorial: ../tutorial01/
+.. _documentation: ../
.. _ask questions: http://www.djangoproject.com/community/
How do I fix the "install a later version of setuptools" error?
@@ -328,8 +328,9 @@ Do I have to use mod_python?
Although we recommend mod_python for production use, you don't have to use it,
thanks to the fact that Django uses an arrangement called WSGI_. Django can
-talk to any WSGI-enabled server. The most common non-mod_python deployment
-setup is FastCGI. See `How to use Django with FastCGI`_ for full information.
+talk to any WSGI-enabled server. Other non-mod_python deployment setups are
+FastCGI, SCGI or AJP. See `How to use Django with FastCGI, SCGI or AJP`_ for
+full information.
Also, see the `server arrangements wiki page`_ for other deployment strategies.
@@ -337,7 +338,7 @@ If you just want to play around and develop things on your local computer, use
the development Web server that comes with Django. Things should Just Work.
.. _WSGI: http://www.python.org/peps/pep-0333.html
-.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
+.. _How to use Django with FastCGI, SCGI or AJP: ../fastcgi/
.. _server arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements
How do I install mod_python on Windows?
@@ -381,9 +382,9 @@ Why do I get an error about importing DJANGO_SETTINGS_MODULE?
Make sure that:
* The environment variable DJANGO_SETTINGS_MODULE is set to a fully-qualified
- Python module (i.e. "mysite.settings.main").
+ Python module (i.e. "mysite.settings").
- * Said module is on ``sys.path`` (``import mysite.settings.main`` should work).
+ * Said module is on ``sys.path`` (``import mysite.settings`` should work).
* The module doesn't contain syntax errors (of course).
@@ -464,7 +465,7 @@ Can I use Django with a pre-existing database?
Yes. See `Integrating with a legacy database`_.
-.. _`Integrating with a legacy database`: http://www.djangoproject.com/documentation/legacy_databases/
+.. _`Integrating with a legacy database`: ../legacy_databases/
If I make changes to a model, how do I update the database?
-----------------------------------------------------------
@@ -511,7 +512,7 @@ type, create an initial data file and put something like this in it::
As explained in the `SQL initial data file`_ documentation, this SQL file can
contain arbitrary SQL, so you can make any sorts of changes you need to make.
-.. _SQL initial data file: http://www.djangoproject.com/documentation/model_api/#providing-initial-sql-data
+.. _SQL initial data file: ../model-api/#providing-initial-sql-data
Why is Django leaking memory?
-----------------------------
@@ -592,7 +593,7 @@ My admin-site CSS and images showed up fine using the development server, but th
See `serving the admin files`_ in the "How to use Django with mod_python"
documentation.
-.. _serving the admin files: http://www.djangoproject.com/documentation/modpython/#serving-the-admin-files
+.. _serving the admin files: ../modpython/#serving-the-admin-files
My "list_filter" contains a ManyToManyField, but the filter doesn't display.
----------------------------------------------------------------------------
@@ -630,7 +631,7 @@ site is built using semantic HTML and plenty of CSS hooks, so any changes you'd
like to make should be possible by editing the stylesheet. We've got a
`guide to the CSS used in the admin`_ to get you started.
-.. _`guide to the CSS used in the admin`: http://www.djangoproject.com/documentation/admin_css/
+.. _`guide to the CSS used in the admin`: ../admin_css/
How do I create users without having to edit password hashes?
-------------------------------------------------------------
@@ -640,7 +641,7 @@ development version, where this problem was fixed on Aug. 4, 2006.
You can also use the Python API. See `creating users`_ for full info.
-.. _creating users: http://www.djangoproject.com/documentation/authentication/#creating-users
+.. _creating users: ../authentication/#creating-users
Contributing code
=================
@@ -651,7 +652,7 @@ How can I get started contributing code to Django?
Thanks for asking! We've written an entire document devoted to this question.
It's titled `Contributing to Django`_.
-.. _Contributing to Django: http://www.djangoproject.com/documentation/contributing/
+.. _Contributing to Django: ../contributing/
I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch?
--------------------------------------------------------------------------------------------
diff --git a/docs/fastcgi.txt b/docs/fastcgi.txt
index e2f4e933b4..81888bba76 100644
--- a/docs/fastcgi.txt
+++ b/docs/fastcgi.txt
@@ -1,11 +1,17 @@
-==============================
-How to use Django with FastCGI
-==============================
+===========================================
+How to use Django with FastCGI, SCGI or AJP
+===========================================
Although the `current preferred setup`_ for running Django is Apache_ with
-`mod_python`_, many people use shared hosting, on which FastCGI is the only
-viable option. In some setups, FastCGI also allows better security -- and,
-possibly, better performance -- than mod_python.
+`mod_python`_, many people use shared hosting, on which protocols such as
+FastCGI, SCGI or AJP are the only viable options. In some setups, these protocols
+also allow better security -- and, possibly, better performance -- than mod_python.
+
+.. admonition:: Note
+
+ This document primarily focuses on FastCGI. Other protocols, such as SCGI
+ and AJP, are also supported, through the ``flup`` Python package. See the
+ "Protocols" section below for specifics about SCGI and AJP.
Essentially, FastCGI is an efficient way of letting an external application
serve pages to a Web server. The Web server delegates the incoming Web requests
@@ -17,7 +23,7 @@ served with no startup time. Unlike mod_python (or `mod_perl`_), a FastCGI
process doesn't run inside the Web server process, but in a separate,
persistent process.
-.. _current preferred setup: http://www.djangoproject.com/documentation/modpython/
+.. _current preferred setup: ../modpython/
.. _Apache: http://httpd.apache.org/
.. _mod_python: http://www.modpython.org/
.. _mod_perl: http://perl.apache.org/
@@ -74,10 +80,26 @@ your ``manage.py`` is), and then run ``manage.py`` with the ``runfcgi`` option::
If you specify ``help`` as the only option after ``runfcgi``, it'll display a
list of all the available options.
-You'll need to specify either a ``socket`` or both ``host`` and ``port``. Then,
-when you set up your Web server, you'll just need to point it at the host/port
+You'll need to specify either a ``socket``, ``protocol`` or both ``host`` and ``port``.
+Then, when you set up your Web server, you'll just need to point it at the host/port
or socket you specified when starting the FastCGI server.
+Protocols
+---------
+
+Django supports all the protocols that flup_ does, namely fastcgi_, `SCGI`_ and
+`AJP1.3`_ (the Apache JServ Protocol, version 1.3). Select your preferred
+protocol by using the ``protocol=<protocol_name>`` option with
+``./manage.py runfcgi`` -- where ``<protocol_name>`` may be one of: ``fcgi``
+(the default), ``scgi`` or ``ajp``. For example::
+
+ ./manage.py runfcgi --protocol=scgi
+
+.. _flup: http://www.saddi.com/software/flup/
+.. _fastcgi: http://www.fastcgi.com/
+.. _SCGI: http://python.ca/scgi/protocol.txt
+.. _AJP1.3: http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html
+
Examples
--------
@@ -181,7 +203,7 @@ This is probably the most common case, if you're using Django's admin site::
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
- RewriteRule ^/(media.*)$ /$1 [QSA,L]
+ RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>
@@ -274,7 +296,7 @@ In your Web root directory, add this to a file named ``.htaccess`` ::
Then, create a small script that tells Apache how to spawn your FastCGI
program. Create a file ``mysite.fcgi`` and place it in your Web directory, and
-be sure to make it executable ::
+be sure to make it executable::
#!/usr/bin/python
import sys, os
@@ -304,3 +326,14 @@ If you have access to a command shell on a Unix system, you can accomplish this
easily by using the ``touch`` command::
touch mysite.fcgi
+
+Serving admin media files
+=========================
+
+Regardless of the server and configuration you eventually decide to use, you will
+also need to give some thought to how to serve the admin media files. The
+advice given in the modpython_ documentation is also applicable in the setups
+detailed above.
+
+.. _modpython: ../modpython/#serving-the-admin-files
+
diff --git a/docs/flatpages.txt b/docs/flatpages.txt
index 06979f7a9a..1422f16b6b 100644
--- a/docs/flatpages.txt
+++ b/docs/flatpages.txt
@@ -29,8 +29,8 @@ To install the flatpages app, follow these steps:
to your MIDDLEWARE_CLASSES_ setting.
3. Run the command ``manage.py syncdb``.
-.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps
-.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes
+.. _INSTALLED_APPS: ../settings/#installed-apps
+.. _MIDDLEWARE_CLASSES: ../settings/#middleware-classes
How it works
============
@@ -63,9 +63,9 @@ resort.
For more on middleware, read the `middleware docs`_.
-.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id
-.. _RequestContext: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext
-.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
+.. _SITE_ID: ../settings/#site-id
+.. _RequestContext: ../templates_python/#subclassing-context-djangocontext
+.. _middleware docs: ../middleware/
How to add, change and delete flatpages
=======================================
@@ -84,9 +84,9 @@ Flatpages are represented by a standard `Django model`_, which lives in
`django/contrib/flatpages/models.py`_. You can access flatpage objects via the
`Django database API`_.
-.. _Django model: http://www.djangoproject.com/documentation/model_api/
+.. _Django model: ../model-api/
.. _django/contrib/flatpages/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models.py
-.. _Django database API: http://www.djangoproject.com/documentation/db_api/
+.. _Django database API: ../db-api/
Flatpage templates
==================
diff --git a/docs/forms.txt b/docs/forms.txt
index 6efa24d28f..f6cb55a3f6 100644
--- a/docs/forms.txt
+++ b/docs/forms.txt
@@ -14,7 +14,7 @@ use the django.newforms system, which we have begun to document in the
If you have legacy form/manipulator code, read the "Migration plan" section in
that document to understand how we're making the switch.
-.. _newforms documentation: http://www.djangoproject.com/documentation/newforms/
+.. _newforms documentation: ../newforms/
Introduction
============
@@ -173,10 +173,10 @@ creation view that takes validation into account::
# Check for validation errors
errors = manipulator.get_validation_errors(new_data)
+ manipulator.do_html2python(new_data)
if errors:
return render_to_response('places/errors.html', {'errors': errors})
else:
- manipulator.do_html2python(new_data)
new_place = manipulator.save(new_data)
return HttpResponse("Place created: %s" % new_place)
@@ -229,10 +229,10 @@ Below is the finished view::
# Check for errors.
errors = manipulator.get_validation_errors(new_data)
+ manipulator.do_html2python(new_data)
if not errors:
# No errors. This means we can save the data!
- manipulator.do_html2python(new_data)
new_place = manipulator.save(new_data)
# Redirect to the object's "edit" page. Always use a redirect
@@ -324,8 +324,8 @@ about editing an existing one? It's shockingly similar to creating a new one::
if request.method == 'POST':
new_data = request.POST.copy()
errors = manipulator.get_validation_errors(new_data)
+ manipulator.do_html2python(new_data)
if not errors:
- manipulator.do_html2python(new_data)
manipulator.save(new_data)
# Do a post-after-redirect so that reload works, etc.
@@ -406,8 +406,8 @@ Here's a simple function that might drive the above form::
if request.method == 'POST':
new_data = request.POST.copy()
errors = manipulator.get_validation_errors(new_data)
+ manipulator.do_html2python(new_data)
if not errors:
- manipulator.do_html2python(new_data)
# Send e-mail using new_data here...
@@ -417,6 +417,27 @@ Here's a simple function that might drive the above form::
form = forms.FormWrapper(manipulator, new_data, errors)
return render_to_response('contact_form.html', {'form': form})
+Implementing ``flatten_data`` for custom manipulators
+------------------------------------------------------
+
+It is possible (although rarely needed) to replace the default automatically
+created manipulators on a model with your own custom manipulators. If you do
+this and you are intending to use those models in generic views, you should
+also define a ``flatten_data`` method in any ``ChangeManipulator`` replacement.
+This should act like the default ``flatten_data`` and return a dictionary
+mapping field names to their values, like so::
+
+ def flatten_data(self):
+ obj = self.original_object
+ return dict(
+ from = obj.from,
+ subject = obj.subject,
+ ...
+ )
+
+In this way, your new change manipulator will act exactly like the default
+version.
+
``FileField`` and ``ImageField`` special cases
==============================================
@@ -496,10 +517,10 @@ to put punctuation at the end of your validation messages.
When are validators called?
---------------------------
-After a form has been submitted, Django first checks to see that all the
-required fields are present and non-empty. For each field that passes that
-test *and if the form submission contained data* for that field, all the
-validators for that field are called in turn. The emphasized portion in the
+After a form has been submitted, Django validates each field in turn. First,
+if the field is required, Django checks that it is present and non-empty. Then,
+if that test passes *and the form submission contained data* for that field, all
+the validators for that field are called in turn. The emphasized portion in the
last sentence is important: if a form field is not submitted (because it
contains no data -- which is normal HTML behavior), the validators are not
run against the field.
@@ -546,6 +567,7 @@ check for the given property:
* isValidANSIDate
* isValidANSITime
* isValidEmail
+ * isValidFloat
* isValidImage
* isValidImageURL
* isValidPhone
@@ -594,20 +616,28 @@ fails. If no message is passed in, a default message is used.
``other_value``, then the validators in ``validator_list`` are all run
against the current field.
+``RequiredIfOtherFieldGiven``
+ Takes a field name of the current field is only required if the other
+ field has a value.
+
+``RequiredIfOtherFieldsGiven``
+ Similar to ``RequiredIfOtherFieldGiven``, except that it takes a list of
+ field names and if any one of the supplied fields has a value provided,
+ the current field being validated is required.
+
``RequiredIfOtherFieldNotGiven``
Takes the name of the other field and this field is only required if the
other field has no value.
-``RequiredIfOtherFieldsNotGiven``
- Similar to ``RequiredIfOtherFieldNotGiven``, except that it takes a list
- of field names and if any one of the supplied fields does not have a value
- provided, the field being validated is required.
-
``RequiredIfOtherFieldEquals`` and ``RequiredIfOtherFieldDoesNotEqual``
Each of these validator classes takes a field name and a value (in that
order). If the given field does (or does not have, in the latter case) the
given value, then the current field being validated is required.
+ An optional ``other_label`` argument can be passed which, if given, is used
+ in error messages instead of the value. This allows more user friendly error
+ messages if the value itself is not descriptive enough.
+
Note that because validators are called before any ``do_html2python()``
functions, the value being compared against is a string. So
``RequiredIfOtherFieldEquals('choice', '1')`` is correct, whilst
@@ -625,8 +655,8 @@ fails. If no message is passed in, a default message is used.
``NumberIsInRange``
Takes two boundary numbers, ``lower`` and ``upper``, and checks that the
field is greater than ``lower`` (if given) and less than ``upper`` (if
- given).
-
+ given).
+
Both checks are inclusive. That is, ``NumberIsInRange(10, 20)`` will allow
values of both 10 and 20. This validator only checks numeric values
(e.g., float and integer values).
@@ -635,10 +665,10 @@ fails. If no message is passed in, a default message is used.
Takes an integer argument and when called as a validator, checks that the
field being validated is a power of the integer.
-``IsValidFloat``
+``IsValidDecimal``
Takes a maximum number of digits and number of decimal places (in that
- order) and validates whether the field is a float with less than the
- maximum number of digits and decimal place.
+ order) and validates whether the field is a decimal with no more than the
+ maximum number of digits and decimal places.
``MatchesRegularExpression``
Takes a regular expression (a string) as a parameter and validates the
@@ -665,6 +695,6 @@ fails. If no message is passed in, a default message is used.
the executable specified in the ``JING_PATH`` setting (see the settings_
document for more details).
-.. _`generic views`: http://www.djangoproject.com/documentation/generic_views/
-.. _`models API`: http://www.djangoproject.com/documentation/model_api/
-.. _settings: http://www.djangoproject.com/documentation/settings/
+.. _`generic views`: ../generic_views/
+.. _`models API`: ../model-api/
+.. _settings: ../settings/
diff --git a/docs/generic_views.txt b/docs/generic_views.txt
index 25635f35d8..359a82506a 100644
--- a/docs/generic_views.txt
+++ b/docs/generic_views.txt
@@ -44,7 +44,7 @@ simple weblog app that drives the blog on djangoproject.com::
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', 'archive_day', info_dict),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', info_dict),
(r'^(?P<year>\d{4})/$', 'archive_year', info_dict),
- (r'^/?$', 'archive_index', info_dict),
+ (r'^$', 'archive_index', info_dict),
)
As you can see, this URLconf defines a few options in ``info_dict``.
@@ -71,7 +71,7 @@ are first evaluated, so if you want to pass in a QuerySet via
``extra_context`` that is always fresh you need to wrap it in a function or
lambda that returns the QuerySet.
-.. _database API docs: http://www.djangoproject.com/documentation/db_api/
+.. _database API docs: ../db-api/
"Simple" generic views
======================
@@ -97,9 +97,11 @@ which is a dictionary of the parameters captured in the URL.
* ``extra_context``: A dictionary of values to add to the template
context. By default, this is an empty dictionary. If a value in the
dictionary is callable, the generic view will call it
- just before rendering the template. (**This is new in the
- Django development version.**)
-
+ just before rendering the template.
+
+ * ``mimetype``: The MIME type to use for the resulting document. Defaults
+ to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
+
**Example:**
Given the following URL patterns::
@@ -205,11 +207,11 @@ If ``template_name`` isn't specified, this view will use the template
``<app_label>/<model_name>_archive.html`` by default, where:
* ``<model_name>`` is your model's name in all lowercase. For a model
- ``StaffMember``, that'd be ``staffmember``.
+ ``StaffMember``, that'd be ``staffmember``.
* ``<app_label>`` is the right-most part of the full Python path to
- your model's app. For example, if your model lives in
- ``apps/blog/models.py``, that'd be ``blog``.
+ your model's app. For example, if your model lives in
+ ``apps/blog/models.py``, that'd be ``blog``.
**Template context:**
@@ -223,7 +225,7 @@ In addition to ``extra_context``, the template's context will be:
by ``date_field``. For example, if ``num_latest`` is ``10``, then
``latest`` will be a list of the latest 10 objects in ``queryset``.
-.. _RequestContext docs: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext
+.. _RequestContext docs: ../templates_python/#subclassing-context-requestcontext
``django.views.generic.date_based.archive_year``
------------------------------------------------
@@ -266,9 +268,9 @@ to ``True``.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``. The
- view will append ``'_list'`` to the value of this parameter in
- determining the variable's name.
+ to use in the template context. By default, this is ``'object'``. The
+ view will append ``'_list'`` to the value of this parameter in
+ determining the variable's name.
* ``make_object_list``: A boolean specifying whether to retrieve the full
list of objects for this year and pass those to the template. If ``True``,
@@ -360,9 +362,9 @@ date in the *future* are not displayed unless you set ``allow_future`` to
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``. The
- view will append ``'_list'`` to the value of this parameter in
- determining the variable's name.
+ to use in the template context. By default, this is ``'object'``. The
+ view will append ``'_list'`` to the value of this parameter in
+ determining the variable's name.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -441,9 +443,9 @@ in the *future* are not displayed unless you set ``allow_future`` to ``True``.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``. The
- view will append ``'_list'`` to the value of this parameter in
- determining the variable's name.
+ to use in the template context. By default, this is ``'object'``. The
+ view will append ``'_list'`` to the value of this parameter in
+ determining the variable's name.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -526,9 +528,9 @@ you set ``allow_future`` to ``True``.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``. The
- view will append ``'_list'`` to the value of this parameter in
- determining the variable's name.
+ to use in the template context. By default, this is ``'object'``. The
+ view will append ``'_list'`` to the value of this parameter in
+ determining the variable's name.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -638,7 +640,7 @@ future, the view will throw a 404 error by default, unless you set
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``.
+ to use in the template context. By default, this is ``'object'``.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -686,7 +688,7 @@ A page representing a list of objects.
* ``paginate_by``: An integer specifying how many objects should be
displayed per page. If this is given, the view will paginate objects with
``paginate_by`` objects per page. The view will expect either a ``page``
- query string parameter (via ``GET``) containing a zero-indexed page
+ query string parameter (via ``GET``) containing a 1-based page
number, or a ``page`` variable specified in the URLconf. See
"Notes on pagination" below.
@@ -710,9 +712,9 @@ A page representing a list of objects.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``. The
- view will append ``'_list'`` to the value of this parameter in
- determining the variable's name.
+ to use in the template context. By default, this is ``'object'``. The
+ view will append ``'_list'`` to the value of this parameter in
+ determining the variable's name.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -752,6 +754,12 @@ If the results are paginated, the context will contain these extra variables:
* ``previous``: The previous page number, as an integer. This is 1-based.
+ * `last_on_page`: The number of the
+ last result on the current page. This is 1-based.
+
+ * `first_on_page`: The number of the
+ first result on the current page. This is 1-based.
+
* ``pages``: The total number of pages, as an integer.
* ``hits``: The total number of objects across *all* pages, not just this
@@ -824,7 +832,7 @@ A page representing an individual object.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``.
+ to use in the template context. By default, this is ``'object'``.
* ``mimetype``: The MIME type to use for the resulting document. Defaults
to the value of the ``DEFAULT_CONTENT_TYPE`` setting.
@@ -916,8 +924,8 @@ In addition to ``extra_context``, the template's context will be:
See the `manipulator and formfield documentation`_ for more information
about using ``FormWrapper`` objects in templates.
-.. _authentication system: http://www.djangoproject.com/documentation/authentication/
-.. _manipulator and formfield documentation: http://www.djangoproject.com/documentation/forms/
+.. _authentication system: ../authentication/
+.. _manipulator and formfield documentation: ../forms/
``django.views.generic.create_update.update_object``
----------------------------------------------------
@@ -973,7 +981,7 @@ object. This uses the automatic manipulators that come with Django models.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``.
+ to use in the template context. By default, this is ``'object'``.
**Template name:**
@@ -1054,7 +1062,7 @@ contain a form that POSTs to the same URL.
the view's template. See the `RequestContext docs`_.
* ``template_object_name``: Designates the name of the template variable
- to use in the template context. By default, this is ``'object'``.
+ to use in the template context. By default, this is ``'object'``.
**Template name:**
diff --git a/docs/i18n.txt b/docs/i18n.txt
index 4d0d92b082..27abadacc9 100644
--- a/docs/i18n.txt
+++ b/docs/i18n.txt
@@ -53,7 +53,7 @@ internationalization machinery. See the `documentation for USE_I18N`_.
You'll probably also want to remove ``'django.core.context_processors.i18n'``
from your ``TEMPLATE_CONTEXT_PROCESSORS`` setting.
-.. _documentation for USE_I18N: http://www.djangoproject.com/documentation/settings/#use-i18n
+.. _documentation for USE_I18N: ../settings/#use-i18n
How to specify translation strings
==================================
@@ -175,7 +175,7 @@ class, though::
verbose_name = _('my thing')
verbose_name_plural = _('mythings')
-.. _Django models: http://www.djangoproject.com/documentation/model_api/
+.. _Django models: ../model-api/
Pluralization
~~~~~~~~~~~~~
@@ -236,7 +236,7 @@ To pluralize, specify both the singular and plural forms with the
``{% plural %}`` tag, which appears within ``{% blocktrans %}`` and
``{% endblocktrans %}``. Example::
- {% blocktrans count list|count as counter %}
+ {% blocktrans count list|length as counter %}
There is only one {{ name }} object.
{% plural %}
There are {{ counter }} {{ name }} objects.
@@ -274,7 +274,7 @@ translation string. Example::
In this case, both the tag and the filter will see the already-translated
string, so they don't need to be aware of translations.
-.. _Django templates: http://www.djangoproject.com/documentation/templates_python/
+.. _Django templates: ../templates_python/
How to create language files
============================
@@ -282,6 +282,17 @@ How to create language files
Once you've tagged your strings for later translation, you need to write (or
obtain) the language translations themselves. Here's how that works.
+.. admonition:: Locale restrictions
+
+ Django does not support localizing your application into a locale for
+ which Django itself has not been translated. In this case, it will ignore
+ your translation files. If you were to try this and Django supported it,
+ you would inevitably see a mixture of translated strings (from your
+ application) and English strings (from Django itself). If you want to
+ support a locale for your application that is not already part of
+ Django, you'll need to make at least a minimal translation of the Django
+ core.
+
Message files
-------------
@@ -299,7 +310,7 @@ To create or update a message file, run this command::
...where ``de`` is the language code for the message file you want to create.
The language code, in this case, is in locale format. For example, it's
-``pt_BR`` for Brazilian and ``de_AT`` for Austrian German.
+``pt_BR`` for Brazilian Portugese and ``de_AT`` for Austrian German.
The script should be run from one of three places:
@@ -394,7 +405,7 @@ That's it. Your translations are ready for use.
please let us know! See `Submitting and maintaining translations`_ for
the steps to take.
- .. _Submitting and maintaining translations: http://www.djangoproject.com/documentation/contributing/
+ .. _Submitting and maintaining translations: ../contributing/
How Django discovers language preference
========================================
@@ -452,8 +463,8 @@ following this algorithm:
Notes:
* In each of these places, the language preference is expected to be in the
- standard language format, as a string. For example, Brazilian is
- ``pt-br``.
+ standard language format, as a string. For example, Brazilian Portugese
+ is ``pt-br``.
* If a base language is available but the sublanguage specified is not,
Django uses the base language. For example, if a user specifies ``de-at``
(Austrian German) but Django only has ``de`` available, Django uses
@@ -472,7 +483,7 @@ Notes:
selection to German and English (and any sublanguage, like de-ch or
en-us).
- .. _LANGUAGES setting: http://www.djangoproject.com/documentation/settings/#languages
+ .. _LANGUAGES setting: ../settings/#languages
* If you define a custom ``LANGUAGES`` setting, as explained in the
previous bullet, it's OK to mark the languages as translation strings
@@ -530,10 +541,10 @@ Note that, with static (middleware-less) translation, the language is in
``settings.LANGUAGE_CODE``, while with dynamic (middleware) translation, it's
in ``request.LANGUAGE_CODE``.
-.. _settings file: http://www.djangoproject.com/documentation/settings/
-.. _middleware documentation: http://www.djangoproject.com/documentation/middleware/
-.. _session: http://www.djangoproject.com/documentation/sessions/
-.. _request object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+.. _settings file: ../settings/
+.. _middleware documentation: ../middleware/
+.. _session: ../sessions/
+.. _request object: ../request_response/#httprequest-objects
The ``set_language`` redirect view
==================================
@@ -599,7 +610,7 @@ message file. The choice is yours.
of the settings file to determine this, and a settings file doesn't exist
if you're manually configuring your settings.)
-.. _settings documentation: http://www.djangoproject.com/documentation/settings/#using-settings-without-the-django-settings-module-environment-variable
+.. _settings documentation: ../settings/#using-settings-without-the-django-settings-module-environment-variable
All message file repositories are structured the same way. They are:
diff --git a/docs/install.txt b/docs/install.txt
index ff8e1a8318..4f5a4bbe31 100644
--- a/docs/install.txt
+++ b/docs/install.txt
@@ -11,8 +11,8 @@ Being a Python Web framework, Django requires Python.
It works with any Python version 2.3 and higher.
-Get Python at www.python.org. If you're running Linux or Mac OS X, you probably
-already have it installed.
+Get Python at http://www.python.org. If you're running Linux or Mac OS X, you
+probably already have it installed.
Install Apache and mod_python
=============================
@@ -38,33 +38,68 @@ each platform.
.. _Apache: http://httpd.apache.org/
.. _mod_python: http://www.modpython.org/
.. _WSGI: http://www.python.org/peps/pep-0333.html
-.. _How to use Django with mod_python: http://www.djangoproject.com/documentation/modpython/
+.. _How to use Django with mod_python: ../modpython/
.. _server-arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements
Get your database running
=========================
If you plan to use Django's database API functionality, you'll need to
-make sure a database server is running. Django works with PostgreSQL_
-(recommended), MySQL_ and SQLite_.
+make sure a database server is running. Django works with PostgreSQL_,
+MySQL_ and SQLite_.
Additionally, you'll need to make sure your Python database bindings are
installed.
-* If you're using PostgreSQL, you'll need the psycopg_ package (version 1.1 --
- not version 1.0 or version 2, which is still in beta). If you're on Windows,
- check out the unofficial `compiled Windows version`_.
-* If you're using MySQL, you'll need MySQLdb_.
+* If you're using PostgreSQL, you'll need the psycopg_ package. Django supports
+ both version 1 and 2. (When you configure Django's database layer, specify
+ either ``postgresql`` [for version 1] or ``postgresql_psycopg2`` [for version 2].)
+
+ If you're on Windows, check out the unofficial `compiled Windows version`_.
+
+* If you're using MySQL, you'll need MySQLdb_, version 1.2.1p2 or higher.
+ You will also want to read the database-specific notes for the `MySQL backend`_.
+
* If you're using SQLite, you'll need pysqlite_. Use version 2.0.3 or higher.
.. _PostgreSQL: http://www.postgresql.org/
.. _MySQL: http://www.mysql.com/
.. _Django's ticket system: http://code.djangoproject.com/report/1
-.. _psycopg: http://initd.org/projects/psycopg1
+.. _psycopg: http://initd.org/tracker/psycopg
.. _compiled Windows version: http://stickpeople.com/projects/python/win-psycopg/
.. _MySQLdb: http://sourceforge.net/projects/mysql-python
.. _SQLite: http://www.sqlite.org/
.. _pysqlite: http://initd.org/tracker/pysqlite
+.. _MySQL backend: ../databases/
+
+Remove any old versions of Django
+=================================
+
+If you are upgrading your installation of Django from a previous version,
+you will need to uninstall the old Django version before installing the
+new version.
+
+If you installed Django using ``setup.py install``, uninstalling
+is as simple as deleting the ``django`` directory from your Python
+``site-packages``.
+
+If you installed Django from a Python Egg, remove the Django ``.egg`` file,
+and remove the reference to the egg in the file named ``easy-install.pth``.
+This file should also be located in your ``site-packages`` directory.
+
+.. admonition:: Where are my ``site-packages`` stored?
+
+ The location of the ``site-packages`` directory depends on the operating
+ system, and the location in which Python was installed. However, the
+ following locations are common:
+
+ * If you're using Linux: ``/usr/lib/python2.X/site-packages``
+
+ * If you're using Windows: ``C:\Python2.X\lib\site-packages``
+
+ * If you're using MacOSX: ``/Library/Python2.X/site-packages`` or
+ ``/Library/Frameworks/Python.framework/Versions/2.X/lib/python2.X/site-packages/``
+ (in later releases).
Install the Django code
=======================
@@ -77,22 +112,23 @@ It's easy either way.
Installing the official version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1. Download Django-0.95.tar.gz from our `download page`_.
-2. ``tar xzvf Django-0.95.tar.gz``
-3. ``cd Django-0.95``
-4. ``sudo python setup.py install``
+ 1. Check the `distribution specific notes`_ to see if your
+ platform/distribution provides official Django packages/installers.
+ Distribution-provided packages will typically allow for automatic
+ installation of dependancies and easy upgrade paths.
+
+ 2. Download the latest release from our `download page`_.
+
+ 3. Untar the downloaded file (e.g. ``tar xzvf Django-NNN.tar.gz``).
+
+ 4. Change into the downloaded directory (e.g. ``cd Django-NNN``).
-Note that the last command will automatically download and install setuptools_
-if you don't already have it installed. This requires a working Internet
-connection and may cause problems on Python 2.5. If you run into problems,
-try using our development version by following the instructions below. The
-development version no longer uses setuptools nor requires an Internet
-connection.
+ 5. Run ``sudo python setup.py install``.
The command will install Django in your Python installation's ``site-packages``
directory.
-.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
+.. _distribution specific notes: ../distributions/
Installing the development version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -113,14 +149,14 @@ latest bug fixes and improvements, follow these instructions:
svn co http://code.djangoproject.com/svn/django/trunk/django c:\Python24\lib\site-packages\django
-4. Copy the file ``django_src/django/bin/django-admin.py`` to somewhere on your
+3. Copy the file ``django_src/django/bin/django-admin.py`` to somewhere on your
system path, such as ``/usr/local/bin`` (Unix) or ``C:\Python24\Scripts``
(Windows). This step simply lets you type ``django-admin.py`` from within
any directory, rather than having to qualify the command with the full path
to the file.
You *don't* have to run ``python setup.py install``, because that command
-takes care of steps 3 and 4 for you.
+takes care of steps 2 and 3 for you.
When you want to update your copy of the Django source code, just run the
command ``svn update`` from within the ``django`` directory. When you do this,
diff --git a/docs/legacy_databases.txt b/docs/legacy_databases.txt
index 66cb1a2ef4..ca3927e52f 100644
--- a/docs/legacy_databases.txt
+++ b/docs/legacy_databases.txt
@@ -9,7 +9,7 @@ utilities to automate as much of this process as possible.
This document assumes you know the Django basics, as covered in the
`official tutorial`_.
-.. _official tutorial: http://www.djangoproject.com/documentation/tutorial1/
+.. _official tutorial: ../tutorial01/
Give Django your database parameters
====================================
@@ -22,18 +22,16 @@ what the name of the database is. Do that by editing these settings in your
* `DATABASE_ENGINE`_
* `DATABASE_USER`_
* `DATABASE_PASSWORD`_
- * `DATABASE_NAME`_
* `DATABASE_HOST`_
* `DATABASE_PORT`_
-.. _settings file: http://www.djangoproject.com/documentation/settings/
-.. _DATABASE_NAME: http://www.djangoproject.com/documentation/settings/#database-name
-.. _DATABASE_ENGINE: http://www.djangoproject.com/documentation/settings/#database-engine
-.. _DATABASE_USER: http://www.djangoproject.com/documentation/settings/#database-user
-.. _DATABASE_PASSWORD: http://www.djangoproject.com/documentation/settings/#database-password
-.. _DATABASE_NAME: http://www.djangoproject.com/documentation/settings/#database-name
-.. _DATABASE_HOST: http://www.djangoproject.com/documentation/settings/#database-host
-.. _DATABASE_PORT: http://www.djangoproject.com/documentation/settings/#database-port
+.. _settings file: ../settings/
+.. _DATABASE_NAME: ../settings/#database-name
+.. _DATABASE_ENGINE: ../settings/#database-engine
+.. _DATABASE_USER: ../settings/#database-user
+.. _DATABASE_PASSWORD: ../settings/#database-password
+.. _DATABASE_HOST: ../settings/#database-host
+.. _DATABASE_PORT: ../settings/#database-port
Auto-generate the models
========================
@@ -41,11 +39,11 @@ Auto-generate the models
Django comes with a utility that can create models by introspecting an existing
database. You can view the output by running this command::
- django-admin.py inspectdb --settings=path.to.settings
+ python manage.py inspectdb
Save this as a file by using standard Unix output redirection::
- django-admin.py inspectdb --settings=path.to.settings > models.py
+ python manage.py inspectdb > models.py
This feature is meant as a shortcut, not as definitive model generation. See
the `django-admin.py documentation`_ for more information.
@@ -54,7 +52,7 @@ Once you've cleaned up your models, name the file ``models.py`` and put it in
the Python package that holds your app. Then add the app to your
``INSTALLED_APPS`` setting.
-.. _django-admin.py documentation: http://www.djangoproject.com/documentation/django_admin/
+.. _django-admin.py documentation: ../django-admin/
Install the core Django tables
==============================
@@ -62,7 +60,7 @@ Install the core Django tables
Next, run the ``manage.py syncdb`` command to install any extra needed database
records such as admin permissions and content types::
- django-admin.py init --settings=path.to.settings
+ python manage.py syncdb
See whether it worked
=====================
diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1
new file mode 100644
index 0000000000..fec5053ccb
--- /dev/null
+++ b/docs/man/django-admin.1
@@ -0,0 +1,162 @@
+.TH "django-admin.py" "1" "June 2007" "Django Project" ""
+.SH "NAME"
+django\-admin.py \- Utility script for the Django web framework
+.SH "SYNOPSIS"
+.B django\-admin.py
+.I <action>
+.B [options]
+.sp
+.SH "DESCRIPTION"
+This utility script provides commands for creation and maintenance of Django
+projects and apps.
+.sp
+With the exception of
+.BI startproject,
+all commands listed below can also be performed with the
+.BI manage.py
+script found at the top level of each Django project directory.
+.sp
+.SH "ACTIONS"
+.TP
+.BI "adminindex [" "appname ..." "]"
+Prints the admin\-index template snippet for the given app name(s).
+.TP
+.BI "createcachetable [" "tablename" "]"
+Creates the table needed to use the SQL cache backend
+.TP
+.B dbshell
+Runs the command\-line client for the current
+.BI DATABASE_ENGINE.
+.TP
+.B diffsettings
+Displays differences between the current
+.B settings.py
+and Django's default settings. Settings that don't appear in the defaults are
+followed by "###".
+.TP
+.B inspectdb
+Introspects the database tables in the database specified in settings.py and outputs a Django
+model module.
+.TP
+.BI "install [" "appname ..." "]"
+Executes
+.B sqlall
+for the given app(s) in the current database.
+.TP
+.BI "reset [" "appname ..." "]"
+Executes
+.B sqlreset
+for the given app(s) in the current database.
+.TP
+.BI "runfcgi [" "KEY=val" "] [" "KEY=val" "] " "..."
+Runs this project as a FastCGI application. Requires flup. Use
+.B runfcgi help
+for help on the KEY=val pairs.
+.TP
+.BI "runserver [" "\-\-noreload" "] [" "\-\-adminmedia=ADMIN_MEDIA_PATH" "] [" "port|ipaddr:port" "]"
+Starts a lightweight Web server for development.
+.TP
+.BI "shell [" "\-\-plain" "]"
+Runs a Python interactive interpreter. Tries to use IPython, if it's available.
+The
+.BI \-\-plain
+option forces the use of the standard Python interpreter even when IPython is
+installed.
+.TP
+.BI "sql [" "appname ..." "]"
+Prints the CREATE TABLE SQL statements for the given app name(s).
+.TP
+.BI "sqlall [" "appname ..." "]"
+Prints the CREATE TABLE, initial\-data and CREATE INDEX SQL statements for the
+given model module name(s).
+.TP
+.BI "sqlclear [" "appname ..." "]"
+Prints the DROP TABLE SQL statements for the given app name(s).
+.TP
+.BI "sqlindexes [" "appname ..." "]"
+Prints the CREATE INDEX SQL statements for the given model module name(s).
+.TP
+.BI "sqlinitialdata [" "appname ..." "]"
+Prints the initial INSERT SQL statements for the given app name(s).
+.TP
+.BI "sqlreset [" "appname ..." "]"
+Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app
+name(s).
+.TP
+.BI "sqlsequencereset [" "appname ..." "]"
+Prints the SQL statements for resetting PostgreSQL sequences for the
+given app name(s).
+.TP
+.BI "startapp [" "appname" "]"
+Creates a Django app directory structure for the given app name in
+the current directory.
+.TP
+.BI "startproject [" "projectname" "]"
+Creates a Django project directory structure for the given project name
+in the current directory.
+.TP
+.BI syncdb
+Creates the database tables for all apps in INSTALLED_APPS whose tables
+haven't already been created.
+.TP
+.BI "test [" "\-\-verbosity" "] [" "appname ..." "]"
+Runs the test suite for the specified applications, or the entire project if
+no apps are specified
+.TP
+.BI validate
+Validates all installed models.
+.SH "OPTIONS"
+.TP
+.I \-\-version
+Show program's version number and exit.
+.TP
+.I \-h, \-\-help
+Show this help message and exit.
+.TP
+.I \-\-settings=SETTINGS
+Python path to settings module, e.g. "myproject.settings.main". If
+this isn't provided, the DJANGO_SETTINGS_MODULE environment variable
+will be used.
+.TP
+.I \-\-pythonpath=PYTHONPATH
+Lets you manually add a directory the Python path,
+e.g. "/home/djangoprojects/myproject".
+.TP
+.I \-\-plain
+Use plain Python, not IPython, for the "shell" command.
+.TP
+.I \-\-noinput
+Do not prompt the user for input.
+.TP
+.I \-\-noreload
+Disable the development server's auto\-reloader.
+.TP
+.I \-\-verbosity=VERBOSITY
+Verbosity level: 0=minimal output, 1=normal output, 2=all output.
+.TP
+.I \-\-adminmedia=ADMIN_MEDIA_PATH
+Specifies the directory from which to serve admin media when using the development server.
+
+.SH "ENVIRONMENT"
+.TP
+.I DJANGO_SETTINGS_MODULE
+In the absence of the
+.BI \-\-settings
+option, this environment variable defines the settings module to be read.
+It should be in Python-import form, e.g. "myproject.settings".
+
+.SH "SEE ALSO"
+Full descriptions of all these options, with examples, as well as documentation
+for the rest of the Django framework, can be found on the Django site:
+.sp
+.I http://www.djangoproject.com/documentation/
+.sp
+or in the distributed documentation.
+.SH "AUTHORS/CREDITS"
+Originally developed at World Online in Lawrence, Kansas, USA. Refer to the
+AUTHORS file in the Django distribution for contributors.
+.sp
+.SH "LICENSE"
+New BSD license. For the full license text refer to the LICENSE file in the
+Django distribution.
+
diff --git a/docs/middleware.txt b/docs/middleware.txt
index efc4d89569..0d533443d3 100644
--- a/docs/middleware.txt
+++ b/docs/middleware.txt
@@ -47,7 +47,7 @@ Enables site-wide cache. If this is enabled, each Django-powered page will be
cached for as long as the ``CACHE_MIDDLEWARE_SECONDS`` setting defines. See
the `cache documentation`_.
-.. _`cache documentation`: http://www.djangoproject.com/documentation/cache/#the-per-site-cache
+.. _`cache documentation`: ../cache/#the-per-site-cache
django.middleware.common.CommonMiddleware
-----------------------------------------
@@ -104,11 +104,10 @@ Also removes the content from any response to a HEAD request and sets the
django.middleware.http.SetRemoteAddrFromForwardedFor
----------------------------------------------------
-**New in Django development version**
-
-Sets ``request['REMOTE_ADDR']`` based on ``request.['HTTP_X_FORWARDED_FOR']``,
-if the latter is set. This is useful if you're sitting behind a reverse proxy
-that causes each request's ``REMOTE_ADDR`` to be set to ``127.0.0.1``.
+Sets ``request.META['REMOTE_ADDR']`` based on
+``request.META['HTTP_X_FORWARDED_FOR']``, if the latter is set. This is useful
+if you're sitting behind a reverse proxy that causes each request's
+``REMOTE_ADDR`` to be set to ``127.0.0.1``.
**Important note:** This does NOT validate ``HTTP_X_FORWARDED_FOR``. If you're
not behind a reverse proxy that sets ``HTTP_X_FORWARDED_FOR`` automatically, do
@@ -122,7 +121,7 @@ django.contrib.sessions.middleware.SessionMiddleware
Enables session support. See the `session documentation`_.
-.. _`session documentation`: http://www.djangoproject.com/documentation/sessions/
+.. _`session documentation`: ../sessions/
django.contrib.auth.middleware.AuthenticationMiddleware
-------------------------------------------------------
@@ -130,7 +129,7 @@ django.contrib.auth.middleware.AuthenticationMiddleware
Adds the ``user`` attribute, representing the currently-logged-in user, to
every incoming ``HttpRequest`` object. See `Authentication in Web requests`_.
-.. _Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests
+.. _Authentication in Web requests: ../authentication/#authentication-in-web-requests
django.middleware.transaction.TransactionMiddleware
---------------------------------------------------
@@ -146,7 +145,7 @@ the same transaction control as the view functions.
See the `transaction management documentation`_.
-.. _`transaction management documentation`: http://www.djangoproject.com/documentation/transactions/
+.. _`transaction management documentation`: ../transactions/
Writing your own middleware
===========================
diff --git a/docs/model-api.txt b/docs/model-api.txt
index 1aa8c811f4..09440f2b56 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -21,7 +21,7 @@ A companion to this document is the `official repository of model examples`_.
(In the Django source distribution, these examples are in the
``tests/modeltests`` directory.)
-.. _Database API reference: http://www.djangoproject.com/documentation/db_api/
+.. _Database API reference: ../db-api/
.. _official repository of model examples: http://www.djangoproject.com/documentation/models/
Quick example
@@ -57,7 +57,7 @@ Some technical notes:
syntax, but it's worth noting Django uses SQL tailored to the database
backend specified in your `settings file`_.
-.. _settings file: http://www.djangoproject.com/documentation/settings/
+.. _settings file: ../settings/
Fields
======
@@ -94,7 +94,7 @@ Django places only two restrictions on model field names:
the way Django's query lookup syntax works. For example::
class Example(models.Model):
- foo__bar = models.IntegerField() 'foo__bar' has two underscores!
+ foo__bar = models.IntegerField() # 'foo__bar' has two underscores!
These limitations can be worked around, though, because your field name doesn't
necessarily have to match your database column name. See `db_column`_ below.
@@ -184,6 +184,35 @@ A date and time field. Takes the same extra options as ``DateField``.
The admin represents this as two ``<input type="text">`` fields, with
JavaScript shortcuts.
+``DecimalField``
+~~~~~~~~~~~~~~~~
+
+**New in Django development version**
+
+A fixed-precision decimal number, represented in Python by a ``Decimal`` instance.
+Has two **required** arguments:
+
+ ====================== ===================================================
+ Argument Description
+ ====================== ===================================================
+ ``max_digits`` The maximum number of digits allowed in the number.
+
+ ``decimal_places`` The number of decimal places to store with the
+ number.
+ ====================== ===================================================
+
+For example, to store numbers up to 999 with a resolution of 2 decimal places,
+you'd use::
+
+ models.DecimalField(..., max_digits=5, decimal_places=2)
+
+And to store numbers up to approximately one billion with a resolution of 10
+decimal places::
+
+ models.DecimalField(..., max_digits=19, decimal_places=10)
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
``EmailField``
~~~~~~~~~~~~~~
@@ -194,14 +223,23 @@ This doesn't accept ``maxlength``; its ``maxlength`` is automatically set to
``FileField``
~~~~~~~~~~~~~
-A file-upload field.
+A file-upload field. Has one **required** argument:
+
+ ====================== ===================================================
+ Argument Description
+ ====================== ===================================================
+ ``upload_to`` A local filesystem path that will be appended to
+ your ``MEDIA_ROOT`` setting to determine the
+ output of the ``get_<fieldname>_url()`` helper
+ function.
+ ====================== ===================================================
-Has an extra required argument, ``upload_to``, a local filesystem path to
-which files should be upload. This path may contain `strftime formatting`_,
-which will be replaced by the date/time of the file upload (so that
-uploaded files don't fill up the given directory).
+This path may contain `strftime formatting`_, which will be replaced by the
+date/time of the file upload (so that uploaded files don't fill up the given
+directory).
-The admin represents this as an ``<input type="file">`` (a file-upload widget).
+The admin represents this field as an ``<input type="file">`` (a file-upload
+widget).
Using a ``FileField`` or an ``ImageField`` (see below) in a model takes a few
steps:
@@ -231,6 +269,13 @@ For example, say your ``MEDIA_ROOT`` is set to ``'/home/media'``, and
upload a file on Jan. 15, 2007, it will be saved in the directory
``/home/media/photos/2007/01/15``.
+If you want to retrieve the upload file's on-disk filename, or a URL that
+refers to that file, or the file's size, you can use the
+``get_FOO_filename()``, ``get_FOO_url()`` and ``get_FOO_size()`` methods.
+They are all documented here__.
+
+__ ../db-api/#get-foo-filename
+
Note that whenever you deal with uploaded files, you should pay close attention
to where you're uploading them and what type of files they are, to avoid
security holes. *Validate all uploaded files* so that you're sure the files are
@@ -246,7 +291,7 @@ visiting its URL on your site. Don't allow that.
A field whose choices are limited to the filenames in a certain directory
on the filesystem. Has three special arguments, of which the first is
-required:
+**required**:
====================== ===================================================
Argument Description
@@ -281,28 +326,16 @@ because the ``match`` applies to the base filename (``foo.gif`` and
``FloatField``
~~~~~~~~~~~~~~
-A floating-point number. Has two **required** arguments:
+**Changed in Django development version**
- ====================== ===================================================
- Argument Description
- ====================== ===================================================
- ``max_digits`` The maximum number of digits allowed in the number.
-
- ``decimal_places`` The number of decimal places to store with the
- number.
- ====================== ===================================================
+A floating-point number represented in Python by a ``float`` instance.
-For example, to store numbers up to 999 with a resolution of 2 decimal places,
-you'd use::
-
- models.FloatField(..., max_digits=5, decimal_places=2)
-
-And to store numbers up to approximately one billion with a resolution of 10
-decimal places::
+The admin represents this as an ``<input type="text">`` (a single-line input).
- models.FloatField(..., max_digits=19, decimal_places=10)
+**NOTE:** The semantics of ``FloatField`` have changed in the Django
+development version. See the `Django 0.96 documentation`_ for the old behavior.
-The admin represents this as an ``<input type="text">`` (a single-line input).
+.. _Django 0.96 documentation: http://www.djangoproject.com/documentation/0.96/model-api/#floatfield
``ImageField``
~~~~~~~~~~~~~~
@@ -312,9 +345,14 @@ image. Has two extra optional arguments, ``height_field`` and
``width_field``, which, if set, will be auto-populated with the height and
width of the image each time a model instance is saved.
+In addition to the special ``get_FOO_*`` methods that are available for
+``FileField``, an ``ImageField`` also has ``get_FOO_height()`` and
+``get_FOO_width()`` methods. These are documented elsewhere_.
+
Requires the `Python Imaging Library`_.
.. _Python Imaging Library: http://www.pythonware.com/products/pil/
+.. _elsewhere: ../db-api/#get-foo-height-and-get-foo-width
``IntegerField``
~~~~~~~~~~~~~~~~
@@ -362,9 +400,8 @@ Like a ``PositiveIntegerField``, but only allows values under a certain
containing only letters, numbers, underscores or hyphens. They're generally
used in URLs.
-In the Django development version, you can specify ``maxlength``. If
-``maxlength`` is not specified, Django will use a default length of 50. In
-previous Django versions, there's no way to override the length of 50.
+Like a CharField, you can specify ``maxlength``. If ``maxlength`` is
+not specified, Django will use a default length of 50.
Implies ``db_index=True``.
@@ -410,6 +447,11 @@ and doesn't give a 404 response).
The admin represents this as an ``<input type="text">`` (a single-line input).
+``URLField`` takes an optional argument, ``maxlength``, the maximum length (in
+characters) of the field. The maxlength is enforced at the database level and
+in Django's validation. If you don't specify ``maxlength``, a default of 200
+is used.
+
``USStateField``
~~~~~~~~~~~~~~~~
@@ -438,8 +480,10 @@ If ``True``, Django will store empty values as ``NULL`` in the database.
Default is ``False``.
Note that empty string values will always get stored as empty strings, not
-as ``NULL`` -- so use ``null=True`` for non-string fields such as integers,
-booleans and dates.
+as ``NULL``. Only use ``null=True`` for non-string fields such as integers,
+booleans and dates. For both types of fields, you will also need to set
+``blank=True`` if you wish to permit empty values in forms, as the ``null``
+parameter only affects database storage (see blank_, below).
Avoid using ``null`` on string-based fields such as ``CharField`` and
``TextField`` unless you have an excellent reason. If a string-based field
@@ -451,7 +495,7 @@ string, not ``NULL``.
``blank``
~~~~~~~~~
-If ``True``, the field is allowed to be blank.
+If ``True``, the field is allowed to be blank. Default is ``False``.
Note that this is different than ``null``. ``null`` is purely
database-related, whereas ``blank`` is validation-related. If a field has
@@ -498,6 +542,12 @@ or outside your model class altogether::
class Foo(models.Model):
gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+For each model field that has ``choices`` set, Django will add a method to
+retrieve the human-readable name for the field's current value. See
+`get_FOO_display`_ in the database API documentation.
+
+.. _get_FOO_display: ../db-api/#get-foo-display
+
Finally, note that choices can be any iterable object -- not necessarily a
list or tuple. This lets you construct choices dynamically. But if you find
yourself hacking ``choices`` to be dynamic, you're probably better off using
@@ -621,7 +671,7 @@ that takes the parameters ``field_data, all_data`` and raises
Django comes with quite a few validators. They're in ``django.core.validators``.
-.. _validator docs: http://www.djangoproject.com/documentation/forms/#validators
+.. _validator docs: ../forms/#validators
Verbose field names
-------------------
@@ -729,10 +779,10 @@ relationship should work. All are optional:
``limit_choices_to`` A dictionary of lookup arguments and values (see
the `Database API reference`_) that limit the
available admin choices for this object. Use this
- with ``models.LazyDate`` to limit choices of objects
- by date. For example::
+ with functions from the Python ``datetime`` module
+ to limit choices of objects by date. For example::
- limit_choices_to = {'pub_date__lte': models.LazyDate()}
+ limit_choices_to = {'pub_date__lte': datetime.now}
only allows the choice of related objects with a
``pub_date`` before the current date/time to be
@@ -787,8 +837,8 @@ relationship should work. All are optional:
the related object.
======================= ============================================================
-.. _`Database API reference`: http://www.djangoproject.com/documentation/db_api/
-.. _related objects documentation: http://www.djangoproject.com/documentation/db_api/#related-objects
+.. _`Database API reference`: ../db-api/
+.. _related objects documentation: ../db-api/#related-objects
Many-to-many relationships
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -875,6 +925,10 @@ the relationship should work. All are optional:
relationship, allowing ``ManyToMany`` relationships to be
non-symmetrical.
+ ``db_table`` The name of the table to create for storing the many-to-many
+ data. If this is not provided, Django will assume a default
+ name based upon the names of the two tables being joined.
+
======================= ============================================================
One-to-one relationships
@@ -954,7 +1008,7 @@ Example::
See the `docs for latest()`_ for more.
-.. _docs for latest(): http://www.djangoproject.com/documentation/db_api/#latest-field-name-none
+.. _docs for latest(): ../db-api/#latest-field-name-none
``order_with_respect_to``
-------------------------
@@ -1206,6 +1260,10 @@ screen via ``<script src="">`` tags. This can be used to tweak a given type of
admin page in JavaScript or to provide "quick links" to fill in default values
for certain fields.
+If you use relative URLs -- URLs that don't start with ``http://`` or ``/`` --
+then the admin site will automatically prefix these links with
+``settings.ADMIN_MEDIA_PREFIX``.
+
``list_display``
----------------
@@ -1268,15 +1326,53 @@ A few special cases to note about ``list_display``:
return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name)
colored_name.allow_tags = True
+ * If the string given is a method of the model that returns True or False
+ Django will display a pretty "on" or "off" icon if you give the method a
+ ``boolean`` attribute whose value is ``True``.
+
+ Here's a full example model::
+
+ class Person(models.Model):
+ first_name = models.CharField(maxlength=50)
+ birthday = models.DateField()
+
+ class Admin:
+ list_display = ('name', 'born_in_fifties')
+
+ def born_in_fifties(self):
+ return self.birthday.strftime('%Y')[:3] == 5
+ born_in_fifties.boolean = True
+
+
* The ``__str__()`` method is just as valid in ``list_display`` as any
other model method, so it's perfectly OK to do this::
list_display = ('__str__', 'some_other_field')
- * For any element of ``list_display`` that is not a field on the model, the
- change list page will not allow ordering by that column. This is because
- ordering is done at the database level, and Django has no way of knowing
- how to order the result of a custom method at the SQL level.
+ * Usually, elements of ``list_display`` that aren't actual database fields
+ can't be used in sorting (because Django does all the sorting at the
+ database level).
+
+ However, if an element of ``list_display`` represents a certain database
+ field, you can indicate this fact by setting the ``admin_order_field``
+ attribute of the item.
+
+ For example::
+
+ class Person(models.Model):
+ first_name = models.CharField(maxlength=50)
+ color_code = models.CharField(maxlength=6)
+
+ class Admin:
+ list_display = ('first_name', 'colored_first_name')
+
+ def colored_first_name(self):
+ return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name)
+ colored_first_name.allow_tags = True
+ colored_first_name.admin_order_field = 'first_name'
+
+ The above will tell Django to order by the ``first_name`` field when
+ trying to sort by ``colored_first_name`` in the admin.
``list_display_links``
----------------------
@@ -1346,7 +1442,7 @@ if one of the ``list_display`` fields is a ``ForeignKey``.
For more on ``select_related()``, see `the select_related() docs`_.
-.. _the select_related() docs: http://www.djangoproject.com/documentation/db_api/#select-related
+.. _the select_related() docs: ../db-api/#select-related
``ordering``
------------
@@ -1390,7 +1486,10 @@ This should be set to a list of field names that will be searched whenever
somebody submits a search query in that text box.
These fields should be some kind of text field, such as ``CharField`` or
-``TextField``.
+``TextField``. You can also perform a related lookup on a ``ForeignKey`` with
+the lookup API "follow" notation::
+
+ search_fields = ['foreign_key__related_fieldname']
When somebody does a search in the admin search box, Django splits the search
query into words and returns all objects that contain each of the words, case
@@ -1402,8 +1501,8 @@ user searches for ``john lennon``, Django will do the equivalent of this SQL
WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
-**New in Django development version:** For faster and/or more restrictive
-searches, prefix the field name with an operator:
+For faster and/or more restrictive searches, prefix the field name
+with an operator:
``^``
Matches the beginning of the field. For example, if ``search_fields`` is
@@ -1448,7 +1547,7 @@ The way ``Manager`` classes work is documented in the `Retrieving objects`_
section of the database API docs, but this section specifically touches on
model options that customize ``Manager`` behavior.
-.. _Retrieving objects: http://www.djangoproject.com/documentation/db_api/#retrieving-objects
+.. _Retrieving objects: ../db-api/#retrieving-objects
Manager names
-------------
@@ -1696,11 +1795,58 @@ But this template code is good::
<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
-(Yes, we know ``get_absolute_url()`` couples URLs to models, which violates the
-DRY principle, because URLs are defined both in a URLconf and in the model.
-This is a rare case in which we've intentionally violated that principle for
-the sake of convenience. With that said, we're working on an even cleaner way
-of specifying URLs in a more DRY fashion.)
+.. note::
+ The string you return from ``get_absolute_url()`` must contain only ASCII
+ characters (required by the URI spec, `RFC 2396`_) that have been
+ URL-encoded, if necessary. Code and templates using ``get_absolute_url()``
+ should be able to use the result directly without needing to do any
+ further processing.
+
+.. _RFC 2396: http://www.ietf.org/rfc/rfc2396.txt
+
+The ``permalink`` decorator
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The problem with the way we wrote ``get_absolute_url()`` above is that it
+slightly violates the DRY principle: the URL for this object is defined both
+in the URLConf file and in the model.
+
+You can further decouple your models from the URLconf using the ``permalink``
+decorator. This decorator is passed the view function, a list of positional
+parameters and (optionally) a dictionary of named parameters. Django then
+works out the correct full URL path using the URLconf, substituting the
+parameters you have given into the URL. For example, if your URLconf
+contained a line such as::
+
+ (r'^/people/(\d+)/$', 'people.views.details'),
+
+...your model could have a ``get_absolute_url`` method that looked like this::
+
+ from django.db.models import permalink
+
+ def get_absolute_url(self):
+ return ('people.views.details', [str(self.id)])
+ get_absolute_url = permalink(get_absolute_url)
+
+Similarly, if you had a URLconf entry that looked like::
+
+ (r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view)
+
+...you could reference this using ``permalink()`` as follows::
+
+ def get_absolute_url(self):
+ return ('archive_view', (), {
+ 'year': self.created.year,
+ 'month': self.created.month,
+ 'day': self.created.day})
+ get_absolute_url = permalink(get_absolute_url)
+
+Notice that we specify an empty sequence for the second argument in this case,
+because we only want to pass keyword arguments, not named arguments.
+
+In this way, you're tying the model's absolute URL to the view that is used
+to display it, without repeating the URL information anywhere. You can still
+use the ``get_absolute_url`` method in templates, as before.
Executing custom SQL
--------------------
@@ -1719,21 +1865,23 @@ rows. Example::
row = cursor.fetchone()
return row
-``connection`` and ``cursor`` simply use the standard `Python DB-API`_. If
-you're not familiar with the Python DB-API, note that the SQL statement in
-``cursor.execute()`` uses placeholders, ``"%s"``, rather than adding parameters
-directly within the SQL. If you use this technique, the underlying database
-library will automatically add quotes and escaping to your parameter(s) as
-necessary. (Also note that Django expects the ``"%s"`` placeholder, *not* the
-``"?"`` placeholder, which is used by the SQLite Python bindings. This is for
-the sake of consistency and sanity.)
+``connection`` and ``cursor`` mostly implement the standard `Python DB-API`_
+(except when it comes to `transaction handling`_). If you're not familiar with
+the Python DB-API, note that the SQL statement in ``cursor.execute()`` uses
+placeholders, ``"%s"``, rather than adding parameters directly within the SQL.
+If you use this technique, the underlying database library will automatically
+add quotes and escaping to your parameter(s) as necessary. (Also note that
+Django expects the ``"%s"`` placeholder, *not* the ``"?"`` placeholder, which is
+used by the SQLite Python bindings. This is for the sake of consistency and
+sanity.)
A final note: If all you want to do is a custom ``WHERE`` clause, you can just
just the ``where``, ``tables`` and ``params`` arguments to the standard lookup
API. See `Other lookup options`_.
.. _Python DB-API: http://www.python.org/peps/pep-0249.html
-.. _Other lookup options: http://www.djangoproject.com/documentation/db_api/#extra-params-select-where-tables
+.. _Other lookup options: ../db-api/#extra-params-select-where-tables
+.. _transaction handling: ../transactions/
Overriding default model methods
--------------------------------
@@ -1766,7 +1914,7 @@ You can also prevent saving::
else:
super(Blog, self).save() # Call the "real" save() method.
-.. _database API docs: http://www.djangoproject.com/documentation/db_api/
+.. _database API docs: ../db-api/
Models across files
===================
@@ -1823,7 +1971,7 @@ Each SQL file, if given, is expected to contain valid SQL. The SQL files are
piped directly into the database after all of the models' table-creation
statements have been executed.
-The SQL files are read by the ``sqlinitialdata``, ``sqlreset``, ``sqlall`` and
+The SQL files are read by the ``sqlcustom``, ``sqlreset``, ``sqlall`` and
``reset`` commands in ``manage.py``. Refer to the `manage.py documentation`_
for more information.
@@ -1832,7 +1980,7 @@ order in which they're executed. The only thing you can assume is that, by the
time your custom data files are executed, all the database tables already will
have been created.
-.. _`manage.py documentation`: http://www.djangoproject.com/documentation/django_admin/#sqlinitialdata-appname-appname
+.. _`manage.py documentation`: ../django-admin/#sqlcustom-appname-appname
Database-backend-specific SQL data
----------------------------------
diff --git a/docs/modpython.txt b/docs/modpython.txt
index 5177abf728..388a6168f3 100644
--- a/docs/modpython.txt
+++ b/docs/modpython.txt
@@ -13,14 +13,15 @@ other server arrangements.
Django requires Apache 2.x and mod_python 3.x, and you should use Apache's
`prefork MPM`_, as opposed to the `worker MPM`_.
-You may also be interested in `How to use Django with FastCGI`_.
+You may also be interested in `How to use Django with FastCGI, SCGI or AJP`_
+(which also covers SCGI and AJP).
.. _Apache: http://httpd.apache.org/
.. _mod_python: http://www.modpython.org/
.. _mod_perl: http://perl.apache.org/
.. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html
.. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html
-.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
+.. _How to use Django with FastCGI, SCGI or AJP: ../fastcgi/
Basic configuration
===================
@@ -37,7 +38,8 @@ Then edit your ``httpd.conf`` file and add the following::
PythonDebug On
</Location>
-...and replace ``mysite.settings`` with the Python path to your settings file.
+...and replace ``mysite.settings`` with the Python import path to your Django
+project's settings file.
This tells Apache: "Use mod_python for any URL at or under '/mysite/', using the
Django mod_python handler." It passes the value of ``DJANGO_SETTINGS_MODULE``
@@ -49,9 +51,29 @@ whereas ``<Location>`` points at places in the URL structure of a Web site.
``<Directory>`` would be meaningless here.
Also, if you've manually altered your ``PYTHONPATH`` to put your Django project
-on it, you'll need to tell mod_python::
+on it, you'll need to tell mod_python:
- PythonPath "['/path/to/project'] + sys.path"
+.. parsed-literal::
+
+ <Location "/mysite/">
+ SetHandler python-program
+ PythonHandler django.core.handlers.modpython
+ SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+ PythonDebug On
+ **PythonPath "['/path/to/project'] + sys.path"**
+ </Location>
+
+.. caution::
+
+ If you're using Windows, remember that the path will contain backslashes.
+ This string is passed through Python's string parser twice, so you need to
+ escape each backslash **twice**::
+
+ PythonPath "['c:\\\\path\\\\to\\\\project'] + sys.path"
+
+ Or, use raw strings::
+
+ PythonPath "[r'c:\\path\\to\\project'] + sys.path"
You can also add directives such as ``PythonAutoReload Off`` for performance.
See the `mod_python documentation`_ for a full list of options.
@@ -146,7 +168,7 @@ If, however, you have no option but to serve media files on the same Apache
``VirtualHost`` as Django, here's how you can turn off mod_python for a
particular part of the site::
- <Location "/media/">
+ <Location "/media">
SetHandler None
</Location>
@@ -163,7 +185,7 @@ the ``media`` subdirectory and any URL that ends with ``.jpg``, ``.gif`` or
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</Location>
- <Location "media">
+ <Location "/media">
SetHandler None
</Location>
@@ -197,6 +219,41 @@ Here are two recommended approaches:
2. Or, copy the admin media files so that they live within your Apache
document root.
+Using eggs with mod_python
+==========================
+
+If you installed Django from a Python egg_ or are using eggs in your Django
+project, some extra configuration is required. Create an extra file in your
+project (or somewhere else) that contains something like the following::
+
+ import os
+ os.environ['PYTHON_EGG_CACHE'] = '/some/directory'
+
+Here, ``/some/directory`` is a directory that the Apache webserver process can
+write to. It will be used as the location for any unpacking of code the eggs
+need to do.
+
+Then you have to tell mod_python to import this file before doing anything
+else. This is done using the PythonImport_ directive to mod_python. You need
+to ensure that you have specified the ``PythonInterpreter`` directive to
+mod_python as described above__ (you need to do this even if you aren't
+serving multiple installations in this case). Then add the ``PythonImport``
+line inside the ``Location`` or ``VirtualHost`` section. For example::
+
+ PythonInterpreter my_django
+ PythonImport /path/to/my/project/file.py my_django
+
+Note that you can use an absolute path here (or a normal dotted import path),
+as described in the `mod_python manual`_. We use an absolute path in the
+above example because if any Python path modifications are required to access
+your project, they will not have been done at the time the ``PythonImport``
+line is processed.
+
+.. _Egg: http://peak.telecommunity.com/DevCenter/PythonEggs
+.. _PythonImport: http://www.modpython.org/live/current/doc-html/dir-other-pimp.html
+.. _mod_python manual: PythonImport_
+__ `Multiple Django installations on the same Apache`_
+
Error handling
==============
@@ -242,3 +299,5 @@ as necessary.
.. _Expat Causing Apache Crash: http://www.dscpl.com.au/articles/modpython-006.html
.. _mod_python FAQ entry: http://modpython.org/FAQ/faqw.py?req=show&file=faq02.013.htp
.. _Getting mod_python Working: http://www.dscpl.com.au/articles/modpython-001.html
+
+
diff --git a/docs/newforms.txt b/docs/newforms.txt
index c4986eb45e..1511791a7d 100644
--- a/docs/newforms.txt
+++ b/docs/newforms.txt
@@ -2,34 +2,37 @@
The newforms library
====================
-``django.newforms`` is a new replacement for ``django.forms``, the old Django
-form/manipulator/validation framework. This document explains how to use this
-new form library.
+``django.newforms`` is Django's fantastic new form-handling library. It's a
+replacement for ``django.forms``, the old form/manipulator/validation
+framework. This document explains how to use this new library.
Migration plan
==============
-``django.newforms`` currently is only available in the Django development version
--- i.e., it's not available in the Django 0.95 release. For the next Django
-release, our plan is to do the following:
+``django.newforms`` is new in Django's 0.96 release, but, as it won't be new
+forever, we plan to rename it to ``django.forms`` in the future. The current
+``django.forms`` package will be available as ``django.oldforms`` until Django
+1.0, when we plan to remove it for good.
- * As of revision [4208], we've copied the current ``django.forms`` to
- ``django.oldforms``. This allows you to upgrade your code *now* rather
- than waiting for the backwards-incompatible change and rushing to fix
- your code after the fact. Just change your import statements like this::
+That has direct repercussions on the forward compatibility of your code. Please
+read the following migration plan and code accordingly:
+
+ * The old forms framework (the current ``django.forms``) has been copied to
+ ``django.oldforms``. Thus, you can start upgrading your code *now*,
+ rather than waiting for the future backwards-incompatible change, by
+ changing your import statements like this::
from django import forms # old
from django import oldforms as forms # new
- * At an undecided future date, we will move the current ``django.newforms``
- to ``django.forms``. This will be a backwards-incompatible change, and
- anybody who is still using the old version of ``django.forms`` at that
- time will need to change their import statements, as described in the
- previous bullet.
+ * In the next Django release (0.97), we will move the current
+ ``django.newforms`` to ``django.forms``. This will be a
+ backwards-incompatible change, and anybody who is still using the old
+ version of ``django.forms`` at that time will need to change their import
+ statements, as described in the previous bullet.
* We will remove ``django.oldforms`` in the release *after* the next Django
- release -- the release that comes after the release in which we're
- creating the new ``django.forms``.
+ release -- either 0.98 or 1.0, whichever comes first.
With this in mind, we recommend you use the following import statement when
using ``django.newforms``::
@@ -51,9 +54,10 @@ too messy. The choice is yours.
Overview
========
-As the ``django.forms`` ("manipulators") system before it, ``django.newforms``
-is intended to handle HTML form display, validation and redisplay. It's what
-you use if you want to perform server-side validation for an HTML form.
+As with the ``django.forms`` ("manipulators") system before it,
+``django.newforms`` is intended to handle HTML form display, data processing
+(validation) and redisplay. It's what you use if you want to perform
+server-side validation for an HTML form.
For example, if your Web site has a contact form that visitors can use to
send you e-mail, you'd use this library to implement the display of the HTML
@@ -72,6 +76,12 @@ The library deals with these concepts:
* **Form** -- A collection of fields that knows how to validate itself and
display itself as HTML.
+The library is decoupled from the other Django components, such as the database
+layer, views and templates. It relies only on Django settings, a couple of
+``django.utils`` helper functions and Django's internationalization hooks (but
+you're not required to be using internationalization features to use this
+library).
+
Form objects
============
@@ -79,8 +89,8 @@ The primary way of using the ``newforms`` library is to create a form object.
Do this by subclassing ``django.newforms.Form`` and specifying the form's
fields, in a declarative style that you'll be familiar with if you've used
Django database models. In this section, we'll iteratively develop a form
-object that you might to implement "contact me" functionality on your personal
-Web site.
+object that you might use to implement "contact me" functionality on your
+personal Web site.
Start with this basic ``Form`` subclass, which we'll call ``ContactForm``::
@@ -97,11 +107,224 @@ fields: ``subject``, ``message``, ``sender`` and ``cc_myself``. We'll explain
the different types of fields -- e.g., ``CharField`` and ``EmailField`` --
shortly.
+Creating ``Form`` instances
+---------------------------
+
+A ``Form`` instance is either **bound** or **unbound** to a set of data.
+
+ * If it's **bound** to a set of data, it's capable of validating that data
+ and rendering the form as HTML with the data displayed in the HTML.
+
+ * If it's **unbound**, it cannot do validation (because there's no data to
+ validate!), but it can still render the blank form as HTML.
+
+To create an unbound ``Form`` instance, simply instantiate the class::
+
+ >>> f = ContactForm()
+
+To bind data to a form, pass the data as a dictionary as the first parameter to
+your ``Form`` class constructor::
+
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+
+In this dictionary, the keys are the field names, which correspond to the
+attributes in your ``Form`` class. The values are the data you're trying
+to validate. These will usually be strings, but there's no requirement that
+they be strings; the type of data you pass depends on the ``Field``, as we'll
+see in a moment.
+
+If you need to distinguish between bound and unbound form instances at runtime,
+check the value of the form's ``is_bound`` attribute::
+
+ >>> f = ContactForm()
+ >>> f.is_bound
+ False
+ >>> f = ContactForm({'subject': 'hello'})
+ >>> f.is_bound
+ True
+
+Note that passing an empty dictionary creates a *bound* form with empty data::
+
+ >>> f = ContactForm({})
+ >>> f.is_bound
+ True
+
+If you have a bound ``Form`` instance and want to change the data somehow, or
+if you want to bind an unbound ``Form`` instance to some data, create another
+``Form`` instance. There is no way to change data in a ``Form`` instance. Once
+a ``Form`` instance has been created, you should consider its data immutable,
+whether it has data or not.
+
+Using forms to validate data
+----------------------------
+
+The primary task of a ``Form`` object is to validate data. With a bound
+``Form`` instance, call the ``is_valid()`` method to run validation and return
+a boolean designating whether the data was valid::
+
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+ >>> f.is_valid()
+ True
+
+Let's try with some invalid data. In this case, ``subject`` is blank (an error,
+because all fields are required by default) and ``sender`` is not a valid
+e-mail address::
+
+ >>> data = {'subject': '',
+ ... 'message': 'Hi there',
+ ... 'sender': 'invalid e-mail address',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+ >>> f.is_valid()
+ False
+
+Access the ``errors`` attribute to get a dictionary of error messages::
+
+ >>> f.errors
+ {'sender': [u'Enter a valid e-mail address.'], 'subject': [u'This field is required.']}
+
+In this dictionary, the keys are the field names, and the values are lists of
+Unicode strings representing the error messages. The error messages are stored
+in lists because a field can have multiple error messages.
+
+You can access ``errors`` without having to call ``is_valid()`` first. The
+form's data will be validated the first time either you call ``is_valid()`` or
+access ``errors``.
+
+The validation routines will only get called once, regardless of how many times
+you access ``errors`` or call ``is_valid()``. This means that if validation has
+side effects, those side effects will only be triggered once.
+
+Behavior of unbound forms
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It's meaningless to validate a form with no data, but, for the record, here's
+what happens with unbound forms::
+
+ >>> f = ContactForm()
+ >>> f.is_valid()
+ False
+ >>> f.errors
+ {}
+
+Accessing "clean" data
+----------------------
+
+Each ``Field`` in a ``Form`` class is responsible not only for validating data,
+but also for "cleaning" it -- normalizing it to a consistent format. This is a
+nice feature, because it allows data for a particular field to be input in
+a variety of ways, always resulting in consistent output.
+
+For example, ``DateField`` normalizes input into a Python ``datetime.date``
+object. Regardless of whether you pass it a string in the format
+``'1994-07-15'``, a ``datetime.date`` object or a number of other formats,
+``DateField`` will always normalize it to a ``datetime.date`` object as long as
+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 ``cleaned_data`` attribute of the ``Form``
+object::
+
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+ >>> f.is_valid()
+ True
+ >>> 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`` --
+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
+``cleaned_data`` attribute::
+
+ >>> data = {'subject': '',
+ ... 'message': 'Hi there',
+ ... 'sender': 'invalid e-mail address',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+ >>> f.is_valid()
+ False
+ >>> f.cleaned_data
+ Traceback (most recent call last):
+ ...
+ AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
+
+``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 ``cleaned_data`` contains only the form's fields::
+
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True,
+ ... 'extra_field_1': 'foo',
+ ... 'extra_field_2': 'bar',
+ ... 'extra_field_3': 'baz'}
+ >>> f = ContactForm(data)
+ >>> f.is_valid()
+ True
+ >>> 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'}
+
+``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 ``cleaned_data`` includes it, with an empty value::
+
+ >>> class OptionalPersonForm(Form):
+ ... first_name = CharField()
+ ... last_name = CharField()
+ ... nick_name = CharField(required=False)
+ >>> data = {'first_name': u'John', 'last_name': u'Lennon'}
+ >>> f = OptionalPersonForm(data)
+ >>> f.is_valid()
+ True
+ >>> f.cleaned_data
+ {'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'}
+
+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. For
+full details on each field's behavior in this case, see the "Empty value" note
+for each field in the "Built-in ``Field`` classes" section below.
+
+You can write code to perform validation for particular form fields (based on
+their name) or for the form as a whole (considering combinations of various
+fields). More information about this is in the `Custom form and field
+validation`_ section, below.
+
+Behavior of unbound forms
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It's meaningless to request "cleaned" data in a form with no data, but, for the
+record, here's what happens with unbound forms::
+
+ >>> f = ContactForm()
+ >>> f.cleaned_data
+ Traceback (most recent call last):
+ ...
+ AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
+
Outputting forms as HTML
------------------------
-The first thing we can do with this is output it as HTML. To do so, instantiate
-it and ``print`` it::
+The second task of a ``Form`` object is to render itself as HTML. To do so,
+simply ``print`` it::
>>> f = ContactForm()
>>> print f
@@ -110,6 +333,23 @@ it and ``print`` it::
<tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>
<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>
+If the form is bound to data, the HTML output will include that data
+appropriately. For example, if a field is represented by an
+``<input type="text">``, the data will be in the ``value`` attribute. If a
+field is represented by an ``<input type="checkbox">``, then that HTML will
+include ``checked="checked"`` if appropriate::
+
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data)
+ >>> print f
+ <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" /></td></tr>
+ <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" /></td></tr>
+ <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" value="foo@example.com" /></td></tr>
+ <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" checked="checked" /></td></tr>
+
This default output is a two-column HTML table, with a ``<tr>`` for each field.
Notice the following:
@@ -121,13 +361,13 @@ Notice the following:
``EmailField`` are represented by an ``<input type="text">``.
``BooleanField`` is represented by an ``<input type="checkbox">``. Note
these are merely sensible defaults; you can specify which HTML to use for
- a given field by using ``widgets``, which we'll explain shortly.
+ a given field by using widgets, which we'll explain shortly.
* The HTML ``name`` for each tag is taken directly from its attribute name
in the ``ContactForm`` class.
* The text label for each field -- e.g. ``'Subject:'``, ``'Message:'`` and
- ``'CC myself:'`` is generated from the field name by converting all
+ ``'Cc myself:'`` is generated from the field name by converting all
underscores to spaces and upper-casing the first letter. Again, note
these are merely sensible defaults; you can also specify labels manually.
@@ -248,7 +488,7 @@ field::
If ``auto_id`` is set to a string containing the format character ``'%s'``,
then the form output will include ``<label>`` tags, and will generate ``id``
attributes based on the format string. For example, for a format string
-``'field_%s'``, a field named ``subject`` will get the ``id``
+``'field_%s'``, a field named ``subject`` will get the ``id`` value
``'field_subject'``. Continuing our example::
>>> f = ContactForm(auto_id='id_for_%s')
@@ -282,6 +522,1117 @@ example, in the ``ContactForm`` example, the fields are defined in the order
``subject``, ``message``, ``sender``, ``cc_myself``. To reorder the HTML
output, just change the order in which those fields are listed in the class.
+How errors are displayed
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you render a bound ``Form`` object, the act of rendering will automatically
+run the form's validation if it hasn't already happened, and the HTML output
+will include the validation errors as a ``<ul class="errorlist">`` near the
+field. The particular positioning of the error messages depends on the output
+method you're using::
+
+ >>> data = {'subject': '',
+ ... 'message': 'Hi there',
+ ... 'sender': 'invalid e-mail address',
+ ... 'cc_myself': True}
+ >>> f = ContactForm(data, auto_id=False)
+ >>> print f.as_table()
+ <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" /></td></tr>
+ <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" /></td></tr>
+ <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul><input type="text" name="sender" value="invalid e-mail address" /></td></tr>
+ <tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr>
+ >>> print f.as_ul()
+ <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" /></li>
+ <li>Message: <input type="text" name="message" value="Hi there" /></li>
+ <li><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul>Sender: <input type="text" name="sender" value="invalid e-mail address" /></li>
+ <li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li>
+ >>> print f.as_p()
+ <p><ul class="errorlist"><li>This field is required.</li></ul></p>
+ <p>Subject: <input type="text" name="subject" maxlength="100" /></p>
+ <p>Message: <input type="text" name="message" value="Hi there" /></p>
+ <p><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul></p>
+ <p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p>
+ <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
+
+More granular output
+~~~~~~~~~~~~~~~~~~~~
+
+The ``as_p()``, ``as_ul()`` and ``as_table()`` methods are simply shortcuts for
+lazy developers -- they're not the only way a form object can be displayed.
+
+To display the HTML for a single field in your form, use dictionary lookup
+syntax using the field's name as the key, and print the resulting object::
+
+ >>> f = ContactForm()
+ >>> print f['subject']
+ <input id="id_subject" type="text" name="subject" maxlength="100" />
+ >>> print f['message']
+ <input type="text" name="message" id="id_message" />
+ >>> print f['sender']
+ <input type="text" name="sender" id="id_sender" />
+ >>> print f['cc_myself']
+ <input type="checkbox" name="cc_myself" id="id_cc_myself" />
+
+Call ``str()`` or ``unicode()`` on the field to get its rendered HTML as a
+string or Unicode object, respectively::
+
+ >>> str(f['subject'])
+ '<input id="id_subject" type="text" name="subject" maxlength="100" />'
+ >>> unicode(f['subject'])
+ u'<input id="id_subject" type="text" name="subject" maxlength="100" />'
+
+The field-specific output honors the form object's ``auto_id`` setting::
+
+ >>> f = ContactForm(auto_id=False)
+ >>> print f['message']
+ <input type="text" name="message" />
+ >>> f = ContactForm(auto_id='id_%s')
+ >>> print f['message']
+ <input type="text" name="message" id="id_message" />
+
+For a field's list of errors, access the field's ``errors`` attribute. This
+is a list-like object that is displayed as an HTML ``<ul class="errorlist">``
+when printed::
+
+ >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''}
+ >>> f = ContactForm(data, auto_id=False)
+ >>> print f['message']
+ <input type="text" name="message" />
+ >>> f['message'].errors
+ [u'This field is required.']
+ >>> print f['message'].errors
+ <ul class="errorlist"><li>This field is required.</li></ul>
+ >>> f['subject'].errors
+ []
+ >>> print f['subject'].errors
+
+ >>> str(f['subject'].errors)
+ ''
+
+Using forms in views and templates
+----------------------------------
+
+Let's put this all together and use the ``ContactForm`` example in a Django
+view and template.
+
+Simple view example
+~~~~~~~~~~~~~~~~~~~
+
+This example view displays the contact form by default and validates/processes
+it if accessed via a POST request::
+
+ def contact(request):
+ if request.method == 'POST':
+ form = ContactForm(request.POST)
+ if form.is_valid():
+ # Do form processing here...
+ return HttpResponseRedirect('/url/on_success/')
+ else:
+ form = ContactForm()
+ return render_to_response('contact.html', {'form': form})
+
+Simple template example
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The template in the above view example, ``contact.html``, is responsible for
+displaying the form as HTML. To do this, we can use the techniques outlined in
+the "Outputting forms as HTML" section above.
+
+The simplest way to display a form's HTML is to use the variable on its own,
+like this::
+
+ <form method="post">
+ <table>{{ form }}</table>
+ <input type="submit" />
+ </form>
+
+The above template code will display the form as an HTML table, using the
+``form.as_table()`` method explained previously. This works because Django's
+template system displays an object's ``__str__()`` value, and the ``Form``
+class' ``__str__()`` method calls its ``as_table()`` method.
+
+The following is equivalent but a bit more explicit::
+
+ <form method="post">
+ <table>{{ form.as_table }}</table>
+ <input type="submit" />
+ </form>
+
+``form.as_ul`` and ``form.as_p`` are also available, as you may expect.
+
+Note that in the above two examples, we included the ``<form>``, ``<table>``
+``<input type="submit" />``, ``</table>`` and ``</form>`` tags. The form
+convenience methods (``as_table()``, ``as_ul()`` and ``as_p()``) do not include
+that HTML.
+
+Complex template output
+~~~~~~~~~~~~~~~~~~~~~~~
+
+As we've stressed several times, the ``as_table()``, ``as_ul()`` and ``as_p()``
+methods are just shortcuts for the common case. You can also work with the
+individual fields for complete template control over the form's design.
+
+The easiest way is to iterate over the form's fields, with
+``{% for field in form %}``. For example::
+
+ <form method="post">
+ <dl>
+ {% for field in form %}
+ <dt>{{ field.label }}</dt>
+ <dd>{{ field }}</dd>
+ {% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %}
+ {% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %}
+ {% endfor %}
+ </dl>
+ <input type="submit" />
+ </form>
+
+This iteration technique is useful if you want to apply the same HTML
+formatting to each field, or if you don't know the names of the form fields
+ahead of time. Note that the fields will be iterated over in the order in which
+they're defined in the ``Form`` class.
+
+Alternatively, you can arrange the form's fields explicitly, by name. Do that
+by accessing ``{{ form.fieldname }}``, where ``fieldname`` is the field's name.
+For example::
+
+ <form method="post">
+ <ul class="myformclass">
+ <li>{{ form.sender.label }} {{ form.sender }}</li>
+ <li class="helptext">{{ form.sender.help_text }}</li>
+ {% if form.sender.errors %}<ul class="errorlist">{{ form.sender.errors }}</ul>{% endif %}
+
+ <li>{{ form.subject.label }} {{ form.subject }}</li>
+ <li class="helptext">{{ form.subject.help_text }}</li>
+ {% if form.subject.errors %}<ul class="errorlist">{{ form.subject.errors }}</ul>{% endif %}
+
+ ...
+ </ul>
+ </form>
+
+Subclassing forms
+-----------------
+
+If you have multiple ``Form`` classes that share fields, you can use
+subclassing to remove redundancy.
+
+When you subclass a custom ``Form`` class, the resulting subclass will
+include all fields of the parent class(es), followed by the fields you define
+in the subclass.
+
+In this example, ``ContactFormWithPriority`` contains all the fields from
+``ContactForm``, plus an additional field, ``priority``. The ``ContactForm``
+fields are ordered first::
+
+ >>> class ContactFormWithPriority(ContactForm):
+ ... priority = forms.CharField()
+ >>> f = ContactFormWithPriority(auto_id=False)
+ >>> print f.as_ul()
+ <li>Subject: <input type="text" name="subject" maxlength="100" /></li>
+ <li>Message: <input type="text" name="message" /></li>
+ <li>Sender: <input type="text" name="sender" /></li>
+ <li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
+ <li>Priority: <input type="text" name="priority" /></li>
+
+It's possible to subclass multiple forms, treating forms as "mix-ins." In this
+example, ``BeatleForm`` subclasses both ``PersonForm`` and ``InstrumentForm``
+(in that order), and its field list includes the fields from the parent
+classes::
+
+ >>> class PersonForm(Form):
+ ... first_name = CharField()
+ ... last_name = CharField()
+ >>> class InstrumentForm(Form):
+ ... instrument = CharField()
+ >>> class BeatleForm(PersonForm, InstrumentForm):
+ ... haircut_type = CharField()
+ >>> b = BeatleForm(auto_id=False)
+ >>> print b.as_ul()
+ <li>First name: <input type="text" name="first_name" /></li>
+ <li>Last name: <input type="text" name="last_name" /></li>
+ <li>Instrument: <input type="text" name="instrument" /></li>
+ <li>Haircut type: <input type="text" name="haircut_type" /></li>
+
+Fields
+======
+
+When you create a ``Form`` class, the most important part is defining the
+fields of the form. Each field has custom validation logic, along with a few
+other hooks.
+
+Although the primary way you'll use ``Field`` classes is in ``Form`` classes,
+you can also instantiate them and use them directly to get a better idea of
+how they work. Each ``Field`` instance has a ``clean()`` method, which takes
+a single argument and either raises a ``django.newforms.ValidationError``
+exception or returns the clean value::
+
+ >>> f = forms.EmailField()
+ >>> f.clean('foo@example.com')
+ u'foo@example.com'
+ >>> f.clean(u'foo@example.com')
+ u'foo@example.com'
+ >>> f.clean('invalid e-mail address')
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u'Enter a valid e-mail address.']
+
+If you've used Django's old forms/validation framework, take care in noticing
+this ``ValidationError`` is different than the previous ``ValidationError``.
+This one lives at ``django.newforms.ValidationError`` rather than
+``django.core.validators.ValidationError``.
+
+Core field arguments
+--------------------
+
+Each ``Field`` class constructor takes at least these arguments. Some
+``Field`` classes take additional, field-specific arguments, but the following
+should *always* be accepted:
+
+``required``
+~~~~~~~~~~~~
+
+By default, each ``Field`` class assumes the value is required, so if you pass
+an empty value -- either ``None`` or the empty string (``""``) -- then
+``clean()`` will raise a ``ValidationError`` exception::
+
+ >>> f = forms.CharField()
+ >>> f.clean('foo')
+ u'foo'
+ >>> f.clean('')
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u'This field is required.']
+ >>> f.clean(None)
+ Traceback (most recent call last):
+ ...
+ ValidationError: [u'This field is required.']
+ >>> f.clean(' ')
+ u' '
+ >>> f.clean(0)
+ u'0'
+ >>> f.clean(True)
+ u'True'
+ >>> f.clean(False)
+ u'False'
+
+To specify that a field is *not* required, pass ``required=False`` to the
+``Field`` constructor::
+
+ >>> f = forms.CharField(required=False)
+ >>> f.clean('foo')
+ u'foo'
+ >>> f.clean('')
+ u''
+ >>> f.clean(None)
+ u''
+ >>> f.clean(0)
+ u'0'
+ >>> f.clean(True)
+ u'True'
+ >>> f.clean(False)
+ u'False'
+
+If a ``Field`` has ``required=False`` and you pass ``clean()`` an empty value,
+then ``clean()`` will return a *normalized* empty value rather than raising
+``ValidationError``. For ``CharField``, this will be a Unicode empty string.
+For other ``Field`` classes, it might be ``None``. (This varies from field to
+field.)
+
+``label``
+~~~~~~~~~
+
+The ``label`` argument lets you specify the "human-friendly" label for this
+field. This is used when the ``Field`` is displayed in a ``Form``.
+
+As explained in "Outputting forms as HTML" above, the default label for a
+``Field`` is generated from the field name by converting all underscores to
+spaces and upper-casing the first letter. Specify ``label`` if that default
+behavior doesn't result in an adequate label.
+
+Here's a full example ``Form`` that implements ``label`` for two of its fields.
+We've specified ``auto_id=False`` to simplify the output::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField(label='Your name')
+ ... url = forms.URLField(label='Your Web site', required=False)
+ ... comment = forms.CharField()
+ >>> f = CommentForm(auto_id=False)
+ >>> print f
+ <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
+ <tr><th>Your Web site:</th><td><input type="text" name="url" /></td></tr>
+ <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
+
+``initial``
+~~~~~~~~~~~
+
+The ``initial`` argument lets you specify the initial value to use when
+rendering this ``Field`` in an unbound ``Form``.
+
+The use-case for this is when you want to display an "empty" form in which a
+field is initialized to a particular value. For example::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField(initial='Your name')
+ ... url = forms.URLField(initial='http://')
+ ... comment = forms.CharField()
+ >>> f = CommentForm(auto_id=False)
+ >>> print f
+ <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
+ <tr><th>Url:</th><td><input type="text" name="url" value="http://" /></td></tr>
+ <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
+
+You may be thinking, why not just pass a dictionary of the initial values as
+data when displaying the form? Well, if you do that, you'll trigger validation,
+and the HTML output will include any validation errors::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField()
+ ... url = forms.URLField()
+ ... comment = forms.CharField()
+ >>> default_data = {'name': 'Your name', 'url': 'http://'}
+ >>> f = CommentForm(default_data, auto_id=False)
+ >>> print f
+ <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
+ <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="text" name="url" value="http://" /></td></tr>
+ <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr>
+
+This is why ``initial`` values are only displayed for unbound forms. For bound
+forms, the HTML output will use the bound data.
+
+Also note that ``initial`` values are *not* used as "fallback" data in
+validation if a particular field's value is not given. ``initial`` values are
+*only* intended for initial form display::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField(initial='Your name')
+ ... url = forms.URLField(initial='http://')
+ ... comment = forms.CharField()
+ >>> data = {'name': '', 'url': '', 'comment': 'Foo'}
+ >>> f = CommentForm(data)
+ >>> f.is_valid()
+ False
+ # The form does *not* fall back to using the initial values.
+ >>> f.errors
+ {'url': [u'This field is required.'], 'name': [u'This field is required.']}
+
+``widget``
+~~~~~~~~~~
+
+The ``widget`` argument lets you specify a ``Widget`` class to use when
+rendering this ``Field``. See "Widgets" below for more information.
+
+``help_text``
+~~~~~~~~~~~~~
+
+The ``help_text`` argument lets you specify descriptive text for this
+``Field``. If you provide ``help_text``, it will be displayed next to the
+``Field`` when the ``Field`` is rendered by one of the convenience ``Form``
+methods (e.g., ``as_ul()``).
+
+Here's a full example ``Form`` that implements ``help_text`` for two of its
+fields. We've specified ``auto_id=False`` to simplify the output::
+
+ >>> class HelpTextContactForm(forms.Form):
+ ... subject = forms.CharField(max_length=100, help_text='100 characters max.')
+ ... message = forms.CharField()
+ ... sender = forms.EmailField(help_text='A valid e-mail address, please.')
+ ... cc_myself = forms.BooleanField()
+ >>> f = HelpTextContactForm(auto_id=False)
+ >>> print f.as_table()
+ <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br />100 characters max.</td></tr>
+ <tr><th>Message:</th><td><input type="text" name="message" /></td></tr>
+ <tr><th>Sender:</th><td><input type="text" name="sender" /><br />A valid e-mail address, please.</td></tr>
+ <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
+ >>> print f.as_ul()
+ <li>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</li>
+ <li>Message: <input type="text" name="message" /></li>
+ <li>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</li>
+ <li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
+ >>> print f.as_p()
+ <p>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</p>
+ <p>Message: <input type="text" name="message" /></p>
+ <p>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</p>
+ <p>Cc myself: <input type="checkbox" name="cc_myself" /></p>
+
+Dynamic initial values
+----------------------
+
+The ``initial`` argument to ``Field`` (explained above) lets you hard-code the
+initial value for a ``Field`` -- but what if you want to declare the initial
+value at runtime? For example, you might want to fill in a ``username`` field
+with the username of the current session.
+
+To accomplish this, use the ``initial`` argument to a ``Form``. This argument,
+if given, should be a dictionary mapping field names to initial values. Only
+include the fields for which you're specifying an initial value; it's not
+necessary to include every field in your form. For example::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField()
+ ... url = forms.URLField()
+ ... comment = forms.CharField()
+ >>> f = CommentForm(initial={'name': 'your username'}, auto_id=False)
+ >>> print f
+ <tr><th>Name:</th><td><input type="text" name="name" value="your username" /></td></tr>
+ <tr><th>Url:</th><td><input type="text" name="url" /></td></tr>
+ <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
+ >>> f = CommentForm(initial={'name': 'another username'}, auto_id=False)
+ >>> print f
+ <tr><th>Name:</th><td><input type="text" name="name" value="another username" /></td></tr>
+ <tr><th>Url:</th><td><input type="text" name="url" /></td></tr>
+ <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
+
+Just like the ``initial`` parameter to ``Field``, these values are only
+displayed for unbound forms, and they're not used as fallback values if a
+particular value isn't provided.
+
+Finally, note that if a ``Field`` defines ``initial`` *and* you include
+``initial`` when instantiating the ``Form``, then the latter ``initial`` will
+have precedence. In this example, ``initial`` is provided both at the field
+level and at the form instance level, and the latter gets precedence::
+
+ >>> class CommentForm(forms.Form):
+ ... name = forms.CharField(initial='class')
+ ... url = forms.URLField()
+ ... comment = forms.CharField()
+ >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False)
+ >>> print f
+ <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr>
+ <tr><th>Url:</th><td><input type="text" name="url" /></td></tr>
+ <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
+
+Built-in ``Field`` classes
+--------------------------
+
+Naturally, the ``newforms`` library comes with a set of ``Field`` classes that
+represent common validation needs. This section documents each built-in field.
+
+For each field, we describe the default widget used if you don't specify
+``widget``. We also specify the value returned when you provide an empty value
+(see the section on ``required`` above to understand what that means).
+
+``BooleanField``
+~~~~~~~~~~~~~~~~
+
+ * Default widget: ``CheckboxInput``
+ * Empty value: ``None``
+ * Normalizes to: A Python ``True`` or ``False`` value.
+ * Validates nothing (i.e., it never raises a ``ValidationError``).
+
+``CharField``
+~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``''`` (an empty string)
+ * Normalizes to: A Unicode object.
+ * Validates nothing, unless ``max_length`` or ``min_length`` is provided.
+
+Has two optional arguments for validation, ``max_length`` and ``min_length``.
+If provided, these arguments ensure that the string is at most or at least the
+given length.
+
+``ChoiceField``
+~~~~~~~~~~~~~~~
+
+ * Default widget: ``Select``
+ * Empty value: ``''`` (an empty string)
+ * Normalizes to: A Unicode object.
+ * Validates that the given value exists in the list of choices.
+
+Takes one extra argument, ``choices``, which is an iterable (e.g., a list or
+tuple) of 2-tuples to use as choices for this field.
+
+``DateField``
+~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``None``
+ * Normalizes to: A Python ``datetime.date`` object.
+ * Validates that the given value is either a ``datetime.date``,
+ ``datetime.datetime`` or string formatted in a particular date format.
+
+Takes one optional argument, ``input_formats``, which is a list of formats used
+to attempt to convert a string to a valid ``datetime.date`` object.
+
+If no ``input_formats`` argument is provided, the default input formats are::
+
+ '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
+ '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
+ '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
+ '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
+ '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
+
+``DateTimeField``
+~~~~~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``None``
+ * Normalizes to: A Python ``datetime.datetime`` object.
+ * Validates that the given value is either a ``datetime.datetime``,
+ ``datetime.date`` or string formatted in a particular datetime format.
+
+Takes one optional argument, ``input_formats``, which is a list of formats used
+to attempt to convert a string to a valid ``datetime.datetime`` object.
+
+If no ``input_formats`` argument is provided, the default input formats are::
+
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
+ '%m/%d/%Y %H:%M', # '10/25/2006 14:30'
+ '%m/%d/%Y', # '10/25/2006'
+ '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
+ '%m/%d/%y %H:%M', # '10/25/06 14:30'
+ '%m/%d/%y', # '10/25/06'
+
+``EmailField``
+~~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``''`` (an empty string)
+ * Normalizes to: A Unicode object.
+ * Validates that the given value is a valid e-mail address, using a
+ moderately complex regular expression.
+
+Has two optional arguments for validation, ``max_length`` and ``min_length``.
+If provided, these arguments ensure that the string is at most or at least the
+given length.
+
+``IntegerField``
+~~~~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``None``
+ * Normalizes to: A Python integer or long integer.
+ * Validates that the given value is an integer. Leading and trailing
+ whitespace is allowed, as in Python's ``int()`` function.
+
+``MultipleChoiceField``
+~~~~~~~~~~~~~~~~~~~~~~~
+
+ * Default widget: ``SelectMultiple``
+ * Empty value: ``[]`` (an empty list)
+ * Normalizes to: A list of Unicode objects.
+ * Validates that every value in the given list of values exists in the list
+ of choices.
+
+Takes one extra argument, ``choices``, which is an iterable (e.g., a list or
+tuple) of 2-tuples to use as choices for this field.
+
+``NullBooleanField``
+~~~~~~~~~~~~~~~~~~~~
+
+ * Default widget: ``NullBooleanSelect``
+ * Empty value: ``None``
+ * Normalizes to: A Python ``True``, ``False`` or ``None`` value.
+ * Validates nothing (i.e., it never raises a ``ValidationError``).
+
+``RegexField``
+~~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``''`` (an empty string)
+ * Normalizes to: A Unicode object.
+ * Validates that the given value matches against a certain regular
+ expression.
+
+Takes one required argument, ``regex``, which is a regular expression specified
+either as a string or a compiled regular expression object.
+
+Also takes the following optional arguments:
+
+ ====================== =====================================================
+ Argument Description
+ ====================== =====================================================
+ ``max_length`` Ensures the string has at most this many characters.
+ ``min_length`` Ensures the string has at least this many characters.
+ ``error_message`` Error message to return for failed validation. If no
+ message is provided, a generic error message will be
+ used.
+ ====================== =====================================================
+
+``TimeField``
+~~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``None``
+ * Normalizes to: A Python ``datetime.time`` object.
+ * Validates that the given value is either a ``datetime.time`` or string
+ formatted in a particular time format.
+
+Takes one optional argument, ``input_formats``, which is a list of formats used
+to attempt to convert a string to a valid ``datetime.time`` object.
+
+If no ``input_formats`` argument is provided, the default input formats are::
+
+ '%H:%M:%S', # '14:30:59'
+ '%H:%M', # '14:30'
+
+``URLField``
+~~~~~~~~~~~~
+
+ * Default widget: ``TextInput``
+ * Empty value: ``''`` (an empty string)
+ * Normalizes to: A Unicode object.
+ * Validates that the given value is a valid URL.
+
+Takes the following optional arguments:
+
+ ======================== =====================================================
+ Argument Description
+ ======================== =====================================================
+ ``max_length`` Ensures the string has at most this many characters.
+ ``min_length`` Ensures the string has at least this many characters.
+ ``verify_exists`` If ``True``, the validator will attempt to load the
+ given URL, raising ``ValidationError`` if the page
+ gives a 404. Defaults to ``False``.
+ ``validator_user_agent`` String used as the user-agent used when checking for
+ a URL's existence. Defaults to the value of the
+ ``URL_VALIDATOR_USER_AGENT`` setting.
+ ======================== =====================================================
+
+Slightly complex built-in ``Field`` classes
+-------------------------------------------
+
+The following are not yet documented here. See the unit tests, linked-to from
+the bottom of this document, for examples of their use.
+
+``ComboField``
+~~~~~~~~~~~~~~
+
+``MultiValueField``
+~~~~~~~~~~~~~~~~~~~
+
+``SplitDateTimeField``
+~~~~~~~~~~~~~~~~~~~~~~
+
+Creating custom fields
+----------------------
+
+If the built-in ``Field`` classes don't meet your needs, you can easily create
+custom ``Field`` classes. To do this, just create a subclass of
+``django.newforms.Field``. Its only requirements are that it implement a
+``clean()`` method and that its ``__init__()`` method accept the core arguments
+mentioned above (``required``, ``label``, ``initial``, ``widget``,
+``help_text``).
+
+Custom form and field validation
+---------------------------------
+
+Form validation happens when the data is cleaned. If you want to customise
+this process, there are various places you can change, each one serving a
+different purpose. Thee types of cleaning methods are run during form
+processing. These are normally executed when you call the ``is_valid()``
+method on a form. There are other things that can trigger cleaning and
+validation (accessing the ``errors`` attribute or calling ``full_clean()``
+directly), but normally they won't be needed.
+
+In general, any cleaning method can raise ``ValidationError`` if there is a
+problem with the data it is processing, passing the relevant error message to
+the ``ValidationError`` constructor. If no ``ValidationError`` is raised, the
+method should return the cleaned (normalised) data as a Python object.
+
+If you detect multiple errors during a cleaning method and wish to signal all
+of them to the form submitter, it is possible to pass a list of errors to the
+``ValidationError`` constructor.
+
+The three types of cleaning methods are:
+
+ * The ``clean()`` method on a Field subclass. This is responsible
+ for cleaning the data in a way that is generic for that type of field.
+ For example, a FloatField will turn the data into a Python ``float`` or
+ raise a ``ValidationError``.
+
+ * The ``clean_<fieldname>()`` method in a form subclass -- where
+ ``<fieldname>`` is replaced with the name of the form field attribute.
+ This method does any cleaning that is specific to that particular
+ attribute, unrelated to the type of field that it is. This method is not
+ passed any parameters. You will need to look up the value of the field
+ in ``self.cleaned_data`` and remember that it will be a Python object
+ at this point, not the original string submitted in the form (it will be
+ in ``cleaned_data`` because the general field ``clean()`` method, above,
+ has already cleaned the data once).
+
+ For example, if you wanted to validate that the contents of a
+ ``CharField`` called ``serialnumber`` was unique,
+ ``clean_serialnumber()`` would be the right place to do this. You don't
+ need a specific field (it's just a ``CharField``), but you want a
+ formfield-specific piece of validation and, possibly,
+ cleaning/normalizing the data.
+
+ * The Form subclass's ``clean()`` method. This method can perform
+ any validation that requires access to multiple fields from the form at
+ once. This is where you might put in things to check that if field ``A``
+ is supplied, field ``B`` must contain a valid email address and the
+ like. The data that this method returns is the final ``cleaned_data``
+ attribute for the form, so don't forget to return the full list of
+ cleaned data if you override this method (by default, ``Form.clean()``
+ just returns ``self.cleaned_data``).
+
+ Note that any errors raised by your ``Form.clean()`` override will not
+ be associated with any field in particular. They go into a special
+ "field" (called ``__all__``, which you can access via the
+ ``non_field_errors()`` method if you need to.
+
+These methods are run in the order given above, one field at a time. That is,
+for each field in the form (in the order they are declared in the form
+definition), the ``Field.clean()`` method (or it's override) is run, then
+``clean_<fieldname>()``. Finally, once those two methods are run for every
+field, the ``Form.clean()`` method, or it's override, is executed.
+
+As mentioned above, any of these methods can raise a ``ValidationError``. For
+any field, if the ``Field.clean()`` method raises a ``ValidationError``, any
+field-specific cleaning method is not called. However, the cleaning methods
+for all remaining fields are still executed.
+
+The ``clean()`` method for the ``Form`` class or subclass is always run. If
+that method raises a ``ValidationError``, ``cleaned_data`` will be an empty
+dictionary.
+
+The previous paragraph means that if you are overriding ``Form.clean()``, you
+should iterate through ``self.cleaned_data.items()``, possibly considering the
+``_errors`` dictionary attribute on the form as well. In this way, you will
+already know which fields have passed their individual validation requirements.
+
+A simple example
+~~~~~~~~~~~~~~~~
+
+Here's a simple example of a custom field that validates its input is a string
+containing comma-separated e-mail addresses, with at least one address. We'll
+keep it simple and assume e-mail validation is contained in a function called
+``is_valid_email()``. The full class::
+
+ from django import newforms as forms
+
+ class MultiEmailField(forms.Field):
+ def clean(self, value):
+ emails = value.split(',')
+ for email in emails:
+ if not is_valid_email(email):
+ raise forms.ValidationError('%s is not a valid e-mail address.' % email)
+ if not emails:
+ raise forms.ValidationError('Enter at least one e-mail address.')
+ return emails
+
+Let's alter the ongoing ``ContactForm`` example to demonstrate how you'd use
+this in a form. Simply use ``MultiEmailField`` instead of ``forms.EmailField``,
+like so::
+
+ class ContactForm(forms.Form):
+ subject = forms.CharField(max_length=100)
+ message = forms.CharField()
+ senders = MultiEmailField()
+ cc_myself = forms.BooleanField()
+
+Generating forms for models
+===========================
+
+If you're building a database-driven app, chances are you'll have forms that
+map closely to Django models. For instance, you might have a ``BlogComment``
+model, and you want to create a form that lets people submit comments. In this
+case, it would be redundant to define the field types in your form, because
+you've already defined the fields in your model.
+
+For this reason, Django provides a few helper functions that let you create a
+``Form`` class from a Django model.
+
+``form_for_model()``
+--------------------
+
+The method ``django.newforms.form_for_model()`` creates a form based on the
+definition of a specific model. Pass it the model class, and it will return a
+``Form`` class that contains a form field for each model field.
+
+For example::
+
+ >>> from django.newforms import form_for_model
+
+ # Create the form class.
+ >>> ArticleForm = form_for_model(Article)
+
+ # Create an empty form instance.
+ >>> f = ArticleForm()
+
+It bears repeating that ``form_for_model()`` takes the model *class*, not a
+model instance, and it returns a ``Form`` *class*, not a ``Form`` instance.
+
+Field types
+~~~~~~~~~~~
+
+The generated ``Form`` class will have a form field for every model field. Each
+model field has a corresponding default form field. For example, a
+``CharField`` on a model is represented as a ``CharField`` on a form. A
+model ``ManyToManyField`` is represented as a ``MultipleChoiceField``. Here is
+the full list of conversions:
+
+ =============================== ========================================
+ Model field Form field
+ =============================== ========================================
+ ``AutoField`` Not represented in the form
+ ``BooleanField`` ``BooleanField``
+ ``CharField`` ``CharField`` with ``max_length`` set to
+ the model field's ``maxlength``
+ ``CommaSeparatedIntegerField`` ``CharField``
+ ``DateField`` ``DateField``
+ ``DateTimeField`` ``DateTimeField``
+ ``DecimalField`` ``DecimalField``
+ ``EmailField`` ``EmailField``
+ ``FileField`` ``CharField``
+ ``FilePathField`` ``CharField``
+ ``FloatField`` ``FloatField``
+ ``ForeignKey`` ``ModelChoiceField`` (see below)
+ ``ImageField`` ``CharField``
+ ``IntegerField`` ``IntegerField``
+ ``IPAddressField`` ``CharField``
+ ``ManyToManyField`` ``ModelMultipleChoiceField`` (see
+ below)
+ ``NullBooleanField`` ``CharField``
+ ``PhoneNumberField`` ``USPhoneNumberField``
+ (from ``django.contrib.localflavor.us``)
+ ``PositiveIntegerField`` ``IntegerField``
+ ``PositiveSmallIntegerField`` ``IntegerField``
+ ``SlugField`` ``CharField``
+ ``SmallIntegerField`` ``IntegerField``
+ ``TextField`` ``CharField`` with ``widget=Textarea``
+ ``TimeField`` ``TimeField``
+ ``URLField`` ``URLField`` with ``verify_exists`` set
+ to the model field's ``verify_exists``
+ ``USStateField`` ``CharField`` with
+ ``widget=USStateSelect``
+ (``USStateSelect`` is from
+ ``django.contrib.localflavor.us``)
+ ``XMLField`` ``CharField`` with ``widget=Textarea``
+ =============================== ========================================
+
+
+.. note::
+ The ``FloatField`` form field and ``DecimalField`` model and form fields
+ are new in the development version.
+
+As you might expect, the ``ForeignKey`` and ``ManyToManyField`` model field
+types are special cases:
+
+ * ``ForeignKey`` is represented by ``django.newforms.ModelChoiceField``,
+ which is a ``ChoiceField`` whose choices are a model ``QuerySet``.
+
+ * ``ManyToManyField`` is represented by
+ ``django.newforms.ModelMultipleChoiceField``, which is a
+ ``MultipleChoiceField`` whose choices are a model ``QuerySet``.
+
+In addition, each generated form field has attributes set as follows:
+
+ * If the model field has ``blank=True``, then ``required`` is set to
+ ``False`` on the form field. Otherwise, ``required=True``.
+
+ * The form field's ``label`` is set to the ``verbose_name`` of the model
+ field, with the first character capitalized.
+
+ * The form field's ``help_text`` is set to the ``help_text`` of the model
+ field.
+
+ * If the model field has ``choices`` set, then the form field's ``widget``
+ will be set to ``Select``, with choices coming from the model field's
+ ``choices``.
+
+Finally, note that you can override the form field used for a given model
+field. See "Overriding the default field types" below.
+
+A full example
+~~~~~~~~~~~~~~
+
+Consider this set of models::
+
+ from django.db import models
+
+ TITLE_CHOICES = (
+ ('MR', 'Mr.'),
+ ('MRS', 'Mrs.'),
+ ('MS', 'Ms.'),
+ )
+
+ class Author(models.Model):
+ name = models.CharField(maxlength=100)
+ title = models.CharField(maxlength=3, choices=TITLE_CHOICES)
+ birth_date = models.DateField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
+
+ class Book(models.Model):
+ name = models.CharField(maxlength=100)
+ authors = models.ManyToManyField(Author)
+
+With these models, a call to ``form_for_model(Author)`` would return a ``Form``
+class equivalent to this::
+
+ class AuthorForm(forms.Form):
+ name = forms.CharField(max_length=100)
+ title = forms.CharField(max_length=3,
+ widget=forms.Select(choices=TITLE_CHOICES))
+ birth_date = forms.DateField(required=False)
+
+A call to ``form_for_model(Book)`` would return a ``Form`` class equivalent to
+this::
+
+ class BookForm(forms.Form):
+ name = forms.CharField(max_length=100)
+ authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())
+
+The ``save()`` method
+~~~~~~~~~~~~~~~~~~~~~
+
+Every form produced by ``form_for_model()`` also has a ``save()`` method. This
+method creates and saves a database object from the data bound to the form. For
+example::
+
+ # Create a form instance from POST data.
+ >>> f = ArticleForm(request.POST)
+
+ # Save a new Article object from the form's data.
+ >>> new_article = f.save()
+
+Note that ``save()`` will raise a ``ValueError`` if the data in the form
+doesn't validate -- i.e., ``if form.errors``.
+
+Using an alternate base class
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to add custom methods to the form generated by
+``form_for_model()``, write a class that extends ``django.newforms.BaseForm``
+and contains your custom methods. Then, use the ``form`` argument to
+``form_for_model()`` to tell it to use your custom form as its base class.
+For example::
+
+ # Create the new base class.
+ >>> class MyBase(BaseForm):
+ ... def my_method(self):
+ ... # Do whatever the method does
+
+ # Create the form class with a different base class.
+ >>> ArticleForm = form_for_model(Article, form=MyBase)
+
+ # Instantiate the form.
+ >>> f = ArticleForm()
+
+ # Use the base class method.
+ >>> f.my_method()
+
+Using a subset of fields on the form
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**New in Django development version**
+
+In some cases, you may not want all the model fields to appear on the generated
+form. There are two ways of telling ``form_for_model()`` to use only a subset
+of the model fields:
+
+ 1. Set ``editable=False`` on the model field. As a result, *any* form
+ created from the model via ``form_for_model()`` will not include that
+ field.
+
+ 2. Use the ``fields`` argument to ``form_for_model()``. This argument, if
+ given, should be a list of field names to include in the form.
+
+ For example, if you want a form for the ``Author`` model (defined above)
+ that includes only the ``name`` and ``title`` fields, you would specify
+ ``fields`` like this::
+
+ PartialArticleForm = form_for_model(Author, fields=('name', 'title'))
+
+.. note::
+
+ If you specify ``fields`` when creating a form with ``form_for_model()``,
+ make sure that the fields that are *not* specified can provide default
+ values, or are allowed to have a value of ``None``. If a field isn't
+ specified on a form, the object created from the form can't provide
+ a value for that attribute, which will prevent the new instance from
+ being saved.
+
+Overriding the default field types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The default field types, as described in the "Field types" table above, are
+sensible defaults; if you have a ``DateField`` in your model, chances are you'd
+want that to be represented as a ``DateField`` in your form. But
+``form_for_model()`` gives you the flexibility of changing the form field type
+for a given model field. You do this by specifying a **formfield callback**.
+
+A formfield callback is a function that, when provided with a model field,
+returns a form field instance. When constructing a form, ``form_for_model()``
+asks the formfield callback to provide form field types.
+
+By default, ``form_for_model()`` calls the ``formfield()`` method on the model
+field::
+
+ def default_callback(field, **kwargs):
+ return field.formfield(**kwargs)
+
+The ``kwargs`` are any keyword arguments that might be passed to the form
+field, such as ``required=True`` or ``label='Foo'``.
+
+For example, if you wanted to use ``MyDateFormField`` for any ``DateField``
+field on the model, you could define the callback::
+
+ >>> def my_callback(field, **kwargs):
+ ... if isinstance(field, models.DateField):
+ ... return MyDateFormField(**kwargs)
+ ... else:
+ ... return field.formfield(**kwargs)
+
+ >>> ArticleForm = form_for_model(formfield_callback=my_callback)
+
+Note that your callback needs to handle *all* possible model field types, not
+just the ones that you want to behave differently to the default. That's why
+this example has an ``else`` clause that implements the default behavior.
+
+Finding the model associated with a form
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The model class that was used to construct the form is available
+using the ``_model`` property of the generated form::
+
+ >>> ArticleForm = form_for_model(Article)
+ >>> ArticleForm._model
+ <class 'myapp.models.Article'>
+
+``form_for_instance()``
+-----------------------
+
+``form_for_instance()`` is like ``form_for_model()``, but it takes a model
+instance instead of a model class::
+
+ # Create an Author.
+ >>> a = Author(name='Joe Smith', title='MR', birth_date=None)
+ >>> a.save()
+
+ # Create a form for this particular Author.
+ >>> AuthorForm = form_for_instance(a)
+
+ # Instantiate the form.
+ >>> f = AuthorForm()
+
+When a form created by ``form_for_instance()`` is created, the initial
+data values for the form fields are drawn from the instance. However,
+this data is not bound to the form. You will need to bind data to the
+form before the form can be saved.
+
+When you call ``save()`` on a form created by ``form_for_instance()``,
+the database instance will be updated. As in ``form_for_model()``, ``save()``
+will raise ``ValueError`` if the data doesn't validate.
+
+``form_for_instance()`` has ``form``, ``fields`` and ``formfield_callback``
+arguments that behave the same way as they do for ``form_for_model()``.
+
+When should you use ``form_for_model()`` and ``form_for_instance()``?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``form_for_model()`` and ``form_for_instance()`` functions are meant to be
+shortcuts for the common case. If you want to create a form whose fields map to
+more than one model, or a form that contains fields that *aren't* on a model,
+you shouldn't use these shortcuts. Creating a ``Form`` class the "long" way
+isn't that difficult, after all.
+
More coming soon
================
@@ -290,11 +1641,5 @@ http://code.djangoproject.com/browser/django/trunk/tests/regressiontests/forms/t
-- the unit tests for ``django.newforms``. This can give you a good idea of
what's possible.
-Using forms to validate data
-----------------------------
-
-Using forms with templates
-==========================
-
-Using forms in views
-====================
+If you're really itching to learn and use this library, please be patient.
+We're working hard on finishing both the code and documentation.
diff --git a/docs/outputting_csv.txt b/docs/outputting_csv.txt
index 1970261891..d6ec3f62a0 100644
--- a/docs/outputting_csv.txt
+++ b/docs/outputting_csv.txt
@@ -24,7 +24,7 @@ and Django's ``HttpResponse`` objects are file-like objects.
For more information on the CSV library, see the `CSV library docs`_.
- .. _Request and response objects: http://www.djangoproject.com/documentation/request_response/
+ .. _Request and response objects: ../request_response/
.. _CSV library docs: http://www.python.org/doc/current/lib/module-csv.html
Here's an example::
@@ -115,5 +115,5 @@ a line of CSV for each row. It uses the `addslashes template filter`_ to ensure
there aren't any problems with quotes. If you can be certain your data doesn't
have single or double quotes in it, you can remove the ``addslashes`` filters.
-.. _Django template system: http://www.djangoproject.com/documentation/templates/
-.. _addslashes template filter: http://www.djangoproject.com/documentation/templates/#addslashes
+.. _Django template system: ../templates/
+.. _addslashes template filter: ../templates/#addslashes
diff --git a/docs/outputting_pdf.txt b/docs/outputting_pdf.txt
index edd34aca24..bd6ae7a660 100644
--- a/docs/outputting_pdf.txt
+++ b/docs/outputting_pdf.txt
@@ -29,7 +29,7 @@ Test your installation by importing it in the Python interactive interpreter::
If that command doesn't raise any errors, the installation worked.
-.. _user guide: http://www.reportlab.org/rsrc/userguide.pdf
+.. _user guide: http://www.reportlab.com/docs/userguide.pdf
Write your view
===============
@@ -43,7 +43,7 @@ objects.
For more information on ``HttpResponse`` objects, see
`Request and response objects`_.
- .. _Request and response objects: http://www.djangoproject.com/documentation/request_response/
+ .. _Request and response objects: ../request_response/
Here's a "Hello World" example::
diff --git a/docs/overview.txt b/docs/overview.txt
index 8e6274dd9a..7b3559663a 100644
--- a/docs/overview.txt
+++ b/docs/overview.txt
@@ -11,7 +11,7 @@ understand how Django works, but this isn't intended to be a tutorial or
reference. Please see our more-detailed Django documentation_ when you're ready
to start a project.
-.. _documentation: http://www.djangoproject.com/documentation/
+.. _documentation: ../
Design your model
=================
@@ -297,5 +297,5 @@ The next obvious steps are for you to `download Django`_, read `the tutorial`_
and join `the community`_. Thanks for your interest!
.. _download Django: http://www.djangoproject.com/download/
-.. _the tutorial: http://www.djangoproject.com/documentation/tutorial1/
+.. _the tutorial: http://www.djangoproject.com/documentation/tutorial01/
.. _the community: http://www.djangoproject.com/community/
diff --git a/docs/redirects.txt b/docs/redirects.txt
index 13f08668c8..4df60d473f 100644
--- a/docs/redirects.txt
+++ b/docs/redirects.txt
@@ -15,8 +15,8 @@ To install the redirects app, follow these steps:
to your MIDDLEWARE_CLASSES_ setting.
3. Run the command ``manage.py syncdb``.
-.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps
-.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes
+.. _INSTALLED_APPS: ../settings/#installed-apps
+.. _MIDDLEWARE_CLASSES: ../settings/#middleware-classes
How it works
============
@@ -46,8 +46,8 @@ resort.
For more on middleware, read the `middleware docs`_.
-.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id
-.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
+.. _SITE_ID: ../settings/#site-id
+.. _middleware docs: ../middleware/
How to add, change and delete redirects
=======================================
@@ -66,6 +66,6 @@ Redirects are represented by a standard `Django model`_, which lives in
`django/contrib/redirects/models.py`_. You can access redirect
objects via the `Django database API`_.
-.. _Django model: http://www.djangoproject.com/documentation/model_api/
+.. _Django model: ../model-api/
.. _django/contrib/redirects/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/redirects/models.py
-.. _Django database API: http://www.djangoproject.com/documentation/db_api/
+.. _Django database API: ../db-api/
diff --git a/docs/release_notes_0.96.txt b/docs/release_notes_0.96.txt
new file mode 100644
index 0000000000..f62780c6b2
--- /dev/null
+++ b/docs/release_notes_0.96.txt
@@ -0,0 +1,264 @@
+=================================
+Django version 0.96 release notes
+=================================
+
+Welcome to Django 0.96!
+
+The primary goal for 0.96 is a cleanup and stabilization of the features
+introduced in 0.95. There have been a few small `backwards-incompatible
+changes`_ since 0.95, but the upgrade process should be fairly simple
+and should not require major changes to existing applications.
+
+However, we're also releasing 0.96 now because we have a set of
+backwards-incompatible changes scheduled for the near future. Once
+completed, they will involve some code changes for application
+developers, so we recommend that you stick with Django 0.96 until the
+next official release; then you'll be able to upgrade in one step
+instead of needing to make incremental changes to keep up with the
+development version of Django.
+
+Backwards-incompatible changes
+==============================
+
+The following changes may require you to update your code when you switch from
+0.95 to 0.96:
+
+``MySQLdb`` version requirement
+-------------------------------
+
+Due to a bug in older versions of the ``MySQLdb`` Python module (which
+Django uses to connect to MySQL databases), Django's MySQL backend now
+requires version 1.2.1p2 or higher of `MySQLdb`, and will raise
+exceptions if you attempt to use an older version.
+
+If you're currently unable to upgrade your copy of ``MySQLdb`` to meet
+this requirement, a separate, backwards-compatible backend, called
+"mysql_old", has been added to Django. To use this backend, change
+the ``DATABASE_ENGINE`` setting in your Django settings file from
+this::
+
+ DATABASE_ENGINE = "mysql"
+
+to this::
+
+ DATABASE_ENGINE = "mysql_old"
+
+However, we strongly encourage MySQL users to upgrade to a more recent
+version of `MySQLdb` as soon as possible, The "mysql_old" backend is
+provided only to ease this transition, and is considered deprecated;
+aside from any necessary security fixes, it will not be actively
+maintained, and it will be removed in a future release of Django.
+
+Also, note that some features, like the new ``DATABASE_OPTIONS``
+setting (see the `databases documentation`_ for details), are only
+available on the "mysql" backend, and will not be made available for
+"mysql_old".
+
+.. _databases documentation: ../databases/
+
+Database constraint names changed
+---------------------------------
+
+The format of the constraint names Django generates for foreign key
+references have changed slightly. These names are generally only used
+when it is not possible to put the reference directly on the affected
+column, so they are not always visible.
+
+The effect of this change is that running ``manage.py reset`` and
+similar commands against an existing database may generate SQL with
+the new form of constraint name, while the database itself contains
+constraints named in the old form; this will cause the database server
+to raise an error message about modifying non-existent constraints.
+
+If you need to work around this, there are two methods available:
+
+ 1. Redirect the output of ``manage.py`` to a file, and edit the
+ generated SQL to use the correct constraint names before
+ executing it.
+
+ 2. Examine the output of ``manage.py sqlall`` to see the new-style
+ constraint names, and use that as a guide to rename existing
+ constraints in your database.
+
+Name changes in ``manage.py``
+-----------------------------
+
+A few of the options to ``manage.py`` have changed with the addition of fixture
+support:
+
+ * There are new ``dumpdata`` and ``loaddata`` commands which, as
+ you might expect, will dump and load data to/from the
+ database. These commands can operate against any of Django's
+ supported serialization formats.
+
+ * The ``sqlinitialdata`` command has been renamed to ``sqlcustom`` to
+ emphasize that ``loaddata`` should be used for data (and ``sqlcustom`` for
+ other custom SQL -- views, stored procedures, etc.).
+
+ * The vestigial ``install`` command has been removed. Use ``syncdb``.
+
+Backslash escaping changed
+--------------------------
+
+The Django database API now escapes backslashes given as query parameters. If
+you have any database API code that matches backslashes, and it was working before
+(despite the lack of escaping), you'll have to change your code to "unescape" the
+slashes one level.
+
+For example, this used to work::
+
+ # Find text containing a single backslash
+ MyModel.objects.filter(text__contains='\\\\')
+
+The above is now incorrect, and should be rewritten as::
+
+ # Find text containing a single backslash
+ MyModel.objects.filter(text__contains='\\')
+
+Removed ENABLE_PSYCO setting
+----------------------------
+
+The ``ENABLE_PSYCO`` setting no longer exists. If your settings file includes
+``ENABLE_PSYCO`` it will have no effect; to use Psyco_, we recommend
+writing a middleware class to activate it.
+
+.. _psyco: http://psyco.sourceforge.net/
+
+What's new in 0.96?
+===================
+
+This revision represents over a thousand source commits and over four hundred
+bug fixes, so we can't possibly catalog all the changes. Here, we describe the
+most notable changes in this release.
+
+New forms library
+-----------------
+
+``django.newforms`` is Django's new form-handling library. It's a
+replacement for ``django.forms``, the old form/manipulator/validation
+framework. Both APIs are available in 0.96, but over the next two
+releases we plan to switch completely to the new forms system, and
+deprecate and remove the old system.
+
+There are three elements to this transition:
+
+ * We've copied the current ``django.forms`` to
+ ``django.oldforms``. This allows you to upgrade your code *now*
+ rather than waiting for the backwards-incompatible change and
+ rushing to fix your code after the fact. Just change your
+ import statements like this::
+
+ from django import forms # 0.95-style
+ from django import oldforms as forms # 0.96-style
+
+ * The next official release of Django will move the current
+ ``django.newforms`` to ``django.forms``. This will be a
+ backwards-incompatible change, and anyone still using the old
+ version of ``django.forms`` at that time will need to change
+ their import statements as described above.
+
+ * The next release after that will completely remove
+ ``django.oldforms``.
+
+Although the ``newforms`` library will continue to evolve, it's ready for use
+for most common cases. We recommend that anyone new to form handling skip the
+old forms system and start with the new.
+
+For more information about ``django.newforms``, read the `newforms
+documentation`_.
+
+.. _newforms documentation: ../newforms/
+
+URLconf improvements
+--------------------
+
+You can now use any callable as the callback in URLconfs (previously, only
+strings that referred to callables were allowed). This allows a much more
+natural use of URLconfs. For example, this URLconf::
+
+ from django.conf.urls.defaults import *
+
+ urlpatterns = patterns('',
+ ('^myview/$', 'mysite.myapp.views.myview')
+ )
+
+can now be rewritten as::
+
+ from django.conf.urls.defaults import *
+ from mysite.myapp.views import myview
+
+ urlpatterns = patterns('',
+ ('^myview/$', myview)
+ )
+
+One useful application of this can be seen when using decorators; this
+change allows you to apply decorators to views *in your
+URLconf*. Thus, you can make a generic view require login very
+easily::
+
+ from django.conf.urls.defaults import *
+ from django.contrib.auth.decorators import login_required
+ from django.views.generic.list_detail import object_list
+ from mysite.myapp.models import MyModel
+
+ info = {
+ "queryset" : MyModel.objects.all(),
+ }
+
+ urlpatterns = patterns('',
+ ('^myview/$', login_required(object_list), info)
+ )
+
+Note that both syntaxes (strings and callables) are valid, and will continue to
+be valid for the foreseeable future.
+
+The test framework
+------------------
+
+Django now includes a test framework so you can start transmuting fear into
+boredom (with apologies to Kent Beck). You can write tests based on doctest_
+or unittest_ and test your views with a simple test client.
+
+There is also new support for "fixtures" -- initial data, stored in any of the
+supported `serialization formats`_, that will be loaded into your database at the
+start of your tests. This makes testing with real data much easier.
+
+See `the testing documentation`_ for the full details.
+
+.. _doctest: http://docs.python.org/lib/module-doctest.html
+.. _unittest: http://docs.python.org/lib/module-unittest.html
+.. _the testing documentation: ../testing/
+.. _serialization formats: ../serialization/
+
+Improvements to the admin interface
+-----------------------------------
+
+A small change, but a very nice one: dedicated views for adding and
+updating users have been added to the admin interface, so you no
+longer need to worry about working with hashed passwords in the admin.
+
+Thanks
+======
+
+Since 0.95, a number of people have stepped forward and taken a major
+new role in Django's development. We'd like to thank these people for
+all their hard work:
+
+ * Russell Keith-Magee and Malcolm Tredinnick for their major code
+ contributions. This release wouldn't have been possible without them.
+
+ * Our new release manager, James Bennett, for his work in getting out
+ 0.95.1, 0.96, and (hopefully) future release.
+
+ * Our ticket managers Chris Beaven (aka SmileyChris), Simon Greenhill,
+ Michael Radziej, and Gary Wilson. They agreed to take on the monumental
+ task of wrangling our tickets into nicely cataloged submission. Figuring
+ out what to work on is now about a million times easier; thanks again,
+ guys.
+
+ * Everyone who submitted a bug report, patch or ticket comment. We can't
+ possibly thank everyone by name -- over 200 developers submitted patches
+ that went into 0.96 -- but everyone who's contributed to Django is listed
+ in AUTHORS_.
+
+.. _AUTHORS: http://code.djangoproject.com/browser/django/trunk/AUTHORS
diff --git a/docs/request_response.txt b/docs/request_response.txt
index 006ac6b648..0b985d563b 100644
--- a/docs/request_response.txt
+++ b/docs/request_response.txt
@@ -93,6 +93,7 @@ All attributes except ``session`` should be considered read-only.
* ``CONTENT_TYPE``
* ``HTTP_ACCEPT_ENCODING``
* ``HTTP_ACCEPT_LANGUAGE``
+ * ``HTTP_HOST`` -- The HTTP Host header sent by the client.
* ``HTTP_REFERER`` -- The referring page, if any.
* ``HTTP_USER_AGENT`` -- The client's user-agent string.
* ``QUERY_STRING`` -- The query string, as a single (unparsed) string.
@@ -117,14 +118,14 @@ All attributes except ``session`` should be considered read-only.
``AuthenticationMiddleware`` activated. For more, see
`Authentication in Web requests`_.
- .. _Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests
+ .. _Authentication in Web requests: ../authentication/#authentication-in-web-requests
``session``
A readable-and-writable, dictionary-like object that represents the current
session. This is only available if your Django installation has session
support activated. See the `session documentation`_ for full details.
- .. _`session documentation`: http://www.djangoproject.com/documentation/sessions/
+ .. _`session documentation`: ../sessions/
``raw_post_data``
The raw HTTP POST data. This is only useful for advanced processing. Use
@@ -384,7 +385,6 @@ Methods
Deletes the cookie with the given key. Fails silently if the key doesn't
exist.
- The ``path`` and ``domain`` arguments are new in the Django development version.
Due to the way cookies work, ``path`` and ``domain`` should be the same
values you used in ``set_cookie()`` -- otherwise the cookie may not be deleted.
@@ -417,6 +417,10 @@ types of HTTP responses. Like ``HttpResponse``, these subclasses live in
The constructor doesn't take any arguments. Use this to designate that a
page hasn't been modified since the user's last request.
+``HttpResponseBadRequest``
+ **New in Django development version.**
+ Acts just like ``HttpResponse`` but uses a 400 status code.
+
``HttpResponseNotFound``
Acts just like ``HttpResponse`` but uses a 404 status code.
@@ -432,3 +436,118 @@ types of HTTP responses. Like ``HttpResponse``, these subclasses live in
``HttpResponseServerError``
Acts just like ``HttpResponse`` but uses a 500 status code.
+
+Returning errors
+================
+
+Returning HTTP error codes in Django is easy. We've already mentioned the
+``HttpResponseNotFound``, ``HttpResponseForbidden``,
+``HttpResponseServerError``, etc., subclasses; just return an instance of one
+of those subclasses instead of a normal ``HttpResponse`` in order to signify
+an error. For example::
+
+ def my_view(request):
+ # ...
+ if foo:
+ return HttpResponseNotFound('<h1>Page not found</h1>')
+ else:
+ return HttpResponse('<h1>Page was found</h1>')
+
+Because 404 errors are by far the most common HTTP error, there's an easier way
+to handle those errors.
+
+The Http404 exception
+---------------------
+
+When you return an error such as ``HttpResponseNotFound``, you're responsible
+for defining the HTML of the resulting error page::
+
+ return HttpResponseNotFound('<h1>Page not found</h1>')
+
+For convenience, and because it's a good idea to have a consistent 404 error page
+across your site, Django provides an ``Http404`` exception. If you raise
+``Http404`` at any point in a view function, Django will catch it and return the
+standard error page for your application, along with an HTTP error code 404.
+
+Example usage::
+
+ from django.http import Http404
+
+ def detail(request, poll_id):
+ try:
+ p = Poll.objects.get(pk=poll_id)
+ except Poll.DoesNotExist:
+ raise Http404
+ return render_to_response('polls/detail.html', {'poll': p})
+
+In order to use the ``Http404`` exception to its fullest, you should create a
+template that is displayed when a 404 error is raised. This template should be
+called ``404.html`` and located in the top level of your template tree.
+
+Customizing error views
+-----------------------
+
+The 404 (page not found) view
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you raise an ``Http404`` exception, Django loads a special view devoted
+to handling 404 errors. By default, it's the view
+``django.views.defaults.page_not_found``, which loads and renders the template
+``404.html``.
+
+This means you need to define a ``404.html`` template in your root template
+directory. This template will be used for all 404 errors.
+
+This ``page_not_found`` view should suffice for 99% of Web applications, but if
+you want to override the 404 view, you can specify ``handler404`` in your
+URLconf, like so::
+
+ handler404 = 'mysite.views.my_custom_404_view'
+
+Behind the scenes, Django determines the 404 view by looking for ``handler404``.
+By default, URLconfs contain the following line::
+
+ from django.conf.urls.defaults import *
+
+That takes care of setting ``handler404`` in the current module. As you can see
+in ``django/conf/urls/defaults.py``, ``handler404`` is set to
+``'django.views.defaults.page_not_found'`` by default.
+
+Three things to note about 404 views:
+
+ * The 404 view is also called if Django doesn't find a match after checking
+ every regular expression in the URLconf.
+
+ * If you don't define your own 404 view -- and simply use the default,
+ which is recommended -- you still have one obligation: To create a
+ ``404.html`` template in the root of your template directory. The default
+ 404 view will use that template for all 404 errors.
+
+ * If ``DEBUG`` is set to ``True`` (in your settings module) then your 404
+ view will never be used, and the traceback will be displayed instead.
+
+The 500 (server error) view
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Similarly, Django executes special-case behavior in the case of runtime errors
+in view code. If a view results in an exception, Django will, by default, call
+the view ``django.views.defaults.server_error``, which loads and renders the
+template ``500.html``.
+
+This means you need to define a ``500.html`` template in your root template
+directory. This template will be used for all server errors.
+
+This ``server_error`` view should suffice for 99% of Web applications, but if
+you want to override the view, you can specify ``handler500`` in your
+URLconf, like so::
+
+ handler500 = 'mysite.views.my_custom_error_view'
+
+Behind the scenes, Django determines the error view by looking for ``handler500``.
+By default, URLconfs contain the following line::
+
+ from django.conf.urls.defaults import *
+
+That takes care of setting ``handler500`` in the current module. As you can see
+in ``django/conf/urls/defaults.py``, ``handler500`` is set to
+``'django.views.defaults.server_error'`` by default.
diff --git a/docs/serialization.txt b/docs/serialization.txt
index aee1b9a3bb..01afa2708c 100644
--- a/docs/serialization.txt
+++ b/docs/serialization.txt
@@ -27,11 +27,12 @@ data to (see `Serialization formats`_) and a QuerySet_ to serialize.
(Actually, the second argument can be any iterator that yields Django objects,
but it'll almost always be a QuerySet).
-.. _QuerySet: ../db_api/#retrieving-objects
+.. _QuerySet: ../db-api/#retrieving-objects
You can also use a serializer object directly::
- xml_serializer = serializers.get_serializer("xml")
+ XMLSerializer = serializers.get_serializer("xml")
+ xml_serializer = XMLSerializer()
xml_serializer.serialize(queryset)
data = xml_serializer.getvalue()
@@ -43,6 +44,25 @@ This is useful if you want to serialize data directly to a file-like object
.. _HTTPResponse: ../request_response/#httpresponse-objects
+Subset of fields
+~~~~~~~~~~~~~~~~
+
+If you only want a subset of fields to be serialized, you can
+specify a `fields` argument to the serializer::
+
+ from django.core import serializers
+ data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))
+
+In this example, only the `name` and `size` attributes of each model will
+be serialized.
+
+.. note::
+
+ Depending on your model, you may find that it is not possible to deserialize
+ a model that only serializes a subset of its fields. If a serialized object
+ doesn't specify all the fields that are required by a model, the deserializer
+ will not be able to save deserialized instances.
+
Deserializing data
------------------
@@ -91,10 +111,14 @@ Django "ships" with a few included serializers:
``python`` Translates to and from "simple" Python objects (lists, dicts,
strings, etc.). Not really all that useful on its own, but
used as a base for other serializers.
+
+ ``yaml`` Serializes to YAML (Yet Another Markup Lanuage). This
+ serializer is only available if PyYAML_ is installed.
========== ==============================================================
.. _json: http://json.org/
.. _simplejson: http://undefined.org/python/#simplejson
+.. _PyYAML: http://www.pyyaml.org/
Notes for specific serialization formats
----------------------------------------
@@ -108,7 +132,7 @@ serializer, you must pass ``ensure_ascii=False`` as a parameter to the
For example::
- json_serializer = serializers.get_serializer("json")
+ json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
Writing custom serializers
diff --git a/docs/sessions.txt b/docs/sessions.txt
index dd4a581d91..c7124ba703 100644
--- a/docs/sessions.txt
+++ b/docs/sessions.txt
@@ -27,7 +27,7 @@ If you don't want to use sessions, you might as well remove the
``SessionMiddleware`` line from ``MIDDLEWARE_CLASSES`` and ``'django.contrib.sessions'``
from your ``INSTALLED_APPS``. It'll save you a small bit of overhead.
-.. _middleware: http://www.djangoproject.com/documentation/middleware/
+.. _middleware: ../middleware/
Using sessions in views
=======================
@@ -107,7 +107,7 @@ posts a comment. It doesn't let a user post a comment more than once::
This simplistic view logs in a "member" of the site::
def login(request):
- m = members.get_object(username__exact=request.POST['username'])
+ m = Member.objects.get(username=request.POST['username'])
if m.password == request.POST['password']:
request.session['member_id'] = m.id
return HttpResponse("You're logged in.")
@@ -158,7 +158,7 @@ is defined in ``django/contrib/sessions/models.py``. Because it's a normal
model, you can access sessions using the normal Django database API::
>>> from django.contrib.sessions.models import Session
- >>> s = Session.objects.get_object(pk='2b1189a188b44ad18c35e113ac6ceead')
+ >>> s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
>>> s.expire_date
datetime.datetime(2005, 8, 20, 13, 35, 12)
@@ -217,6 +217,23 @@ browser-length cookies -- cookies that expire as soon as the user closes his or
her browser. Use this if you want people to have to log in every time they open
a browser.
+Clearing the session table
+==========================
+
+Note that session data can accumulate in the ``django_session`` database table
+and Django does *not* provide automatic purging. Therefore, it's your job to
+purge expired sessions on a regular basis.
+
+To understand this problem, consider what happens when a user uses a session.
+When a user logs in, Django adds a row to the ``django_session`` database
+table. Django updates this row each time the session data changes. If the user
+logs out manually, Django deletes the row. But if the user does *not* log out,
+the row never gets deleted.
+
+Django provides a sample clean-up script in ``django/bin/daily_cleanup.py``.
+That script deletes any session in the session table whose ``expire_date`` is
+in the past -- but your application may have different requirements.
+
Settings
========
@@ -248,8 +265,6 @@ The name of the cookie to use for sessions. This can be whatever you want.
SESSION_COOKIE_SECURE
---------------------
-**New in Django development version**
-
Default: ``False``
Whether to use a secure cookie for the session cookie. If this is set to
@@ -273,7 +288,7 @@ Whether to save the session data on every request. If this is ``False``
(default), then the session data will only be saved if it has been modified --
that is, if any of its dictionary values have been assigned or deleted.
-.. _Django settings: http://www.djangoproject.com/documentation/settings/
+.. _Django settings: ../settings/
Technical details
=================
diff --git a/docs/settings.txt b/docs/settings.txt
index ba1e8eafea..12e6dab4bc 100644
--- a/docs/settings.txt
+++ b/docs/settings.txt
@@ -59,7 +59,7 @@ Use the ``--settings`` command-line argument to specify the settings manually::
django-admin.py runserver --settings=mysite.settings
-.. _django-admin.py: http://www.djangoproject.com/documentation/django_admin/
+.. _django-admin.py: ../django-admin/
On the server (mod_python)
--------------------------
@@ -75,7 +75,7 @@ settings file to use. Do that with ``SetEnv``::
Read the `Django mod_python documentation`_ for more information.
-.. _Django mod_python documentation: http://www.djangoproject.com/documentation/modpython/
+.. _Django mod_python documentation: ../modpython/
Default settings
================
@@ -102,7 +102,7 @@ between the current settings file and Django's default settings.
For more, see the `diffsettings documentation`_.
-.. _diffsettings documentation: http://www.djangoproject.com/documentation/django_admin/#diffsettings
+.. _diffsettings documentation: ../django-admin/#diffsettings
Using settings in Python code
=============================
@@ -157,15 +157,18 @@ ABSOLUTE_URL_OVERRIDES
Default: ``{}`` (Empty dictionary)
-A dictionary mapping ``"app_label.module_name"`` strings to functions that take
+A dictionary mapping ``"app_label.model_name"`` strings to functions that take
a model object and return its URL. This is a way of overriding
``get_absolute_url()`` methods on a per-installation basis. Example::
ABSOLUTE_URL_OVERRIDES = {
- 'blogs.blogs': lambda o: "/blogs/%s/" % o.slug,
- 'news.stories': lambda o: "/stories/%s/%s/" % (o.pub_year, o.slug),
+ 'blogs.weblog': lambda o: "/blogs/%s/" % o.slug,
+ 'news.story': lambda o: "/stories/%s/%s/" % (o.pub_year, o.slug),
}
+Note that the model name used in this setting should be all lower-case, regardless
+of the case of the actual model class name.
+
ADMIN_FOR
---------
@@ -197,6 +200,9 @@ of (Full name, e-mail address). Example::
(('John', 'john@example.com'), ('Mary', 'mary@example.com'))
+Note that Django will e-mail *all* of these people whenever an error happens. See the
+section on `error reporting via e-mail`_ for more information.
+
ALLOWED_INCLUDE_ROOTS
---------------------
@@ -236,10 +242,11 @@ The cache key prefix that the cache middleware should use. See the
DATABASE_ENGINE
---------------
-Default: ``'postgresql'``
+Default: ``''`` (Empty string)
-Which database backend to use. Either ``'postgresql'``, ``'mysql'``,
-``'sqlite3'`` or ``'ado_mssql'``.
+Which database backend to use. Either ``'postgresql_psycopg2'``,
+``'postgresql'``, ``'mysql'``, ``'mysql_old'``, ``'sqlite3'`` or
+``'ado_mssql'``.
DATABASE_HOST
-------------
@@ -257,6 +264,11 @@ MySQL will connect via a Unix socket to the specified socket. For example::
If you're using MySQL and this value *doesn't* start with a forward slash, then
this value is assumed to be the host.
+If you're using PostgreSQL, an empty string means to use a Unix domain socket
+for the connection, rather than a network connection to localhost. If you
+explictly need to use a TCP/IP connection on the local machine with
+PostgreSQL, specify ``localhost`` here.
+
DATABASE_NAME
-------------
@@ -306,7 +318,7 @@ pages -- and, possibly, by other parts of the system. See
See also DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and MONTH_DAY_FORMAT.
-.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+.. _allowed date format strings: ../templates/#now
DATETIME_FORMAT
---------------
@@ -319,7 +331,7 @@ pages -- and, possibly, by other parts of the system. See
See also DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and MONTH_DAY_FORMAT.
-.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+.. _allowed date format strings: ../templates/#now
DEBUG
-----
@@ -328,6 +340,16 @@ Default: ``False``
A boolean that turns on/off debug mode.
+If you define custom settings, django/views/debug.py has a ``HIDDEN_SETTINGS``
+regular expression which will hide from the DEBUG view anything that contins
+``'SECRET``, ``PASSWORD``, or ``PROFANITIES'``. This allows untrusted users to
+be able to give backtraces without seeing sensitive (or offensive) settings.
+
+Still, note that there are always going to be sections of your debug output that
+are inapporpriate for public consumption. File paths, configuration options, and
+the like all give attackers extra information about your server. Never deploy a
+site with ``DEBUG`` turned on.
+
DEFAULT_CHARSET
---------------
@@ -378,8 +400,10 @@ EMAIL_HOST_PASSWORD
Default: ``''`` (Empty string)
-Username to use for the SMTP server defined in ``EMAIL_HOST``. If empty,
-Django won't attempt authentication.
+Password to use for the SMTP server defined in ``EMAIL_HOST``. This setting is
+used in conjunction with ``EMAIL_HOST_USER`` when authenticating to the SMTP
+server. If either of these settings is empty, Django won't attempt
+authenticaion.
See also ``EMAIL_HOST_USER``.
@@ -409,12 +433,32 @@ Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins
or ``django.core.mail.mail_managers``. You'll probably want to include the
trailing space.
+EMAIL_USE_TLS
+-------------
+
+**New in Django development version**
+
+Default: ``False``
+
+Whether to use a TLS (secure) connection when talking to the SMTP server.
+
+FIXTURE_DIRS
+-------------
+
+Default: ``()`` (Empty tuple)
+
+List of locations of the fixture data files, in search order. Note that
+these paths should use Unix-style forward slashes, even on Windows. See
+`Testing Django Applications`_.
+
+.. _Testing Django Applications: ../testing/
+
IGNORABLE_404_ENDS
------------------
Default: ``('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php')``
-See also ``IGNORABLE_404_STARTS``.
+See also ``IGNORABLE_404_STARTS`` and ``Error reporting via e-mail``.
IGNORABLE_404_STARTS
--------------------
@@ -422,7 +466,8 @@ IGNORABLE_404_STARTS
Default: ``('/cgi-bin/', '/_vti_bin', '/_vti_inf')``
A tuple of strings that specify beginnings of URLs that should be ignored by
-the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS`` and ``IGNORABLE_404_ENDS``.
+the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS``, ``IGNORABLE_404_ENDS`` and
+the section on `error reporting via e-mail`_.
INSTALLED_APPS
--------------
@@ -433,7 +478,7 @@ A tuple of strings designating all applications that are enabled in this Django
installation. Each string should be a full Python path to a Python package that
contains a Django application, as created by `django-admin.py startapp`_.
-.. _django-admin.py startapp: http://www.djangoproject.com/documentation/django_admin/#startapp-appname
+.. _django-admin.py startapp: ../django-admin/#startapp-appname
INTERNAL_IPS
------------
@@ -464,49 +509,22 @@ A string representing the language code for this installation. This should be
in standard language format. For example, U.S. English is ``"en-us"``. See the
`internationalization docs`_.
-.. _internationalization docs: http://www.djangoproject.com/documentation/i18n/
+.. _internationalization docs: ../i18n/
LANGUAGES
---------
-Default: A tuple of all available languages. Currently, this is::
+Default: A tuple of all available languages. This list is continually growing
+and including a copy here would inevitably become rapidly out of date. You can
+see the current list of translated languages by looking in
+``django/conf/global_settings.py`` (or view the `online source`_).
- LANGUAGES = (
- ('ar', _('Arabic')),
- ('bn', _('Bengali')),
- ('cs', _('Czech')),
- ('cy', _('Welsh')),
- ('da', _('Danish')),
- ('de', _('German')),
- ('el', _('Greek')),
- ('en', _('English')),
- ('es', _('Spanish')),
- ('es_AR', _('Argentinean Spanish')),
- ('fr', _('French')),
- ('gl', _('Galician')),
- ('hu', _('Hungarian')),
- ('he', _('Hebrew')),
- ('is', _('Icelandic')),
- ('it', _('Italian')),
- ('ja', _('Japanese')),
- ('nl', _('Dutch')),
- ('no', _('Norwegian')),
- ('pt-br', _('Brazilian')),
- ('ro', _('Romanian')),
- ('ru', _('Russian')),
- ('sk', _('Slovak')),
- ('sl', _('Slovenian')),
- ('sr', _('Serbian')),
- ('sv', _('Swedish')),
- ('ta', _('Tamil')),
- ('uk', _('Ukrainian')),
- ('zh-cn', _('Simplified Chinese')),
- ('zh-tw', _('Traditional Chinese')),
- )
+.. _online source: http://code.djangoproject.com/browser/django/trunk/django/conf/global_settings.py
-A tuple of two-tuples in the format (language code, language name). This
-specifies which languages are available for language selection. See the
-`internationalization docs`_ for details.
+The list is a tuple of two-tuples in the format (language code, language
+name) -- for example, ``('ja', 'Japanese')``. This specifies which languages
+are available for language selection. See the `internationalization docs`_ for
+details.
Generally, the default value should suffice. Only set this setting if you want
to restrict language selection to a subset of the Django-provided languages.
@@ -533,6 +551,37 @@ strings for translation, but the translation won't happen at runtime -- so
you'll have to remember to wrap the languages in the *real* ``gettext()`` in
any code that uses ``LANGUAGES`` at runtime.
+LOGIN_REDIRECT_URL
+------------------
+
+**New in Django development version**
+
+Default: ``'/accounts/profile/'``
+
+The URL where requests are redirected after login when the
+``contrib.auth.login`` view gets no ``next`` parameter.
+
+This is used by the `@login_required`_ decorator, for example.
+
+LOGIN_URL
+---------
+
+**New in Django development version**
+
+Default: ``'/accounts/login/'``
+
+The URL where requests are redirected for login, specially when using the
+`@login_required`_ decorator.
+
+LOGOUT_URL
+----------
+
+**New in Django development version**
+
+Default: ``'/accounts/logout/'``
+
+LOGIN_URL counterpart.
+
MANAGERS
--------
@@ -557,6 +606,11 @@ Default: ``''`` (Empty string)
URL that handles the media served from ``MEDIA_ROOT``.
Example: ``"http://media.lawrence.com"``
+Note that this should have a trailing slash if it has a path component.
+
+Good: ``"http://www.example.com/static/"``
+Bad: ``"http://www.example.com/static"``
+
MIDDLEWARE_CLASSES
------------------
@@ -612,7 +666,7 @@ Default: Not defined
A string representing the full Python import path to your root URLconf. For example:
``"mydjangoapps.urls"``. See `How Django processes a request`_.
-.. _How Django processes a request: http://www.djangoproject.com/documentation/url_dispatch/#how-django-processes-a-request
+.. _How Django processes a request: ../url_dispatch/#how-django-processes-a-request
SECRET_KEY
----------
@@ -631,8 +685,19 @@ Default: ``False``
Whether to send an e-mail to the ``MANAGERS`` each time somebody visits a
Django-powered page that is 404ed with a non-empty referer (i.e., a broken
link). This is only used if ``CommonMiddleware`` is installed (see the
-`middleware docs`_). See also ``IGNORABLE_404_STARTS`` and
-``IGNORABLE_404_ENDS``.
+`middleware docs`_). See also ``IGNORABLE_404_STARTS``,
+``IGNORABLE_404_ENDS`` and the section on `error reporting via e-mail`_
+
+SERIALIZATION_MODULES
+---------------------
+
+Default: Not defined.
+
+A dictionary of modules containing serializer definitions (provided as
+strings), keyed by a string identifier for that serialization type. For
+example, to define a YAML serializer, use::
+
+ SERIALIZATION_MODULES = { 'yaml' : 'path.to.yaml_serializer' }
SERVER_EMAIL
------------
@@ -669,8 +734,6 @@ See the `session docs`_.
SESSION_COOKIE_SECURE
---------------------
-**New in Django development version**
-
Default: ``False``
Whether to use a secure cookie for the session cookie. If this is set to
@@ -704,7 +767,7 @@ and a single database can manage content for multiple sites.
See the `site framework docs`_.
-.. _site framework docs: http://www.djangoproject.com/documentation/sites/
+.. _site framework docs: ../sites/
TEMPLATE_CONTEXT_PROCESSORS
---------------------------
@@ -713,7 +776,8 @@ Default::
("django.core.context_processors.auth",
"django.core.context_processors.debug",
- "django.core.context_processors.i18n")
+ "django.core.context_processors.i18n",
+ "django.core.context_processors.media")
A tuple of callables that are used to populate the context in ``RequestContext``.
These callables take a request object as their argument and return a dictionary
@@ -760,32 +824,59 @@ Default: ``''`` (Empty string)
Output, as a string, that the template system should use for invalid (e.g.
misspelled) variables. See `How invalid variables are handled`_.
-.. _How invalid variables are handled: http://www.djangoproject.com/documentation/templates_python/#how-invalid-variables-are-handled
+.. _How invalid variables are handled: ../templates_python/#how-invalid-variables-are-handled
-TEST_RUNNER
------------
+TEST_DATABASE_CHARSET
+---------------------
**New in Django development version**
-Default: ``'django.test.simple.run_tests'``
+Default: ``None``
-The name of the method to use for starting the test suite. See
-`Testing Django Applications`_.
+The character set encoding used to create the test database. The value of this
+string is passed directly through to the database, so its format is
+backend-specific.
-.. _Testing Django Applications: ../testing/
+Supported for the PostgreSQL_ (``postgresql``, ``postgresql_psycopg2``) and MySQL_ (``mysql``, ``mysql_old``) backends.
-TEST_DATABASE_NAME
-------------------
+.. _PostgreSQL: http://www.postgresql.org/docs/8.2/static/multibyte.html
+.. _MySQL: http://www.mysql.org/doc/refman/5.0/en/charset-database.html
+
+TEST_DATABASE_COLLATION
+------------------------
**New in Django development version**
Default: ``None``
-The name of database to use when running the test suite. If a value of
+The collation order to use when creating the test database. This value is
+passed directly to the backend, so its format is backend-specific.
+
+Only supported for ``mysql`` and ``mysql_old`` backends (see `section 10.3.2`_
+of the MySQL manual for details).
+
+.. _section 10.3.2: http://www.mysql.org/doc/refman/5.0/en/charset-database.html
+
+TEST_DATABASE_NAME
+------------------
+
+Default: ``None``
+
+The name of database to use when running the test suite. If a value of
``None`` is specified, the test database will use the name ``'test_' + settings.DATABASE_NAME``. See `Testing Django Applications`_.
.. _Testing Django Applications: ../testing/
+TEST_RUNNER
+-----------
+
+Default: ``'django.test.simple.run_tests'``
+
+The name of the method to use for starting the test suite. See
+`Testing Django Applications`_.
+
+.. _Testing Django Applications: ../testing/
+
TIME_FORMAT
-----------
@@ -798,7 +889,7 @@ pages -- and, possibly, by other parts of the system. See
See also DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and
MONTH_DAY_FORMAT.
-.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+.. _allowed date format strings: ../templates/#now
TIME_ZONE
---------
@@ -822,6 +913,11 @@ manual configuration option (see below), Django will *not* touch the ``TZ``
environment variable, and it'll be up to you to ensure your processes are
running in the correct environment.
+.. note::
+ Django cannot reliably use alternate time zones in a Windows environment.
+ If you're running Django on Windows, this variable must be set to match the
+ system timezone.
+
URL_VALIDATOR_USER_AGENT
------------------------
@@ -830,7 +926,7 @@ Default: ``Django/<version> (http://www.djangoproject.com/)``
The string to use as the ``User-Agent`` header when checking to see if URLs
exist (see the ``verify_exists`` option on URLField_).
-.. _URLField: ../model_api/#urlfield
+.. _URLField: ../model-api/#urlfield
USE_ETAGS
---------
@@ -868,11 +964,11 @@ Different locales have different formats. For example, U.S. English would say
See `allowed date format strings`_. See also DATE_FORMAT, DATETIME_FORMAT,
TIME_FORMAT and MONTH_DAY_FORMAT.
-.. _cache docs: http://www.djangoproject.com/documentation/cache/
-.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
-.. _session docs: http://www.djangoproject.com/documentation/sessions/
+.. _cache docs: ../cache/
+.. _middleware docs: ../middleware/
+.. _session docs: ../sessions/
.. _See available choices: http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
-.. _template documentation: http://www.djangoproject.com/documentation/templates_python/
+.. _template documentation: ../templates_python/
Creating your own settings
==========================
@@ -967,3 +1063,38 @@ Also, it's an error to call ``configure()`` more than once, or to call
It boils down to this: Use exactly one of either ``configure()`` or
``DJANGO_SETTINGS_MODULE``. Not both, and not neither.
+
+.. _@login_required: ../authentication/#the-login-required-decorator
+
+Error reporting via e-mail
+==========================
+
+Server errors
+-------------
+
+When ``DEBUG`` is ``False``, Django will e-mail the users listed in the
+``ADMIN`` setting whenever your code raises an unhandled exception and results
+in an internal server error (HTTP status code 500). This gives the
+administrators immediate notification of any errors.
+
+To disable this behavior, just remove all entries from the ``ADMINS`` setting.
+
+404 errors
+----------
+
+When ``DEBUG`` is ``False`` and your ``MIDDLEWARE_CLASSES`` setting includes
+``CommonMiddleware``, Django will e-mail the users listed in the ``MANAGERS``
+setting whenever your code raises a 404 and the request has a referer.
+(It doesn't bother to e-mail for 404s that don't have a referer.)
+
+You can tell Django to stop reporting particular 404s by tweaking the
+``IGNORABLE_404_ENDS`` and ``IGNORABLE_404_STARTS`` settings. Both should be a
+tuple of strings. For example::
+
+ IGNORABLE_404_ENDS = ('.php', '.cgi')
+ IGNORABLE_404_STARTS = ('/phpmyadmin/',)
+
+In this example, a 404 to any URL ending with ``.php`` or ``.cgi`` will *not*
+be reported. Neither will any URL starting with ``/phpmyadmin/``.
+
+To disable this behavior, just remove all entries from the ``MANAGERS`` setting.
diff --git a/docs/sitemaps.txt b/docs/sitemaps.txt
index 7414567b16..550f448de1 100644
--- a/docs/sitemaps.txt
+++ b/docs/sitemaps.txt
@@ -2,8 +2,6 @@
The sitemap framework
=====================
-**New in Django development version**.
-
Django comes with a high-level sitemap-generating framework that makes
creating sitemap_ XML files easy.
@@ -23,8 +21,8 @@ you express this information in Python code.
It works much like Django's `syndication framework`_. To create a sitemap, just
write a ``Sitemap`` class and point to it in your URLconf_.
-.. _syndication framework: http://www.djangoproject.com/documentation/syndication/
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _syndication framework: ../syndication/
+.. _URLconf: ../url_dispatch/
Installation
============
@@ -41,9 +39,9 @@ To install the sitemap app, follow these steps:
reason it needs to go into ``INSTALLED_APPS`` is so that the
``load_template_source`` template loader can find the default templates.)
-.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps
-.. _TEMPLATE_LOADERS: http://www.djangoproject.com/documentation/settings/#template-loaders
-.. _sites framework: http://www.djangoproject.com/documentation/sites/
+.. _INSTALLED_APPS: ../settings/#installed-apps
+.. _TEMPLATE_LOADERS: ../settings/#template-loaders
+.. _sites framework: ../sites/
Initialization
==============
@@ -68,7 +66,7 @@ The sitemap view takes an extra, required argument: ``{'sitemaps': sitemaps}``.
``NewsSitemap``). It may also map to an *instance* of a ``Sitemap`` class
(e.g., ``BlogSitemap(some_var)``).
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _URLconf: ../url_dispatch/
Sitemap classes
===============
@@ -217,8 +215,8 @@ defined for the current ``SITE_ID`` (see the `sites documentation`_) and
creates an entry in the sitemap. These entries include only the ``location``
attribute -- not ``lastmod``, ``changefreq`` or ``priority``.
-.. _flatpages: http://www.djangoproject.com/documentation/flatpages/
-.. _sites documentation: http://www.djangoproject.com/documentation/sites/
+.. _flatpages: ../flatpages/
+.. _sites documentation: ../sites/
``GenericSitemap``
------------------
@@ -232,7 +230,7 @@ the ``lastmod`` attribute in the generated sitemap. You may also pass
``priority`` and ``changefreq`` keyword arguments to the ``GenericSitemap``
constructor to specify these attributes for all URLs.
-.. _generic views: http://www.djangoproject.com/documentation/generic_views/
+.. _generic views: ../generic_views/
Example
-------
@@ -261,7 +259,7 @@ Here's an example of a URLconf_ using both::
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})
)
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _URLconf: ../url_dispatch/
Creating a sitemap index
========================
diff --git a/docs/sites.txt b/docs/sites.txt
index 8c5f1fc64b..12259b04c3 100644
--- a/docs/sites.txt
+++ b/docs/sites.txt
@@ -276,8 +276,8 @@ you want your admin site to have access to all objects (not just site-specific
ones), put ``objects = models.Manager()`` in your model, before you define
``CurrentSiteManager``.
-.. _manager: http://www.djangoproject.com/documentation/model_api/#managers
-.. _manager documentation: http://www.djangoproject.com/documentation/model_api/#managers
+.. _manager: ../model-api/#managers
+.. _manager documentation: ../model-api/#managers
How Django uses the sites framework
===================================
@@ -316,7 +316,7 @@ Here's how Django uses the sites framework:
* The shortcut view (``django.views.defaults.shortcut``) uses the domain of
the current ``Site`` object when calculating an object's URL.
-.. _redirects framework: http://www.djangoproject.com/documentation/redirects/
-.. _flatpages framework: http://www.djangoproject.com/documentation/flatpages/
-.. _syndication framework: http://www.djangoproject.com/documentation/syndication/
-.. _authentication framework: http://www.djangoproject.com/documentation/authentication/
+.. _redirects framework: ../redirects/
+.. _flatpages framework: ../flatpages/
+.. _syndication framework: ../syndication/
+.. _authentication framework: ../authentication/
diff --git a/docs/static_files.txt b/docs/static_files.txt
index 55380a659b..b6a1d278fd 100644
--- a/docs/static_files.txt
+++ b/docs/static_files.txt
@@ -24,7 +24,7 @@ production setting. Use this only for development.
For information on serving static files in an Apache production environment,
see the `Django mod_python documentation`_.
-.. _Django mod_python documentation: http://www.djangoproject.com/documentation/modpython/#serving-media-files
+.. _Django mod_python documentation: ../modpython/#serving-media-files
How to do it
============
@@ -49,7 +49,7 @@ Examples:
* The file ``/path/bar.jpg`` will not be accessible, because it doesn't
fall under the document root.
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _URLconf: ../url_dispatch/
Directory listings
==================
@@ -122,4 +122,4 @@ associated with the ``django.views.static.serve`` view. If not
Of course, the catch here is that you'll have to remember to set ``DEBUG=False``
in your production settings file. But you should be doing that anyway.
-.. _DEBUG setting: http://www.djangoproject.com/documentation/settings/#debug
+.. _DEBUG setting: ../settings/#debug
diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt
index 59a9022d9b..2a03e6d5a6 100644
--- a/docs/syndication_feeds.txt
+++ b/docs/syndication_feeds.txt
@@ -26,7 +26,7 @@ to determine which feed to output.
To create a feed, just write a ``Feed`` class and point to it in your URLconf_.
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _URLconf: ../url_dispatch/
Initialization
--------------
@@ -72,8 +72,8 @@ The above example registers two feeds:
Once that's set up, you just need to define the ``Feed`` classes themselves.
-.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
-.. _settings file: http://www.djangoproject.com/documentation/settings/
+.. _URLconf: ../url_dispatch/
+.. _settings file: ../settings/
Feed classes
------------
@@ -114,6 +114,9 @@ Note:
`object-relational mapper`_, ``items()`` doesn't have to return model
instances. Although you get a few bits of functionality "for free" by
using Django models, ``items()`` can return any type of object you want.
+ * If you're creating an Atom feed, rather than an RSS feed, set the
+ ``subtitle`` attribute instead of the ``description`` attribute. See
+ `Publishing Atom and RSS feeds in tandem`_, later, for an example.
One thing's left to do. In an RSS feed, each ``<item>`` has a ``<title>``,
``<link>`` and ``<description>``. We need to tell the framework what data to
@@ -127,7 +130,7 @@ put into those elements.
it two template context variables:
* ``{{ obj }}`` -- The current object (one of whichever objects you
- returned in ``items()``).
+ returned in ``items()``).
* ``{{ site }}`` -- A ``django.models.core.sites.Site`` object
representing the current site. This is useful for
``{{ site.domain }}`` or ``{{ site.name }}``.
@@ -143,7 +146,10 @@ put into those elements.
exist, it tries calling a method ``item_link()`` in the ``Feed`` class,
passing it a single parameter, ``item``, which is the object itself.
Both ``get_absolute_url()`` and ``item_link()`` should return the item's
- URL as a normal Python string.
+ URL as a normal Python string. As with ``get_absolute_url()``, the
+ result of ``item_link()`` will be included directly in the URL, so you
+ are responsible for doing all necessary URL quoting and conversion to
+ ASCII inside the method itself.
* For the LatestEntries example above, we could have very simple feed templates:
@@ -156,8 +162,8 @@ put into those elements.
{{ obj.description }}
.. _chicagocrime.org: http://www.chicagocrime.org/
-.. _object-relational mapper: http://www.djangoproject.com/documentation/db_api/
-.. _Django templates: http://www.djangoproject.com/documentation/templates/
+.. _object-relational mapper: ../db-api/
+.. _Django templates: ../templates/
A complex example
-----------------
@@ -277,7 +283,7 @@ Feeds created by the syndication framework automatically include the
appropriate ``<language>`` tag (RSS 2.0) or ``xml:lang`` attribute (Atom). This
comes directly from your `LANGUAGE_CODE setting`_.
-.. _LANGUAGE_CODE setting: http://www.djangoproject.com/documentation/settings/#language-code
+.. _LANGUAGE_CODE setting: ../settings/#language-code
URLs
----
@@ -292,13 +298,13 @@ Atom feeds require a ``<link rel="self">`` that defines the feed's current
location. The syndication framework populates this automatically, using the
domain of the current site according to the SITE_ID setting.
-.. _SITE_ID setting: http://www.djangoproject.com/documentation/settings/#site-id
+.. _SITE_ID setting: ../settings/#site-id
Publishing Atom and RSS feeds in tandem
---------------------------------------
Some developers like to make available both Atom *and* RSS versions of their
-feeds. That's easy to do with Django: Just create a subclass of your ``feed``
+feeds. That's easy to do with Django: Just create a subclass of your ``Feed``
class and set the ``feed_type`` to something different. Then update your
URLconf to add the extra versions.
@@ -318,6 +324,20 @@ Here's a full example::
class AtomSiteNewsFeed(RssSiteNewsFeed):
feed_type = Atom1Feed
+ subtitle = RssSiteNewsFeed.description
+
+.. Note::
+ In this example, the RSS feed uses a ``description`` while the Atom feed
+ uses a ``subtitle``. That's because Atom feeds don't provide for a
+ feed-level "description," but they *do* provide for a "subtitle."
+
+ If you provide a ``description`` in your ``Feed`` class, Django will *not*
+ automatically put that into the ``subtitle`` element, because a subtitle
+ and description are not necessarily the same thing. Instead, you should
+ define a ``subtitle`` attribute.
+
+ In the above example, we simply set the Atom feed's ``subtitle`` to the
+ RSS feed's ``description``, because it's quite short already.
And the accompanying URLconf::
@@ -478,6 +498,22 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
categories = ("python", "django") # Hard-coded list of categories.
+ # COPYRIGHT NOTICE -- One of the following three is optional. The
+ # framework looks for them in this order.
+
+ def copyright(self, obj):
+ """
+ Takes the object returned by get_object() and returns the feed's
+ copyright notice as a normal Python string.
+ """
+
+ def copyright(self):
+ """
+ Returns the feed's copyright notice as a normal Python string.
+ """
+
+ copyright = 'Copyright (c) 2007, Sally Smith' # Hard-coded copyright notice.
+
# ITEMS -- One of the following three is required. The framework looks
# for them in this order.
@@ -613,15 +649,15 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
def item_enclosure_mime_type(self, item):
"""
Takes an item, as returned by items(), and returns the item's
- enclosure mime type.
+ enclosure MIME type.
"""
def item_enclosure_mime_type(self):
"""
- Returns the enclosure length, in bytes, for every item in the feed.
+ Returns the enclosure MIME type for every item in the feed.
"""
- item_enclosure_mime_type = "audio/mpeg" # Hard-coded enclosure mime-type.
+ item_enclosure_mime_type = "audio/mpeg" # Hard-coded enclosure MIME type.
# ITEM PUBDATE -- It's optional to use one of these three. This is a
# hook that specifies how to get the pubdate for a given item.
@@ -659,6 +695,23 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
item_categories = ("python", "django") # Hard-coded categories.
+ # ITEM COPYRIGHT NOTICE (only applicable to Atom feeds) -- One of the
+ # following three is optional. The framework looks for them in this
+ # order.
+
+ def item_copyright(self, obj):
+ """
+ Takes an item, as returned by items(), and returns the item's
+ copyright notice as a normal Python string.
+ """
+
+ def item_copyright(self):
+ """
+ Returns the copyright notice for every item in the feed.
+ """
+
+ item_copyright = 'Copyright (c) 2007, Sally Smith' # Hard-coded copyright notice.
+
The low-level framework
=======================
diff --git a/docs/templates.txt b/docs/templates.txt
index b4cc47b9f3..cb8e238f43 100644
--- a/docs/templates.txt
+++ b/docs/templates.txt
@@ -91,9 +91,12 @@ Filters can be "chained." The output of one filter is applied to the next.
``{{ text|escape|linebreaks }}`` is a common idiom for escaping text contents,
then converting line breaks to ``<p>`` tags.
-Some filters take arguments. A filter argument looks like this:
-``{{ bio|truncatewords:"30" }}``. This will display the first 30 words of the
-``bio`` variable. Filter arguments always are in double quotes.
+Some filters take arguments. A filter argument looks like this: ``{{
+bio|truncatewords:30 }}``. This will display the first 30 words of the ``bio``
+variable.
+
+Filter arguments that contain spaces must be quoted; for example, to join a list
+with commas and spaced you'd use ``{{ list|join:", " }}``.
The `Built-in filter reference`_ below describes all the built-in filters.
@@ -112,9 +115,7 @@ know how to write Python code.
Comments
========
-**New in Django development version**
-
-To comment-out part of a template, use the comment syntax: ``{# #}``.
+To comment-out part of a line in a template, use the comment syntax: ``{# #}``.
For example, this template would render as ``'hello'``::
@@ -124,6 +125,12 @@ A comment can contain any template code, invalid or not. For example::
{# {% if foo %}bar{% else %} #}
+This syntax can only be used for single-line comments (no newlines are
+permitted between the ``{#`` and ``#}`` delimiters). If you need to comment
+out a multiline portion of the template, see the ``comment`` tag, below__.
+
+__ comment_
+
Template inheritance
====================
@@ -253,6 +260,16 @@ Here are some tips for working with inheritance:
if you want to add to the contents of a parent block instead of
completely overriding it.
+ * For extra readability, you can optionally give a *name* to your
+ ``{% endblock %}`` tag. For example::
+
+ {% block content %}
+ ...
+ {% endblock content %}
+
+ In larger templates, this technique helps you see which ``{% block %}``
+ tags are being closed.
+
Finally, note that you can't define multiple ``{% block %}`` tags with the same
name in the same template. This limitation exists because a block tag works in
"both" directions. That is, a block tag doesn't just provide a hole to fill --
@@ -430,7 +447,7 @@ for
~~~
Loop over each item in an array. For example, to display a list of athletes
-given ``athlete_list``::
+provided in ``athlete_list``::
<ul>
{% for athlete in athlete_list %}
@@ -438,7 +455,25 @@ given ``athlete_list``::
{% endfor %}
</ul>
-You can also loop over a list in reverse by using ``{% for obj in list reversed %}``.
+You can loop over a list in reverse by using ``{% for obj in list reversed %}``.
+
+**New in Django development version**
+If you need to loop over a list of lists, you can unpack the values
+in eachs sub-list into a set of known names. For example, if your context contains
+a list of (x,y) coordinates called ``points``, you could use the following
+to output the list of points::
+
+ {% for x, y in points %}
+ There is a point at {{ x }},{{ y }}
+ {% endfor %}
+
+This can also be useful if you need to access the items in a dictionary.
+For example, if your context contained a dictionary ``data``, the following
+would display the keys and values of the dictionary::
+
+ {% for key, value in data.items %}
+ {{ key }}: {{ value }}
+ {% endfor %}
The for loop sets a number of variables available within the loop:
@@ -538,9 +573,9 @@ The 'ifchanged' block tag is used within a loop. It has two possible uses.
<a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
{% endfor %}
-2. **New in Django development version.** If given a variable, check whether that
- variable has changed. For example, the following shows the date every time it
- changes, but only shows the hour if both the hour and the date has changed::
+2. If given a variable, check whether that variable has changed. For
+ example, the following shows the date every time it changes, but
+ only shows the hour if both the hour and the date has changed::
{% for date in days %}
{% ifchanged date.date %} {{ date.date }} {% endifchanged %}
@@ -635,6 +670,7 @@ Available format strings:
output, because this includes periods
to match Associated Press style.)
A ``'AM'`` or ``'PM'``. ``'AM'``
+ b Month, textual, 3 letters, lowercase. ``'jan'``
B Not implemented.
d Day of the month, 2 digits with ``'01'`` to ``'31'``
leading zeros.
@@ -693,11 +729,11 @@ Example::
Note that you can backslash-escape a format string if you want to use the
"raw" value. In this example, "f" is backslash-escaped, because otherwise
"f" is a format string that displays the time. The "o" doesn't need to be
-escaped, because it's not a format character.::
+escaped, because it's not a format character::
It is the {% now "jS o\f F" %}
-(Displays "It is the 4th of September" %}
+This would display as "It is the 4th of September".
regroup
~~~~~~~
@@ -728,6 +764,7 @@ The following snippet of template code would accomplish this dubious task::
<li>{{ item }}</li>
{% endfor %}
</ul>
+ </li>
{% endfor %}
</ul>
@@ -747,7 +784,7 @@ i.e.::
spaceless
~~~~~~~~~
-Normalizes whitespace between HTML tags to a single space. This includes tab
+Removes whitespace between HTML tags. This includes tab
characters and newlines.
Example usage::
@@ -760,9 +797,9 @@ Example usage::
This example would return this HTML::
- <p> <a href="foo/">Foo</a> </p>
+ <p><a href="foo/">Foo</a></p>
-Only space between *tags* is normalized -- not space between tags and text. In
+Only space between *tags* is removed -- not space between tags and text. In
this example, the space around ``Hello`` won't be stripped::
{% spaceless %}
@@ -792,7 +829,7 @@ Note that if you use ``{% ssi %}``, you'll need to define
See also: ``{% include %}``.
-.. _ALLOWED_INCLUDE_ROOTS: http://www.djangoproject.com/documentation/settings/#allowed-include-roots
+.. _ALLOWED_INCLUDE_ROOTS: ../settings/#allowed-include-roots
templatetag
~~~~~~~~~~~
@@ -817,7 +854,38 @@ The argument tells which template bit to output:
``closecomment`` ``#}``
================== =======
-Note: ``opencomment`` and ``closecomment`` are new in the Django development version.
+url
+~~~
+
+**Note that the syntax for this tag may change in the future, as we make it more robust.**
+
+Returns an absolute URL (i.e., a URL without the domain name) matching a given
+view function and optional parameters. This is a way to output links without
+violating the DRY principle by having to hard-code URLs in your templates::
+
+ {% url path.to.some_view arg1,arg2,name1=value1 %}
+
+The first argument is a path to a view function in the format
+``package.package.module.function``. Additional arguments are optional and
+should be comma-separated values that will be used as positional and keyword
+arguments in the URL. All arguments required by the URLconf should be present.
+
+For example, suppose you have a view, ``app_views.client``, whose URLconf
+takes a client ID (here, ``client()`` is a method inside the views file
+``app_views.py``). The URLconf line might look like this::
+
+ ('^client/(\d+)/$', 'app_views.client')
+
+If this app's URLconf is included into the project's URLconf under a path
+such as this::
+
+ ('^clients/', include('project_name.app_name.urls'))
+
+...then, in a template, you can create a link to this view like this::
+
+ {% url app_views.client client.id %}
+
+The template tag will output the string ``/clients/client/123/``.
widthratio
~~~~~~~~~~
@@ -833,6 +901,23 @@ Above, if ``this_value`` is 175 and ``max_value`` is 200, the the image in the
above example will be 88 pixels wide (because 175/200 = .875; .875 * 100 = 87.5
which is rounded up to 88).
+with
+~~~~
+
+**New in Django development version**
+
+Caches a complex variable under a simpler name. This is useful when accessing
+an "expensive" method (e.g., one that hits the database) multiple times.
+
+For example::
+
+ {% with business.employees.count as total %}
+ {{ total }} employee{{ total|pluralize }}
+ {% endwith %}
+
+The populated variable (in the example above, ``total``) is only available
+between the ``{% with %}`` and ``{% endwith %}`` tags.
+
Built-in filter reference
-------------------------
@@ -924,13 +1009,29 @@ Replaces ampersands with ``&amp;`` entities.
floatformat
~~~~~~~~~~~
-Rounds a floating-point number to one decimal place -- but only if there's a
-decimal part to be displayed. For example:
+When used without an argument, rounds a floating-point number to one decimal
+place -- but only if there's a decimal part to be displayed. For example:
* ``36.123`` gets converted to ``36.1``
* ``36.15`` gets converted to ``36.2``
* ``36`` gets converted to ``36``
+If used with a numeric integer argument, ``floatformat`` rounds a number to that
+many decimal places. For example:
+
+ * ``36.1234`` with floatformat:3 gets converted to ``36.123``
+ * ``36`` with floatformat:4 gets converted to ``36.0000``
+
+If the argument passed to ``floatformat`` is negative, it will round a number to
+that many decimal places -- but only if there's a decimal part to be displayed.
+For example:
+
+ * ``36.1234`` with floatformat:-3 gets converted to ``36.123``
+ * ``36`` with floatformat:-4 gets converted to ``36``
+
+Using ``floatformat`` with no argument is equivalent to using ``floatformat`` with
+an argument of ``-1``.
+
get_digit
~~~~~~~~~
@@ -1115,6 +1216,16 @@ Truncates a string after a certain number of words.
**Argument:** Number of words to truncate after
+truncatewords_html
+~~~~~~~~~~~~~~~~~~
+
+Similar to ``truncatewords``, except that it is aware of HTML tags. Any tags
+that are opened in the string and not closed before the truncation point, are
+closed immediately after the truncation.
+
+This is less efficient than ``truncatewords``, so should only be used when it
+is being passed HTML text.
+
unordered_list
~~~~~~~~~~~~~~
@@ -1200,7 +1311,7 @@ django.contrib.humanize
A set of Django template filters useful for adding a "human touch" to data. See
the `humanize documentation`_.
-.. _humanize documentation: http://www.djangoproject.com/documentation/add_ons/#humanize
+.. _humanize documentation: ../add_ons/#humanize
django.contrib.markup
---------------------
@@ -1210,3 +1321,11 @@ A collection of template filters that implement these common markup languages:
* Textile
* Markdown
* ReST (ReStructured Text)
+
+django.contrib.webdesign
+------------------------
+
+A collection of template tags that can be useful while designing a website,
+such as a generator of Lorem Ipsum text. See the `webdesign documentation`_.
+
+.. _webdesign documentation: ../webdesign/
diff --git a/docs/templates_python.txt b/docs/templates_python.txt
index 7aeed935b9..c967df1a49 100644
--- a/docs/templates_python.txt
+++ b/docs/templates_python.txt
@@ -11,7 +11,7 @@ If you're looking to use the Django template system as part of another
application -- i.e., without the rest of the framework -- make sure to read
the `configuration`_ section later in this document.
-.. _`The Django template language: For template authors`: http://www.djangoproject.com/documentation/templates/
+.. _`The Django template language: For template authors`: ../templates/
Basics
======
@@ -212,21 +212,24 @@ template tags. If an invalid variable is provided to one of these template
tags, the variable will be interpreted as ``None``. Filters are always
applied to invalid variables within these template tags.
+If ``TEMPLATE_STRING_IF_INVALID`` contains a ``'%s'``, the format marker will
+be replaced with the name of the invalid variable.
+
.. admonition:: For debug purposes only!
- While ``TEMPLATE_STRING_IF_INVALID`` can be a useful debugging tool,
- it is a bad idea to turn it on as a 'development default'.
-
- Many templates, including those in the Admin site, rely upon the
- silence of the template system when a non-existent variable is
+ While ``TEMPLATE_STRING_IF_INVALID`` can be a useful debugging tool,
+ it is a bad idea to turn it on as a 'development default'.
+
+ Many templates, including those in the Admin site, rely upon the
+ silence of the template system when a non-existent variable is
encountered. If you assign a value other than ``''`` to
- ``TEMPLATE_STRING_IF_INVALID``, you will experience rendering
+ ``TEMPLATE_STRING_IF_INVALID``, you will experience rendering
problems with these templates and sites.
-
- Generally, ``TEMPLATE_STRING_IF_INVALID`` should only be enabled
- in order to debug a specific template problem, then cleared
+
+ Generally, ``TEMPLATE_STRING_IF_INVALID`` should only be enabled
+ in order to debug a specific template problem, then cleared
once debugging is complete.
-
+
Playing with Context objects
----------------------------
@@ -291,7 +294,8 @@ return a dictionary of items to be merged into the context. By default,
("django.core.context_processors.auth",
"django.core.context_processors.debug",
- "django.core.context_processors.i18n")
+ "django.core.context_processors.i18n",
+ "django.core.context_processors.media")
Each processor is applied in order. That means, if one processor adds a
variable to the context and a second processor adds a variable with the same
@@ -327,8 +331,8 @@ Note::
Here's what each of the default processors does:
-.. _HttpRequest object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
-.. _TEMPLATE_CONTEXT_PROCESSORS setting: http://www.djangoproject.com/documentation/settings/#template-context-processors
+.. _HttpRequest object: ../request_response/#httprequest-objects
+.. _TEMPLATE_CONTEXT_PROCESSORS setting: ../settings/#template-context-processors
django.core.context_processors.auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -345,7 +349,7 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
``request.user.get_and_delete_messages()`` for every request. That method
collects the user's messages and deletes them from the database.
- Note that messages are set with ``user.add_message()``. See the
+ Note that messages are set with ``user.message_set.create``. See the
`message docs`_ for more.
* ``perms`` -- An instance of
@@ -353,9 +357,9 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
permissions that the currently logged-in user has. See the `permissions
docs`_.
-.. _user authentication docs: http://www.djangoproject.com/documentation/authentication/#users
-.. _message docs: http://www.djangoproject.com/documentation/authentication/#messages
-.. _permissions docs: http://www.djangoproject.com/documentation/authentication/#permissions
+.. _user authentication docs: ../authentication/#users
+.. _message docs: ../authentication/#messages
+.. _permissions docs: ../authentication/#permissions
django.core.context_processors.debug
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -383,9 +387,18 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
See the `internationalization docs`_ for more.
-.. _LANGUAGES setting: http://www.djangoproject.com/documentation/settings/#languages
-.. _LANGUAGE_CODE setting: http://www.djangoproject.com/documentation/settings/#language-code
-.. _internationalization docs: http://www.djangoproject.com/documentation/i18n/
+.. _LANGUAGES setting: ../settings/#languages
+.. _LANGUAGE_CODE setting: ../settings/#language-code
+.. _internationalization docs: ../i18n/
+
+django.core.context_processors.media
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
+``RequestContext`` will contain a variable ``MEDIA_URL``, providing the
+value of the `MEDIA_URL setting`_.
+
+.. _MEDIA_URL setting: ../settings/#media-url
django.core.context_processors.request
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -654,6 +667,18 @@ decorator instead::
If you leave off the ``name`` argument, as in the second example above, Django
will use the function's name as the filter name.
+Template filters which expect strings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+If you are writing a template filter which only expects a string as the first
+argument, you should use the included decorator ``stringfilter`` which will convert
+an object to it's string value before being passed to your function::
+
+ from django import template
+
+ @template.stringfilter
+ def lower(value):
+ return value.lower()
+
Writing custom template tags
----------------------------
@@ -668,14 +693,15 @@ how the compilation works and how the rendering works.
When Django compiles a template, it splits the raw template text into
''nodes''. Each node is an instance of ``django.template.Node`` and has
-a ``render()`` method. A compiled template is, simply, a list of ``Node``
-objects. When you call ``render()`` on a compiled template object, the template
-calls ``render()`` on each ``Node`` in its node list, with the given context.
-The results are all concatenated together to form the output of the template.
+either a ``render()`` or ``iter_render()`` method. A compiled template is,
+simply, a list of ``Node`` objects. When you call ``render()`` on a compiled
+template object, the template calls ``render()`` on each ``Node`` in its node
+list, with the given context. The results are all concatenated together to
+form the output of the template.
Thus, to define a custom template tag, you specify how the raw template tag is
converted into a ``Node`` (the compilation function), and what the node's
-``render()`` method does.
+``render()`` or ``iter_render()`` method does.
Writing the compilation function
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -702,7 +728,7 @@ object::
# split_contents() knows not to split quoted strings.
tag_name, format_string = token.split_contents()
except ValueError:
- raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents[0]
+ raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
return CurrentTimeNode(format_string[1:-1])
@@ -745,7 +771,8 @@ Writing the renderer
~~~~~~~~~~~~~~~~~~~~
The second step in writing custom tags is to define a ``Node`` subclass that
-has a ``render()`` method.
+has a ``render()`` method (we will discuss the ``iter_render()`` alternative
+in `Improving rendering speed`_, below).
Continuing the above example, we need to define ``CurrentTimeNode``::
@@ -801,6 +828,70 @@ Python 2.4 and above::
If you leave off the ``name`` argument, as in the second example above, Django
will use the function's name as the tag name.
+Passing template variables to the tag
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Although you can pass any number of arguments to a template tag using
+``token.split_contents()``, the arguments are all unpacked as
+string literals. A little more work is required in order to dynamic content (a
+template variable) to a template tag as an argument.
+
+While the previous examples have formatted the current time into a string and
+returned the string, suppose you wanted to pass in a ``DateTimeField`` from an
+object and have the template tag format that date-time::
+
+ <p>This post was last updated at {% format_time blog_entry.date_updated "%Y-%m-%d %I:%M %p" %}.</p>
+
+Initially, ``token.split_contents()`` will return three values:
+
+ 1. The tag name ``format_time``.
+ 2. The string "blog_entry.date_updated" (without the surrounding quotes).
+ 3. The formatting string "%Y-%m-%d %I:%M %p". The return value from
+ ``split_contents()`` will include the leading and trailing quotes for
+ string literals like this.
+
+Now your tag should begin to look like this::
+
+ from django import template
+ def do_format_time(parser, token):
+ try:
+ # split_contents() knows not to split quoted strings.
+ tag_name, date_to_be_formatted, format_string = token.split_contents()
+ except ValueError:
+ raise template.TemplateSyntaxError, "%r tag requires exactly two arguments" % token.contents.split()[0]
+ if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
+ raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
+ return FormatTimeNode(date_to_be_formatted, format_string[1:-1])
+
+You also have to change the renderer to retrieve the actual contents of the
+``date_updated`` property of the ``blog_entry`` object. This can be
+accomplished by using the ``resolve_variable()`` function in
+``django.template``. You pass ``resolve_variable()`` the variable name and the
+current context, available in the ``render`` method::
+
+ from django import template
+ from django.template import resolve_variable
+ import datetime
+ class FormatTimeNode(template.Node):
+ def __init__(self, date_to_be_formatted, format_string):
+ self.date_to_be_formatted = date_to_be_formatted
+ self.format_string = format_string
+
+ def render(self, context):
+ try:
+ actual_date = resolve_variable(self.date_to_be_formatted, context)
+ return actual_date.strftime(self.format_string)
+ except template.VariableDoesNotExist:
+ return ''
+
+``resolve_variable`` will try to resolve ``blog_entry.date_updated`` and then
+format it accordingly.
+
+.. note::
+ The ``resolve_variable()`` function will throw a ``VariableDoesNotExist``
+ exception if it cannot resolve the string passed to it in the current
+ context of the page.
+
Shortcut for simple tags
~~~~~~~~~~~~~~~~~~~~~~~~
@@ -944,7 +1035,7 @@ The ``takes_context`` parameter defaults to ``False``. When it's set to *True*,
the tag is passed the context object, as in this example. That's the only
difference between this case and the previous ``inclusion_tag`` example.
-.. _tutorials: http://www.djangoproject.com/documentation/tutorial1/#creating-models
+.. _tutorials: ../tutorial01/#creating-models
Setting a variable in the context
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1001,7 +1092,7 @@ class, like so::
# Splitting by None == splitting by spaces.
tag_name, arg = token.contents.split(None, 1)
except ValueError:
- raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents[0]
+ raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0]
m = re.search(r'(.*?) as (\w+)', arg)
if not m:
raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name
@@ -1086,6 +1177,48 @@ For more examples of complex rendering, see the source code for ``{% if %}``,
.. _configuration:
+Improving rendering speed
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For most practical purposes, the ``render()`` method on a ``Node`` will be
+sufficient and the simplest way to implement a new tag. However, if your
+template tag is expected to produce large strings via ``render()``, you can
+speed up the rendering process (and reduce memory usage) using iterative
+rendering via the ``iter_render()`` method.
+
+The ``iter_render()`` method should either be an iterator that yields string
+chunks, one at a time, or a method that returns a sequence of string chunks.
+The template renderer will join the successive chunks together when creating
+the final output. The improvement over the ``render()`` method here is that
+you do not need to create one large string containing all the output of the
+``Node``, instead you can produce the output in smaller chunks.
+
+By way of example, here's a trivial ``Node`` subclass that simply returns the
+contents of a file it is given::
+
+ class FileNode(Node):
+ def __init__(self, filename):
+ self.filename = filename
+
+ def iter_render(self):
+ for line in file(self.filename):
+ yield line
+
+For very large files, the full file contents will never be read entirely into
+memory when this tag is used, which is a useful optimisation.
+
+If you define an ``iter_render()`` method on your ``Node`` subclass, you do
+not need to define a ``render()`` method. The reverse is true as well: the
+default ``Node.iter_render()`` method will call your ``render()`` method if
+necessary. A useful side-effect of this is that you can develop a new tag
+using ``render()`` and producing all the output at once, which is easy to
+debug. Then you can rewrite the method as an iterator, rename it to
+``iter_render()`` and everything will still work.
+
+It is compulsory, however, to define *either* ``render()`` or ``iter_render()``
+in your subclass. If you omit them both, a ``TypeError`` will be raised when
+the code is imported.
+
Configuring the template system in standalone mode
==================================================
@@ -1115,5 +1248,6 @@ settings you wish to specify. You might want to consider setting at least
`settings documentation`_, and any setting starting with *TEMPLATE_*
is of obvious interest.
-.. _settings file: http://www.djangoproject.com/documentation/settings/#using-settings-without-the-django-settings-module-environment-variable
-.. _settings documentation: http://www.djangoproject.com/documentation/settings/
+.. _settings file: ../settings/#using-settings-without-the-django-settings-module-environment-variable
+.. _settings documentation: ../settings/
+
diff --git a/docs/testing.txt b/docs/testing.txt
index a0b8a8a187..50c4ec3046 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -2,21 +2,29 @@
Testing Django applications
===========================
-**New in Django development version**.
+Automated testing is an extremely useful bug-killing tool for the modern
+Web developer. You can use a collection of tests -- a **test suite** -- to
+solve, or avoid, a number of problems:
-Automated testing is an extremely useful weapon in the bug-killing arsenal
-of the modern developer. When initially writing code, a test suite can be
-used to validate that code behaves as expected. When refactoring or
-modifying code, tests serve as a guide to ensure that behavior hasn't
-changed unexpectedly as a result of the refactor.
+ * When you're writing new code, you can use tests to validate your code
+ works as expected.
-Testing a web application is a complex task, as there are many
-components of a web application that must be validated and tested. To
-help you test your application, Django provides a test execution
-framework, and range of utilities that can be used to stimulate and
-inspect various facets of a web application.
+ * When you're refactoring or modifying old code, you can use tests to
+ ensure your changes haven't affected your application's behavior
+ unexpectedly.
- This testing framework is currently under development, and may change
+Testing a Web application is a complex task, because a Web application is made
+of several layers of logic -- from HTTP-level request handling, to form
+validation and processing, to template rendering. With Django's test-execution
+framework and assorted utilities, you can simulate requests, insert test data,
+inspect your application's output and generally verify your code is doing what
+it should be doing.
+
+The best part is, it's really easy.
+
+.. admonition:: Note
+
+ This testing framework is currently under development. It may change
slightly before the next official Django release.
(That's *no* excuse not to write tests, though!)
@@ -92,7 +100,7 @@ Writing unittests
Like doctests, Django's unit tests use a standard library module: unittest_.
As with doctests, Django's test runner looks for any unit test cases defined
-in ``models.py``, or in a ``tests.py`` file stored in the application
+in ``models.py``, or in a ``tests.py`` file stored in the application
directory.
An equivalent unittest test case for the above example would look like::
@@ -111,8 +119,8 @@ An equivalent unittest test case for the above example would look like::
self.assertEquals(self.cat.speak(), 'The cat says "meow"')
When you `run your tests`_, the test utility will find all the test cases
-(that is, subclasses of ``unittest.TestCase``) in ``models.py`` and
-``tests.py``, automatically build a test suite out of those test cases,
+(that is, subclasses of ``unittest.TestCase``) in ``models.py`` and
+``tests.py``, automatically build a test suite out of those test cases,
and run that suite.
For more details about ``unittest``, see the `standard library unittest
@@ -139,7 +147,7 @@ doctests or unit tests are right for you.
If you've been using Python for a while, ``doctest`` will probably feel more
"pythonic". It's designed to make writing tests as easy as possible, so
there's no overhead of writing classes or methods; you simply put tests in
-docstrings. This gives the added advantage of given your modules automatic
+docstrings. This gives the added advantage of giving your modules automatic
documentation -- well-written doctests can kill both the documentation and the
testing bird with a single stone.
@@ -164,12 +172,13 @@ in different circumstances.
Testing Tools
=============
-To assist in testing various features of your application, Django provides
+To assist in testing various features of your application, Django provides
tools that can be used to establish tests and test conditions.
* `Test Client`_
-* Fixtures_
-
+* `TestCase`_
+* `E-mail services`_
+
Test Client
-----------
@@ -178,36 +187,30 @@ GET and POST requests on a URL, and observe the response that is received.
This allows you to test that the correct view is executed for a given URL,
and that the view constructs the correct response.
-As the response is generated, the Test Client gathers details on the
+As the response is generated, the Test Client gathers details on the
Template and Context objects that were used to generate the response. These
Templates and Contexts are then provided as part of the response, and can be
used as test conditions.
.. admonition:: Test Client vs Browser Automation?
- The Test Client is not intended as a replacement for Twill_, Selenium_,
- or other browser automation frameworks - it is intended to allow
- testing of the contexts and templates produced by a view,
+ The Test Client is not intended as a replacement for Twill_, Selenium_,
+ or other browser automation frameworks - it is intended to allow
+ testing of the contexts and templates produced by a view,
rather than the HTML rendered to the end-user.
-
+
A comprehensive test suite should use a combination of both: Test Client
- tests to establish that the correct view is being called and that
+ tests to establish that the correct view is being called and that
the view is collecting the correct context data, and Browser Automation
tests to check that user interface behaves as expected.
-
+
.. _Twill: http://twill.idyll.org/
.. _Selenium: http://www.openqa.org/selenium/
-The Test Client is stateful; if a cookie is returned as part of a response,
-that cookie is provided as part of the next request issued to that Client
-instance. Expiry policies for these cookies are not followed; if you want
-a cookie to expire, either delete it manually from ``client.cookies``, or
-create a new Client instance (which will effectively delete all cookies).
-
Making requests
~~~~~~~~~~~~~~~
-Creating an instance of ``Client`` (``django.test.client.Client``) requires
+Creating an instance of ``Client`` (``django.test.client.Client``) requires
no arguments at time of construction. Once constructed, the following methods
can be invoked on the ``Client`` instance.
@@ -220,104 +223,329 @@ can be invoked on the ``Client`` instance.
will result in the evaluation of a GET request equivalent to::
- http://yoursite.com/customers/details/?name='fred'&age=7
+ http://yoursite.com/customers/details/?name=fred&age=7
+
+``post(path, data={}, content_type=MULTIPART_CONTENT)``
+ Make a POST request on the provided ``path``. If you provide a content type
+ (e.g., ``text/xml`` for an XML payload), the contents of ``data`` will be
+ sent as-is in the POST request, using the content type in the HTTP
+ ``Content-Type`` header.
+
+ If you do not provide a value for ``content_type``, the values in
+ ``data`` will be transmitted with a content type of ``multipart/form-data``.
+ The key-value pairs in the data dictionary will be encoded as a multipart
+ message and used to create the POST data payload.
-``post(path, data={})``
- Make a POST request on the provided ``path``. The key-value pairs in the
- data dictionary will be used to create the POST data payload. This payload
- will be transmitted with the mimetype ``multipart/form-data``.
+ To submit multiple values for a given key (for example, to specify
+ the selections for a multiple selection list), provide the values as a
+ list or tuple for the required key. For example, a data dictionary of
+ ``{'choices': ('a','b','d')}`` would submit three selected rows for the
+ field named ``choices``.
- However submitting files is a special case. To POST a file, you need only
- provide the file field name as a key, and a file handle to the file you wish to
- upload as a value. The Test Client will populate the two POST fields (i.e.,
- ``field`` and ``field_file``) required by FileField. For example::
+ Submitting files is a special case. To POST a file, you need only
+ provide the file field name as a key, and a file handle to the file you wish to
+ upload as a value. The Test Client will populate the two POST fields (i.e.,
+ ``field`` and ``field_file``) required by Django's FileField. For example::
c = Client()
f = open('wishlist.doc')
c.post('/customers/wishes/', {'name':'fred', 'attachment':f})
f.close()
- will result in the evaluation of a POST request on ``/customers/wishes/``,
- with a POST dictionary that contains `name`, `attachment` (containing the
+ will result in the evaluation of a POST request on ``/customers/wishes/``,
+ with a POST dictionary that contains `name`, `attachment` (containing the
file name), and `attachment_file` (containing the file data). Note that you
need to manually close the file after it has been provided to the POST.
-``login(path, username, password)``
- In a production site, it is likely that some views will be protected with
- the @login_required URL provided by ``django.contrib.auth``. Interacting
- with a URL that has been login protected is a slightly complex operation,
- so the Test Client provides a simple URL to automate the login process. A
- call to ``login()`` stimulates the series of GET and POST calls required
- to log a user into a @login_required protected URL.
+``login(**credentials)``
+ **New in Django development version**
- If login is possible, the final return value of ``login()`` is the response
- that is generated by issuing a GET request on the protected URL. If login
- is not possible, ``login()`` returns False.
+ On a production site, it is likely that some views will be protected from
+ anonymous access through the use of the @login_required decorator, or some
+ other login checking mechanism. The ``login()`` method can be used to
+ simulate the effect of a user logging into the site. As a result of calling
+ this method, the Client will have all the cookies and session data required
+ to pass any login-based tests that may form part of a view.
- Note that since the test suite will be executed using the test database,
- which contains no users by default. As a result, logins for your production
- site will not work. You will need to create users as part of the test suite
- to be able to test logins to your application.
+ In most cases, the ``credentials`` required by this method are the username
+ and password of the user that wants to log in, provided as keyword
+ arguments::
+
+ c = Client()
+ c.login(username='fred', password='secret')
+ # Now you can access a login protected view
+
+ If you are using a different authentication backend, this method may
+ require different credentials.
+
+ ``login()`` returns ``True`` if it the credentials were accepted and login
+ was successful.
+
+ Note that since the test suite will be executed using the test database,
+ which contains no users by default. As a result, logins that are valid
+ on your production site will not work under test conditions. You will
+ need to create users as part of the test suite (either manually, or
+ using a test fixture).
Testing Responses
~~~~~~~~~~~~~~~~~
-The ``get()``, ``post()`` and ``login()`` methods all return a Response
-object. This Response object has the following properties that can be used
-for testing purposes:
+The ``get()`` and ``post()`` methods both return a Response object. This
+Response object has the following properties that can be used for testing
+purposes:
=============== ==========================================================
Property Description
=============== ==========================================================
- ``status_code`` The HTTP status of the response. See RFC2616_ for a
+ ``status_code`` The HTTP status of the response. See RFC2616_ for a
full list of HTTP status codes.
- ``content`` The body of the response. The is the final page
- content as rendered by the view, or any error message
+ ``content`` The body of the response. This is the final page
+ content as rendered by the view, or any error message
(such as the URL for a 302 redirect).
- ``template`` The Template instance that was used to render the final
- content. Testing ``template.name`` can be particularly
- useful; if the template was loaded from a file,
- ``template.name`` will be the file name that was loaded.
+ ``template`` The Template instance that was used to render the final
+ content. Testing ``template.name`` can be particularly
+ useful; if the template was loaded from a file,
+ ``template.name`` will be the file name that was loaded.
- If multiple templates were rendered, (e.g., if one
- template includes another template),``template`` will
- be a list of Template objects, in the order in which
+ If multiple templates were rendered, (e.g., if one
+ template includes another template),``template`` will
+ be a list of Template objects, in the order in which
they were rendered.
- ``context`` The Context that was used to render the template that
+ ``context`` The Context that was used to render the template that
produced the response content.
- As with ``template``, if multiple templates were rendered
- ``context`` will be a list of Context objects, stored in
- the order in which they were rendered.
+ As with ``template``, if multiple templates were rendered
+ ``context`` will be a list of Context objects, stored in
+ the order in which they were rendered.
=============== ==========================================================
.. _RFC2616: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+Exceptions
+~~~~~~~~~~
+
+If you point the Test Client at a view that raises an exception, that exception
+will be visible in the test case. You can then use a standard ``try...catch``
+block, or ``unittest.TestCase.assertRaises()`` to test for exceptions.
+
+The only exceptions that are not visible in a Test Case are ``Http404``,
+``PermissionDenied`` and ``SystemExit``. Django catches these exceptions
+internally and converts them into the appropriate HTTP responses codes.
+
+Persistent state
+~~~~~~~~~~~~~~~~
+
+The Test Client is stateful; if a cookie is returned as part of a response,
+that cookie is provided as part of the next request issued by that Client
+instance. Expiry policies for these cookies are not followed; if you want
+a cookie to expire, either delete it manually or create a new Client
+instance (which will effectively delete all cookies).
+
+There are two properties of the Test Client which are used to store persistent
+state information. If necessary, these properties can be interrogated as
+part of a test condition.
+
+ =============== ==========================================================
+ Property Description
+ =============== ==========================================================
+ ``cookies`` A Python ``SimpleCookie`` object, containing the current
+ values of all the client cookies.
+
+ ``session`` A dictionary-like object containing session information.
+ See the `session documentation`_ for full details.
+ =============== ==========================================================
+
+.. _`session documentation`: ../sessions/
+
+Example
+~~~~~~~
+
The following is a simple unit test using the Test Client::
-
+
import unittest
from django.test.client import Client
-
+
class SimpleTest(unittest.TestCase):
def setUp(self):
# Every test needs a client
self.client = Client()
- def test_details(self):
+ def test_details(self):
# Issue a GET request
response = self.client.get('/customer/details/')
-
+
# Check that the respose is 200 OK
self.failUnlessEqual(response.status_code, 200)
# Check that the rendered context contains 5 customers
self.failUnlessEqual(len(response.context['customers']), 5)
-Fixtures
+TestCase
--------
-Feature still to come...
+Normal python unit tests extend a base class of ``unittest.testCase``.
+Django provides an extension of this base class - ``django.test.TestCase``
+- that provides some additional capabilities that can be useful for
+testing web sites.
+
+Moving from a normal unittest TestCase to a Django TestCase is easy - just
+change the base class of your test from ``unittest.TestCase`` to
+``django.test.TestCase``. All of the standard Python unit test facilities
+will continue to be available, but they will be augmented with some useful
+extra facilities.
+
+Default Test Client
+~~~~~~~~~~~~~~~~~~~
+**New in Django development version**
+
+Every test case in a ``django.test.TestCase`` instance has access to an
+instance of a Django `Test Client`_. This Client can be accessed as
+``self.client``. This client is recreated for each test.
+
+Fixture loading
+~~~~~~~~~~~~~~~
+
+A test case for a database-backed website isn't much use if there isn't any
+data in the database. To make it easy to put test data into the database,
+Django provides a fixtures framework.
+
+A *Fixture* is a collection of files that contain the serialized contents of
+the database. Each fixture has a unique name; however, the files that
+comprise the fixture can be distributed over multiple directories, in
+multiple applications.
+
+.. note::
+ If you have synchronized a Django project, you have already experienced
+ the use of one fixture -- the ``initial_data`` fixture. Every time you
+ synchronize the database, Django installs the ``initial_data`` fixture.
+ This provides a mechanism to populate a new database with any initial
+ data (such as a default set of categories). Fixtures with other names
+ can be installed manually using ``django-admin.py loaddata``.
+
+However, for the purposes of unit testing, each test must be able to
+guarantee the contents of the database at the start of each and every
+test.
+
+To define a fixture for a test, all you need to do is add a class
+attribute to your test describing the fixtures you want the test to use.
+For example, the test case from `Writing unittests`_ would
+look like::
+
+ from django.test import TestCase
+ from myapp.models import Animal
+
+ class AnimalTestCase(TestCase):
+ fixtures = ['mammals.json', 'birds']
+
+ def setUp(self):
+ # test definitions as before
+
+At the start of each test case, before ``setUp()`` is run, Django will
+flush the database, returning the database the state it was in directly
+after ``syncdb`` was called. Then, all the named fixtures are installed.
+In this example, any JSON fixture called ``mammals``, and any fixture
+named ``birds`` will be installed. See the documentation on
+`loading fixtures`_ for more details on defining and installing fixtures.
+
+.. _`loading fixtures`: ../django-admin/#loaddata-fixture-fixture
+
+This flush/load procedure is repeated for each test in the test case, so you
+can be certain that the outcome of a test will not be affected by
+another test, or the order of test execution.
+
+Emptying the test outbox
+~~~~~~~~~~~~~~~~~~~~~~~~
+**New in Django development version**
+
+At the start of each test case, in addition to installing fixtures,
+Django clears the contents of the test e-mail outbox.
+
+For more detail on e-mail services during tests, see `E-mail services`_.
+
+Assertions
+~~~~~~~~~~
+**New in Django development version**
+
+Normal Python unit tests have a wide range of assertions, such as
+``assertTrue`` and ``assertEquals`` that can be used to validate behavior.
+``django.TestCase`` adds to these, providing some assertions
+that can be useful in testing the behavior of web sites.
+
+``assertContains(response, text, count=1, status_code=200)``
+ Assert that a response indicates that a page could be retrieved and
+ produced the nominated status code, and that ``text`` occurs ``count``
+ times in the content of the response.
+
+``assertFormError(response, form, field, errors)``
+ Assert that a field on a form raised the provided list of errors when
+ rendered on the form.
+
+ ``form`` is the name the form object was given in the template context.
+
+ ``field`` is the name of the field on the form to check. If ``field``
+ has a value of ``None``, non-field errors will be checked.
+
+ ``errors`` is an error string, or a list of error strings, that are
+ expected as a result of form validation.
+
+``assertTemplateNotUsed(response, template_name)``
+ Assert that the template with the given name was *not* used in rendering
+ the response.
+
+``assertRedirects(response, expected_path, status_code=302, target_status_code=200)``
+ Assert that the response received produced the nominated status code,
+ redirects the browser to the provided path, and that retrieving the provided
+ path yields a response with the target status code.
+
+``assertTemplateUsed(response, template_name)``
+ Assert that the template with the given name was used in rendering the
+ response.
+
+E-mail services
+---------------
+
+**New in Django development version**
+
+If your view makes use of the `Django e-mail services`_, you don't really
+want e-mail to be sent every time you run a test using that view.
+
+When the Django test framework is initialized, it transparently replaces the
+normal `SMTPConnection`_ class with a dummy implementation that redirects all
+e-mail to a dummy outbox. This outbox, stored as ``django.core.mail.outbox``,
+is a simple list of all `EmailMessage`_ instances that have been sent.
+For example, during test conditions, it would be possible to run the following
+code::
+
+ from django.core import mail
+
+ # Send message
+ mail.send_mail('Subject here', 'Here is the message.', 'from@example.com',
+ ['to@example.com'], fail_silently=False)
+
+ # One message has been sent
+ self.assertEqual(len(mail.outbox), 1)
+ # Subject of first message is correct
+ self.assertEqual(mail.outbox[0].subject, 'Subject here')
+
+The ``mail.outbox`` object does not exist under normal execution conditions.
+The outbox is created during test setup, along with the dummy `SMTPConnection`_.
+When the test framework is torn down, the standard `SMTPConnection`_ class
+is restored, and the test outbox is destroyed.
+
+As noted `previously`_, the test outbox is emptied at the start of every
+test in a Django TestCase. To empty the outbox manually, assign the empty list
+to mail.outbox::
+
+ from django.core import mail
+
+ # Empty the test outbox
+ mail.outbox = []
+
+.. _`Django e-mail services`: ../email/
+.. _`SMTPConnection`: ../email/#the-emailmessage-and-smtpconnection-classes
+.. _`EmailMessage`: ../email/#the-emailmessage-and-smtpconnection-classes
+.. _`previously`: #emptying-the-test-outbox
Running tests
=============
@@ -335,13 +563,25 @@ but you only want to run the animals unit tests, run::
When you run your tests, you'll see a bunch of text flow by as the test
database is created and models are initialized. This test database is
-created from scratch every time you run your tests.
+created from scratch every time you run your tests.
-By default, the test database gets its name by prepending ``test_`` to
-the database name specified by the ``DATABASE_NAME`` setting; all other
+By default, the test database gets its name by prepending ``test_`` to
+the database name specified by the ``DATABASE_NAME`` setting; all other
database settings will the same as they would be for the project normally.
-If you wish to use a name other than the default for the test database,
-you can use the ``TEST_DATABASE_NAME`` setting to provide a name.
+If you wish to use a name other than the default for the test database,
+you can use the ``TEST_DATABASE_NAME`` setting to provide a name.
+
+**New in Django development version:** For fine-grained control over the
+character encoding of your database, use the ``TEST_DATABASE_CHARSET`` setting.
+If you're using MySQL, you can also use the ``TEST_DATABASE_COLLATION`` setting
+to control the particular collation used by the test database. See the
+settings_ documentation for details of these advanced settings.
+
+.. _settings: ../settings/
+
+The test database is created by the user in the ``DATABASE_USER`` setting.
+This user needs to have sufficient privileges to create a new database on the
+system.
Once the test database has been established, Django will run your tests.
If everything goes well, at the end you'll see::
@@ -377,7 +617,11 @@ failed::
FAILED (failures=1)
-When the tests have all been executed, the test database is destroyed.
+The return code for the script is the total number of failed and erroneous
+tests. If all the tests pass, the return code is 0.
+
+Regardless of whether the tests pass or fail, the test database is destroyed when
+all the tests have been executed.
Using a different testing framework
===================================
@@ -388,7 +632,8 @@ it does provide a mechanism to allow you to invoke tests constructed for
an alternative framework as if they were normal Django tests.
When you run ``./manage.py test``, Django looks at the ``TEST_RUNNER``
-setting to determine what to do. By default, ``TEST_RUNNER`` points to ``django.test.simple.run_tests``. This method defines the default Django
+setting to determine what to do. By default, ``TEST_RUNNER`` points to
+``django.test.simple.run_tests``. This method defines the default Django
testing behavior. This behavior involves:
#. Performing global pre-test setup
@@ -396,7 +641,7 @@ testing behavior. This behavior involves:
#. Running ``syncdb`` to install models and initial data into the test database
#. Looking for Unit Tests and Doctests in ``models.py`` and ``tests.py`` file for each installed application
#. Running the Unit Tests and Doctests that are found
-#. Destroying the test database.
+#. Destroying the test database
#. Performing global post-test teardown
If you define your own test runner method and point ``TEST_RUNNER``
@@ -414,10 +659,12 @@ arguments:
The module list is the list of Python modules that contain the models to be
tested. This is the same format returned by ``django.db.models.get_apps()``
- Verbosity determines the amount of notification and debug information that
- will be printed to the console; '0' is no output, '1' is normal output,
+ Verbosity determines the amount of notification and debug information that
+ will be printed to the console; `0` is no output, `1` is normal output,
and `2` is verbose output.
+ This method should return the number of tests that failed.
+
Testing utilities
-----------------
@@ -425,12 +672,13 @@ To assist in the creation of your own test runner, Django provides
a number of utility methods in the ``django.test.utils`` module.
``setup_test_environment()``
- Performs any global pre-test setup, such as the installing the
- instrumentation of the template rendering system.
+ Performs any global pre-test setup, such as the installing the
+ instrumentation of the template rendering system and setting up
+ the dummy SMTPConnection.
``teardown_test_environment()``
- Performs any global post-test teardown, such as removing the instrumentation
- of the template rendering system.
+ Performs any global post-test teardown, such as removing the instrumentation
+ of the template rendering system and restoring normal e-mail services.
``create_test_db(verbosity=1, autoclobber=False)``
Creates a new test database, and run ``syncdb`` against it.
diff --git a/docs/tutorial01.txt b/docs/tutorial01.txt
index 1113b603da..c40b051b19 100644
--- a/docs/tutorial01.txt
+++ b/docs/tutorial01.txt
@@ -17,7 +17,16 @@ installed by running the Python interactive interpreter and typing
``import django``. If that command runs successfully, with no errors, Django is
installed.
-.. _`Django installed`: http://www.djangoproject.com/documentation/install/
+.. _`Django installed`: ../install/
+
+.. admonition:: Where to get help:
+
+ If you're having trouble going through this tutorial, please post a message
+ to `django-users`_ or drop by `#django`_ on ``irc.freenode.net`` and we'll
+ try to help.
+
+.. _django-users: http://groups.google.com/group/django-users
+.. _#django: irc://irc.freenode.net/django
Creating a project
==================
@@ -32,6 +41,13 @@ From the command line, ``cd`` into a directory where you'd like to store your
code, then run the command ``django-admin.py startproject mysite``. This
will create a ``mysite`` directory in your current directory.
+.. note::
+
+ You'll need to avoid naming projects after built-in Python or Django
+ components. In particular, this means you should avoid using names like
+ ``django`` (which will conflict with Django itself) or ``site`` (which
+ conflicts with a built-in Python package).
+
(``django-admin.py`` should be on your system path if you installed Django via
``python setup.py``. If it's not on your path, you can find it in
``site-packages/django/bin``, where ``site-packages`` is a directory within
@@ -108,7 +124,7 @@ It worked!
Full docs for the development server are at `django-admin documentation`_.
-.. _django-admin documentation: http://www.djangoproject.com/documentation/django_admin/
+.. _django-admin documentation: ../django-admin/
Database setup
--------------
@@ -117,8 +133,8 @@ Now, edit ``settings.py``. It's a normal Python module with module-level
variables representing Django settings. Change these settings to match your
database's connection parameters:
- * ``DATABASE_ENGINE`` -- Either 'postgresql', 'mysql' or 'sqlite3'.
- More coming soon.
+ * ``DATABASE_ENGINE`` -- Either 'postgresql_psycopg2', 'mysql' or 'sqlite3'.
+ Other backends are `also available`_.
* ``DATABASE_NAME`` -- The name of your database, or the full (absolute)
path to the database file if you're using SQLite.
* ``DATABASE_USER`` -- Your database username (not used for SQLite).
@@ -127,6 +143,8 @@ database's connection parameters:
empty string if your database server is on the same physical machine
(not used for SQLite).
+.. _also available: ../settings/
+
.. admonition:: Note
If you're using PostgreSQL or MySQL, make sure you've created a database by
@@ -303,7 +321,8 @@ Now Django knows ``mysite`` includes the ``polls`` app. Let's run another comman
python manage.py sql polls
-You should see the following (the CREATE TABLE SQL statements for the polls app)::
+You should see something similar to the following (the CREATE TABLE SQL statements
+for the polls app)::
BEGIN;
CREATE TABLE "polls_poll" (
@@ -321,6 +340,8 @@ You should see the following (the CREATE TABLE SQL statements for the polls app)
Note the following:
+ * The exact output will vary depending on the database you are using.
+
* Table names are automatically generated by combining the name of the app
(``polls``) and the lowercase name of the model -- ``poll`` and
``choice``. (You can override this behavior.)
@@ -349,8 +370,9 @@ If you're interested, also run the following commands:
* ``python manage.py validate polls`` -- Checks for any errors in the
construction of your models.
- * ``python manage.py sqlinitialdata polls`` -- Outputs any initial data
- required for Django's admin framework and your models.
+ * ``python manage.py sqlcustom polls`` -- Outputs any custom SQL statements
+ (such as table modifications or constraints) that are defined for the
+ application.
* ``python manage.py sqlclear polls`` -- Outputs the necessary ``DROP
TABLE`` statements for this app, according to which tables already exist
@@ -360,7 +382,7 @@ If you're interested, also run the following commands:
statements for this app.
* ``python manage.py sqlall polls`` -- A combination of all the SQL from
- the 'sql', 'sqlinitialdata', and 'sqlindexes' commands.
+ the 'sql', 'sqlcustom', and 'sqlindexes' commands.
Looking at the output of those commands can help you understand what's actually
happening under the hood.
@@ -378,7 +400,7 @@ as you like, and it will only ever create the tables that don't exist.
Read the `django-admin.py documentation`_ for full information on what the
``manage.py`` utility can do.
-.. _django-admin.py documentation: http://www.djangoproject.com/documentation/django_admin/
+.. _django-admin.py documentation: ../django-admin/
Playing with the API
====================
@@ -555,5 +577,5 @@ For full details on the database API, see our `Database API reference`_.
When you're comfortable with the API, read `part 2 of this tutorial`_ to get
Django's automatic admin working.
-.. _Database API reference: http://www.djangoproject.com/documentation/db_api/
-.. _part 2 of this tutorial: http://www.djangoproject.com/documentation/tutorial2/
+.. _Database API reference: ../db-api/
+.. _part 2 of this tutorial: ../tutorial02/
diff --git a/docs/tutorial02.txt b/docs/tutorial02.txt
index f6d4045fa3..99f586b4a1 100644
--- a/docs/tutorial02.txt
+++ b/docs/tutorial02.txt
@@ -5,7 +5,7 @@ Writing your first Django app, part 2
This tutorial begins where `Tutorial 1`_ left off. We're continuing the Web-poll
application and will focus on Django's automatically-generated admin site.
-.. _Tutorial 1: http://www.djangoproject.com/documentation/tutorial1/
+.. _Tutorial 1: ../tutorial01/
.. admonition:: Philosophy
@@ -61,10 +61,10 @@ tutorial, remember?) You should see the Django admin index page:
:alt: Django admin index page
:target: http://media.djangoproject.com/img/doc/tutorial/admin02.png
-By default, you should see two types of editable content: groups and users.
-These are core features Django ships with by default.
+You should see a few other types of editable content, including groups, users
+and sites. These are core features Django ships with by default.
-.. _"I can't log in" questions: http://www.djangoproject.com/documentation/faq/#the-admin-site
+.. _"I can't log in" questions: ../faq/#the-admin-site
Make the poll app modifiable in the admin
=========================================
@@ -320,7 +320,7 @@ method a ``short_description`` attribute::
Let's add another improvement to the Poll change list page: Filters. Add the
-following line to ``Poll.admin``::
+following line to ``Poll.Admin``::
list_filter = ['pub_date']
@@ -402,7 +402,7 @@ Django automatically looks for a ``templates/`` subdirectory within each app
package, for use as a fallback. See the `loader types documentation`_ for full
information.
-.. _loader types documentation: http://www.djangoproject.com/documentation/templates_python/#loader-types
+.. _loader types documentation: ../templates_python/#loader-types
Customize the admin index page
==============================
@@ -433,5 +433,5 @@ general, see the `Django admin CSS guide`_.
When you're comfortable with the admin site, read `part 3 of this tutorial`_ to
start working on public poll views.
-.. _Django admin CSS guide: http://www.djangoproject.com/documentation/admin_css/
-.. _part 3 of this tutorial: http://www.djangoproject.com/documentation/tutorial3/
+.. _Django admin CSS guide: ../admin_css/
+.. _part 3 of this tutorial: ../tutorial03/
diff --git a/docs/tutorial03.txt b/docs/tutorial03.txt
index c4c1b4c546..41febe021d 100644
--- a/docs/tutorial03.txt
+++ b/docs/tutorial03.txt
@@ -5,7 +5,7 @@ Writing your first Django app, part 3
This tutorial begins where `Tutorial 2`_ left off. We're continuing the Web-poll
application and will focus on creating the public interface -- "views."
-.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+.. _Tutorial 2: ../tutorial02/
Philosophy
==========
@@ -60,9 +60,10 @@ arguments from the dictionary (an optional third item in the tuple).
For more on ``HTTPRequest`` objects, see the `request and response documentation`_.
For more details on URLconfs, see the `URLconf documentation`_.
-When you ran ``python manage.py startproject mysite`` at the beginning of
+When you ran ``python django-admin.py startproject mysite`` at the beginning of
Tutorial 1, it created a default URLconf in ``mysite/urls.py``. It also
-automatically set your ``ROOT_URLCONF`` setting to point at that file::
+automatically set your ``ROOT_URLCONF`` setting (in ``settings.py``) to point
+at that file::
ROOT_URLCONF = 'mysite.urls'
@@ -117,8 +118,8 @@ time the URLconf module is loaded. They're super fast.
.. _Wikipedia's entry: http://en.wikipedia.org/wiki/Regular_expression
.. _Python documentation: http://www.python.org/doc/current/lib/module-re.html
-.. _request and response documentation: http://www.djangoproject.com/documentation/request_response/
-.. _URLconf documentation: http://www.djangoproject.com/documentation/url_dispatch/
+.. _request and response documentation: ../request_response/
+.. _URLconf documentation: ../url_dispatch/
Write your first view
=====================
@@ -260,8 +261,7 @@ provides a shortcut. Here's the full ``index()`` view, rewritten::
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})
-Note that we no longer need to import ``loader``, ``Context`` or
-``HttpResponse``.
+Note that once we've done this in all these views, we no longer need to import ``loader``, ``Context`` and ``HttpResponse``.
The ``render_to_response()`` function takes a template name as its first
argument and a dictionary as its optional second argument. It returns an
@@ -300,7 +300,7 @@ rewritten::
The ``get_object_or_404()`` function takes a Django model module as its first
argument and an arbitrary number of keyword arguments, which it passes to the
-module's ``get_object()`` function. It raises ``Http404`` if the object doesn't
+module's ``get()`` function. It raises ``Http404`` if the object doesn't
exist.
.. admonition:: Philosophy
@@ -377,7 +377,7 @@ iterable of Choice objects and is suitable for use in the ``{% for %}`` tag.
See the `template guide`_ for full details on how templates work.
-.. _template guide: http://www.djangoproject.com/documentation/templates/
+.. _template guide: ../templates/
Simplifying the URLconfs
========================
@@ -464,4 +464,4 @@ All the poll app cares about is its relative URLs, not its absolute URLs.
When you're comfortable with writing views, read `part 4 of this tutorial`_ to
learn about simple form processing and generic views.
-.. _part 4 of this tutorial: http://www.djangoproject.com/documentation/tutorial4/
+.. _part 4 of this tutorial: ../tutorial04/
diff --git a/docs/tutorial04.txt b/docs/tutorial04.txt
index 49ed649cff..5cc12c445d 100644
--- a/docs/tutorial04.txt
+++ b/docs/tutorial04.txt
@@ -48,6 +48,7 @@ So let's create a ``vote()`` function in ``mysite/polls/views.py``::
from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponseRedirect
+ from django.core.urlresolvers import reverse
from mysite.polls.models import Choice, Poll
# ...
def vote(request, poll_id):
@@ -66,7 +67,7 @@ So let's create a ``vote()`` function in ``mysite/polls/views.py``::
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
- return HttpResponseRedirect('/polls/%s/results/' % p.id)
+ return HttpResponseRedirect(reverse('mysite.polls.views.results', args=(p.id,)))
This code includes a few things we haven't covered yet in this tutorial:
@@ -86,13 +87,29 @@ This code includes a few things we haven't covered yet in this tutorial:
* After incrementing the choice count, the code returns an
``HttpResponseRedirect`` rather than a normal ``HttpResponse``.
``HttpResponseRedirect`` takes a single argument: the URL to which the
- user will be redirected. You should leave off the "http://" and domain
- name if you can. That helps your app become portable across domains.
+ user will be redirected (see the following point for how we construct
+ the URL in this case).
As the Python comment above points out, you should always return an
``HttpResponseRedirect`` after successfully dealing with POST data. This
tip isn't specific to Django; it's just good Web development practice.
+ * We are using the ``reverse()`` function in the ``HttpResponseRedirect``
+ constructor in this example. This function helps avoid having to
+ hardcode a URL in the view function. It is given the name of the view
+ that we want to pass control to and the variable portion of the URL
+ pattern that points to that view. In this case, using the URLConf we set
+ up in Tutorial 3, this ``reverse()`` call will return a string like ::
+
+ '/polls/3/results/'
+
+ ... where the ``3`` is the value of ``p.id``. This redirected URL will
+ then call the ``'results'`` view to display the final page. Note that
+ you need to use the full name of the view here (including the prefix).
+
+ For more information about ``reverse()``, see the `URL dispatcher`_
+ documentation.
+
As mentioned in Tutorial 3, ``request`` is a ``HTTPRequest`` object. For more
on ``HTTPRequest`` objects, see the `request and response documentation`_.
@@ -120,7 +137,8 @@ Now, go to ``/polls/1/`` in your browser and vote in the poll. You should see a
results page that gets updated each time you vote. If you submit the form
without having chosen a choice, you should see the error message.
-.. _request and response documentation: http://www.djangoproject.com/documentation/request_response/
+.. _request and response documentation: ../request_response/
+.. _URL dispatcher: ../url_dispatch#reverse
Use generic views: Less code is better
======================================
@@ -206,6 +224,21 @@ for the polls app, we manually specify a template name for the results view:
``template_name='polls/results.html'``. Otherwise, both views would use the same
template. Note that we use ``dict()`` to return an altered dictionary in place.
+.. note:: ``all()`` is lazy
+
+ It might look a little frightening to see ``Poll.objects.all()`` being used
+ in a detail view which only needs one ``Poll`` object, but don't worry;
+ ``Poll.objects.all()`` is actually a special object called a ``QuerySet``,
+ which is "lazy" and doesn't hit your database until it absolutely has to. By
+ the time the database query happens, the ``object_detail`` generic view will
+ have narrowed its scope down to a single object, so the eventual query will
+ only select one row from the database.
+
+ If you'd like to know more about how that works, The Django database API
+ documentation `explains the lazy nature of QuerySet objects`_.
+
+.. _explains the lazy nature of QuerySet objects: ../db-api/#querysets-are-lazy
+
In previous parts of the tutorial, the templates have been provided with a context
that contains the ``poll`` and ``latest_poll_list`` context variables. However,
the generic views provide the variables ``object`` and ``object_list`` as context.
@@ -226,7 +259,7 @@ Run the server, and use your new polling app based on generic views.
For full details on generic views, see the `generic views documentation`_.
-.. _generic views documentation: http://www.djangoproject.com/documentation/generic_views/
+.. _generic views documentation: ../generic_views/
Coming soon
===========
@@ -241,4 +274,8 @@ installments:
* Advanced admin features: Permissions
* Advanced admin features: Custom JavaScript
-.. _Tutorial 3: http://www.djangoproject.com/documentation/tutorial3/
+In the meantime, you can read through the rest of the `Django documentation`_
+and start writing your own applications.
+
+.. _Tutorial 3: ../tutorial03/
+.. _Django documentation: http://www.djangoproject.com/documentation/
diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt
index 00a7af027a..402b1200b5 100644
--- a/docs/url_dispatch.txt
+++ b/docs/url_dispatch.txt
@@ -45,8 +45,8 @@ algorithm the system follows to determine which Python code to execute:
`request object`_ as its first argument and any values captured in the
regex as remaining arguments.
-.. _settings file: http://www.djangoproject.com/documentation/settings/
-.. _request object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+.. _settings file: ../settings/
+.. _request object: ../request_response/#httprequest-objects
Example
=======
@@ -185,10 +185,26 @@ The first argument to ``patterns()`` is a string ``prefix``. See
The remaining arguments should be tuples in this format::
- (regular expression, Python callback function [, optional dictionary])
+ (regular expression, Python callback function [, optional dictionary [, optional name]])
-...where ``optional dictionary`` is optional. (See
-_`Passing extra options to view functions` below.)
+...where ``optional dictionary`` and ``optional name`` are optional. (See
+`Passing extra options to view functions`_ below.)
+
+url
+---
+
+**New in Django development version**
+
+You can use the ``url()`` function, instead of a tuple, as an argument to
+``patterns()``. This is convenient if you want to specify a name without the
+optional extra arguments dictionary. For example::
+
+ urlpatterns = patterns('',
+ url(r'/index/$', index_view, name="main-view"),
+ ...
+ )
+
+See `Naming URL patterns`_ for why the ``name`` parameter is useful.
handler404
----------
@@ -286,7 +302,7 @@ With this in mind, the above example can be written more concisely as::
Note that you don't put a trailing dot (``"."``) in the prefix. Django puts
that in automatically.
-.. _Django overview: http://www.djangoproject.com/documentation/overview/
+.. _Django overview: ../overview/
Multiple view prefixes
----------------------
@@ -387,14 +403,19 @@ In this example, for a request to ``/blog/2005/``, Django will call the
This technique is used in `generic views`_ and in the `syndication framework`_
to pass metadata and options to views.
-.. _generic views: http://www.djangoproject.com/documentation/generic_views/
-.. _syndication framework: http://www.djangoproject.com/documentation/syndication/
+.. _generic views: ../generic_views/
+.. _syndication framework: ../syndication/
+
+.. admonition:: Dealing with conflicts
+
+ It's possible to have a URL pattern which captures named keyword arguments,
+ and also passes arguments with the same names in its dictionary of extra
+ arguments. When this happens, the arguments in the dictionary will be used
+ instead of the arguments captured in the URL.
Passing extra options to ``include()``
--------------------------------------
-**New in the Django development version.**
-
Similarly, you can pass extra options to ``include()``. When you pass extra
options to ``include()``, *each* line in the included URLconf will be passed
the extra options.
@@ -435,8 +456,6 @@ every view in the the included URLconf accepts the extra options you're passing.
Passing callable objects instead of strings
===========================================
-**New in the Django development version.**
-
Some developers find it more natural to pass the actual Python function object
rather than a string containing the path to its module. This alternative is
supported -- you can pass any callable object as the view.
@@ -476,3 +495,94 @@ The style you use is up to you.
Note that if you use this technique -- passing objects rather than strings --
the view prefix (as explained in "The view prefix" above) will have no effect.
+
+Naming URL patterns
+===================
+
+**New in Django development version**
+
+It's fairly common to use the same view function in multiple URL patterns in
+your URLconf. For example, these two URL patterns both point to the ``archive``
+view::
+
+ urlpatterns = patterns('',
+ (r'/archive/(\d{4})/$', archive),
+ (r'/archive-summary/(\d{4})/$', archive, {'summary': True}),
+ )
+
+This is completely valid, but it leads to problems when you try to do reverse
+URL matching (through the ``permalink()`` decorator or the ``{% url %}``
+template tag). Continuing this example, if you wanted to retrieve the URL for
+the ``archive`` view, Django's reverse URL matcher would get confused, because
+*two* URLpatterns point at that view.
+
+To solve this problem, Django supports **named URL patterns**. That is, you can
+give a name to a URL pattern in order to distinguish it from other patterns
+using the same view and parameters. Then, you can use this name in reverse URL
+matching.
+
+Here's the above example, rewritten to used named URL patterns::
+
+ urlpatterns = patterns('',
+ url(r'/archive/(\d{4})/$', archive, name="full-archive"),
+ url(r'/archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
+ )
+
+With these names in place (``full-archive`` and ``arch-summary``), you can
+target each pattern individually by using its name::
+
+ {% url arch-summary 1945 %}
+ {% url full-archive 2007 %}
+
+Even though both URL patterns refer to the ``archive`` view here, using the
+``name`` parameter to ``url()`` allows you to tell them apart in templates.
+
+The string used for the URL name can contain any characters you like. You are
+not restricted to valid Python names.
+
+.. note::
+
+ When you name your URL patterns, make sure you use names that are unlikely
+ to clash with any other application's choice of names. If you call your URL
+ pattern ``comment``, and another application does the same thing, there's
+ no guarantee which URL will be inserted into your template when you use
+ this name.
+
+ Putting a prefix on your URL names, perhaps derived from the application
+ name, will decrease the chances of collision. We recommend something like
+ ``myapp-comment`` instead of ``comment``.
+
+Utility methods
+===============
+
+reverse()
+---------
+
+If you need to use something similar to the ``{% url %}`` template tag in your
+code, Django provides the ``django.core.urlresolvers.reverse()``. The
+``reverse()`` function has the following signature::
+
+ reverse(viewname, urlconf=None, args=None, kwargs=None)
+
+``viewname`` is either the function name (either a function reference, or the
+string version of the name, if you used that form in ``urlpatterns``) or the
+`URL pattern name`_. Normally, you won't need to worry about the
+``urlconf`` parameter and will only pass in the positional and keyword
+arguments to use in the URL matching. For example::
+
+ from django.core.urlresolvers import reverse
+
+ def myview(request):
+ return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
+
+.. _URL pattern name: `Naming URL patterns`_
+
+permalink()
+-----------
+
+The ``permalink()`` decorator is useful for writing short methods that return
+a full URL path. For example, a model's ``get_absolute_url()`` method. Refer
+to the `model API documentation`_ for more information about ``permalink()``.
+
+.. _model API documentation: ../model-api/#the-permalink-decorator
+
diff --git a/docs/webdesign.txt b/docs/webdesign.txt
new file mode 100644
index 0000000000..8e6eae89dd
--- /dev/null
+++ b/docs/webdesign.txt
@@ -0,0 +1,53 @@
+========================
+django.contrib.webdesign
+========================
+
+The ``django.contrib.webdesign`` package, part of the `"django.contrib" add-ons`_,
+provides various Django helpers that are particularly useful to Web *designers*
+(as opposed to developers).
+
+At present, the package contains only a single template tag. If you have ideas
+for Web-designer-friendly functionality in Django, please `suggest them`_.
+
+.. _"django.contrib" add-ons: ../add_ons/
+.. _suggest them: ../contributing/
+
+Template tags
+=============
+
+To use these template tags, add ``'django.contrib.webdesign'`` to your
+``INSTALLED_APPS`` setting. Once you've done that, use
+``{% load webdesign %}`` in a template to give your template access to the tags.
+
+
+lorem
+=====
+
+Displays random "lorem ipsum" Latin text. This is useful for providing sample
+data in templates.
+
+Usage::
+
+ {% lorem [count] [method] [random] %}
+
+The ``{% lorem %}`` tag can be used with zero, one, two or three arguments.
+The arguments are:
+
+ =========== =============================================================
+ Argument Description
+ =========== =============================================================
+ ``count`` A number (or variable) containing the number of paragraphs or
+ words to generate (default is 1).
+ ``method`` Either ``w`` for words, ``p`` for HTML paragraphs or ``b``
+ for plain-text paragraph blocks (default is ``b``).
+ ``random`` The word ``random``, which if given, does not use the common
+ paragraph ("Lorem ipsum dolor sit amet...") when generating
+ text.
+ =========== =============================================================
+
+Examples:
+
+ * ``{% lorem %}`` will output the common "lorem ipsum" paragraph.
+ * ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
+ and two random paragraphs each wrapped in HTML ``<p>`` tags.
+ * ``{% lorem 2 w random %}`` will output two random Latin words.
diff --git a/extras/django_bash_completion b/extras/django_bash_completion
index 829756c371..8906609a68 100644
--- a/extras/django_bash_completion
+++ b/extras/django_bash_completion
@@ -31,6 +31,9 @@
#
# To uninstall, just remove the line from your .bash_profile and .bashrc.
+# Enable extended pattern matching operators.
+shopt -s extglob
+
_django_completion()
{
local cur prev opts actions action_shell_opts action_runfcgi_opts
@@ -39,13 +42,13 @@ _django_completion()
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Standalone options
- opts="--help --settings --pythonpath --version"
+ opts="--help --settings --pythonpath --noinput --noreload --format --indent --verbosity --adminmedia --version"
# Actions
actions="adminindex createcachetable dbshell diffsettings \
- inspectdb install reset runfcgi runserver \
- shell sql sqlall sqlclear sqlindexes sqlinitialdata \
+ dumpdata flush inspectdb loaddata reset runfcgi runserver \
+ shell sql sqlall sqlclear sqlcustom sqlflush sqlindexes \
sqlreset sqlsequencereset startapp startproject \
- syncdb validate"
+ syncdb test validate"
# Action's options
action_shell_opts="--plain"
action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir"
@@ -58,8 +61,13 @@ _django_completion()
||
# python manage.py, /some/path/python manage.py (if manage.py exists)
( ${COMP_CWORD} -eq 2 &&
- ( $( basename ${COMP_WORDS[0]} ) == python ) &&
+ ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
( $( basename ${COMP_WORDS[1]} ) == manage.py) &&
+ ( -r ${COMP_WORDS[1]} ) )
+ ||
+ ( ${COMP_CWORD} -eq 2 &&
+ ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
+ ( $( basename ${COMP_WORDS[1]} ) == django-admin.py) &&
( -r ${COMP_WORDS[1]} ) ) ]] ; then
case ${cur} in
@@ -76,15 +84,33 @@ _django_completion()
esac
else
case ${prev} in
- adminindex|install|reset| \
- sql|sqlall|sqlclear|sqlindexes| \
- sqlinitialdata|sqlreset|sqlsequencereset)
- # App completion isn't yet implemented, but here's where that
- # would go.
- # COMPREPLY=( $(compgen -W "auth core" -- ${cur}) )
- COMPREPLY=()
- return 0
- ;;
+ adminindex|dumpdata|reset| \
+ sql|sqlall|sqlclear|sqlcustom|sqlindexes| \
+ sqlreset|sqlsequencereset|test)
+ # App completion
+ settings=""
+ # If settings.py in the PWD, use that
+ if [ -e settings.py ] ; then
+ settings="$PWD/settings.py"
+ else
+ # Use the ENV variable if it is set
+ if [ $DJANGO_SETTINGS_MODULE ] ; then
+ settings=$DJANGO_SETTINGS_MODULE
+ fi
+ fi
+ # Couldn't find settings so return nothing
+ if [ -z $settings ] ; then
+ COMPREPLY=()
+ # Otherwise inspect settings.py file
+ else
+ apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \
+ grep -v "django.contrib" |
+ sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \
+ tr -d "\n"`
+ COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) )
+ fi
+ return 0
+ ;;
createcachetable|dbshell|diffsettings| \
inspectdb|runserver|startapp|startproject|syncdb| \
@@ -117,3 +143,17 @@ _django_completion()
}
complete -F _django_completion django-admin.py manage.py
+
+# Support for multiple interpreters.
+unset pythons
+if command -v whereis &>/dev/null; then
+ python_interpreters=$(whereis python | cut -d " " -f 2-)
+ for python in $python_interpreters; do
+ pythons="${pythons} $(basename $python)"
+ done
+ pythons=$(echo $pythons | tr " " "\n" | sort -u | tr "\n" " ")
+else
+ pythons=python
+fi
+
+complete -F _django_completion -o default $pythons
diff --git a/scripts/rpm-install.sh b/scripts/rpm-install.sh
new file mode 100644
index 0000000000..f337a789b1
--- /dev/null
+++ b/scripts/rpm-install.sh
@@ -0,0 +1,28 @@
+#! /bin/sh
+#
+# This file becomes the install section of the generated spec file.
+#
+
+# This is what dist.py normally does.
+python setup.py install --root=${RPM_BUILD_ROOT} --record="INSTALLED_FILES"
+
+# Sort the filelist so that directories appear before files. This avoids
+# duplicate filename problems on some systems.
+touch DIRS
+for i in `cat INSTALLED_FILES`; do
+ if [ -f ${RPM_BUILD_ROOT}/$i ]; then
+ echo $i >>FILES
+ fi
+ if [ -d ${RPM_BUILD_ROOT}/$i ]; then
+ echo %dir $i >>DIRS
+ fi
+done
+
+# Make sure we match foo.pyo and foo.pyc along with foo.py (but only once each)
+sed -e "/\.py[co]$/d" -e "s/\.py$/.py*/" DIRS FILES >INSTALLED_FILES
+
+mkdir -p ${RPM_BUILD_ROOT}/%{_mandir}/man1/
+cp docs/man/* ${RPM_BUILD_ROOT}/%{_mandir}/man1/
+cat << EOF >> INSTALLED_FILES
+%doc %{_mandir}/man1/*"
+EOF
diff --git a/setup.cfg b/setup.cfg
index d3d908abf5..99bc60c9a3 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,3 +1,4 @@
[bdist_rpm]
-doc_files = docs/*.txt
+doc_files = docs examples extras AUTHORS INSTALL LICENSE README
+install-script = scripts/rpm-install.sh
diff --git a/setup.py b/setup.py
index f403029efe..61e0fd55e9 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,21 @@
from distutils.core import setup
from distutils.command.install import INSTALL_SCHEMES
import os
+import sys
+
+def fullsplit(path, result=None):
+ """
+ Split a pathname into components (the opposite of os.path.join) in a
+ platform-neutral way.
+ """
+ if result is None:
+ result = []
+ head, tail = os.path.split(path)
+ if head == '':
+ return [tail] + result
+ if head == path:
+ return result
+ return fullsplit(head, [tail] + result)
# Tell distutils to put the data_files in platform-specific installation
# locations. See here for an explanation:
@@ -12,21 +27,28 @@ for scheme in INSTALL_SCHEMES.values():
# an easy way to do this.
packages, data_files = [], []
root_dir = os.path.dirname(__file__)
-len_root_dir = len(root_dir)
django_dir = os.path.join(root_dir, 'django')
+pieces = fullsplit(root_dir)
+if pieces[-1] == '':
+ len_root_dir = len(pieces) - 1
+else:
+ len_root_dir = len(pieces)
for dirpath, dirnames, filenames in os.walk(django_dir):
# Ignore dirnames that start with '.'
for i, dirname in enumerate(dirnames):
if dirname.startswith('.'): del dirnames[i]
if '__init__.py' in filenames:
- package = dirpath[len_root_dir:].lstrip('/').replace('/', '.')
- packages.append(package)
- else:
- data_files.append((dirpath, [os.path.join(dirpath, f) for f in filenames]))
+ packages.append('.'.join(fullsplit(dirpath)[len_root_dir:]))
+ elif filenames:
+ data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
# Dynamically calculate the version based on django.VERSION.
-version = "%d.%d-%s" % (__import__('django').VERSION)
+version_tuple = __import__('django').VERSION
+if version_tuple[2] is not None:
+ version = "%d.%d_%s" % version_tuple
+else:
+ version = "%d.%d" % version_tuple[:2]
setup(
name = "Django",
diff --git a/tests/modeltests/basic/models.py b/tests/modeltests/basic/models.py
index 1663068892..9af13c0e3e 100644
--- a/tests/modeltests/basic/models.py
+++ b/tests/modeltests/basic/models.py
@@ -12,7 +12,7 @@ class Article(models.Model):
class Meta:
ordering = ('pub_date','headline')
-
+
def __str__(self):
return self.headline
@@ -319,7 +319,6 @@ AttributeError: Manager isn't accessible via Article instances
>>> Article.objects.filter(id__lte=4).delete()
>>> Article.objects.all()
[<Article: Article 6>, <Article: Default headline>, <Article: Article 7>, <Article: Updated article 8>]
-
"""}
from django.conf import settings
@@ -358,4 +357,11 @@ __test__['API_TESTS'] += """
>>> a10 = Article.objects.create(headline="Article 10", pub_date=datetime(2005, 7, 31, 12, 30, 45))
>>> Article.objects.get(headline="Article 10")
<Article: Article 10>
+
+# Edge-case test: A year lookup should retrieve all objects in the given
+year, including Jan. 1 and Dec. 31.
+>>> a11 = Article.objects.create(headline='Article 11', pub_date=datetime(2008, 1, 1))
+>>> a12 = Article.objects.create(headline='Article 12', pub_date=datetime(2008, 12, 31, 23, 59, 59, 999999))
+>>> Article.objects.filter(pub_date__year=2008)
+[<Article: Article 11>, <Article: Article 12>]
"""
diff --git a/tests/modeltests/custom_columns/models.py b/tests/modeltests/custom_columns/models.py
index e88fa80da2..1283da07cf 100644
--- a/tests/modeltests/custom_columns/models.py
+++ b/tests/modeltests/custom_columns/models.py
@@ -1,53 +1,105 @@
"""
-17. Custom column names
+17. Custom column/table names
If your database column name is different than your model attribute, use the
``db_column`` parameter. Note that you'll use the field's name, not its column
name, in API usage.
+
+If your database table name is different than your model name, use the
+``db_table`` Meta attribute. This has no effect on the API used to
+query the database.
+
+If you need to use a table name for a many-to-many relationship that differs
+from the default generated name, use the ``db_table`` parameter on the
+ManyToMany field. This has no effect on the API for querying the database.
+
"""
from django.db import models
-class Person(models.Model):
+class Author(models.Model):
first_name = models.CharField(maxlength=30, db_column='firstname')
last_name = models.CharField(maxlength=30, db_column='last')
def __str__(self):
return '%s %s' % (self.first_name, self.last_name)
+ class Meta:
+ db_table = 'my_author_table'
+ ordering = ('last_name','first_name')
+
+class Article(models.Model):
+ headline = models.CharField(maxlength=100)
+ authors = models.ManyToManyField(Author, db_table='my_m2m_table')
+
+ def __str__(self):
+ return self.headline
+
+ class Meta:
+ ordering = ('headline',)
+
__test__ = {'API_TESTS':"""
-# Create a Person.
->>> p = Person(first_name='John', last_name='Smith')
->>> p.save()
+# Create a Author.
+>>> a = Author(first_name='John', last_name='Smith')
+>>> a.save()
->>> p.id
+>>> a.id
1
->>> Person.objects.all()
-[<Person: John Smith>]
+# Create another author
+>>> a2 = Author(first_name='Peter', last_name='Jones')
+>>> a2.save()
+
+# Create an article
+>>> art = Article(headline='Django lets you build web apps easily')
+>>> art.save()
+>>> art.authors = [a, a2]
->>> Person.objects.filter(first_name__exact='John')
-[<Person: John Smith>]
+# Although the table and column names on Author have been set to
+# custom values, nothing about using the Author model has changed...
->>> Person.objects.get(first_name__exact='John')
-<Person: John Smith>
+# Query the available authors
+>>> Author.objects.all()
+[<Author: Peter Jones>, <Author: John Smith>]
->>> Person.objects.filter(firstname__exact='John')
+>>> Author.objects.filter(first_name__exact='John')
+[<Author: John Smith>]
+
+>>> Author.objects.get(first_name__exact='John')
+<Author: John Smith>
+
+>>> Author.objects.filter(firstname__exact='John')
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'firstname' into field
+TypeError: Cannot resolve keyword 'firstname' into field. Choices are: article, id, first_name, last_name
->>> p = Person.objects.get(last_name__exact='Smith')
->>> p.first_name
+>>> a = Author.objects.get(last_name__exact='Smith')
+>>> a.first_name
'John'
->>> p.last_name
+>>> a.last_name
'Smith'
->>> p.firstname
+>>> a.firstname
Traceback (most recent call last):
...
-AttributeError: 'Person' object has no attribute 'firstname'
->>> p.last
+AttributeError: 'Author' object has no attribute 'firstname'
+>>> a.last
Traceback (most recent call last):
...
-AttributeError: 'Person' object has no attribute 'last'
+AttributeError: 'Author' object has no attribute 'last'
+
+# Although the Article table uses a custom m2m table,
+# nothing about using the m2m relationship has changed...
+
+# Get all the authors for an article
+>>> art.authors.all()
+[<Author: Peter Jones>, <Author: John Smith>]
+
+# Get the articles for an author
+>>> a.article_set.all()
+[<Article: Django lets you build web apps easily>]
+
+# Query the authors across the m2m relation
+>>> art.authors.filter(last_name='Jones')
+[<Author: Peter Jones>]
+
"""}
diff --git a/tests/modeltests/empty/models.py b/tests/modeltests/empty/models.py
index 0e5d572504..2493b53837 100644
--- a/tests/modeltests/empty/models.py
+++ b/tests/modeltests/empty/models.py
@@ -1,5 +1,5 @@
"""
-Empty model tests
+39. Empty model tests
These test that things behave sensibly for the rare corner-case of a model with
no fields.
diff --git a/tests/modeltests/field_defaults/models.py b/tests/modeltests/field_defaults/models.py
index da4cd38974..8e803d00d8 100644
--- a/tests/modeltests/field_defaults/models.py
+++ b/tests/modeltests/field_defaults/models.py
@@ -1,5 +1,5 @@
"""
-31. Callable defaults
+32. Callable defaults
You can pass callable objects as the ``default`` parameter to a field. When
the object is created without an explicit value passed in, Django will call
diff --git a/tests/modeltests/fixtures/__init__.py b/tests/modeltests/fixtures/__init__.py
new file mode 100644
index 0000000000..139597f9cb
--- /dev/null
+++ b/tests/modeltests/fixtures/__init__.py
@@ -0,0 +1,2 @@
+
+
diff --git a/tests/modeltests/fixtures/fixtures/fixture1.json b/tests/modeltests/fixtures/fixtures/fixture1.json
new file mode 100644
index 0000000000..cc11a3e926
--- /dev/null
+++ b/tests/modeltests/fixtures/fixtures/fixture1.json
@@ -0,0 +1,18 @@
+[
+ {
+ "pk": "2",
+ "model": "fixtures.article",
+ "fields": {
+ "headline": "Poker has no place on ESPN",
+ "pub_date": "2006-06-16 12:00:00"
+ }
+ },
+ {
+ "pk": "3",
+ "model": "fixtures.article",
+ "fields": {
+ "headline": "Time to reform copyright",
+ "pub_date": "2006-06-16 13:00:00"
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/modeltests/fixtures/fixtures/fixture2.json b/tests/modeltests/fixtures/fixtures/fixture2.json
new file mode 100644
index 0000000000..01b40d7535
--- /dev/null
+++ b/tests/modeltests/fixtures/fixtures/fixture2.json
@@ -0,0 +1,18 @@
+[
+ {
+ "pk": "3",
+ "model": "fixtures.article",
+ "fields": {
+ "headline": "Copyright is fine the way it is",
+ "pub_date": "2006-06-16 14:00:00"
+ }
+ },
+ {
+ "pk": "4",
+ "model": "fixtures.article",
+ "fields": {
+ "headline": "Django conquers world!",
+ "pub_date": "2006-06-16 15:00:00"
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/modeltests/fixtures/fixtures/fixture2.xml b/tests/modeltests/fixtures/fixtures/fixture2.xml
new file mode 100644
index 0000000000..9ced78162e
--- /dev/null
+++ b/tests/modeltests/fixtures/fixtures/fixture2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+ <object pk="2" model="fixtures.article">
+ <field type="CharField" name="headline">Poker on TV is great!</field>
+ <field type="DateTimeField" name="pub_date">2006-06-16 11:00:00</field>
+ </object>
+ <object pk="5" model="fixtures.article">
+ <field type="CharField" name="headline">XML identified as leading cause of cancer</field>
+ <field type="DateTimeField" name="pub_date">2006-06-16 16:00:00</field>
+ </object>
+</django-objects> \ No newline at end of file
diff --git a/tests/modeltests/fixtures/fixtures/fixture3.xml b/tests/modeltests/fixtures/fixtures/fixture3.xml
new file mode 100644
index 0000000000..9ced78162e
--- /dev/null
+++ b/tests/modeltests/fixtures/fixtures/fixture3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+ <object pk="2" model="fixtures.article">
+ <field type="CharField" name="headline">Poker on TV is great!</field>
+ <field type="DateTimeField" name="pub_date">2006-06-16 11:00:00</field>
+ </object>
+ <object pk="5" model="fixtures.article">
+ <field type="CharField" name="headline">XML identified as leading cause of cancer</field>
+ <field type="DateTimeField" name="pub_date">2006-06-16 16:00:00</field>
+ </object>
+</django-objects> \ No newline at end of file
diff --git a/tests/modeltests/fixtures/fixtures/initial_data.json b/tests/modeltests/fixtures/fixtures/initial_data.json
new file mode 100644
index 0000000000..477d781dbc
--- /dev/null
+++ b/tests/modeltests/fixtures/fixtures/initial_data.json
@@ -0,0 +1,10 @@
+[
+ {
+ "pk": "1",
+ "model": "fixtures.article",
+ "fields": {
+ "headline": "Python program becomes self aware",
+ "pub_date": "2006-06-16 11:00:00"
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/modeltests/fixtures/models.py b/tests/modeltests/fixtures/models.py
new file mode 100644
index 0000000000..c75e6723fd
--- /dev/null
+++ b/tests/modeltests/fixtures/models.py
@@ -0,0 +1,88 @@
+"""
+37. Fixtures.
+
+Fixtures are a way of loading data into the database in bulk. Fixure data
+can be stored in any serializable format (including JSON and XML). Fixtures
+are identified by name, and are stored in either a directory named 'fixtures'
+in the application directory, on in one of the directories named in the
+FIXTURE_DIRS setting.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+ headline = models.CharField(maxlength=100, default='Default headline')
+ pub_date = models.DateTimeField()
+
+ def __str__(self):
+ return self.headline
+
+ class Meta:
+ ordering = ('-pub_date', 'headline')
+
+__test__ = {'API_TESTS': """
+>>> from django.core import management
+>>> from django.db.models import get_app
+
+# Reset the database representation of this app.
+# This will return the database to a clean initial state.
+>>> management.flush(verbosity=0, interactive=False)
+
+# Syncdb introduces 1 initial data object from initial_data.json.
+>>> Article.objects.all()
+[<Article: Python program becomes self aware>]
+
+# Load fixture 1. Single JSON file, with two objects.
+>>> management.load_data(['fixture1.json'], verbosity=0)
+>>> Article.objects.all()
+[<Article: Time to reform copyright>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]
+
+# Load fixture 2. JSON file imported by default. Overwrites some existing objects
+>>> management.load_data(['fixture2.json'], verbosity=0)
+>>> Article.objects.all()
+[<Article: Django conquers world!>, <Article: Copyright is fine the way it is>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]
+
+# Load fixture 3, XML format.
+>>> management.load_data(['fixture3.xml'], verbosity=0)
+>>> Article.objects.all()
+[<Article: XML identified as leading cause of cancer>, <Article: Django conquers world!>, <Article: Copyright is fine the way it is>, <Article: Poker on TV is great!>, <Article: Python program becomes self aware>]
+
+# Load a fixture that doesn't exist
+>>> management.load_data(['unknown.json'], verbosity=0)
+
+# object list is unaffected
+>>> Article.objects.all()
+[<Article: XML identified as leading cause of cancer>, <Article: Django conquers world!>, <Article: Copyright is fine the way it is>, <Article: Poker on TV is great!>, <Article: Python program becomes self aware>]
+
+# Reset the database representation of this app. This will delete all data.
+>>> management.flush(verbosity=0, interactive=False)
+>>> Article.objects.all()
+[<Article: Python program becomes self aware>]
+
+# Load fixture 1 again, using format discovery
+>>> management.load_data(['fixture1'], verbosity=0)
+>>> Article.objects.all()
+[<Article: Time to reform copyright>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]
+
+# Try to load fixture 2 using format discovery; this will fail
+# because there are two fixture2's in the fixtures directory
+>>> management.load_data(['fixture2'], verbosity=0) # doctest: +ELLIPSIS
+Multiple fixtures named 'fixture2' in '...fixtures'. Aborting.
+
+>>> Article.objects.all()
+[<Article: Time to reform copyright>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]
+
+# Dump the current contents of the database as a JSON fixture
+>>> print management.dump_data(['fixtures'], format='json')
+[{"pk": "3", "model": "fixtures.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "2", "model": "fixtures.article", "fields": {"headline": "Poker has no place on ESPN", "pub_date": "2006-06-16 12:00:00"}}, {"pk": "1", "model": "fixtures.article", "fields": {"headline": "Python program becomes self aware", "pub_date": "2006-06-16 11:00:00"}}]
+"""}
+
+from django.test import TestCase
+
+class SampleTestCase(TestCase):
+ fixtures = ['fixture1.json', 'fixture2.json']
+
+ def testClassFixtures(self):
+ "Check that test case has installed 4 fixture objects"
+ self.assertEqual(Article.objects.count(), 4)
+ self.assertEquals(str(Article.objects.all()), "[<Article: Django conquers world!>, <Article: Copyright is fine the way it is>, <Article: Poker has no place on ESPN>, <Article: Python program becomes self aware>]")
diff --git a/tests/modeltests/generic_relations/models.py b/tests/modeltests/generic_relations/models.py
index eb64d7ec3d..195f67db8f 100644
--- a/tests/modeltests/generic_relations/models.py
+++ b/tests/modeltests/generic_relations/models.py
@@ -1,5 +1,5 @@
"""
-33. Generic relations
+34. Generic relations
Generic relations let an object have a foreign key to any object through a
content-type/object-id field. A generic foreign key can point to any object,
@@ -11,6 +11,7 @@ from complete).
from django.db import models
from django.contrib.contenttypes.models import ContentType
+from django.contrib.contenttypes import generic
class TaggedItem(models.Model):
"""A tag on an item."""
@@ -18,7 +19,7 @@ class TaggedItem(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
- content_object = models.GenericForeignKey()
+ content_object = generic.GenericForeignKey()
class Meta:
ordering = ["tag"]
@@ -30,7 +31,7 @@ class Animal(models.Model):
common_name = models.CharField(maxlength=150)
latin_name = models.CharField(maxlength=150)
- tags = models.GenericRelation(TaggedItem)
+ tags = generic.GenericRelation(TaggedItem)
def __str__(self):
return self.common_name
@@ -39,7 +40,7 @@ class Vegetable(models.Model):
name = models.CharField(maxlength=150)
is_yucky = models.BooleanField(default=True)
- tags = models.GenericRelation(TaggedItem)
+ tags = generic.GenericRelation(TaggedItem)
def __str__(self):
return self.name
@@ -65,14 +66,14 @@ __test__ = {'API_TESTS':"""
# Objects with declared GenericRelations can be tagged directly -- the API
# mimics the many-to-many API.
->>> lion.tags.create(tag="yellow")
-<TaggedItem: yellow>
->>> lion.tags.create(tag="hairy")
-<TaggedItem: hairy>
>>> bacon.tags.create(tag="fatty")
<TaggedItem: fatty>
>>> bacon.tags.create(tag="salty")
<TaggedItem: salty>
+>>> lion.tags.create(tag="yellow")
+<TaggedItem: yellow>
+>>> lion.tags.create(tag="hairy")
+<TaggedItem: hairy>
>>> lion.tags.all()
[<TaggedItem: hairy>, <TaggedItem: yellow>]
@@ -105,4 +106,30 @@ __test__ = {'API_TESTS':"""
[<TaggedItem: shiny>]
>>> TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id)
[<TaggedItem: clearish>]
+
+# If you delete an object with an explicit Generic relation, the related
+# objects are deleted when the source object is deleted.
+# Original list of tags:
+>>> [(t.tag, t.content_type, t.object_id) for t in TaggedItem.objects.all()]
+[('clearish', <ContentType: mineral>, 1), ('fatty', <ContentType: vegetable>, 2), ('hairy', <ContentType: animal>, 1), ('salty', <ContentType: vegetable>, 2), ('shiny', <ContentType: animal>, 2), ('yellow', <ContentType: animal>, 1)]
+
+>>> lion.delete()
+>>> [(t.tag, t.content_type, t.object_id) for t in TaggedItem.objects.all()]
+[('clearish', <ContentType: mineral>, 1), ('fatty', <ContentType: vegetable>, 2), ('salty', <ContentType: vegetable>, 2), ('shiny', <ContentType: animal>, 2)]
+
+# If Generic Relation is not explicitly defined, any related objects
+# remain after deletion of the source object.
+>>> quartz.delete()
+>>> [(t.tag, t.content_type, t.object_id) for t in TaggedItem.objects.all()]
+[('clearish', <ContentType: mineral>, 1), ('fatty', <ContentType: vegetable>, 2), ('salty', <ContentType: vegetable>, 2), ('shiny', <ContentType: animal>, 2)]
+
+# If you delete a tag, the objects using the tag are unaffected
+# (other than losing a tag)
+>>> tag = TaggedItem.objects.get(id=1)
+>>> tag.delete()
+>>> bacon.tags.all()
+[<TaggedItem: salty>]
+>>> [(t.tag, t.content_type, t.object_id) for t in TaggedItem.objects.all()]
+[('clearish', <ContentType: mineral>, 1), ('salty', <ContentType: vegetable>, 2), ('shiny', <ContentType: animal>, 2)]
+
"""}
diff --git a/tests/modeltests/get_object_or_404/__init__.py b/tests/modeltests/get_object_or_404/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/modeltests/get_object_or_404/__init__.py
diff --git a/tests/modeltests/get_object_or_404/models.py b/tests/modeltests/get_object_or_404/models.py
new file mode 100644
index 0000000000..2ad459669f
--- /dev/null
+++ b/tests/modeltests/get_object_or_404/models.py
@@ -0,0 +1,86 @@
+"""
+35. DB-API Shortcuts
+
+get_object_or_404 is a shortcut function to be used in view functions for
+performing a get() lookup and raising a Http404 exception if a DoesNotExist
+exception was rasied during the get() call.
+
+get_list_or_404 is a shortcut function to be used in view functions for
+performing a filter() lookup and raising a Http404 exception if a DoesNotExist
+exception was rasied during the filter() call.
+"""
+
+from django.db import models
+from django.http import Http404
+from django.shortcuts import get_object_or_404, get_list_or_404
+
+class Author(models.Model):
+ name = models.CharField(maxlength=50)
+
+ def __str__(self):
+ return self.name
+
+class ArticleManager(models.Manager):
+ def get_query_set(self):
+ return super(ArticleManager, self).get_query_set().filter(authors__name__icontains='sir')
+
+class Article(models.Model):
+ authors = models.ManyToManyField(Author)
+ title = models.CharField(maxlength=50)
+ objects = models.Manager()
+ by_a_sir = ArticleManager()
+
+ def __str__(self):
+ return self.title
+
+__test__ = {'API_TESTS':"""
+# Create some Authors.
+>>> a = Author.objects.create(name="Brave Sir Robin")
+>>> a.save()
+>>> a2 = Author.objects.create(name="Patsy")
+>>> a2.save()
+
+# No Articles yet, so we should get a Http404 error.
+>>> get_object_or_404(Article, title="Foo")
+Traceback (most recent call last):
+...
+Http404: No Article matches the given query.
+
+# Create an Article.
+>>> article = Article.objects.create(title="Run away!")
+>>> article.authors = [a, a2]
+>>> article.save()
+
+# get_object_or_404 can be passed a Model to query.
+>>> get_object_or_404(Article, title__contains="Run")
+<Article: Run away!>
+
+# We can also use the the Article manager through an Author object.
+>>> get_object_or_404(a.article_set, title__contains="Run")
+<Article: Run away!>
+
+# No articles containing "Camelot". This should raise a Http404 error.
+>>> get_object_or_404(a.article_set, title__contains="Camelot")
+Traceback (most recent call last):
+...
+Http404: No Article matches the given query.
+
+# Custom managers can be used too.
+>>> get_object_or_404(Article.by_a_sir, title="Run away!")
+<Article: Run away!>
+
+# get_list_or_404 can be used to get lists of objects
+>>> get_list_or_404(a.article_set, title__icontains='Run')
+[<Article: Run away!>]
+
+# Http404 is returned if the list is empty
+>>> get_list_or_404(a.article_set, title__icontains='Shrubbery')
+Traceback (most recent call last):
+...
+Http404: No Article matches the given query.
+
+# Custom managers can be used too.
+>>> get_list_or_404(Article.by_a_sir, title__icontains="Run")
+[<Article: Run away!>]
+
+"""}
diff --git a/tests/modeltests/get_or_create/models.py b/tests/modeltests/get_or_create/models.py
index b4f39ceded..f974a82dee 100644
--- a/tests/modeltests/get_or_create/models.py
+++ b/tests/modeltests/get_or_create/models.py
@@ -1,5 +1,5 @@
"""
-32. get_or_create()
+33. get_or_create()
get_or_create() does what it says: it tries to look up an object with the given
parameters. If an object isn't found, it creates one with the given parameters.
diff --git a/tests/modeltests/invalid_models/models.py b/tests/modeltests/invalid_models/models.py
index 2299cd85e6..90f2f54632 100644
--- a/tests/modeltests/invalid_models/models.py
+++ b/tests/modeltests/invalid_models/models.py
@@ -8,7 +8,7 @@ from django.db import models
class FieldErrors(models.Model):
charfield = models.CharField()
- floatfield = models.FloatField()
+ decimalfield = models.DecimalField()
filefield = models.FileField()
prepopulate = models.CharField(maxlength=10, prepopulate_from='bad')
choices = models.CharField(maxlength=10, choices='bad')
@@ -87,19 +87,29 @@ class SelfClashM2M(models.Model):
src_safe = models.CharField(maxlength=10)
selfclashm2m = models.CharField(maxlength=10)
- # Non-symmetrical M2M fields _do_ have related accessors, so
+ # Non-symmetrical M2M fields _do_ have related accessors, so
# there is potential for clashes.
selfclashm2m_set = models.ManyToManyField("SelfClashM2M", symmetrical=False)
-
+
m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id', symmetrical=False)
m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe', symmetrical=False)
m2m_3 = models.ManyToManyField('self', symmetrical=False)
m2m_4 = models.ManyToManyField('self', symmetrical=False)
+class Model(models.Model):
+ "But it's valid to call a model Model."
+ year = models.PositiveIntegerField() #1960
+ make = models.CharField(maxlength=10) #Aston Martin
+ name = models.CharField(maxlength=10) #DB 4 GT
+
+class Car(models.Model):
+ colour = models.CharField(maxlength=5)
+ model = models.ForeignKey(Model)
+
model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute.
-invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" attribute.
-invalid_models.fielderrors: "floatfield": FloatFields require a "max_digits" attribute.
+invalid_models.fielderrors: "decimalfield": DecimalFields require a "decimal_places" attribute.
+invalid_models.fielderrors: "decimalfield": DecimalFields require a "max_digits" attribute.
invalid_models.fielderrors: "filefield": FileFields require an "upload_to" attribute.
invalid_models.fielderrors: "prepopulate": prepopulate_from should be a list or tuple.
invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tuple or list).
diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py
index 09c3aa7aa8..6af70f8351 100644
--- a/tests/modeltests/lookup/models.py
+++ b/tests/modeltests/lookup/models.py
@@ -58,6 +58,17 @@ Article 4
>>> Article.objects.filter(headline__startswith='Blah blah').count()
0L
+# count() should respect sliced query sets.
+>>> articles = Article.objects.all()
+>>> articles.count()
+7L
+>>> articles[:4].count()
+4
+>>> articles[1:100].count()
+6L
+>>> articles[10:100].count()
+0
+
# Date and date/time lookups can also be done with strings.
>>> Article.objects.filter(pub_date__exact='2005-07-27 00:00:00').count()
3L
@@ -120,6 +131,27 @@ True
[('headline', 'Article 7'), ('id', 7)]
[('headline', 'Article 1'), ('id', 1)]
+
+# you can use values() even on extra fields
+>>> for d in Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_one'):
+... i = d.items()
+... i.sort()
+... i
+[('id', 5), ('id_plus_one', 6)]
+[('id', 6), ('id_plus_one', 7)]
+[('id', 4), ('id_plus_one', 5)]
+[('id', 2), ('id_plus_one', 3)]
+[('id', 3), ('id_plus_one', 4)]
+[('id', 7), ('id_plus_one', 8)]
+[('id', 1), ('id_plus_one', 2)]
+
+# however, an exception FieldDoesNotExist will still be thrown
+# if you try to access non-existent field (field that is neither on the model nor extra)
+>>> Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_two')
+Traceback (most recent call last):
+ ...
+FieldDoesNotExist: Article has no field named 'id_plus_two'
+
# if you don't specify which fields, all are returned
>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
True
@@ -191,4 +223,32 @@ DoesNotExist: Article matching query does not exist.
>>> Article.objects.filter(headline__contains='\\')
[<Article: Article with \ backslash>]
+# none() returns an EmptyQuerySet that behaves like any other QuerySet object
+>>> Article.objects.none()
+[]
+>>> Article.objects.none().filter(headline__startswith='Article')
+[]
+>>> Article.objects.none().count()
+0
+>>> [article for article in Article.objects.none().iterator()]
+[]
+
+# using __in with an empty list should return an empty query set
+>>> Article.objects.filter(id__in=[])
+[]
+
+>>> Article.objects.exclude(id__in=[])
+[<Article: Article with \ backslash>, <Article: Article% with percent sign>, <Article: Article_ with underscore>, <Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 7>, <Article: Article 1>]
+
+# Programming errors are pointed out with nice error messages
+>>> Article.objects.filter(pub_date_year='2005').count()
+Traceback (most recent call last):
+ ...
+TypeError: Cannot resolve keyword 'pub_date_year' into field. Choices are: id, headline, pub_date
+
+>>> Article.objects.filter(headline__starts='Article')
+Traceback (most recent call last):
+ ...
+TypeError: Cannot resolve keyword 'headline__starts' into field. Choices are: id, headline, pub_date
+
"""}
diff --git a/tests/modeltests/m2m_and_m2o/models.py b/tests/modeltests/m2m_and_m2o/models.py
index 7fc66ed5a0..09affb002f 100644
--- a/tests/modeltests/m2m_and_m2o/models.py
+++ b/tests/modeltests/m2m_and_m2o/models.py
@@ -1,5 +1,5 @@
"""
-28. Many-to-many and many-to-one relationships to the same table
+29. Many-to-many and many-to-one relationships to the same table
Make sure to set ``related_name`` if you use relationships to the same table.
"""
diff --git a/tests/modeltests/m2m_recursive/models.py b/tests/modeltests/m2m_recursive/models.py
index 9f31cf92c0..15c713a759 100644
--- a/tests/modeltests/m2m_recursive/models.py
+++ b/tests/modeltests/m2m_recursive/models.py
@@ -1,5 +1,5 @@
"""
-27. Many-to-many relationships between the same two tables
+28. Many-to-many relationships between the same two tables
In this example, A Person can have many friends, who are also people. Friendship is a
symmetrical relationship - if I am your friend, you are my friend.
diff --git a/tests/modeltests/manipulators/models.py b/tests/modeltests/manipulators/models.py
index e5b8be55b5..1a44cfe7f4 100644
--- a/tests/modeltests/manipulators/models.py
+++ b/tests/modeltests/manipulators/models.py
@@ -1,5 +1,5 @@
"""
-26. Default manipulators
+27. Default manipulators
Each model gets an AddManipulator and ChangeManipulator by default.
"""
diff --git a/tests/modeltests/many_to_many/models.py b/tests/modeltests/many_to_many/models.py
index 38f8931ee7..5e46ad428d 100644
--- a/tests/modeltests/many_to_many/models.py
+++ b/tests/modeltests/many_to_many/models.py
@@ -203,7 +203,19 @@ __test__ = {'API_TESTS':"""
>>> p2.article_set.all()
[<Article: Oxygen-free diet works wonders>]
-# Recreate the article and Publication we just deleted.
+# Relation sets can also be set using primary key values
+>>> p2.article_set = [a4.id, a5.id]
+>>> p2.article_set.all()
+[<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[<Publication: Science News>]
+>>> a4.publications = [p3.id]
+>>> p2.article_set.all()
+[<Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[<Publication: Science Weekly>]
+
+# Recreate the article and Publication we have deleted.
>>> p1 = Publication(id=None, title='The Python Journal')
>>> p1.save()
>>> a2 = Article(id=None, headline='NASA uses Python')
diff --git a/tests/modeltests/many_to_one/models.py b/tests/modeltests/many_to_one/models.py
index 82eb3257d0..02f7bf1066 100644
--- a/tests/modeltests/many_to_one/models.py
+++ b/tests/modeltests/many_to_one/models.py
@@ -174,13 +174,13 @@ False
>>> Article.objects.filter(reporter_id__exact=1)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'reporter_id' into field
+TypeError: Cannot resolve keyword 'reporter_id' into field. Choices are: id, headline, pub_date, reporter
# You need to specify a comparison clause
>>> Article.objects.filter(reporter_id=1)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'reporter_id' into field
+TypeError: Cannot resolve keyword 'reporter_id' into field. Choices are: id, headline, pub_date, reporter
# You can also instantiate an Article by passing
# the Reporter's ID instead of a Reporter object.
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index 5ffd6aac9f..6ffd4d1bce 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -1,18 +1,35 @@
"""
-34. Generating HTML forms from models
+36. Generating HTML forms from models
-Django provides shortcuts for creating Form objects from a model class.
+Django provides shortcuts for creating Form objects from a model class and a
+model instance.
The function django.newforms.form_for_model() takes a model class and returns
a Form that is tied to the model. This Form works just like any other Form,
-with one additional method: create(). The create() method creates an instance
+with one additional method: save(). The save() method creates an instance
of the model and returns that newly created instance. It saves the instance to
-the database if create(save=True), which is default. If you pass
-create(save=False), then you'll get the object without saving it.
+the database if save(commit=True), which is default. If you pass
+commit=False, then you'll get the object without committing the changes to the
+database.
+
+The function django.newforms.form_for_instance() takes a model instance and
+returns a Form that is tied to the instance. This form works just like any
+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 cleaned_data into the instance. It also takes
+a commit=True parameter.
"""
from django.db import models
+ARTICLE_STATUS = (
+ (1, 'Draft'),
+ (2, 'Pending'),
+ (3, 'Live'),
+)
+
class Category(models.Model):
name = models.CharField(maxlength=20)
url = models.CharField('The URL', maxlength=40)
@@ -20,16 +37,40 @@ class Category(models.Model):
def __str__(self):
return self.name
+class Writer(models.Model):
+ name = models.CharField(maxlength=50, help_text='Use both first and last names.')
+
+ def __str__(self):
+ return self.name
+
class Article(models.Model):
headline = models.CharField(maxlength=50)
- pub_date = models.DateTimeField()
- categories = models.ManyToManyField(Category)
+ pub_date = models.DateField()
+ created = models.DateField(editable=False)
+ writer = models.ForeignKey(Writer)
+ article = models.TextField()
+ categories = models.ManyToManyField(Category, blank=True)
+ status = models.IntegerField(choices=ARTICLE_STATUS, blank=True, null=True)
+
+ def save(self):
+ import datetime
+ if not self.id:
+ self.created = datetime.date.today()
+ return super(Article, self).save()
def __str__(self):
return self.headline
+class PhoneNumber(models.Model):
+ phone = models.PhoneNumberField()
+ description = models.CharField(maxlength=20)
+
+ def __str__(self):
+ return self.phone
+
__test__ = {'API_TESTS': """
->>> from django.newforms import form_for_model, BaseForm
+>>> from django.newforms import form_for_model, form_for_instance, save_instance, BaseForm, Form, CharField
+>>> import datetime
>>> Category.objects.all()
[]
@@ -51,33 +92,36 @@ __test__ = {'API_TESTS': """
<li>The URL: <input type="text" name="url" maxlength="40" /></li>
>>> f = CategoryForm({'name': 'Entertainment', 'url': 'entertainment'})
->>> f.errors
-{}
->>> f.clean_data
+>>> f.is_valid()
+True
+>>> f.cleaned_data
{'url': u'entertainment', 'name': u'Entertainment'}
->>> obj = f.create()
+>>> obj = f.save()
>>> obj
<Category: Entertainment>
>>> Category.objects.all()
[<Category: Entertainment>]
>>> f = CategoryForm({'name': "It's a test", 'url': 'test'})
->>> f.errors
-{}
->>> f.clean_data
+>>> f.is_valid()
+True
+>>> f.cleaned_data
{'url': u'test', 'name': u"It's a test"}
->>> obj = f.create()
+>>> obj = f.save()
>>> obj
<Category: It's a test>
>>> Category.objects.all()
[<Category: Entertainment>, <Category: It's a test>]
+If you call save() with commit=False, then it will return an object that
+hasn't yet been saved to the database. In this case, it's up to you to call
+save() on the resulting model instance.
>>> f = CategoryForm({'name': 'Third test', 'url': 'third'})
->>> f.errors
-{}
->>> f.clean_data
+>>> f.is_valid()
+True
+>>> f.cleaned_data
{'url': u'third', 'name': u'Third test'}
->>> obj = f.create(save=False)
+>>> obj = f.save(commit=False)
>>> obj
<Category: Third test>
>>> Category.objects.all()
@@ -86,21 +130,67 @@ __test__ = {'API_TESTS': """
>>> Category.objects.all()
[<Category: Entertainment>, <Category: It's a test>, <Category: Third test>]
+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.create()
+>>> f.cleaned_data
+Traceback (most recent call last):
+...
+AttributeError: 'CategoryForm' object has no attribute 'cleaned_data'
+>>> f.save()
Traceback (most recent call last):
...
ValueError: The Category could not be created because the data didn't validate.
-
>>> f = CategoryForm({'name': '', 'url': 'foo'})
->>> f.create()
+>>> f.save()
Traceback (most recent call last):
...
ValueError: The Category could not be created because the data didn't validate.
+Create a couple of Writers.
+>>> w = Writer(name='Mike Royko')
+>>> w.save()
+>>> w = Writer(name='Bob Woodward')
+>>> w.save()
+
+ManyToManyFields are represented by a MultipleChoiceField, ForeignKeys and any
+fields with the 'choices' attribute are represented by a ChoiceField.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm(auto_id=False)
+>>> print f
+<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr>
+<tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr>
+<tr><th>Writer:</th><td><select name="writer">
+<option value="" selected="selected">---------</option>
+<option value="1">Mike Royko</option>
+<option value="2">Bob Woodward</option>
+</select></td></tr>
+<tr><th>Article:</th><td><textarea rows="10" cols="40" name="article"></textarea></td></tr>
+<tr><th>Status:</th><td><select name="status">
+<option value="" selected="selected">---------</option>
+<option value="1">Draft</option>
+<option value="2">Pending</option>
+<option value="3">Live</option>
+</select></td></tr>
+<tr><th>Categories:</th><td><select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select><br /> Hold down "Control", or "Command" on a Mac, to select more than one.</td></tr>
+
+You can restrict a form to a subset of the complete list of fields
+by providing a 'fields' argument. If you try to save a
+model created with such a form, you need to ensure that the fields
+that are _not_ on the form have default values, or are allowed to have
+a value of None. If a field isn't specified on a form, the object created
+from the form can't provide a value for that field!
+>>> PartialArticleForm = form_for_model(Article, fields=('headline','pub_date'))
+>>> f = PartialArticleForm(auto_id=False)
+>>> print f
+<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr>
+<tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr>
+
You can pass a custom Form class to form_for_model. Make sure it's a
subclass of BaseForm, not Form.
>>> class CustomForm(BaseForm):
@@ -110,4 +200,330 @@ subclass of BaseForm, not Form.
>>> f = CategoryForm()
>>> f.say_hello()
hello
+
+Use form_for_instance to create a Form from a model instance. The difference
+between this Form and one created via form_for_model is that the object's
+current values are inserted as 'initial' data in each Field.
+>>> w = Writer.objects.get(name='Mike Royko')
+>>> RoykoForm = form_for_instance(w)
+>>> f = RoykoForm(auto_id=False)
+>>> print f
+<tr><th>Name:</th><td><input type="text" name="name" value="Mike Royko" maxlength="50" /><br />Use both first and last names.</td></tr>
+
+>>> art = Article(headline='Test article', pub_date=datetime.date(1988, 1, 4), writer=w, article='Hello.')
+>>> art.save()
+>>> art.id
+1
+>>> TestArticleForm = form_for_instance(art)
+>>> f = TestArticleForm(auto_id=False)
+>>> print f.as_ul()
+<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /></li>
+<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>
+<li>Writer: <select name="writer">
+<option value="">---------</option>
+<option value="1" selected="selected">Mike Royko</option>
+<option value="2">Bob Woodward</option>
+</select></li>
+<li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li>
+<li>Status: <select name="status">
+<option value="" selected="selected">---------</option>
+<option value="1">Draft</option>
+<option value="2">Pending</option>
+<option value="3">Live</option>
+</select></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select> Hold down "Control", or "Command" on a Mac, to select more than one.</li>
+>>> f = TestArticleForm({'headline': u'Test headline', 'pub_date': u'1984-02-06', 'writer': u'1', 'article': 'Hello.'})
+>>> f.is_valid()
+True
+>>> test_art = f.save()
+>>> test_art.id
+1
+>>> test_art = Article.objects.get(id=1)
+>>> test_art.headline
+'Test headline'
+
+You can create a form over a subset of the available fields
+by specifying a 'fields' argument to form_for_instance.
+>>> PartialArticleForm = form_for_instance(art, fields=('headline','pub_date'))
+>>> f = PartialArticleForm({'headline': u'New headline', 'pub_date': u'1988-01-04'}, auto_id=False)
+>>> print f.as_ul()
+<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li>
+<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>
+>>> f.is_valid()
+True
+>>> new_art = f.save()
+>>> new_art.id
+1
+>>> new_art = Article.objects.get(id=1)
+>>> new_art.headline
+'New headline'
+
+Add some categories and test the many-to-many form output.
+>>> new_art.categories.all()
+[]
+>>> new_art.categories.add(Category.objects.get(name='Entertainment'))
+>>> new_art.categories.all()
+[<Category: Entertainment>]
+>>> TestArticleForm = form_for_instance(new_art)
+>>> f = TestArticleForm(auto_id=False)
+>>> print f.as_ul()
+<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li>
+<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>
+<li>Writer: <select name="writer">
+<option value="">---------</option>
+<option value="1" selected="selected">Mike Royko</option>
+<option value="2">Bob Woodward</option>
+</select></li>
+<li>Article: <textarea rows="10" cols="40" name="article">Hello.</textarea></li>
+<li>Status: <select name="status">
+<option value="" selected="selected">---------</option>
+<option value="1">Draft</option>
+<option value="2">Pending</option>
+<option value="3">Live</option>
+</select></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1" selected="selected">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third test</option>
+</select> Hold down "Control", or "Command" on a Mac, to select more than one.</li>
+
+>>> f = TestArticleForm({'headline': u'New headline', 'pub_date': u'1988-01-04',
+... 'writer': u'1', 'article': u'Hello.', 'categories': [u'1', u'2']})
+>>> new_art = f.save()
+>>> new_art.id
+1
+>>> new_art = Article.objects.get(id=1)
+>>> new_art.categories.all()
+[<Category: Entertainment>, <Category: It's a test>]
+
+Now, submit form data with no categories. This deletes the existing categories.
+>>> f = TestArticleForm({'headline': u'New headline', 'pub_date': u'1988-01-04',
+... 'writer': u'1', 'article': u'Hello.'})
+>>> new_art = f.save()
+>>> new_art.id
+1
+>>> new_art = Article.objects.get(id=1)
+>>> new_art.categories.all()
+[]
+
+Create a new article, with categories, via the form.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm({'headline': u'The walrus was Paul', 'pub_date': u'1967-11-01',
+... 'writer': u'1', 'article': u'Test.', 'categories': [u'1', u'2']})
+>>> new_art = f.save()
+>>> new_art.id
+2
+>>> new_art = Article.objects.get(id=2)
+>>> new_art.categories.all()
+[<Category: Entertainment>, <Category: It's a test>]
+
+Create a new article, with no categories, via the form.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm({'headline': u'The walrus was Paul', 'pub_date': u'1967-11-01',
+... 'writer': u'1', 'article': u'Test.'})
+>>> new_art = f.save()
+>>> new_art.id
+3
+>>> new_art = Article.objects.get(id=3)
+>>> new_art.categories.all()
+[]
+
+Here, we define a custom Form. Because it happens to have the same fields as
+the Category model, we can use save_instance() to apply its changes to an
+existing Category instance.
+>>> class ShortCategory(Form):
+... name = CharField(max_length=5)
+... url = CharField(max_length=3)
+>>> cat = Category.objects.get(name='Third test')
+>>> cat
+<Category: Third test>
+>>> cat.id
+3
+>>> sc = ShortCategory({'name': 'Third', 'url': '3rd'})
+>>> save_instance(sc, cat)
+<Category: Third>
+>>> Category.objects.get(id=3)
+<Category: Third>
+
+Here, we demonstrate that choices for a ForeignKey ChoiceField are determined
+at runtime, based on the data in the database when the form is displayed, not
+the data in the database when the form is instantiated.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm(auto_id=False)
+>>> print f.as_ul()
+<li>Headline: <input type="text" name="headline" maxlength="50" /></li>
+<li>Pub date: <input type="text" name="pub_date" /></li>
+<li>Writer: <select name="writer">
+<option value="" selected="selected">---------</option>
+<option value="1">Mike Royko</option>
+<option value="2">Bob Woodward</option>
+</select></li>
+<li>Article: <textarea rows="10" cols="40" name="article"></textarea></li>
+<li>Status: <select name="status">
+<option value="" selected="selected">---------</option>
+<option value="1">Draft</option>
+<option value="2">Pending</option>
+<option value="3">Live</option>
+</select></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third</option>
+</select> Hold down "Control", or "Command" on a Mac, to select more than one.</li>
+>>> Category.objects.create(name='Fourth', url='4th')
+<Category: Fourth>
+>>> Writer.objects.create(name='Carl Bernstein')
+<Writer: Carl Bernstein>
+>>> print f.as_ul()
+<li>Headline: <input type="text" name="headline" maxlength="50" /></li>
+<li>Pub date: <input type="text" name="pub_date" /></li>
+<li>Writer: <select name="writer">
+<option value="" selected="selected">---------</option>
+<option value="1">Mike Royko</option>
+<option value="2">Bob Woodward</option>
+<option value="3">Carl Bernstein</option>
+</select></li>
+<li>Article: <textarea rows="10" cols="40" name="article"></textarea></li>
+<li>Status: <select name="status">
+<option value="" selected="selected">---------</option>
+<option value="1">Draft</option>
+<option value="2">Pending</option>
+<option value="3">Live</option>
+</select></li>
+<li>Categories: <select multiple="multiple" name="categories">
+<option value="1">Entertainment</option>
+<option value="2">It&#39;s a test</option>
+<option value="3">Third</option>
+<option value="4">Fourth</option>
+</select> Hold down "Control", or "Command" on a Mac, to select more than one.</li>
+
+# ModelChoiceField ############################################################
+
+>>> from django.newforms import ModelChoiceField, ModelMultipleChoiceField
+
+>>> f = ModelChoiceField(Category.objects.all())
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(0)
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
+>>> f.clean(3)
+<Category: Third>
+>>> f.clean(2)
+<Category: It's a test>
+
+# Add a Category object *after* the ModelChoiceField has already been
+# instantiated. This proves clean() checks the database during clean() rather
+# than caching it at time of instantiation.
+>>> Category.objects.create(name='Fifth', url='5th')
+<Category: Fifth>
+>>> f.clean(5)
+<Category: Fifth>
+
+# Delete a Category object *after* the ModelChoiceField has already been
+# instantiated. This proves clean() checks the database during clean() rather
+# than caching it at time of instantiation.
+>>> Category.objects.get(url='5th').delete()
+>>> f.clean(5)
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
+
+>>> f = ModelChoiceField(Category.objects.filter(pk=1), required=False)
+>>> print f.clean('')
+None
+>>> f.clean('')
+>>> f.clean('1')
+<Category: Entertainment>
+>>> f.clean('100')
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
+
+# ModelMultipleChoiceField ####################################################
+
+>>> f = ModelMultipleChoiceField(Category.objects.all())
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean([])
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean([1])
+[<Category: Entertainment>]
+>>> f.clean([2])
+[<Category: It's a test>]
+>>> f.clean(['1'])
+[<Category: Entertainment>]
+>>> f.clean(['1', '2'])
+[<Category: Entertainment>, <Category: It's a test>]
+>>> f.clean([1, '2'])
+[<Category: Entertainment>, <Category: It's a test>]
+>>> f.clean((1, '2'))
+[<Category: Entertainment>, <Category: It's a test>]
+>>> f.clean(['100'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. 100 is not one of the available choices.']
+>>> f.clean('hello')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a list of values.']
+
+# Add a Category object *after* the ModelChoiceField has already been
+# instantiated. This proves clean() checks the database during clean() rather
+# than caching it at time of instantiation.
+>>> Category.objects.create(id=6, name='Sixth', url='6th')
+<Category: Sixth>
+>>> f.clean([6])
+[<Category: Sixth>]
+
+# Delete a Category object *after* the ModelChoiceField has already been
+# instantiated. This proves clean() checks the database during clean() rather
+# than caching it at time of instantiation.
+>>> Category.objects.get(url='6th').delete()
+>>> f.clean([6])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. 6 is not one of the available choices.']
+
+>>> f = ModelMultipleChoiceField(Category.objects.all(), required=False)
+>>> f.clean([])
+[]
+>>> f.clean(())
+[]
+>>> f.clean(['10'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. 10 is not one of the available choices.']
+>>> f.clean(['3', '10'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. 10 is not one of the available choices.']
+>>> f.clean(['1', '10'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. 10 is not one of the available choices.']
+
+# PhoneNumberField ############################################################
+
+>>> PhoneNumberForm = form_for_model(PhoneNumber)
+>>> f = PhoneNumberForm({'phone': '(312) 555-1212', 'description': 'Assistance'})
+>>> f.is_valid()
+True
+>>> f.cleaned_data
+{'phone': u'312-555-1212', 'description': u'Assistance'}
"""}
diff --git a/tests/modeltests/or_lookups/models.py b/tests/modeltests/or_lookups/models.py
index 2de18edc1f..9f926a7373 100644
--- a/tests/modeltests/or_lookups/models.py
+++ b/tests/modeltests/or_lookups/models.py
@@ -69,6 +69,21 @@ __test__ = {'API_TESTS':"""
>>> Article.objects.filter(Q(pk=1) | Q(pk=2) | Q(pk=3))
[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+# You could also use "in" to accomplish the same as above.
+>>> Article.objects.filter(pk__in=[1,2,3])
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+>>> Article.objects.filter(pk__in=[1,2,3,4])
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+# Passing "in" an empty list returns no results ...
+>>> Article.objects.filter(pk__in=[])
+[]
+
+# ... but can return results if we OR it with another query.
+>>> Article.objects.filter(Q(pk__in=[]) | Q(headline__icontains='goodbye'))
+[<Article: Goodbye>, <Article: Hello and goodbye>]
+
# Q arg objects are ANDed
>>> Article.objects.filter(Q(headline__startswith='Hello'), Q(headline__contains='bye'))
[<Article: Hello and goodbye>]
diff --git a/tests/modeltests/pagination/models.py b/tests/modeltests/pagination/models.py
index 3319b5cafa..94deb885f5 100644
--- a/tests/modeltests/pagination/models.py
+++ b/tests/modeltests/pagination/models.py
@@ -1,5 +1,5 @@
"""
-29. Object pagination
+30. Object pagination
Django provides a framework for paginating a list of objects in a few lines
of code. This is often useful for dividing search results or long lists of
diff --git a/tests/modeltests/reverse_lookup/models.py b/tests/modeltests/reverse_lookup/models.py
index 7e6712676f..4d6591551a 100644
--- a/tests/modeltests/reverse_lookup/models.py
+++ b/tests/modeltests/reverse_lookup/models.py
@@ -55,5 +55,5 @@ __test__ = {'API_TESTS':"""
>>> Poll.objects.get(choice__name__exact="This is the answer")
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'choice' into field
+TypeError: Cannot resolve keyword 'choice' into field. Choices are: poll_choice, related_choice, id, question, creator
"""}
diff --git a/tests/modeltests/select_related/__init__.py b/tests/modeltests/select_related/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/modeltests/select_related/__init__.py
diff --git a/tests/modeltests/select_related/models.py b/tests/modeltests/select_related/models.py
new file mode 100644
index 0000000000..cd34bd1d84
--- /dev/null
+++ b/tests/modeltests/select_related/models.py
@@ -0,0 +1,152 @@
+"""
+40. Tests for select_related()
+
+``select_related()`` follows all relationships and pre-caches any foreign key
+values so that complex trees can be fetched in a single query. However, this
+isn't always a good idea, so the ``depth`` argument control how many "levels"
+the select-related behavior will traverse.
+"""
+
+from django.db import models
+
+# Who remembers high school biology?
+
+class Domain(models.Model):
+ name = models.CharField(maxlength=50)
+ def __str__(self):
+ return self.name
+
+class Kingdom(models.Model):
+ name = models.CharField(maxlength=50)
+ domain = models.ForeignKey(Domain)
+ def __str__(self):
+ return self.name
+
+class Phylum(models.Model):
+ name = models.CharField(maxlength=50)
+ kingdom = models.ForeignKey(Kingdom)
+ def __str__(self):
+ return self.name
+
+class Klass(models.Model):
+ name = models.CharField(maxlength=50)
+ phylum = models.ForeignKey(Phylum)
+ def __str__(self):
+ return self.name
+
+class Order(models.Model):
+ name = models.CharField(maxlength=50)
+ klass = models.ForeignKey(Klass)
+ def __str__(self):
+ return self.name
+
+class Family(models.Model):
+ name = models.CharField(maxlength=50)
+ order = models.ForeignKey(Order)
+ def __str__(self):
+ return self.name
+
+class Genus(models.Model):
+ name = models.CharField(maxlength=50)
+ family = models.ForeignKey(Family)
+ def __str__(self):
+ return self.name
+
+class Species(models.Model):
+ name = models.CharField(maxlength=50)
+ genus = models.ForeignKey(Genus)
+ def __str__(self):
+ return self.name
+
+def create_tree(stringtree):
+ """Helper to create a complete tree"""
+ names = stringtree.split()
+ models = [Domain, Kingdom, Phylum, Klass, Order, Family, Genus, Species]
+ assert len(names) == len(models), (names, models)
+
+ parent = None
+ for name, model in zip(names, models):
+ try:
+ obj = model.objects.get(name=name)
+ except model.DoesNotExist:
+ obj = model(name=name)
+ if parent:
+ setattr(obj, parent.__class__.__name__.lower(), parent)
+ obj.save()
+ parent = obj
+
+__test__ = {'API_TESTS':"""
+
+# Set up.
+# The test runner sets settings.DEBUG to False, but we want to gather queries
+# so we'll set it to True here and reset it at the end of the test suite.
+>>> from django.conf import settings
+>>> settings.DEBUG = True
+
+>>> create_tree("Eukaryota Animalia Anthropoda Insecta Diptera Drosophilidae Drosophila melanogaster")
+>>> create_tree("Eukaryota Animalia Chordata Mammalia Primates Hominidae Homo sapiens")
+>>> create_tree("Eukaryota Plantae Magnoliophyta Magnoliopsida Fabales Fabaceae Pisum sativum")
+>>> create_tree("Eukaryota Fungi Basidiomycota Homobasidiomycatae Agaricales Amanitacae Amanita muscaria")
+
+>>> from django import db
+
+# Normally, accessing FKs doesn't fill in related objects:
+>>> db.reset_queries()
+>>> fly = Species.objects.get(name="melanogaster")
+>>> fly.genus.family.order.klass.phylum.kingdom.domain
+<Domain: Eukaryota>
+>>> len(db.connection.queries)
+8
+
+# However, a select_related() call will fill in those related objects without any extra queries:
+>>> db.reset_queries()
+>>> person = Species.objects.select_related().get(name="sapiens")
+>>> person.genus.family.order.klass.phylum.kingdom.domain
+<Domain: Eukaryota>
+>>> len(db.connection.queries)
+1
+
+# select_related() also of course applies to entire lists, not just items.
+# Without select_related()
+>>> db.reset_queries()
+>>> world = Species.objects.all()
+>>> [o.genus.family for o in world]
+[<Family: Drosophilidae>, <Family: Hominidae>, <Family: Fabaceae>, <Family: Amanitacae>]
+>>> len(db.connection.queries)
+9
+
+# With select_related():
+>>> db.reset_queries()
+>>> world = Species.objects.all().select_related()
+>>> [o.genus.family for o in world]
+[<Family: Drosophilidae>, <Family: Hominidae>, <Family: Fabaceae>, <Family: Amanitacae>]
+>>> len(db.connection.queries)
+1
+
+# The "depth" argument to select_related() will stop the descent at a particular level:
+>>> db.reset_queries()
+>>> pea = Species.objects.select_related(depth=1).get(name="sativum")
+>>> pea.genus.family.order.klass.phylum.kingdom.domain
+<Domain: Eukaryota>
+
+# Notice: one few query than above because of depth=1
+>>> len(db.connection.queries)
+7
+
+>>> db.reset_queries()
+>>> pea = Species.objects.select_related(depth=5).get(name="sativum")
+>>> pea.genus.family.order.klass.phylum.kingdom.domain
+<Domain: Eukaryota>
+>>> len(db.connection.queries)
+3
+
+>>> db.reset_queries()
+>>> world = Species.objects.all().select_related(depth=2)
+>>> [o.genus.family.order for o in world]
+[<Order: Diptera>, <Order: Primates>, <Order: Fabales>, <Order: Agaricales>]
+>>> len(db.connection.queries)
+5
+
+# Reset DEBUG to where we found it.
+>>> settings.DEBUG = False
+"""}
diff --git a/tests/modeltests/serializers/models.py b/tests/modeltests/serializers/models.py
index d1d10b43c0..8d44d5eae7 100644
--- a/tests/modeltests/serializers/models.py
+++ b/tests/modeltests/serializers/models.py
@@ -1,5 +1,5 @@
"""
-XXX. Serialization
+41. Serialization
``django.core.serializers`` provides interfaces to converting Django querysets
to and from "flat" data (i.e. strings).
@@ -37,6 +37,13 @@ class Article(models.Model):
def __str__(self):
return self.headline
+class AuthorProfile(models.Model):
+ author = models.OneToOneField(Author)
+ date_of_birth = models.DateField()
+
+ def __str__(self):
+ return "Profile of %s" % self.author
+
__test__ = {'API_TESTS':"""
# Create some data:
>>> from datetime import datetime
@@ -118,4 +125,42 @@ __test__ = {'API_TESTS':"""
>>> Article.objects.all()
[<Article: Just kidding; I love TV poker>, <Article: Time to reform copyright>]
+# If you use your own primary key field (such as a OneToOneField),
+# it doesn't appear in the serialized field list - it replaces the
+# pk identifier.
+>>> profile = AuthorProfile(author=joe, date_of_birth=datetime(1970,1,1))
+>>> profile.save()
+
+>>> json = serializers.serialize("json", AuthorProfile.objects.all())
+>>> json
+'[{"pk": "1", "model": "serializers.authorprofile", "fields": {"date_of_birth": "1970-01-01"}}]'
+
+>>> for obj in serializers.deserialize("json", json):
+... print obj
+<DeserializedObject: Profile of Joe>
+
+# Objects ids can be referenced before they are defined in the serialization data
+# However, the deserialization process will need to be contained within a transaction
+>>> json = '[{"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00", "categories": [4, 1], "author": 4}}, {"pk": "4", "model": "serializers.category", "fields": {"name": "Reference"}}, {"pk": "4", "model": "serializers.author", "fields": {"name": "Agnes"}}]'
+>>> from django.db import transaction
+>>> transaction.enter_transaction_management()
+>>> transaction.managed(True)
+>>> for obj in serializers.deserialize("json", json):
+... obj.save()
+
+>>> transaction.commit()
+>>> transaction.leave_transaction_management()
+
+>>> article = Article.objects.get(pk=3)
+>>> article
+<Article: Forward references pose no problem>
+>>> article.categories.all()
+[<Category: Reference>, <Category: Sports>]
+>>> article.author
+<Author: Agnes>
+
+# Serializer output can be restricted to a subset of fields
+>>> print serializers.serialize("json", Article.objects.all(), fields=('headline','pub_date'))
+[{"pk": "1", "model": "serializers.article", "fields": {"headline": "Just kidding; I love TV poker", "pub_date": "2006-06-16 11:00:00"}}, {"pk": "2", "model": "serializers.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00"}}]
+
"""}
diff --git a/tests/modeltests/test_client/fixtures/testdata.json b/tests/modeltests/test_client/fixtures/testdata.json
new file mode 100644
index 0000000000..5c9e415240
--- /dev/null
+++ b/tests/modeltests/test_client/fixtures/testdata.json
@@ -0,0 +1,20 @@
+[
+ {
+ "pk": "1",
+ "model": "auth.user",
+ "fields": {
+ "username": "testclient",
+ "first_name": "Test",
+ "last_name": "Client",
+ "is_active": true,
+ "is_superuser": false,
+ "is_staff": false,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "testclient@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/modeltests/test_client/management.py b/tests/modeltests/test_client/management.py
deleted file mode 100644
index 9b5a5c498e..0000000000
--- a/tests/modeltests/test_client/management.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.dispatch import dispatcher
-from django.db.models import signals
-import models as test_client_app
-from django.contrib.auth.models import User
-
-def setup_test(app, created_models, verbosity):
- # Create a user account for the login-based tests
- User.objects.create_user('testclient','testclient@example.com', 'password')
-
-dispatcher.connect(setup_test, sender=test_client_app, signal=signals.post_syncdb)
diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py
index c5b1a241ca..5ebf29678c 100644
--- a/tests/modeltests/test_client/models.py
+++ b/tests/modeltests/test_client/models.py
@@ -1,5 +1,5 @@
"""
-39. Testing using the Test Client
+38. Testing using the Test Client
The test client is a class that can act like a simple
browser for testing purposes.
@@ -19,23 +19,20 @@ testing against the contexts and templates produced by a view,
rather than the HTML rendered to the end-user.
"""
-from django.test.client import Client
-import unittest
+from django.test import Client, TestCase
+from django.core import mail
-class ClientTest(unittest.TestCase):
- def setUp(self):
- "Set up test environment"
- self.client = Client()
-
+class ClientTest(TestCase):
+ fixtures = ['testdata.json']
+
def test_get_view(self):
"GET a view"
response = self.client.get('/test_client/get_view/')
# Check some response details
- self.assertEqual(response.status_code, 200)
+ self.assertContains(response, 'This is a test')
self.assertEqual(response.context['var'], 42)
self.assertEqual(response.template.name, 'GET Template')
- self.failUnless('This is a test.' in response.content)
def test_get_post_view(self):
"GET a view that normally expects POSTs"
@@ -43,7 +40,9 @@ class ClientTest(unittest.TestCase):
# Check some response details
self.assertEqual(response.status_code, 200)
- self.assertEqual(response.template.name, 'Empty POST Template')
+ self.assertEqual(response.template.name, 'Empty GET Template')
+ self.assertTemplateUsed(response, 'Empty GET Template')
+ self.assertTemplateNotUsed(response, 'Empty POST Template')
def test_empty_post(self):
"POST an empty dictionary to a view"
@@ -52,8 +51,10 @@ class ClientTest(unittest.TestCase):
# Check some response details
self.assertEqual(response.status_code, 200)
self.assertEqual(response.template.name, 'Empty POST Template')
+ self.assertTemplateNotUsed(response, 'Empty GET Template')
+ self.assertTemplateUsed(response, 'Empty POST Template')
- def test_post_view(self):
+ def test_post(self):
"POST some data to a view"
post_data = {
'value': 37
@@ -66,13 +67,135 @@ class ClientTest(unittest.TestCase):
self.assertEqual(response.template.name, 'POST Template')
self.failUnless('Data received' in response.content)
+ def test_raw_post(self):
+ "POST raw data (with a content type) to a view"
+ test_doc = """<?xml version="1.0" encoding="utf-8"?><library><book><title>Blink</title><author>Malcolm Gladwell</author></book></library>"""
+ response = self.client.post("/test_client/raw_post_view/", test_doc,
+ content_type="text/xml")
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.template.name, "Book template")
+ self.assertEqual(response.content, "Blink - Malcolm Gladwell")
+
def test_redirect(self):
"GET a URL that redirects elsewhere"
response = self.client.get('/test_client/redirect_view/')
# Check that the response was a 302 (redirect)
- self.assertEqual(response.status_code, 302)
-
+ self.assertRedirects(response, '/test_client/get_view/')
+
+ def test_permanent_redirect(self):
+ "GET a URL that redirects permanently elsewhere"
+ response = self.client.get('/test_client/permanent_redirect_view/')
+
+ # Check that the response was a 301 (permanent redirect)
+ self.assertRedirects(response, '/test_client/get_view/', status_code=301)
+
+ def test_redirect_to_strange_location(self):
+ "GET a URL that redirects to a non-200 page"
+ response = self.client.get('/test_client/double_redirect_view/')
+
+ # Check that the response was a 302, and that
+ # the attempt to get the redirection location returned 301 when retrieved
+ self.assertRedirects(response, '/test_client/permanent_redirect_view/', target_status_code=301)
+
+ def test_notfound_response(self):
+ "GET a URL that responds as '404:Not Found'"
+ response = self.client.get('/test_client/bad_view/')
+
+ # Check that the response was a 404, and that the content contains MAGIC
+ self.assertContains(response, 'MAGIC', status_code=404)
+
+ def test_valid_form(self):
+ "POST valid data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'foo@example.com',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Valid POST Template")
+
+ def test_incomplete_data_form(self):
+ "POST incomplete data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'value': 37
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertContains(response, 'This field is required.', 3)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ self.assertFormError(response, 'form', 'email', 'This field is required.')
+ self.assertFormError(response, 'form', 'single', 'This field is required.')
+ self.assertFormError(response, 'form', 'multi', 'This field is required.')
+
+ def test_form_error(self):
+ "POST erroneous data to a form"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ self.assertFormError(response, 'form', 'email', 'Enter a valid e-mail address.')
+
+ def test_valid_form_with_template(self):
+ "POST valid data to a form using multiple templates"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'foo@example.com',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view_with_template/', post_data)
+ self.assertContains(response, 'POST data OK')
+ self.assertTemplateUsed(response, "form_view.html")
+ self.assertTemplateUsed(response, 'base.html')
+ self.assertTemplateNotUsed(response, "Valid POST Template")
+
+ def test_incomplete_data_form_with_template(self):
+ "POST incomplete data to a form using multiple templates"
+ post_data = {
+ 'text': 'Hello World',
+ 'value': 37
+ }
+ response = self.client.post('/test_client/form_view_with_template/', post_data)
+ self.assertContains(response, 'POST data has errors')
+ self.assertTemplateUsed(response, 'form_view.html')
+ self.assertTemplateUsed(response, 'base.html')
+ self.assertTemplateNotUsed(response, "Invalid POST Template")
+
+ self.assertFormError(response, 'form', 'email', 'This field is required.')
+ self.assertFormError(response, 'form', 'single', 'This field is required.')
+ self.assertFormError(response, 'form', 'multi', 'This field is required.')
+
+ def test_form_error_with_template(self):
+ "POST erroneous data to a form using multiple templates"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view_with_template/', post_data)
+ self.assertContains(response, 'POST data has errors')
+ self.assertTemplateUsed(response, "form_view.html")
+ self.assertTemplateUsed(response, 'base.html')
+ self.assertTemplateNotUsed(response, "Invalid POST Template")
+
+ self.assertFormError(response, 'form', 'email', 'Enter a valid e-mail address.')
+
def test_unknown_page(self):
"GET an invalid URL"
response = self.client.get('/test_client/unknown_view/')
@@ -85,17 +208,77 @@ class ClientTest(unittest.TestCase):
# Get the page without logging in. Should result in 302.
response = self.client.get('/test_client/login_protected_view/')
- self.assertEqual(response.status_code, 302)
+ self.assertRedirects(response, '/accounts/login/')
+ # Log in
+ self.client.login(username='testclient', password='password')
+
# Request a page that requires a login
- response = self.client.login('/test_client/login_protected_view/', 'testclient', 'password')
- self.assertTrue(response)
+ response = self.client.get('/test_client/login_protected_view/')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['user'].username, 'testclient')
- self.assertEqual(response.template.name, 'Login Template')
def test_view_with_bad_login(self):
"Request a page that is protected with @login, but use bad credentials"
- response = self.client.login('/test_client/login_protected_view/', 'otheruser', 'nopassword')
- self.assertFalse(response)
+ login = self.client.login(username='otheruser', password='nopassword')
+ self.failIf(login)
+
+ def test_session_modifying_view(self):
+ "Request a page that modifies the session"
+ # Session value isn't set initially
+ try:
+ self.client.session['tobacconist']
+ self.fail("Shouldn't have a session value")
+ except KeyError:
+ pass
+
+ from django.contrib.sessions.models import Session
+ response = self.client.post('/test_client/session_view/')
+
+ # Check that the session was modified
+ self.assertEquals(self.client.session['tobacconist'], 'hovercraft')
+
+ def test_view_with_exception(self):
+ "Request a page that is known to throw an error"
+ self.assertRaises(KeyError, self.client.get, "/test_client/broken_view/")
+
+ #Try the same assertion, a different way
+ try:
+ self.client.get('/test_client/broken_view/')
+ self.fail('Should raise an error')
+ except KeyError:
+ pass
+
+ def test_mail_sending(self):
+ "Test that mail is redirected to a dummy outbox during test setup"
+
+ response = self.client.get('/test_client/mail_sending_view/')
+ self.assertEqual(response.status_code, 200)
+
+ self.assertEqual(len(mail.outbox), 1)
+ self.assertEqual(mail.outbox[0].subject, 'Test message')
+ self.assertEqual(mail.outbox[0].body, 'This is a test email')
+ self.assertEqual(mail.outbox[0].from_email, 'from@example.com')
+ self.assertEqual(mail.outbox[0].to[0], 'first@example.com')
+ self.assertEqual(mail.outbox[0].to[1], 'second@example.com')
+
+ def test_mass_mail_sending(self):
+ "Test that mass mail is redirected to a dummy outbox during test setup"
+
+ response = self.client.get('/test_client/mass_mail_sending_view/')
+ self.assertEqual(response.status_code, 200)
+
+ self.assertEqual(len(mail.outbox), 2)
+ self.assertEqual(mail.outbox[0].subject, 'First Test message')
+ self.assertEqual(mail.outbox[0].body, 'This is the first test email')
+ self.assertEqual(mail.outbox[0].from_email, 'from@example.com')
+ self.assertEqual(mail.outbox[0].to[0], 'first@example.com')
+ self.assertEqual(mail.outbox[0].to[1], 'second@example.com')
+
+ self.assertEqual(mail.outbox[1].subject, 'Second Test message')
+ self.assertEqual(mail.outbox[1].body, 'This is the second test email')
+ self.assertEqual(mail.outbox[1].from_email, 'from@example.com')
+ self.assertEqual(mail.outbox[1].to[0], 'second@example.com')
+ self.assertEqual(mail.outbox[1].to[1], 'third@example.com')
+ \ No newline at end of file
diff --git a/tests/modeltests/test_client/urls.py b/tests/modeltests/test_client/urls.py
index 09bba5c007..538c0e4b43 100644
--- a/tests/modeltests/test_client/urls.py
+++ b/tests/modeltests/test_client/urls.py
@@ -1,9 +1,20 @@
from django.conf.urls.defaults import *
+from django.views.generic.simple import redirect_to
import views
urlpatterns = patterns('',
(r'^get_view/$', views.get_view),
(r'^post_view/$', views.post_view),
+ (r'^raw_post_view/$', views.raw_post_view),
(r'^redirect_view/$', views.redirect_view),
+ (r'^permanent_redirect_view/$', redirect_to, { 'url': '/test_client/get_view/' }),
+ (r'^double_redirect_view/$', views.double_redirect_view),
+ (r'^bad_view/$', views.bad_view),
+ (r'^form_view/$', views.form_view),
+ (r'^form_view_with_template/$', views.form_view_with_template),
(r'^login_protected_view/$', views.login_protected_view),
+ (r'^session_view/$', views.session_view),
+ (r'^broken_view/$', views.broken_view),
+ (r'^mail_sending_view/$', views.mail_sending_view),
+ (r'^mass_mail_sending_view/$', views.mass_mail_sending_view)
)
diff --git a/tests/modeltests/test_client/views.py b/tests/modeltests/test_client/views.py
index bf131032eb..9bdf213b35 100644
--- a/tests/modeltests/test_client/views.py
+++ b/tests/modeltests/test_client/views.py
@@ -1,6 +1,11 @@
+from xml.dom.minidom import parseString
+from django.core.mail import EmailMessage, SMTPConnection
from django.template import Context, Template
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
from django.contrib.auth.decorators import login_required
+from django.newforms.forms import Form
+from django.newforms import fields
+from django.shortcuts import render_to_response
def get_view(request):
"A simple view that expects a GET request, and returns a rendered template"
@@ -13,23 +18,139 @@ def post_view(request):
"""A view that expects a POST, and returns a different template depending
on whether any POST data is available
"""
- if request.POST:
- t = Template('Data received: {{ data }} is the value.', name='POST Template')
- c = Context({'data': request.POST['value']})
+ if request.method == 'POST':
+ if request.POST:
+ t = Template('Data received: {{ data }} is the value.', name='POST Template')
+ c = Context({'data': request.POST['value']})
+ else:
+ t = Template('Viewing POST page.', name='Empty POST Template')
+ c = Context()
else:
- t = Template('Viewing POST page.', name='Empty POST Template')
+ t = Template('Viewing GET page.', name='Empty GET Template')
c = Context()
-
+
return HttpResponse(t.render(c))
+def raw_post_view(request):
+ """A view which expects raw XML to be posted and returns content extracted
+ from the XML"""
+ if request.method == 'POST':
+ root = parseString(request.raw_post_data)
+ first_book = root.firstChild.firstChild
+ title, author = [n.firstChild.nodeValue for n in first_book.childNodes]
+ t = Template("{{ title }} - {{ author }}", name="Book template")
+ c = Context({"title": title, "author": author})
+ else:
+ t = Template("GET request.", name="Book GET template")
+ c = Context()
+
+ return HttpResponse(t.render(c))
+
def redirect_view(request):
"A view that redirects all requests to the GET view"
return HttpResponseRedirect('/test_client/get_view/')
+
+def double_redirect_view(request):
+ "A view that redirects all requests to a redirection view"
+ return HttpResponseRedirect('/test_client/permanent_redirect_view/')
+
+def bad_view(request):
+ "A view that returns a 404 with some error content"
+ return HttpResponseNotFound('Not found!. This page contains some MAGIC content')
+
+TestChoices = (
+ ('a', 'First Choice'),
+ ('b', 'Second Choice'),
+ ('c', 'Third Choice'),
+ ('d', 'Fourth Choice'),
+ ('e', 'Fifth Choice')
+)
+
+class TestForm(Form):
+ text = fields.CharField()
+ email = fields.EmailField()
+ value = fields.IntegerField()
+ single = fields.ChoiceField(choices=TestChoices)
+ multi = fields.MultipleChoiceField(choices=TestChoices)
+
+def form_view(request):
+ "A view that tests a simple form"
+ if request.method == 'POST':
+ form = TestForm(request.POST)
+ if form.is_valid():
+ t = Template('Valid POST data.', name='Valid POST Template')
+ c = Context()
+ else:
+ t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template')
+ c = Context({'form': form})
+ else:
+ form = TestForm()
+ t = Template('Viewing base form. {{ form }}.', name='Form GET Template')
+ c = Context({'form': form})
-@login_required
+ return HttpResponse(t.render(c))
+
+def form_view_with_template(request):
+ "A view that tests a simple form"
+ if request.method == 'POST':
+ form = TestForm(request.POST)
+ if form.is_valid():
+ message = 'POST data OK'
+ else:
+ message = 'POST data has errors'
+ else:
+ form = TestForm()
+ message = 'GET form page'
+ return render_to_response('form_view.html',
+ {
+ 'form': form,
+ 'message': message
+ }
+ )
+
+
def login_protected_view(request):
"A simple view that is login protected."
t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
c = Context({'user': request.user})
return HttpResponse(t.render(c))
+login_protected_view = login_required(login_protected_view)
+
+def session_view(request):
+ "A view that modifies the session"
+ request.session['tobacconist'] = 'hovercraft'
+
+ t = Template('This is a view that modifies the session.',
+ name='Session Modifying View Template')
+ c = Context()
+ return HttpResponse(t.render(c))
+
+def broken_view(request):
+ """A view which just raises an exception, simulating a broken view."""
+ raise KeyError("Oops! Looks like you wrote some bad code.")
+
+def mail_sending_view(request):
+ EmailMessage(
+ "Test message",
+ "This is a test email",
+ "from@example.com",
+ ['first@example.com', 'second@example.com']).send()
+ return HttpResponse("Mail sent")
+
+def mass_mail_sending_view(request):
+ m1 = EmailMessage(
+ 'First Test message',
+ 'This is the first test email',
+ 'from@example.com',
+ ['first@example.com', 'second@example.com'])
+ m2 = EmailMessage(
+ 'Second Test message',
+ 'This is the second test email',
+ 'from@example.com',
+ ['second@example.com', 'third@example.com'])
+
+ c = SMTPConnection()
+ c.send_messages([m1,m2])
+
+ return HttpResponse("Mail sent")
diff --git a/tests/modeltests/validation/models.py b/tests/modeltests/validation/models.py
index a9a3d3f485..b31f981aac 100644
--- a/tests/modeltests/validation/models.py
+++ b/tests/modeltests/validation/models.py
@@ -1,5 +1,5 @@
"""
-30. Validation
+31. Validation
This is an experimental feature!
@@ -146,4 +146,8 @@ u'john@example.com'
>>> p.validate()
{'email': ['Enter a valid e-mail address.']}
+# Make sure that Date and DateTime return validation errors and don't raise Python errors.
+>>> Person(name='John Doe', is_child=True, email='abc@def.com').validate()
+{'favorite_moment': ['This field is required.'], 'birthdate': ['This field is required.']}
+
"""}
diff --git a/tests/regressiontests/bug639/__init__.py b/tests/regressiontests/bug639/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/bug639/__init__.py
diff --git a/tests/regressiontests/bug639/models.py b/tests/regressiontests/bug639/models.py
new file mode 100644
index 0000000000..7cfdfc82ef
--- /dev/null
+++ b/tests/regressiontests/bug639/models.py
@@ -0,0 +1,16 @@
+import tempfile
+from django.db import models
+
+class Photo(models.Model):
+ title = models.CharField(maxlength=30)
+ image = models.FileField(upload_to=tempfile.gettempdir())
+
+ # Support code for the tests; this keeps track of how many times save() gets
+ # called on each instance.
+ def __init__(self, *args, **kwargs):
+ super(Photo, self).__init__(*args, **kwargs)
+ self._savecount = 0
+
+ def save(self):
+ super(Photo, self).save()
+ self._savecount +=1 \ No newline at end of file
diff --git a/tests/regressiontests/bug639/test.jpg b/tests/regressiontests/bug639/test.jpg
new file mode 100644
index 0000000000..391b57a0f3
--- /dev/null
+++ b/tests/regressiontests/bug639/test.jpg
Binary files differ
diff --git a/tests/regressiontests/bug639/tests.py b/tests/regressiontests/bug639/tests.py
new file mode 100644
index 0000000000..f9596d06cb
--- /dev/null
+++ b/tests/regressiontests/bug639/tests.py
@@ -0,0 +1,42 @@
+"""
+Tests for file field behavior, and specifically #639, in which Model.save() gets
+called *again* for each FileField. This test will fail if calling an
+auto-manipulator's save() method causes Model.save() to be called more than once.
+"""
+
+import os
+import unittest
+from regressiontests.bug639.models import Photo
+from django.http import QueryDict
+from django.utils.datastructures import MultiValueDict
+
+class Bug639Test(unittest.TestCase):
+
+ def testBug639(self):
+ """
+ Simulate a file upload and check how many times Model.save() gets called.
+ """
+ # Grab an image for testing
+ img = open(os.path.join(os.path.dirname(__file__), "test.jpg"), "rb").read()
+
+ # Fake a request query dict with the file
+ qd = QueryDict("title=Testing&image=", mutable=True)
+ qd["image_file"] = {
+ "filename" : "test.jpg",
+ "content-type" : "image/jpeg",
+ "content" : img
+ }
+
+ manip = Photo.AddManipulator()
+ manip.do_html2python(qd)
+ p = manip.save(qd)
+
+ # Check the savecount stored on the object (see the model)
+ self.assertEqual(p._savecount, 1)
+
+ def tearDown(self):
+ """
+ Make sure to delete the "uploaded" file to avoid clogging /tmp.
+ """
+ p = Photo.objects.get()
+ os.unlink(p.get_image_filename()) \ No newline at end of file
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index cf58ab321a..9dc7161c03 100644
--- a/tests/regressiontests/cache/tests.py
+++ b/tests/regressiontests/cache/tests.py
@@ -46,6 +46,11 @@ class Cache(unittest.TestCase):
self.assertEqual(cache.has_key("hello"), True)
self.assertEqual(cache.has_key("goodbye"), False)
+ def test_in(self):
+ cache.set("hello", "goodbye")
+ self.assertEqual("hello" in cache, True)
+ self.assertEqual("goodbye" in cache, False)
+
def test_data_types(self):
# test data types
stuff = {
diff --git a/tests/regressiontests/datastructures/__init__.py b/tests/regressiontests/datastructures/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/datastructures/__init__.py
diff --git a/tests/regressiontests/datastructures/models.py b/tests/regressiontests/datastructures/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/datastructures/models.py
diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py
new file mode 100644
index 0000000000..18eb4fcccd
--- /dev/null
+++ b/tests/regressiontests/datastructures/tests.py
@@ -0,0 +1,67 @@
+"""
+# Tests for stuff in django.utils.datastructures.
+
+>>> from django.utils.datastructures import *
+
+### MergeDict #################################################################
+
+>>> d1 = {'chris':'cool','camri':'cute','cotton':'adorable','tulip':'snuggable', 'twoofme':'firstone'}
+>>> d2 = {'chris2':'cool2','camri2':'cute2','cotton2':'adorable2','tulip2':'snuggable2'}
+>>> d3 = {'chris3':'cool3','camri3':'cute3','cotton3':'adorable3','tulip3':'snuggable3'}
+>>> d4 = {'twoofme':'secondone'}
+>>> md = MergeDict( d1,d2,d3 )
+>>> md['chris']
+'cool'
+>>> md['camri']
+'cute'
+>>> md['twoofme']
+'firstone'
+>>> md2 = md.copy()
+>>> md2['chris']
+'cool'
+
+### MultiValueDict ##########################################################
+
+>>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
+>>> d['name']
+'Simon'
+>>> d.getlist('name')
+['Adrian', 'Simon']
+>>> d.get('lastname', 'nonexistent')
+'nonexistent'
+>>> d.setlist('lastname', ['Holovaty', 'Willison'])
+
+### SortedDict #################################################################
+
+>>> d = SortedDict()
+>>> d['one'] = 'one'
+>>> d['two'] = 'two'
+>>> d['three'] = 'three'
+>>> d['one']
+'one'
+>>> d['two']
+'two'
+>>> d['three']
+'three'
+>>> d.keys()
+['one', 'two', 'three']
+>>> d.values()
+['one', 'two', 'three']
+>>> d['one'] = 'not one'
+>>> d['one']
+'not one'
+>>> d.keys() == d.copy().keys()
+True
+>>> print repr(d)
+{'one': 'not one', 'two': 'two', 'three': 'three'}
+
+### DotExpandedDict ############################################################
+
+>>> d = DotExpandedDict({'person.1.firstname': ['Simon'], 'person.1.lastname': ['Willison'], 'person.2.firstname': ['Adrian'], 'person.2.lastname': ['Holovaty']})
+>>> d['person']['1']['lastname']
+['Willison']
+>>> d['person']['2']['lastname']
+['Holovaty']
+>>> d['person']['2']['firstname']
+['Adrian']
+"""
diff --git a/tests/regressiontests/dateformat/tests.py b/tests/regressiontests/dateformat/tests.py
index 6e28759a92..f9f84145c5 100644
--- a/tests/regressiontests/dateformat/tests.py
+++ b/tests/regressiontests/dateformat/tests.py
@@ -17,6 +17,8 @@ r"""
'07'
>>> format(my_birthday, 'M')
'Jul'
+>>> format(my_birthday, 'b')
+'jul'
>>> format(my_birthday, 'n')
'7'
>>> format(my_birthday, 'N')
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 32d6ef5202..4a2e9432b0 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
r"""
>>> floatformat(7.7)
'7.7'
@@ -11,6 +13,26 @@ r"""
'0.0'
>>> floatformat(0.0)
'0'
+>>> floatformat(7.7,3)
+'7.700'
+>>> floatformat(6.000000,3)
+'6.000'
+>>> floatformat(13.1031,-3)
+'13.103'
+>>> floatformat(11.1197, -2)
+'11.12'
+>>> floatformat(11.0000, -2)
+'11'
+>>> floatformat(11.000001, -2)
+'11.00'
+>>> floatformat(8.2798, 3)
+'8.280'
+>>> floatformat('foo')
+''
+>>> floatformat(13.1031, 'bar')
+'13.1031'
+>>> floatformat('foo', 'bar')
+''
>>> addslashes('"double quotes" and \'single quotes\'')
'\\"double quotes\\" and \\\'single quotes\\\''
@@ -67,6 +89,20 @@ u'\xeb'
>>> truncatewords('A sentence with a few words in it', 'not a number')
'A sentence with a few words in it'
+>>> truncatewords_html('<p>one <a href="#">two - three <br>four</a> five</p>', 0)
+''
+
+>>> truncatewords_html('<p>one <a href="#">two - three <br>four</a> five</p>', 2)
+'<p>one <a href="#">two ...</a></p>'
+
+>>> truncatewords_html('<p>one <a href="#">two - three <br>four</a> five</p>', 4)
+'<p>one <a href="#">two - three <br>four ...</a></p>'
+
+>>> truncatewords_html('<p>one <a href="#">two - three <br>four</a> five</p>', 5)
+'<p>one <a href="#">two - three <br>four</a> five</p>'
+
+>>> truncatewords_html('<p>one <a href="#">two - three <br>four</a> five</p>', 100)
+'<p>one <a href="#">two - three <br>four</a> five</p>'
>>> upper('Mixed case input')
'MIXED CASE INPUT'
@@ -77,6 +113,8 @@ u'\xcb'
>>> urlencode('jack & jill')
'jack%20%26%20jill'
+>>> urlencode(1)
+'1'
>>> urlizetrunc('http://short.com/', 20)
@@ -97,6 +135,12 @@ u'\xcb'
>>> wordwrap('this is a long paragraph of text that really needs to be wrapped I\'m afraid', 14)
"this is a long\nparagraph of\ntext that\nreally needs\nto be wrapped\nI'm afraid"
+>>> wordwrap('this is a short paragraph of text.\n But this line should be indented',14)
+'this is a\nshort\nparagraph of\ntext.\n But this\nline should be\nindented'
+
+>>> wordwrap('this is a short paragraph of text.\n But this line should be indented',15)
+'this is a short\nparagraph of\ntext.\n But this line\nshould be\nindented'
+
>>> ljust('test', 10)
'test '
@@ -124,6 +168,9 @@ u'\xcb'
>>> escape('<some html & special characters > here')
'&lt;some html &amp; special characters &gt; here'
+>>> escape(u'<some html & special characters > here ÄÅ€£')
+u'&lt;some html &amp; special characters &gt; here \xc4\x90\xc3\x85\xe2\x82\xac\xc2\xa3'
+
>>> linebreaks('line 1')
'<p>line 1</p>'
@@ -352,7 +399,53 @@ False
>>> phone2numeric('0800 flowers')
'0800 3569377'
-
+# Filters shouldn't break if passed non-strings
+>>> addslashes(123)
+'123'
+>>> linenumbers(123)
+'1. 123'
+>>> lower(123)
+'123'
+>>> make_list(123)
+['1', '2', '3']
+>>> slugify(123)
+'123'
+>>> title(123)
+'123'
+>>> truncatewords(123, 2)
+'123'
+>>> upper(123)
+'123'
+>>> urlencode(123)
+'123'
+>>> urlize(123)
+'123'
+>>> urlizetrunc(123, 1)
+'123'
+>>> wordcount(123)
+1
+>>> wordwrap(123, 2)
+'123'
+>>> ljust('123', 4)
+'123 '
+>>> rjust('123', 4)
+' 123'
+>>> center('123', 5)
+' 123 '
+>>> center('123', 6)
+' 123 '
+>>> cut(123, '2')
+'13'
+>>> escape(123)
+'123'
+>>> linebreaks(123)
+'<p>123</p>'
+>>> linebreaksbr(123)
+'123'
+>>> removetags(123, 'a')
+'123'
+>>> striptags(123)
+'123'
"""
diff --git a/tests/regressiontests/dispatch/__init__.py b/tests/regressiontests/dispatch/__init__.py
new file mode 100644
index 0000000000..679895bb5c
--- /dev/null
+++ b/tests/regressiontests/dispatch/__init__.py
@@ -0,0 +1,2 @@
+"""Unit-tests for the dispatch project
+"""
diff --git a/tests/regressiontests/dispatch/models.py b/tests/regressiontests/dispatch/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/dispatch/models.py
diff --git a/tests/regressiontests/dispatch/tests/__init__.py b/tests/regressiontests/dispatch/tests/__init__.py
new file mode 100644
index 0000000000..0fdefe48a7
--- /dev/null
+++ b/tests/regressiontests/dispatch/tests/__init__.py
@@ -0,0 +1,7 @@
+"""
+Unit-tests for the dispatch project
+"""
+
+from test_dispatcher import *
+from test_robustapply import *
+from test_saferef import *
diff --git a/tests/regressiontests/dispatch/tests/test_dispatcher.py b/tests/regressiontests/dispatch/tests/test_dispatcher.py
new file mode 100644
index 0000000000..0bc99a1505
--- /dev/null
+++ b/tests/regressiontests/dispatch/tests/test_dispatcher.py
@@ -0,0 +1,144 @@
+from django.dispatch.dispatcher import *
+from django.dispatch import dispatcher, robust
+import unittest
+import copy
+
+def x(a):
+ return a
+
+class Dummy(object):
+ pass
+
+class Callable(object):
+ def __call__(self, a):
+ return a
+
+ def a(self, a):
+ return a
+
+class DispatcherTests(unittest.TestCase):
+ """Test suite for dispatcher (barely started)"""
+
+ def setUp(self):
+ # track the initial state, since it's possible that others have bleed receivers in
+ self.sendersBack = copy.copy(dispatcher.sendersBack)
+ self.connections = copy.copy(dispatcher.connections)
+ self.senders = copy.copy(dispatcher.senders)
+
+ def _testIsClean(self):
+ """Assert that everything has been cleaned up automatically"""
+ self.assertEqual(dispatcher.sendersBack, self.sendersBack)
+ self.assertEqual(dispatcher.connections, self.connections)
+ self.assertEqual(dispatcher.senders, self.senders)
+
+ def testExact(self):
+ a = Dummy()
+ signal = 'this'
+ connect(x, signal, a)
+ expected = [(x,a)]
+ result = send('this',a, a=a)
+ self.assertEqual(result, expected)
+ disconnect(x, signal, a)
+ self.assertEqual(list(getAllReceivers(a,signal)), [])
+ self._testIsClean()
+
+ def testAnonymousSend(self):
+ a = Dummy()
+ signal = 'this'
+ connect(x, signal)
+ expected = [(x,a)]
+ result = send(signal,None, a=a)
+ self.assertEqual(result, expected)
+ disconnect(x, signal)
+ self.assertEqual(list(getAllReceivers(None,signal)), [])
+ self._testIsClean()
+
+ def testAnyRegistration(self):
+ a = Dummy()
+ signal = 'this'
+ connect(x, signal, Any)
+ expected = [(x,a)]
+ result = send('this',object(), a=a)
+ self.assertEqual(result, expected)
+ disconnect(x, signal, Any)
+ expected = []
+ result = send('this',object(), a=a)
+ self.assertEqual(result, expected)
+ self.assertEqual(list(getAllReceivers(Any,signal)), [])
+
+ self._testIsClean()
+
+ def testAnyRegistration2(self):
+ a = Dummy()
+ signal = 'this'
+ connect(x, Any, a)
+ expected = [(x,a)]
+ result = send('this',a, a=a)
+ self.assertEqual(result, expected)
+ disconnect(x, Any, a)
+ self.assertEqual(list(getAllReceivers(a,Any)), [])
+ self._testIsClean()
+
+ def testGarbageCollected(self):
+ a = Callable()
+ b = Dummy()
+ signal = 'this'
+ connect(a.a, signal, b)
+ expected = []
+ del a
+ result = send('this',b, a=b)
+ self.assertEqual(result, expected)
+ self.assertEqual(list(getAllReceivers(b,signal)), [])
+ self._testIsClean()
+
+ def testGarbageCollectedObj(self):
+ class x:
+ def __call__(self, a):
+ return a
+ a = Callable()
+ b = Dummy()
+ signal = 'this'
+ connect(a, signal, b)
+ expected = []
+ del a
+ result = send('this',b, a=b)
+ self.assertEqual(result, expected)
+ self.assertEqual(list(getAllReceivers(b,signal)), [])
+ self._testIsClean()
+
+
+ def testMultipleRegistration(self):
+ a = Callable()
+ b = Dummy()
+ signal = 'this'
+ connect(a, signal, b)
+ connect(a, signal, b)
+ connect(a, signal, b)
+ connect(a, signal, b)
+ connect(a, signal, b)
+ connect(a, signal, b)
+ result = send('this',b, a=b)
+ self.assertEqual(len(result), 1)
+ self.assertEqual(len(list(getAllReceivers(b,signal))), 1)
+ del a
+ del b
+ del result
+ self._testIsClean()
+
+ def testRobust(self):
+ """Test the sendRobust function"""
+ def fails():
+ raise ValueError('this')
+ a = object()
+ signal = 'this'
+ connect(fails, Any, a)
+ result = robust.sendRobust('this',a, a=a)
+ err = result[0][1]
+ self.assert_(isinstance(err, ValueError))
+ self.assertEqual(err.args, ('this',))
+
+def getSuite():
+ return unittest.makeSuite(DispatcherTests,'test')
+
+if __name__ == "__main__":
+ unittest.main ()
diff --git a/tests/regressiontests/dispatch/tests/test_robustapply.py b/tests/regressiontests/dispatch/tests/test_robustapply.py
new file mode 100644
index 0000000000..499450eec4
--- /dev/null
+++ b/tests/regressiontests/dispatch/tests/test_robustapply.py
@@ -0,0 +1,34 @@
+from django.dispatch.robustapply import *
+
+import unittest
+
+def noArgument():
+ pass
+
+def oneArgument(blah):
+ pass
+
+def twoArgument(blah, other):
+ pass
+
+class TestCases(unittest.TestCase):
+ def test01(self):
+ robustApply(noArgument)
+
+ def test02(self):
+ self.assertRaises(TypeError, robustApply, noArgument, "this")
+
+ def test03(self):
+ self.assertRaises(TypeError, robustApply, oneArgument)
+
+ def test04(self):
+ """Raise error on duplication of a particular argument"""
+ self.assertRaises(TypeError, robustApply, oneArgument, "this", blah = "that")
+
+def getSuite():
+ return unittest.makeSuite(TestCases,'test')
+
+
+if __name__ == "__main__":
+ unittest.main()
+
diff --git a/tests/regressiontests/dispatch/tests/test_saferef.py b/tests/regressiontests/dispatch/tests/test_saferef.py
new file mode 100644
index 0000000000..c0ec879a4b
--- /dev/null
+++ b/tests/regressiontests/dispatch/tests/test_saferef.py
@@ -0,0 +1,79 @@
+from django.dispatch.saferef import *
+
+import unittest
+
+class Test1(object):
+ def x(self):
+ pass
+
+def test2(obj):
+ pass
+
+class Test2(object):
+ def __call__(self, obj):
+ pass
+
+class Tester(unittest.TestCase):
+ def setUp(self):
+ ts = []
+ ss = []
+ for x in xrange(5000):
+ t = Test1()
+ ts.append(t)
+ s = safeRef(t.x, self._closure)
+ ss.append(s)
+ ts.append(test2)
+ ss.append(safeRef(test2, self._closure))
+ for x in xrange(30):
+ t = Test2()
+ ts.append(t)
+ s = safeRef(t, self._closure)
+ ss.append(s)
+ self.ts = ts
+ self.ss = ss
+ self.closureCount = 0
+
+ def tearDown(self):
+ del self.ts
+ del self.ss
+
+ def testIn(self):
+ """Test the "in" operator for safe references (cmp)"""
+ for t in self.ts[:50]:
+ self.assert_(safeRef(t.x) in self.ss)
+
+ def testValid(self):
+ """Test that the references are valid (return instance methods)"""
+ for s in self.ss:
+ self.assert_(s())
+
+ def testShortCircuit (self):
+ """Test that creation short-circuits to reuse existing references"""
+ sd = {}
+ for s in self.ss:
+ sd[s] = 1
+ for t in self.ts:
+ if hasattr(t, 'x'):
+ self.assert_(sd.has_key(safeRef(t.x)))
+ self.assert_(safeRef(t.x) in sd)
+ else:
+ self.assert_(sd.has_key(safeRef(t)))
+ self.assert_(safeRef(t) in sd)
+
+ def testRepresentation (self):
+ """Test that the reference object's representation works
+
+ XXX Doesn't currently check the results, just that no error
+ is raised
+ """
+ repr(self.ss[-1])
+
+ def _closure(self, ref):
+ """Dumb utility mechanism to increment deletion counter"""
+ self.closureCount +=1
+
+def getSuite():
+ return unittest.makeSuite(Tester,'test')
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/regressiontests/fixtures_regress/__init__.py b/tests/regressiontests/fixtures_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/__init__.py
diff --git a/tests/regressiontests/fixtures_regress/fixtures/sequence.json b/tests/regressiontests/fixtures_regress/fixtures/sequence.json
new file mode 100644
index 0000000000..ecaf637b9f
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/fixtures/sequence.json
@@ -0,0 +1,10 @@
+[
+ {
+ "pk": "1",
+ "model": "fixtures_regress.animal",
+ "fields": {
+ "name": "Lion",
+ "latin_name": "Panthera leo"
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py
new file mode 100644
index 0000000000..dd407df353
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/models.py
@@ -0,0 +1,29 @@
+from django.db import models
+
+class Animal(models.Model):
+ name = models.CharField(maxlength=150)
+ latin_name = models.CharField(maxlength=150)
+
+ def __str__(self):
+ return self.common_name
+
+class Plant(models.Model):
+ name = models.CharField(maxlength=150)
+
+ class Meta:
+ # For testing when upper case letter in app name; regression for #4057
+ db_table = "Fixtures_regress_plant"
+
+__test__ = {'API_TESTS':"""
+>>> from django.core import management
+
+# Load a fixture that uses PK=1
+>>> management.load_data(['sequence'], verbosity=0)
+
+# Create a new animal. Without a sequence reset, this new object
+# will take a PK of 1 (on Postgres), and the save will fail.
+# This is a regression test for ticket #3790.
+>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus')
+>>> animal.save()
+
+"""} \ No newline at end of file
diff --git a/tests/regressiontests/forms/localflavor.py b/tests/regressiontests/forms/localflavor.py
new file mode 100644
index 0000000000..ede89de2a0
--- /dev/null
+++ b/tests/regressiontests/forms/localflavor.py
@@ -0,0 +1,1359 @@
+# -*- coding: utf-8 -*-
+# Tests for the different contrib/localflavor/ form fields.
+
+localflavor_tests = r"""
+# USZipCodeField ##############################################################
+
+USZipCodeField validates that the data is either a five-digit U.S. zip code or
+a zip+4.
+>>> from django.contrib.localflavor.us.forms import USZipCodeField
+>>> f = USZipCodeField()
+>>> f.clean('60606')
+u'60606'
+>>> f.clean(60606)
+u'60606'
+>>> f.clean('04000')
+u'04000'
+>>> f.clean('4000')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean('60606-1234')
+u'60606-1234'
+>>> f.clean('6060-1234')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean('60606-')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = USZipCodeField(required=False)
+>>> f.clean('60606')
+u'60606'
+>>> f.clean(60606)
+u'60606'
+>>> f.clean('04000')
+u'04000'
+>>> f.clean('4000')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean('60606-1234')
+u'60606-1234'
+>>> f.clean('6060-1234')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean('60606-')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX or XXXXX-XXXX.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# USPhoneNumberField ##########################################################
+
+USPhoneNumberField validates that the data is a valid U.S. phone number,
+including the area code. It's normalized to XXX-XXX-XXXX format.
+>>> from django.contrib.localflavor.us.forms import USPhoneNumberField
+>>> f = USPhoneNumberField()
+>>> f.clean('312-555-1212')
+u'312-555-1212'
+>>> f.clean('3125551212')
+u'312-555-1212'
+>>> f.clean('312 555-1212')
+u'312-555-1212'
+>>> f.clean('(312) 555-1212')
+u'312-555-1212'
+>>> f.clean('312 555 1212')
+u'312-555-1212'
+>>> f.clean('312.555.1212')
+u'312-555-1212'
+>>> f.clean('312.555-1212')
+u'312-555-1212'
+>>> f.clean(' (312) 555.1212 ')
+u'312-555-1212'
+>>> f.clean('555-1212')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
+>>> f.clean('312-55-1212')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = USPhoneNumberField(required=False)
+>>> f.clean('312-555-1212')
+u'312-555-1212'
+>>> f.clean('3125551212')
+u'312-555-1212'
+>>> f.clean('312 555-1212')
+u'312-555-1212'
+>>> f.clean('(312) 555-1212')
+u'312-555-1212'
+>>> f.clean('312 555 1212')
+u'312-555-1212'
+>>> f.clean('312.555.1212')
+u'312-555-1212'
+>>> f.clean('312.555-1212')
+u'312-555-1212'
+>>> f.clean(' (312) 555.1212 ')
+u'312-555-1212'
+>>> f.clean('555-1212')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
+>>> f.clean('312-55-1212')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# USStateField ################################################################
+
+USStateField validates that the data is either an abbreviation or name of a
+U.S. state.
+>>> from django.contrib.localflavor.us.forms import USStateField
+>>> f = USStateField()
+>>> f.clean('il')
+u'IL'
+>>> f.clean('IL')
+u'IL'
+>>> f.clean('illinois')
+u'IL'
+>>> f.clean(' illinois ')
+u'IL'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a U.S. state or territory.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = USStateField(required=False)
+>>> f.clean('il')
+u'IL'
+>>> f.clean('IL')
+u'IL'
+>>> f.clean('illinois')
+u'IL'
+>>> f.clean(' illinois ')
+u'IL'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a U.S. state or territory.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# USStateSelect ###############################################################
+
+USStateSelect is a Select widget that uses a list of U.S. states/territories
+as its choices.
+>>> from django.contrib.localflavor.us.forms import USStateSelect
+>>> w = USStateSelect()
+>>> print w.render('state', 'IL')
+<select name="state">
+<option value="AL">Alabama</option>
+<option value="AK">Alaska</option>
+<option value="AS">American Samoa</option>
+<option value="AZ">Arizona</option>
+<option value="AR">Arkansas</option>
+<option value="CA">California</option>
+<option value="CO">Colorado</option>
+<option value="CT">Connecticut</option>
+<option value="DE">Delaware</option>
+<option value="DC">District of Columbia</option>
+<option value="FM">Federated States of Micronesia</option>
+<option value="FL">Florida</option>
+<option value="GA">Georgia</option>
+<option value="GU">Guam</option>
+<option value="HI">Hawaii</option>
+<option value="ID">Idaho</option>
+<option value="IL" selected="selected">Illinois</option>
+<option value="IN">Indiana</option>
+<option value="IA">Iowa</option>
+<option value="KS">Kansas</option>
+<option value="KY">Kentucky</option>
+<option value="LA">Louisiana</option>
+<option value="ME">Maine</option>
+<option value="MH">Marshall Islands</option>
+<option value="MD">Maryland</option>
+<option value="MA">Massachusetts</option>
+<option value="MI">Michigan</option>
+<option value="MN">Minnesota</option>
+<option value="MS">Mississippi</option>
+<option value="MO">Missouri</option>
+<option value="MT">Montana</option>
+<option value="NE">Nebraska</option>
+<option value="NV">Nevada</option>
+<option value="NH">New Hampshire</option>
+<option value="NJ">New Jersey</option>
+<option value="NM">New Mexico</option>
+<option value="NY">New York</option>
+<option value="NC">North Carolina</option>
+<option value="ND">North Dakota</option>
+<option value="MP">Northern Mariana Islands</option>
+<option value="OH">Ohio</option>
+<option value="OK">Oklahoma</option>
+<option value="OR">Oregon</option>
+<option value="PW">Palau</option>
+<option value="PA">Pennsylvania</option>
+<option value="PR">Puerto Rico</option>
+<option value="RI">Rhode Island</option>
+<option value="SC">South Carolina</option>
+<option value="SD">South Dakota</option>
+<option value="TN">Tennessee</option>
+<option value="TX">Texas</option>
+<option value="UT">Utah</option>
+<option value="VT">Vermont</option>
+<option value="VI">Virgin Islands</option>
+<option value="VA">Virginia</option>
+<option value="WA">Washington</option>
+<option value="WV">West Virginia</option>
+<option value="WI">Wisconsin</option>
+<option value="WY">Wyoming</option>
+</select>
+
+# USSocialSecurityNumberField #################################################
+>>> from django.contrib.localflavor.us.forms import USSocialSecurityNumberField
+>>> f = USSocialSecurityNumberField()
+>>> f.clean('987-65-4330')
+u'987-65-4330'
+>>> f.clean('987654330')
+u'987-65-4330'
+>>> f.clean('078-05-1120')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid U.S. Social Security number in XXX-XX-XXXX format.']
+
+# UKPostcodeField #############################################################
+
+UKPostcodeField validates that the data is a valid UK postcode.
+>>> from django.contrib.localflavor.uk.forms import UKPostcodeField
+>>> f = UKPostcodeField()
+>>> f.clean('BT32 4PX')
+u'BT32 4PX'
+>>> f.clean('GIR 0AA')
+u'GIR 0AA'
+>>> f.clean('BT324PX')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
+>>> f.clean('1NV 4L1D')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = UKPostcodeField(required=False)
+>>> f.clean('BT32 4PX')
+u'BT32 4PX'
+>>> f.clean('GIR 0AA')
+u'GIR 0AA'
+>>> f.clean('1NV 4L1D')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
+>>> f.clean('BT324PX')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postcode. A space is required between the two postcode parts.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# FRZipCodeField #############################################################
+
+FRZipCodeField validates that the data is a valid FR zipcode.
+>>> from django.contrib.localflavor.fr.forms import FRZipCodeField
+>>> f = FRZipCodeField()
+>>> f.clean('75001')
+u'75001'
+>>> f.clean('93200')
+u'93200'
+>>> f.clean('2A200')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean('980001')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = FRZipCodeField(required=False)
+>>> f.clean('75001')
+u'75001'
+>>> f.clean('93200')
+u'93200'
+>>> f.clean('2A200')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean('980001')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+
+# FRPhoneNumberField ##########################################################
+
+FRPhoneNumberField validates that the data is a valid french phone number.
+It's normalized to 0X XX XX XX XX format. Dots are valid too.
+>>> from django.contrib.localflavor.fr.forms import FRPhoneNumberField
+>>> f = FRPhoneNumberField()
+>>> f.clean('01 55 44 58 64')
+u'01 55 44 58 64'
+>>> f.clean('0155445864')
+u'01 55 44 58 64'
+>>> f.clean('01 5544 5864')
+u'01 55 44 58 64'
+>>> f.clean('01 55.44.58.64')
+u'01 55 44 58 64'
+>>> f.clean('01.55.44.58.64')
+u'01 55 44 58 64'
+>>> f.clean('01,55,44,58,64')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
+>>> f.clean('555 015 544')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = FRPhoneNumberField(required=False)
+>>> f.clean('01 55 44 58 64')
+u'01 55 44 58 64'
+>>> f.clean('0155445864')
+u'01 55 44 58 64'
+>>> f.clean('01 5544 5864')
+u'01 55 44 58 64'
+>>> f.clean('01 55.44.58.64')
+u'01 55 44 58 64'
+>>> f.clean('01.55.44.58.64')
+u'01 55 44 58 64'
+>>> f.clean('01,55,44,58,64')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
+>>> f.clean('555 015 544')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0X XX XX XX XX format.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# FRDepartmentSelect ###############################################################
+
+FRDepartmentSelect is a Select widget that uses a list of french departments
+including DOM TOM
+>>> from django.contrib.localflavor.fr.forms import FRDepartmentSelect
+>>> w = FRDepartmentSelect()
+>>> print w.render('dep', 'Paris')
+<select name="dep">
+<option value="01">01 - Ain</option>
+<option value="02">02 - Aisne</option>
+<option value="03">03 - Allier</option>
+<option value="04">04 - Alpes-de-Haute-Provence</option>
+<option value="05">05 - Hautes-Alpes</option>
+<option value="06">06 - Alpes-Maritimes</option>
+<option value="07">07 - Ardeche</option>
+<option value="08">08 - Ardennes</option>
+<option value="09">09 - Ariege</option>
+<option value="10">10 - Aube</option>
+<option value="11">11 - Aude</option>
+<option value="12">12 - Aveyron</option>
+<option value="13">13 - Bouches-du-Rhone</option>
+<option value="14">14 - Calvados</option>
+<option value="15">15 - Cantal</option>
+<option value="16">16 - Charente</option>
+<option value="17">17 - Charente-Maritime</option>
+<option value="18">18 - Cher</option>
+<option value="19">19 - Correze</option>
+<option value="21">21 - Cote-d&#39;Or</option>
+<option value="22">22 - Cotes-d&#39;Armor</option>
+<option value="23">23 - Creuse</option>
+<option value="24">24 - Dordogne</option>
+<option value="25">25 - Doubs</option>
+<option value="26">26 - Drome</option>
+<option value="27">27 - Eure</option>
+<option value="28">28 - Eure-et-Loire</option>
+<option value="29">29 - Finistere</option>
+<option value="2A">2A - Corse-du-Sud</option>
+<option value="2B">2B - Haute-Corse</option>
+<option value="30">30 - Gard</option>
+<option value="31">31 - Haute-Garonne</option>
+<option value="32">32 - Gers</option>
+<option value="33">33 - Gironde</option>
+<option value="34">34 - Herault</option>
+<option value="35">35 - Ille-et-Vilaine</option>
+<option value="36">36 - Indre</option>
+<option value="37">37 - Indre-et-Loire</option>
+<option value="38">38 - Isere</option>
+<option value="39">39 - Jura</option>
+<option value="40">40 - Landes</option>
+<option value="41">41 - Loir-et-Cher</option>
+<option value="42">42 - Loire</option>
+<option value="43">43 - Haute-Loire</option>
+<option value="44">44 - Loire-Atlantique</option>
+<option value="45">45 - Loiret</option>
+<option value="46">46 - Lot</option>
+<option value="47">47 - Lot-et-Garonne</option>
+<option value="48">48 - Lozere</option>
+<option value="49">49 - Maine-et-Loire</option>
+<option value="50">50 - Manche</option>
+<option value="51">51 - Marne</option>
+<option value="52">52 - Haute-Marne</option>
+<option value="53">53 - Mayenne</option>
+<option value="54">54 - Meurthe-et-Moselle</option>
+<option value="55">55 - Meuse</option>
+<option value="56">56 - Morbihan</option>
+<option value="57">57 - Moselle</option>
+<option value="58">58 - Nievre</option>
+<option value="59">59 - Nord</option>
+<option value="60">60 - Oise</option>
+<option value="61">61 - Orne</option>
+<option value="62">62 - Pas-de-Calais</option>
+<option value="63">63 - Puy-de-Dome</option>
+<option value="64">64 - Pyrenees-Atlantiques</option>
+<option value="65">65 - Hautes-Pyrenees</option>
+<option value="66">66 - Pyrenees-Orientales</option>
+<option value="67">67 - Bas-Rhin</option>
+<option value="68">68 - Haut-Rhin</option>
+<option value="69">69 - Rhone</option>
+<option value="70">70 - Haute-Saone</option>
+<option value="71">71 - Saone-et-Loire</option>
+<option value="72">72 - Sarthe</option>
+<option value="73">73 - Savoie</option>
+<option value="74">74 - Haute-Savoie</option>
+<option value="75">75 - Paris</option>
+<option value="76">76 - Seine-Maritime</option>
+<option value="77">77 - Seine-et-Marne</option>
+<option value="78">78 - Yvelines</option>
+<option value="79">79 - Deux-Sevres</option>
+<option value="80">80 - Somme</option>
+<option value="81">81 - Tarn</option>
+<option value="82">82 - Tarn-et-Garonne</option>
+<option value="83">83 - Var</option>
+<option value="84">84 - Vaucluse</option>
+<option value="85">85 - Vendee</option>
+<option value="86">86 - Vienne</option>
+<option value="87">87 - Haute-Vienne</option>
+<option value="88">88 - Vosges</option>
+<option value="89">89 - Yonne</option>
+<option value="90">90 - Territoire de Belfort</option>
+<option value="91">91 - Essonne</option>
+<option value="92">92 - Hauts-de-Seine</option>
+<option value="93">93 - Seine-Saint-Denis</option>
+<option value="94">94 - Val-de-Marne</option>
+<option value="95">95 - Val-d&#39;Oise</option>
+<option value="2A">2A - Corse du sud</option>
+<option value="2B">2B - Haute Corse</option>
+<option value="971">971 - Guadeloupe</option>
+<option value="972">972 - Martinique</option>
+<option value="973">973 - Guyane</option>
+<option value="974">974 - La Reunion</option>
+<option value="975">975 - Saint-Pierre-et-Miquelon</option>
+<option value="976">976 - Mayotte</option>
+<option value="984">984 - Terres Australes et Antarctiques</option>
+<option value="986">986 - Wallis et Futuna</option>
+<option value="987">987 - Polynesie Francaise</option>
+<option value="988">988 - Nouvelle-Caledonie</option>
+</select>
+
+# JPPostalCodeField ###############################################################
+
+A form field that validates its input is a Japanese postcode.
+
+Accepts 7 digits(with/out hyphen).
+>>> from django.contrib.localflavor.jp.forms import JPPostalCodeField
+>>> f = JPPostalCodeField()
+>>> f.clean('251-0032')
+u'2510032'
+>>> f.clean('2510032')
+u'2510032'
+>>> f.clean('2510-032')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
+>>> f.clean('251a0032')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
+>>> f.clean('a51-0032')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
+>>> f.clean('25100321')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = JPPostalCodeField(required=False)
+>>> f.clean('251-0032')
+u'2510032'
+>>> f.clean('2510032')
+u'2510032'
+>>> f.clean('2510-032')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXXXX or XXX-XXXX.']
+>>> f.clean('')
+u''
+>>> f.clean(None)
+u''
+
+# JPPrefectureSelect ###############################################################
+
+A Select widget that uses a list of Japanese prefectures as its choices.
+>>> from django.contrib.localflavor.jp.forms import JPPrefectureSelect
+>>> w = JPPrefectureSelect()
+>>> print w.render('prefecture', 'kanagawa')
+<select name="prefecture">
+<option value="hokkaido">Hokkaido</option>
+<option value="aomori">Aomori</option>
+<option value="iwate">Iwate</option>
+<option value="miyagi">Miyagi</option>
+<option value="akita">Akita</option>
+<option value="yamagata">Yamagata</option>
+<option value="fukushima">Fukushima</option>
+<option value="ibaraki">Ibaraki</option>
+<option value="tochigi">Tochigi</option>
+<option value="gunma">Gunma</option>
+<option value="saitama">Saitama</option>
+<option value="chiba">Chiba</option>
+<option value="tokyo">Tokyo</option>
+<option value="kanagawa" selected="selected">Kanagawa</option>
+<option value="yamanashi">Yamanashi</option>
+<option value="nagano">Nagano</option>
+<option value="niigata">Niigata</option>
+<option value="toyama">Toyama</option>
+<option value="ishikawa">Ishikawa</option>
+<option value="fukui">Fukui</option>
+<option value="gifu">Gifu</option>
+<option value="shizuoka">Shizuoka</option>
+<option value="aichi">Aichi</option>
+<option value="mie">Mie</option>
+<option value="shiga">Shiga</option>
+<option value="kyoto">Kyoto</option>
+<option value="osaka">Osaka</option>
+<option value="hyogo">Hyogo</option>
+<option value="nara">Nara</option>
+<option value="wakayama">Wakayama</option>
+<option value="tottori">Tottori</option>
+<option value="shimane">Shimane</option>
+<option value="okayama">Okayama</option>
+<option value="hiroshima">Hiroshima</option>
+<option value="yamaguchi">Yamaguchi</option>
+<option value="tokushima">Tokushima</option>
+<option value="kagawa">Kagawa</option>
+<option value="ehime">Ehime</option>
+<option value="kochi">Kochi</option>
+<option value="fukuoka">Fukuoka</option>
+<option value="saga">Saga</option>
+<option value="nagasaki">Nagasaki</option>
+<option value="kumamoto">Kumamoto</option>
+<option value="oita">Oita</option>
+<option value="miyazaki">Miyazaki</option>
+<option value="kagoshima">Kagoshima</option>
+<option value="okinawa">Okinawa</option>
+</select>
+
+# ITZipCodeField #############################################################
+
+>>> from django.contrib.localflavor.it.forms import ITZipCodeField
+>>> f = ITZipCodeField()
+>>> f.clean('00100')
+u'00100'
+>>> f.clean(' 00100')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid zip code.']
+
+# ITRegionSelect #############################################################
+
+>>> from django.contrib.localflavor.it.forms import ITRegionSelect
+>>> w = ITRegionSelect()
+>>> w.render('regions', 'PMN')
+u'<select name="regions">\n<option value="ABR">Abruzzo</option>\n<option value="BAS">Basilicata</option>\n<option value="CAL">Calabria</option>\n<option value="CAM">Campania</option>\n<option value="EMR">Emilia-Romagna</option>\n<option value="FVG">Friuli-Venezia Giulia</option>\n<option value="LAZ">Lazio</option>\n<option value="LIG">Liguria</option>\n<option value="LOM">Lombardia</option>\n<option value="MAR">Marche</option>\n<option value="MOL">Molise</option>\n<option value="PMN" selected="selected">Piemonte</option>\n<option value="PUG">Puglia</option>\n<option value="SAR">Sardegna</option>\n<option value="SIC">Sicilia</option>\n<option value="TOS">Toscana</option>\n<option value="TAA">Trentino-Alto Adige</option>\n<option value="UMB">Umbria</option>\n<option value="VAO">Valle d\u2019Aosta</option>\n<option value="VEN">Veneto</option>\n</select>'
+
+# ITSocialSecurityNumberField #################################################
+
+>>> from django.contrib.localflavor.it.forms import ITSocialSecurityNumberField
+>>> f = ITSocialSecurityNumberField()
+>>> f.clean('LVSGDU99T71H501L')
+u'LVSGDU99T71H501L'
+>>> f.clean('LBRRME11A01L736W')
+u'LBRRME11A01L736W'
+>>> f.clean('lbrrme11a01l736w')
+u'LBRRME11A01L736W'
+>>> f.clean('LBR RME 11A01 L736W')
+u'LBRRME11A01L736W'
+>>> f.clean('LBRRME11A01L736A')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Social Security number.']
+>>> f.clean('%BRRME11A01L736W')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Social Security number.']
+
+# ITVatNumberField ###########################################################
+
+>>> from django.contrib.localflavor.it.forms import ITVatNumberField
+>>> f = ITVatNumberField()
+>>> f.clean('07973780013')
+u'07973780013'
+>>> f.clean('7973780013')
+u'07973780013'
+>>> f.clean(7973780013)
+u'07973780013'
+>>> f.clean('07973780014')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid VAT number.']
+>>> f.clean('A7973780013')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid VAT number.']
+
+# FIZipCodeField #############################################################
+
+FIZipCodeField validates that the data is a valid FI zipcode.
+>>> from django.contrib.localflavor.fi.forms import FIZipCodeField
+>>> f = FIZipCodeField()
+>>> f.clean('20540')
+u'20540'
+>>> f.clean('20101')
+u'20101'
+>>> f.clean('20s40')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean('205401')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = FIZipCodeField(required=False)
+>>> f.clean('20540')
+u'20540'
+>>> f.clean('20101')
+u'20101'
+>>> f.clean('20s40')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean('205401')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# FIMunicipalitySelect ###############################################################
+
+A Select widget that uses a list of Finnish municipalities as its choices.
+>>> from django.contrib.localflavor.fi.forms import FIMunicipalitySelect
+>>> w = FIMunicipalitySelect()
+>>> unicode(w.render('municipalities', 'turku'))
+u'<select name="municipalities">\n<option value="akaa">Akaa</option>\n<option value="alaharma">Alah\xe4rm\xe4</option>\n<option value="alajarvi">Alaj\xe4rvi</option>\n<option value="alastaro">Alastaro</option>\n<option value="alavieska">Alavieska</option>\n<option value="alavus">Alavus</option>\n<option value="anjalankoski">Anjalankoski</option>\n<option value="artjarvi">Artj\xe4rvi</option>\n<option value="asikkala">Asikkala</option>\n<option value="askainen">Askainen</option>\n<option value="askola">Askola</option>\n<option value="aura">Aura</option>\n<option value="brando">Br\xe4nd\xf6</option>\n<option value="dragsfjard">Dragsfj\xe4rd</option>\n<option value="eckero">Ecker\xf6</option>\n<option value="elimaki">Elim\xe4ki</option>\n<option value="eno">Eno</option>\n<option value="enonkoski">Enonkoski</option>\n<option value="enontekio">Enonteki\xf6</option>\n<option value="espoo">Espoo</option>\n<option value="eura">Eura</option>\n<option value="eurajoki">Eurajoki</option>\n<option value="evijarvi">Evij\xe4rvi</option>\n<option value="finstrom">Finstr\xf6m</option>\n<option value="forssa">Forssa</option>\n<option value="foglo">F\xf6gl\xf6</option>\n<option value="geta">Geta</option>\n<option value="haapajarvi">Haapaj\xe4rvi</option>\n<option value="haapavesi">Haapavesi</option>\n<option value="hailuoto">Hailuoto</option>\n<option value="halikko">Halikko</option>\n<option value="halsua">Halsua</option>\n<option value="hamina">Hamina</option>\n<option value="hammarland">Hammarland</option>\n<option value="hankasalmi">Hankasalmi</option>\n<option value="hanko">Hanko</option>\n<option value="harjavalta">Harjavalta</option>\n<option value="hartola">Hartola</option>\n<option value="hattula">Hattula</option>\n<option value="hauho">Hauho</option>\n<option value="haukipudas">Haukipudas</option>\n<option value="hausjarvi">Hausj\xe4rvi</option>\n<option value="heinola">Heinola</option>\n<option value="heinavesi">Hein\xe4vesi</option>\n<option value="helsinki">Helsinki</option>\n<option value="himanka">Himanka</option>\n<option value="hirvensalmi">Hirvensalmi</option>\n<option value="hollola">Hollola</option>\n<option value="honkajoki">Honkajoki</option>\n<option value="houtskari">Houtskari</option>\n<option value="huittinen">Huittinen</option>\n<option value="humppila">Humppila</option>\n<option value="hyrynsalmi">Hyrynsalmi</option>\n<option value="hyvinkaa">Hyvink\xe4\xe4</option>\n<option value="hameenkoski">H\xe4meenkoski</option>\n<option value="hameenkyro">H\xe4meenkyr\xf6</option>\n<option value="hameenlinna">H\xe4meenlinna</option>\n<option value="ii">Ii</option>\n<option value="iisalmi">Iisalmi</option>\n<option value="iitti">Iitti</option>\n<option value="ikaalinen">Ikaalinen</option>\n<option value="ilmajoki">Ilmajoki</option>\n<option value="ilomantsi">Ilomantsi</option>\n<option value="imatra">Imatra</option>\n<option value="inari">Inari</option>\n<option value="inio">Ini\xf6</option>\n<option value="inkoo">Inkoo</option>\n<option value="isojoki">Isojoki</option>\n<option value="isokyro">Isokyr\xf6</option>\n<option value="jaala">Jaala</option>\n<option value="jalasjarvi">Jalasj\xe4rvi</option>\n<option value="janakkala">Janakkala</option>\n<option value="joensuu">Joensuu</option>\n<option value="jokioinen">Jokioinen</option>\n<option value="jomala">Jomala</option>\n<option value="joroinen">Joroinen</option>\n<option value="joutsa">Joutsa</option>\n<option value="joutseno">Joutseno</option>\n<option value="juankoski">Juankoski</option>\n<option value="jurva">Jurva</option>\n<option value="juuka">Juuka</option>\n<option value="juupajoki">Juupajoki</option>\n<option value="juva">Juva</option>\n<option value="jyvaskyla">Jyv\xe4skyl\xe4</option>\n<option value="jyvaskylan_mlk">Jyv\xe4skyl\xe4n maalaiskunta</option>\n<option value="jamijarvi">J\xe4mij\xe4rvi</option>\n<option value="jamsa">J\xe4ms\xe4</option>\n<option value="jamsankoski">J\xe4ms\xe4nkoski</option>\n<option value="jarvenpaa">J\xe4rvenp\xe4\xe4</option>\n<option value="kaarina">Kaarina</option>\n<option value="kaavi">Kaavi</option>\n<option value="kajaani">Kajaani</option>\n<option value="kalajoki">Kalajoki</option>\n<option value="kalvola">Kalvola</option>\n<option value="kangasala">Kangasala</option>\n<option value="kangasniemi">Kangasniemi</option>\n<option value="kankaanpaa">Kankaanp\xe4\xe4</option>\n<option value="kannonkoski">Kannonkoski</option>\n<option value="kannus">Kannus</option>\n<option value="karijoki">Karijoki</option>\n<option value="karjaa">Karjaa</option>\n<option value="karjalohja">Karjalohja</option>\n<option value="karkkila">Karkkila</option>\n<option value="karstula">Karstula</option>\n<option value="karttula">Karttula</option>\n<option value="karvia">Karvia</option>\n<option value="kaskinen">Kaskinen</option>\n<option value="kauhajoki">Kauhajoki</option>\n<option value="kauhava">Kauhava</option>\n<option value="kauniainen">Kauniainen</option>\n<option value="kaustinen">Kaustinen</option>\n<option value="keitele">Keitele</option>\n<option value="kemi">Kemi</option>\n<option value="kemijarvi">Kemij\xe4rvi</option>\n<option value="keminmaa">Keminmaa</option>\n<option value="kemio">Kemi\xf6</option>\n<option value="kempele">Kempele</option>\n<option value="kerava">Kerava</option>\n<option value="kerimaki">Kerim\xe4ki</option>\n<option value="kestila">Kestil\xe4</option>\n<option value="kesalahti">Kes\xe4lahti</option>\n<option value="keuruu">Keuruu</option>\n<option value="kihnio">Kihni\xf6</option>\n<option value="kiikala">Kiikala</option>\n<option value="kiikoinen">Kiikoinen</option>\n<option value="kiiminki">Kiiminki</option>\n<option value="kinnula">Kinnula</option>\n<option value="kirkkonummi">Kirkkonummi</option>\n<option value="kisko">Kisko</option>\n<option value="kitee">Kitee</option>\n<option value="kittila">Kittil\xe4</option>\n<option value="kiukainen">Kiukainen</option>\n<option value="kiuruvesi">Kiuruvesi</option>\n<option value="kivijarvi">Kivij\xe4rvi</option>\n<option value="kokemaki">Kokem\xe4ki</option>\n<option value="kokkola">Kokkola</option>\n<option value="kolari">Kolari</option>\n<option value="konnevesi">Konnevesi</option>\n<option value="kontiolahti">Kontiolahti</option>\n<option value="korpilahti">Korpilahti</option>\n<option value="korppoo">Korppoo</option>\n<option value="korsnas">Korsn\xe4s</option>\n<option value="kortesjarvi">Kortesj\xe4rvi</option>\n<option value="koskitl">KoskiTl</option>\n<option value="kotka">Kotka</option>\n<option value="kouvola">Kouvola</option>\n<option value="kristiinankaupunki">Kristiinankaupunki</option>\n<option value="kruunupyy">Kruunupyy</option>\n<option value="kuhmalahti">Kuhmalahti</option>\n<option value="kuhmo">Kuhmo</option>\n<option value="kuhmoinen">Kuhmoinen</option>\n<option value="kumlinge">Kumlinge</option>\n<option value="kuopio">Kuopio</option>\n<option value="kuortane">Kuortane</option>\n<option value="kurikka">Kurikka</option>\n<option value="kuru">Kuru</option>\n<option value="kustavi">Kustavi</option>\n<option value="kuusamo">Kuusamo</option>\n<option value="kuusankoski">Kuusankoski</option>\n<option value="kuusjoki">Kuusjoki</option>\n<option value="kylmakoski">Kylm\xe4koski</option>\n<option value="kyyjarvi">Kyyj\xe4rvi</option>\n<option value="kalvia">K\xe4lvi\xe4</option>\n<option value="karkola">K\xe4rk\xf6l\xe4</option>\n<option value="karsamaki">K\xe4rs\xe4m\xe4ki</option>\n<option value="kokar">K\xf6kar</option>\n<option value="koylio">K\xf6yli\xf6</option>\n<option value="lahti">Lahti</option>\n<option value="laihia">Laihia</option>\n<option value="laitila">Laitila</option>\n<option value="lammi">Lammi</option>\n<option value="lapinjarvi">Lapinj\xe4rvi</option>\n<option value="lapinlahti">Lapinlahti</option>\n<option value="lappajarvi">Lappaj\xe4rvi</option>\n<option value="lappeenranta">Lappeenranta</option>\n<option value="lappi">Lappi</option>\n<option value="lapua">Lapua</option>\n<option value="laukaa">Laukaa</option>\n<option value="lavia">Lavia</option>\n<option value="lehtimaki">Lehtim\xe4ki</option>\n<option value="leivonmaki">Leivonm\xe4ki</option>\n<option value="lemi">Lemi</option>\n<option value="lemland">Lemland</option>\n<option value="lempaala">Lemp\xe4\xe4l\xe4</option>\n<option value="lemu">Lemu</option>\n<option value="leppavirta">Lepp\xe4virta</option>\n<option value="lestijarvi">Lestij\xe4rvi</option>\n<option value="lieksa">Lieksa</option>\n<option value="lieto">Lieto</option>\n<option value="liljendal">Liljendal</option>\n<option value="liminka">Liminka</option>\n<option value="liperi">Liperi</option>\n<option value="lohja">Lohja</option>\n<option value="lohtaja">Lohtaja</option>\n<option value="loimaa">Loimaa</option>\n<option value="loppi">Loppi</option>\n<option value="loviisa">Loviisa</option>\n<option value="luhanka">Luhanka</option>\n<option value="lumijoki">Lumijoki</option>\n<option value="lumparland">Lumparland</option>\n<option value="luoto">Luoto</option>\n<option value="luumaki">Luum\xe4ki</option>\n<option value="luvia">Luvia</option>\n<option value="maalahti">Maalahti</option>\n<option value="maaninka">Maaninka</option>\n<option value="maarianhamina">Maarianhamina</option>\n<option value="marttila">Marttila</option>\n<option value="masku">Masku</option>\n<option value="mellila">Mellil\xe4</option>\n<option value="merijarvi">Merij\xe4rvi</option>\n<option value="merikarvia">Merikarvia</option>\n<option value="merimasku">Merimasku</option>\n<option value="miehikkala">Miehikk\xe4l\xe4</option>\n<option value="mikkeli">Mikkeli</option>\n<option value="mouhijarvi">Mouhij\xe4rvi</option>\n<option value="muhos">Muhos</option>\n<option value="multia">Multia</option>\n<option value="muonio">Muonio</option>\n<option value="mustasaari">Mustasaari</option>\n<option value="muurame">Muurame</option>\n<option value="muurla">Muurla</option>\n<option value="mynamaki">Myn\xe4m\xe4ki</option>\n<option value="myrskyla">Myrskyl\xe4</option>\n<option value="mantsala">M\xe4nts\xe4l\xe4</option>\n<option value="mantta">M\xe4ntt\xe4</option>\n<option value="mantyharju">M\xe4ntyharju</option>\n<option value="naantali">Naantali</option>\n<option value="nakkila">Nakkila</option>\n<option value="nastola">Nastola</option>\n<option value="nauvo">Nauvo</option>\n<option value="nilsia">Nilsi\xe4</option>\n<option value="nivala">Nivala</option>\n<option value="nokia">Nokia</option>\n<option value="noormarkku">Noormarkku</option>\n<option value="nousiainen">Nousiainen</option>\n<option value="nummi-pusula">Nummi-Pusula</option>\n<option value="nurmes">Nurmes</option>\n<option value="nurmijarvi">Nurmij\xe4rvi</option>\n<option value="nurmo">Nurmo</option>\n<option value="narpio">N\xe4rpi\xf6</option>\n<option value="oravainen">Oravainen</option>\n<option value="orimattila">Orimattila</option>\n<option value="oripaa">Orip\xe4\xe4</option>\n<option value="orivesi">Orivesi</option>\n<option value="oulainen">Oulainen</option>\n<option value="oulu">Oulu</option>\n<option value="oulunsalo">Oulunsalo</option>\n<option value="outokumpu">Outokumpu</option>\n<option value="padasjoki">Padasjoki</option>\n<option value="paimio">Paimio</option>\n<option value="paltamo">Paltamo</option>\n<option value="parainen">Parainen</option>\n<option value="parikkala">Parikkala</option>\n<option value="parkano">Parkano</option>\n<option value="pedersore">Peders\xf6re</option>\n<option value="pelkosenniemi">Pelkosenniemi</option>\n<option value="pello">Pello</option>\n<option value="perho">Perho</option>\n<option value="pernaja">Pernaja</option>\n<option value="pernio">Perni\xf6</option>\n<option value="pertteli">Pertteli</option>\n<option value="pertunmaa">Pertunmaa</option>\n<option value="petajavesi">Pet\xe4j\xe4vesi</option>\n<option value="pieksamaki">Pieks\xe4m\xe4ki</option>\n<option value="pielavesi">Pielavesi</option>\n<option value="pietarsaari">Pietarsaari</option>\n<option value="pihtipudas">Pihtipudas</option>\n<option value="piikkio">Piikki\xf6</option>\n<option value="piippola">Piippola</option>\n<option value="pirkkala">Pirkkala</option>\n<option value="pohja">Pohja</option>\n<option value="polvijarvi">Polvij\xe4rvi</option>\n<option value="pomarkku">Pomarkku</option>\n<option value="pori">Pori</option>\n<option value="pornainen">Pornainen</option>\n<option value="porvoo">Porvoo</option>\n<option value="posio">Posio</option>\n<option value="pudasjarvi">Pudasj\xe4rvi</option>\n<option value="pukkila">Pukkila</option>\n<option value="pulkkila">Pulkkila</option>\n<option value="punkaharju">Punkaharju</option>\n<option value="punkalaidun">Punkalaidun</option>\n<option value="puolanka">Puolanka</option>\n<option value="puumala">Puumala</option>\n<option value="pyhtaa">Pyht\xe4\xe4</option>\n<option value="pyhajoki">Pyh\xe4joki</option>\n<option value="pyhajarvi">Pyh\xe4j\xe4rvi</option>\n<option value="pyhanta">Pyh\xe4nt\xe4</option>\n<option value="pyharanta">Pyh\xe4ranta</option>\n<option value="pyhaselka">Pyh\xe4selk\xe4</option>\n<option value="pylkonmaki">Pylk\xf6nm\xe4ki</option>\n<option value="palkane">P\xe4lk\xe4ne</option>\n<option value="poytya">P\xf6yty\xe4</option>\n<option value="raahe">Raahe</option>\n<option value="raisio">Raisio</option>\n<option value="rantasalmi">Rantasalmi</option>\n<option value="rantsila">Rantsila</option>\n<option value="ranua">Ranua</option>\n<option value="rauma">Rauma</option>\n<option value="rautalampi">Rautalampi</option>\n<option value="rautavaara">Rautavaara</option>\n<option value="rautjarvi">Rautj\xe4rvi</option>\n<option value="reisjarvi">Reisj\xe4rvi</option>\n<option value="renko">Renko</option>\n<option value="riihimaki">Riihim\xe4ki</option>\n<option value="ristiina">Ristiina</option>\n<option value="ristijarvi">Ristij\xe4rvi</option>\n<option value="rovaniemi">Rovaniemi</option>\n<option value="ruokolahti">Ruokolahti</option>\n<option value="ruotsinpyhtaa">Ruotsinpyht\xe4\xe4</option>\n<option value="ruovesi">Ruovesi</option>\n<option value="rusko">Rusko</option>\n<option value="rymattyla">Rym\xe4ttyl\xe4</option>\n<option value="raakkyla">R\xe4\xe4kkyl\xe4</option>\n<option value="saarijarvi">Saarij\xe4rvi</option>\n<option value="salla">Salla</option>\n<option value="salo">Salo</option>\n<option value="saltvik">Saltvik</option>\n<option value="sammatti">Sammatti</option>\n<option value="sauvo">Sauvo</option>\n<option value="savitaipale">Savitaipale</option>\n<option value="savonlinna">Savonlinna</option>\n<option value="savonranta">Savonranta</option>\n<option value="savukoski">Savukoski</option>\n<option value="seinajoki">Sein\xe4joki</option>\n<option value="sievi">Sievi</option>\n<option value="siikainen">Siikainen</option>\n<option value="siikajoki">Siikajoki</option>\n<option value="siilinjarvi">Siilinj\xe4rvi</option>\n<option value="simo">Simo</option>\n<option value="sipoo">Sipoo</option>\n<option value="siuntio">Siuntio</option>\n<option value="sodankyla">Sodankyl\xe4</option>\n<option value="soini">Soini</option>\n<option value="somero">Somero</option>\n<option value="sonkajarvi">Sonkaj\xe4rvi</option>\n<option value="sotkamo">Sotkamo</option>\n<option value="sottunga">Sottunga</option>\n<option value="sulkava">Sulkava</option>\n<option value="sund">Sund</option>\n<option value="suomenniemi">Suomenniemi</option>\n<option value="suomusjarvi">Suomusj\xe4rvi</option>\n<option value="suomussalmi">Suomussalmi</option>\n<option value="suonenjoki">Suonenjoki</option>\n<option value="sysma">Sysm\xe4</option>\n<option value="sakyla">S\xe4kyl\xe4</option>\n<option value="sarkisalo">S\xe4rkisalo</option>\n<option value="taipalsaari">Taipalsaari</option>\n<option value="taivalkoski">Taivalkoski</option>\n<option value="taivassalo">Taivassalo</option>\n<option value="tammela">Tammela</option>\n<option value="tammisaari">Tammisaari</option>\n<option value="tampere">Tampere</option>\n<option value="tarvasjoki">Tarvasjoki</option>\n<option value="tervo">Tervo</option>\n<option value="tervola">Tervola</option>\n<option value="teuva">Teuva</option>\n<option value="tohmajarvi">Tohmaj\xe4rvi</option>\n<option value="toholampi">Toholampi</option>\n<option value="toivakka">Toivakka</option>\n<option value="tornio">Tornio</option>\n<option value="turku" selected="selected">Turku</option>\n<option value="tuulos">Tuulos</option>\n<option value="tuusniemi">Tuusniemi</option>\n<option value="tuusula">Tuusula</option>\n<option value="tyrnava">Tyrn\xe4v\xe4</option>\n<option value="toysa">T\xf6ys\xe4</option>\n<option value="ullava">Ullava</option>\n<option value="ulvila">Ulvila</option>\n<option value="urjala">Urjala</option>\n<option value="utajarvi">Utaj\xe4rvi</option>\n<option value="utsjoki">Utsjoki</option>\n<option value="uurainen">Uurainen</option>\n<option value="uusikaarlepyy">Uusikaarlepyy</option>\n<option value="uusikaupunki">Uusikaupunki</option>\n<option value="vaala">Vaala</option>\n<option value="vaasa">Vaasa</option>\n<option value="vahto">Vahto</option>\n<option value="valkeakoski">Valkeakoski</option>\n<option value="valkeala">Valkeala</option>\n<option value="valtimo">Valtimo</option>\n<option value="vammala">Vammala</option>\n<option value="vampula">Vampula</option>\n<option value="vantaa">Vantaa</option>\n<option value="varkaus">Varkaus</option>\n<option value="varpaisjarvi">Varpaisj\xe4rvi</option>\n<option value="vehmaa">Vehmaa</option>\n<option value="velkua">Velkua</option>\n<option value="vesanto">Vesanto</option>\n<option value="vesilahti">Vesilahti</option>\n<option value="veteli">Veteli</option>\n<option value="vierema">Vierem\xe4</option>\n<option value="vihanti">Vihanti</option>\n<option value="vihti">Vihti</option>\n<option value="viitasaari">Viitasaari</option>\n<option value="vilppula">Vilppula</option>\n<option value="vimpeli">Vimpeli</option>\n<option value="virolahti">Virolahti</option>\n<option value="virrat">Virrat</option>\n<option value="vardo">V\xe5rd\xf6</option>\n<option value="vahakyro">V\xe4h\xe4kyr\xf6</option>\n<option value="vastanfjard">V\xe4stanfj\xe4rd</option>\n<option value="voyri-maksamaa">V\xf6yri-Maksamaa</option>\n<option value="yliharma">Ylih\xe4rm\xe4</option>\n<option value="yli-ii">Yli-Ii</option>\n<option value="ylikiiminki">Ylikiiminki</option>\n<option value="ylistaro">Ylistaro</option>\n<option value="ylitornio">Ylitornio</option>\n<option value="ylivieska">Ylivieska</option>\n<option value="ylamaa">Yl\xe4maa</option>\n<option value="ylane">Yl\xe4ne</option>\n<option value="ylojarvi">Yl\xf6j\xe4rvi</option>\n<option value="ypaja">Yp\xe4j\xe4</option>\n<option value="aetsa">\xc4ets\xe4</option>\n<option value="ahtari">\xc4ht\xe4ri</option>\n<option value="aanekoski">\xc4\xe4nekoski</option>\n</select>'
+
+# FISocialSecurityNumber
+##############################################################
+
+>>> from django.contrib.localflavor.fi.forms import FISocialSecurityNumber
+>>> f = FISocialSecurityNumber()
+>>> f.clean('010101-0101')
+u'010101-0101'
+>>> f.clean('010101+0101')
+u'010101+0101'
+>>> f.clean('010101A0101')
+u'010101A0101'
+>>> f.clean('101010-0102')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Finnish social security number.']
+>>> f.clean('10a010-0101')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Finnish social security number.']
+>>> f.clean('101010-0\xe401')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Finnish social security number.']
+>>> f.clean('101010b0101')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Finnish social security number.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f = FISocialSecurityNumber(required=False)
+>>> f.clean('010101-0101')
+u'010101-0101'
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+# BRZipCodeField ############################################################
+>>> from django.contrib.localflavor.br.forms import BRZipCodeField
+>>> f = BRZipCodeField()
+>>> f.clean('12345-123')
+u'12345-123'
+>>> f.clean('12345_123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('1234-123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('abcde-abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('12345-')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('-123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = BRZipCodeField(required=False)
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+>>> f.clean('-123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('12345-')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('abcde-abc')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('1234-123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('12345_123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX-XXX.']
+>>> f.clean('12345-123')
+u'12345-123'
+
+# BRCNPJField ############################################################
+
+>>> from django.contrib.localflavor.br.forms import BRCNPJField
+>>> f = BRCNPJField(required=True)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('12-345-678/9012-10')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CNPJ number.']
+>>> f.clean('12.345.678/9012-10')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CNPJ number.']
+>>> f.clean('12345678/9012-10')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CNPJ number.']
+>>> f.clean('64.132.916/0001-88')
+'64.132.916/0001-88'
+>>> f.clean('64-132-916/0001-88')
+'64-132-916/0001-88'
+>>> f.clean('64132916/0001-88')
+'64132916/0001-88'
+>>> f.clean('64.132.916/0001-XX')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field requires only numbers.']
+>>> f = BRCNPJField(required=False)
+>>> f.clean('')
+u''
+
+# BRCPFField #################################################################
+
+>>> from django.contrib.localflavor.br.forms import BRCPFField
+>>> f = BRCPFField()
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('489.294.654-54')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CPF number.']
+>>> f.clean('295.669.575-98')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CPF number.']
+>>> f.clean('539.315.127-22')
+Traceback (most recent call last):
+...
+ValidationError: [u'Invalid CPF number.']
+>>> f.clean('663.256.017-26')
+u'663.256.017-26'
+>>> f.clean('66325601726')
+u'66325601726'
+>>> f.clean('375.788.573-20')
+u'375.788.573-20'
+>>> f.clean('84828509895')
+u'84828509895'
+>>> f.clean('375.788.573-XX')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field requires only numbers.']
+>>> f.clean('375.788.573-000')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at most 14 characters.']
+>>> f.clean('123.456.78')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at least 11 characters.']
+>>> f.clean('123456789555')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field requires at most 11 digits or 14 characters.']
+>>> f = BRCPFField(required=False)
+>>> f.clean('')
+u''
+>>> f.clean(None)
+u''
+
+# BRPhoneNumberField #########################################################
+
+>>> from django.contrib.localflavor.br.forms import BRPhoneNumberField
+>>> f = BRPhoneNumberField()
+>>> f.clean('41-3562-3464')
+u'41-3562-3464'
+>>> f.clean('4135623464')
+u'41-3562-3464'
+>>> f.clean('41 3562-3464')
+u'41-3562-3464'
+>>> f.clean('41 3562 3464')
+u'41-3562-3464'
+>>> f.clean('(41) 3562 3464')
+u'41-3562-3464'
+>>> f.clean('41.3562.3464')
+u'41-3562-3464'
+>>> f.clean('41.3562-3464')
+u'41-3562-3464'
+>>> f.clean(' (41) 3562.3464')
+u'41-3562-3464'
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = BRPhoneNumberField(required=False)
+>>> f.clean('')
+u''
+>>> f.clean(None)
+u''
+>>> f.clean(' (41) 3562.3464')
+u'41-3562-3464'
+>>> f.clean('41.3562-3464')
+u'41-3562-3464'
+>>> f.clean('(41) 3562 3464')
+u'41-3562-3464'
+>>> f.clean('4135623464')
+u'41-3562-3464'
+>>> f.clean('41 3562-3464')
+u'41-3562-3464'
+
+# BRStateSelect ##############################################################
+
+>>> from django.contrib.localflavor.br.forms import BRStateSelect
+>>> w = BRStateSelect()
+>>> w.render('states', 'PR')
+u'<select name="states">\n<option value="AC">Acre</option>\n<option value="AL">Alagoas</option>\n<option value="AP">Amap\xe1</option>\n<option value="AM">Amazonas</option>\n<option value="BA">Bahia</option>\n<option value="CE">Cear\xe1</option>\n<option value="DF">Distrito Federal</option>\n<option value="ES">Esp\xedrito Santo</option>\n<option value="GO">Goi\xe1s</option>\n<option value="MA">Maranh\xe3o</option>\n<option value="MT">Mato Grosso</option>\n<option value="MS">Mato Grosso do Sul</option>\n<option value="MG">Minas Gerais</option>\n<option value="PA">Par\xe1</option>\n<option value="PB">Para\xedba</option>\n<option value="PR" selected="selected">Paran\xe1</option>\n<option value="PE">Pernambuco</option>\n<option value="PI">Piau\xed</option>\n<option value="RJ">Rio de Janeiro</option>\n<option value="RN">Rio Grande do Norte</option>\n<option value="RS">Rio Grande do Sul</option>\n<option value="RO">Rond\xf4nia</option>\n<option value="RR">Roraima</option>\n<option value="SC">Santa Catarina</option>\n<option value="SP">S\xe3o Paulo</option>\n<option value="SE">Sergipe</option>\n<option value="TO">Tocantins</option>\n</select>'
+
+# DEZipCodeField ##############################################################
+
+>>> from django.contrib.localflavor.de.forms import DEZipCodeField
+>>> f = DEZipCodeField()
+>>> f.clean('99423')
+u'99423'
+>>> f.clean(' 99423')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXXX.']
+
+# DEStateSelect #############################################################
+
+>>> from django.contrib.localflavor.de.forms import DEStateSelect
+>>> w = DEStateSelect()
+>>> w.render('states', 'TH')
+u'<select name="states">\n<option value="BW">Baden-Wuerttemberg</option>\n<option value="BY">Bavaria</option>\n<option value="BE">Berlin</option>\n<option value="BB">Brandenburg</option>\n<option value="HB">Bremen</option>\n<option value="HH">Hamburg</option>\n<option value="HE">Hessen</option>\n<option value="MV">Mecklenburg-Western Pomerania</option>\n<option value="NI">Lower Saxony</option>\n<option value="NW">North Rhine-Westphalia</option>\n<option value="RP">Rhineland-Palatinate</option>\n<option value="SL">Saarland</option>\n<option value="SN">Saxony</option>\n<option value="ST">Saxony-Anhalt</option>\n<option value="SH">Schleswig-Holstein</option>\n<option value="TH" selected="selected">Thuringia</option>\n</select>'
+
+# DEIdentityCardNumberField #################################################
+
+>>> from django.contrib.localflavor.de.forms import DEIdentityCardNumberField
+>>> f = DEIdentityCardNumberField()
+>>> f.clean('7549313035D-6004103-0903042-0')
+u'7549313035D-6004103-0903042-0'
+>>> f.clean('9786324830D 6104243 0910271 2')
+u'9786324830D-6104243-0910271-2'
+>>> f.clean('0434657485D-6407276-0508137-9')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.']
+
+# CHZipCodeField ############################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHZipCodeField
+>>> f = CHZipCodeField()
+>>> f.clean('800x')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+>>> f.clean('80 00')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+>>> f.clean('8000')
+u'8000'
+
+# CHPhoneNumberField ########################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHPhoneNumberField
+>>> f = CHPhoneNumberField()
+>>> f.clean('01234567890')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
+>>> f.clean('1234567890')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must be in 0XX XXX XX XX format.']
+>>> f.clean('0123456789')
+u'012 345 67 89'
+
+# CHIdentityCardNumberField #################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHIdentityCardNumberField
+>>> f = CHIdentityCardNumberField()
+>>> f.clean('C1234567<0')
+u'C1234567<0'
+>>> f.clean('C1234567<1')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
+>>> f.clean('2123456700')
+u'2123456700'
+>>> f.clean('2123456701')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.']
+
+# CHStateSelect #############################################################
+
+>>> from django.contrib.localflavor.ch.forms import CHStateSelect
+>>> w = CHStateSelect()
+>>> w.render('state', 'AG')
+u'<select name="state">\n<option value="AG" selected="selected">Aargau</option>\n<option value="AI">Appenzell Innerrhoden</option>\n<option value="AR">Appenzell Ausserrhoden</option>\n<option value="BS">Basel-Stadt</option>\n<option value="BL">Basel-Land</option>\n<option value="BE">Berne</option>\n<option value="FR">Fribourg</option>\n<option value="GE">Geneva</option>\n<option value="GL">Glarus</option>\n<option value="GR">Graubuenden</option>\n<option value="JU">Jura</option>\n<option value="LU">Lucerne</option>\n<option value="NE">Neuchatel</option>\n<option value="NW">Nidwalden</option>\n<option value="OW">Obwalden</option>\n<option value="SH">Schaffhausen</option>\n<option value="SZ">Schwyz</option>\n<option value="SO">Solothurn</option>\n<option value="SG">St. Gallen</option>\n<option value="TG">Thurgau</option>\n<option value="TI">Ticino</option>\n<option value="UR">Uri</option>\n<option value="VS">Valais</option>\n<option value="VD">Vaud</option>\n<option value="ZG">Zug</option>\n<option value="ZH">Zurich</option>\n</select>'
+
+## AUPostCodeField ##########################################################
+
+A field that accepts a four digit Australian post code.
+
+>>> from django.contrib.localflavor.au.forms import AUPostCodeField
+>>> f = AUPostCodeField()
+>>> f.clean('1234')
+u'1234'
+>>> f.clean('2000')
+u'2000'
+>>> f.clean('abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a 4 digit post code.']
+>>> f.clean('20001')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a 4 digit post code.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = AUPostCodeField(required=False)
+>>> f.clean('1234')
+u'1234'
+>>> f.clean('2000')
+u'2000'
+>>> f.clean('abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a 4 digit post code.']
+>>> f.clean('20001')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a 4 digit post code.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+## AUPhoneNumberField ########################################################
+
+A field that accepts a 10 digit Australian phone number.
+llows spaces and parentheses around area code.
+
+>>> from django.contrib.localflavor.au.forms import AUPhoneNumberField
+>>> f = AUPhoneNumberField()
+>>> f.clean('1234567890')
+u'1234567890'
+>>> f.clean('0213456789')
+u'0213456789'
+>>> f.clean('02 13 45 67 89')
+u'0213456789'
+>>> f.clean('(02) 1345 6789')
+u'0213456789'
+>>> f.clean('(02) 1345-6789')
+u'0213456789'
+>>> f.clean('(02)1345-6789')
+u'0213456789'
+>>> f.clean('0408 123 456')
+u'0408123456'
+>>> f.clean('123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must contain 10 digits.']
+>>> f.clean('1800DJANGO')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must contain 10 digits.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f = AUPhoneNumberField(required=False)
+>>> f.clean('1234567890')
+u'1234567890'
+>>> f.clean('0213456789')
+u'0213456789'
+>>> f.clean('02 13 45 67 89')
+u'0213456789'
+>>> f.clean('(02) 1345 6789')
+u'0213456789'
+>>> f.clean('(02) 1345-6789')
+u'0213456789'
+>>> f.clean('(02)1345-6789')
+u'0213456789'
+>>> f.clean('0408 123 456')
+u'0408123456'
+>>> f.clean('123')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must contain 10 digits.']
+>>> f.clean('1800DJANGO')
+Traceback (most recent call last):
+...
+ValidationError: [u'Phone numbers must contain 10 digits.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+## AUStateSelect #############################################################
+
+AUStateSelect is a Select widget that uses a list of Australian
+states/territories as its choices.
+
+>>> from django.contrib.localflavor.au.forms import AUStateSelect
+>>> f = AUStateSelect()
+>>> print f.render('state', 'NSW')
+<select name="state">
+<option value="ACT">Australian Capital Territory</option>
+<option value="NSW" selected="selected">New South Wales</option>
+<option value="NT">Northern Territory</option>
+<option value="QLD">Queensland</option>
+<option value="SA">South Australia</option>
+<option value="TAS">Tasmania</option>
+<option value="VIC">Victoria</option>
+<option value="WA">Western Australia</option>
+</select>
+
+## ISIdNumberField #############################################################
+
+>>> from django.contrib.localflavor.is_.forms import *
+>>> f = ISIdNumberField()
+>>> f.clean('2308803449')
+u'230880-3449'
+>>> f.clean('230880-3449')
+u'230880-3449'
+>>> f.clean('230880 3449')
+u'230880-3449'
+>>> f.clean('230880343')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at least 10 characters.']
+>>> f.clean('230880343234')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at most 11 characters.']
+>>> f.clean('abcdefghijk')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('2308803439')
+Traceback (most recent call last):
+...
+ValidationError: [u'The Icelandic identification number is not valid.']
+>>> f.clean('2308803440')
+u'230880-3440'
+>>> f = ISIdNumberField(required=False)
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+## ISPhoneNumberField #############################################################
+
+>>> from django.contrib.localflavor.is_.forms import *
+>>> f = ISPhoneNumberField()
+>>> f.clean('1234567')
+u'1234567'
+>>> f.clean('123 4567')
+u'1234567'
+>>> f.clean('123-4567')
+u'1234567'
+>>> f.clean('123-456')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid value.']
+>>> f.clean('123456')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at least 7 characters.']
+>>> f.clean('123456555')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at most 8 characters.']
+>>> f.clean('abcdefg')
+Traceback (most recent call last):
+ValidationError: [u'Enter a valid value.']
+>>> f.clean(' 1234567 ')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value has at most 8 characters.']
+>>> f.clean(' 12367 ')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid value.']
+
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f = ISPhoneNumberField(required=False)
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
+## ISPostalCodeSelect #############################################################
+
+>>> from django.contrib.localflavor.is_.forms import *
+>>> f = ISPostalCodeSelect()
+
+>>> f.render('foo', 'bar')
+u'<select name="foo">\n<option value="101">101 Reykjav\xedk</option>\n<option value="103">103 Reykjav\xedk</option>\n<option value="104">104 Reykjav\xedk</option>\n<option value="105">105 Reykjav\xedk</option>\n<option value="107">107 Reykjav\xedk</option>\n<option value="108">108 Reykjav\xedk</option>\n<option value="109">109 Reykjav\xedk</option>\n<option value="110">110 Reykjav\xedk</option>\n<option value="111">111 Reykjav\xedk</option>\n<option value="112">112 Reykjav\xedk</option>\n<option value="113">113 Reykjav\xedk</option>\n<option value="116">116 Kjalarnes</option>\n<option value="121">121 Reykjav\xedk</option>\n<option value="123">123 Reykjav\xedk</option>\n<option value="124">124 Reykjav\xedk</option>\n<option value="125">125 Reykjav\xedk</option>\n<option value="127">127 Reykjav\xedk</option>\n<option value="128">128 Reykjav\xedk</option>\n<option value="129">129 Reykjav\xedk</option>\n<option value="130">130 Reykjav\xedk</option>\n<option value="132">132 Reykjav\xedk</option>\n<option value="150">150 Reykjav\xedk</option>\n<option value="155">155 Reykjav\xedk</option>\n<option value="170">170 Seltjarnarnes</option>\n<option value="172">172 Seltjarnarnes</option>\n<option value="190">190 Vogar</option>\n<option value="200">200 K\xf3pavogur</option>\n<option value="201">201 K\xf3pavogur</option>\n<option value="202">202 K\xf3pavogur</option>\n<option value="203">203 K\xf3pavogur</option>\n<option value="210">210 Gar\xf0ab\xe6r</option>\n<option value="212">212 Gar\xf0ab\xe6r</option>\n<option value="220">220 Hafnarfj\xf6r\xf0ur</option>\n<option value="221">221 Hafnarfj\xf6r\xf0ur</option>\n<option value="222">222 Hafnarfj\xf6r\xf0ur</option>\n<option value="225">225 \xc1lftanes</option>\n<option value="230">230 Reykjanesb\xe6r</option>\n<option value="232">232 Reykjanesb\xe6r</option>\n<option value="233">233 Reykjanesb\xe6r</option>\n<option value="235">235 Keflav\xedkurflugv\xf6llur</option>\n<option value="240">240 Grindav\xedk</option>\n<option value="245">245 Sandger\xf0i</option>\n<option value="250">250 Gar\xf0ur</option>\n<option value="260">260 Reykjanesb\xe6r</option>\n<option value="270">270 Mosfellsb\xe6r</option>\n<option value="300">300 Akranes</option>\n<option value="301">301 Akranes</option>\n<option value="302">302 Akranes</option>\n<option value="310">310 Borgarnes</option>\n<option value="311">311 Borgarnes</option>\n<option value="320">320 Reykholt \xed Borgarfir\xf0i</option>\n<option value="340">340 Stykkish\xf3lmur</option>\n<option value="345">345 Flatey \xe1 Brei\xf0afir\xf0i</option>\n<option value="350">350 Grundarfj\xf6r\xf0ur</option>\n<option value="355">355 \xd3lafsv\xedk</option>\n<option value="356">356 Sn\xe6fellsb\xe6r</option>\n<option value="360">360 Hellissandur</option>\n<option value="370">370 B\xfa\xf0ardalur</option>\n<option value="371">371 B\xfa\xf0ardalur</option>\n<option value="380">380 Reykh\xf3lahreppur</option>\n<option value="400">400 \xcdsafj\xf6r\xf0ur</option>\n<option value="401">401 \xcdsafj\xf6r\xf0ur</option>\n<option value="410">410 Hn\xedfsdalur</option>\n<option value="415">415 Bolungarv\xedk</option>\n<option value="420">420 S\xfa\xf0av\xedk</option>\n<option value="425">425 Flateyri</option>\n<option value="430">430 Su\xf0ureyri</option>\n<option value="450">450 Patreksfj\xf6r\xf0ur</option>\n<option value="451">451 Patreksfj\xf6r\xf0ur</option>\n<option value="460">460 T\xe1lknafj\xf6r\xf0ur</option>\n<option value="465">465 B\xedldudalur</option>\n<option value="470">470 \xdeingeyri</option>\n<option value="471">471 \xdeingeyri</option>\n<option value="500">500 Sta\xf0ur</option>\n<option value="510">510 H\xf3lmav\xedk</option>\n<option value="512">512 H\xf3lmav\xedk</option>\n<option value="520">520 Drangsnes</option>\n<option value="522">522 Kj\xf6rvogur</option>\n<option value="523">523 B\xe6r</option>\n<option value="524">524 Nor\xf0urfj\xf6r\xf0ur</option>\n<option value="530">530 Hvammstangi</option>\n<option value="531">531 Hvammstangi</option>\n<option value="540">540 Bl\xf6ndu\xf3s</option>\n<option value="541">541 Bl\xf6ndu\xf3s</option>\n<option value="545">545 Skagastr\xf6nd</option>\n<option value="550">550 Sau\xf0\xe1rkr\xf3kur</option>\n<option value="551">551 Sau\xf0\xe1rkr\xf3kur</option>\n<option value="560">560 Varmahl\xed\xf0</option>\n<option value="565">565 Hofs\xf3s</option>\n<option value="566">566 Hofs\xf3s</option>\n<option value="570">570 Flj\xf3t</option>\n<option value="580">580 Siglufj\xf6r\xf0ur</option>\n<option value="600">600 Akureyri</option>\n<option value="601">601 Akureyri</option>\n<option value="602">602 Akureyri</option>\n<option value="603">603 Akureyri</option>\n<option value="610">610 Greniv\xedk</option>\n<option value="611">611 Gr\xedmsey</option>\n<option value="620">620 Dalv\xedk</option>\n<option value="621">621 Dalv\xedk</option>\n<option value="625">625 \xd3lafsfj\xf6r\xf0ur</option>\n<option value="630">630 Hr\xedsey</option>\n<option value="640">640 H\xfasav\xedk</option>\n<option value="641">641 H\xfasav\xedk</option>\n<option value="645">645 Fossh\xf3ll</option>\n<option value="650">650 Laugar</option>\n<option value="660">660 M\xfdvatn</option>\n<option value="670">670 K\xf3pasker</option>\n<option value="671">671 K\xf3pasker</option>\n<option value="675">675 Raufarh\xf6fn</option>\n<option value="680">680 \xde\xf3rsh\xf6fn</option>\n<option value="681">681 \xde\xf3rsh\xf6fn</option>\n<option value="685">685 Bakkafj\xf6r\xf0ur</option>\n<option value="690">690 Vopnafj\xf6r\xf0ur</option>\n<option value="700">700 Egilssta\xf0ir</option>\n<option value="701">701 Egilssta\xf0ir</option>\n<option value="710">710 Sey\xf0isfj\xf6r\xf0ur</option>\n<option value="715">715 Mj\xf3ifj\xf6r\xf0ur</option>\n<option value="720">720 Borgarfj\xf6r\xf0ur eystri</option>\n<option value="730">730 Rey\xf0arfj\xf6r\xf0ur</option>\n<option value="735">735 Eskifj\xf6r\xf0ur</option>\n<option value="740">740 Neskaupsta\xf0ur</option>\n<option value="750">750 F\xe1skr\xfa\xf0sfj\xf6r\xf0ur</option>\n<option value="755">755 St\xf6\xf0varfj\xf6r\xf0ur</option>\n<option value="760">760 Brei\xf0dalsv\xedk</option>\n<option value="765">765 Dj\xfapivogur</option>\n<option value="780">780 H\xf6fn \xed Hornafir\xf0i</option>\n<option value="781">781 H\xf6fn \xed Hornafir\xf0i</option>\n<option value="785">785 \xd6r\xe6fi</option>\n<option value="800">800 Selfoss</option>\n<option value="801">801 Selfoss</option>\n<option value="802">802 Selfoss</option>\n<option value="810">810 Hverager\xf0i</option>\n<option value="815">815 \xdeorl\xe1ksh\xf6fn</option>\n<option value="820">820 Eyrarbakki</option>\n<option value="825">825 Stokkseyri</option>\n<option value="840">840 Laugarvatn</option>\n<option value="845">845 Fl\xfa\xf0ir</option>\n<option value="850">850 Hella</option>\n<option value="851">851 Hella</option>\n<option value="860">860 Hvolsv\xf6llur</option>\n<option value="861">861 Hvolsv\xf6llur</option>\n<option value="870">870 V\xedk</option>\n<option value="871">871 V\xedk</option>\n<option value="880">880 Kirkjub\xe6jarklaustur</option>\n<option value="900">900 Vestmannaeyjar</option>\n<option value="902">902 Vestmannaeyjar</option>\n</select>'
+
+## CLRutField #############################################################
+
+CLRutField is a Field that checks the validity of the Chilean
+personal identification number (RUT). It has two modes relaxed (default) and
+strict.
+
+>>> from django.contrib.localflavor.cl.forms import CLRutField
+>>> rut = CLRutField()
+
+>>> rut.clean('11-6')
+'11-6'
+>>> rut.clean('116')
+'11-6'
+
+# valid format, bad verifier.
+>>> rut.clean('11.111.111-0')
+Traceback (most recent call last):
+...
+ValidationError: [u'The Chilean RUT is not valid.']
+>>> rut.clean('111')
+Traceback (most recent call last):
+...
+ValidationError: [u'The Chilean RUT is not valid.']
+
+>>> rut.clean('767484100')
+'76.748.410-0'
+>>> rut.clean('78.412.790-7')
+'78.412.790-7'
+>>> rut.clean('8.334.6043')
+'8.334.604-3'
+>>> rut.clean('76793310-K')
+'76.793.310-K'
+
+Strict RUT usage (does not allow imposible values)
+>>> rut = CLRutField(strict=True)
+
+>>> rut.clean('11-6')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
+
+# valid format, bad verifier.
+>>> rut.clean('11.111.111-0')
+Traceback (most recent call last):
+...
+ValidationError: [u'The Chilean RUT is not valid.']
+
+# Correct input, invalid format.
+>>> rut.clean('767484100')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
+>>> rut.clean('78.412.790-7')
+'78.412.790-7'
+>>> rut.clean('8.334.6043')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
+>>> rut.clean('76793310-K')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
+
+"""
diff --git a/tests/regressiontests/forms/regressions.py b/tests/regressiontests/forms/regressions.py
new file mode 100644
index 0000000000..5fe057b5d8
--- /dev/null
+++ b/tests/regressiontests/forms/regressions.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+# Tests to prevent against recurrences of earlier bugs.
+
+regression_tests = r"""
+It should be possible to re-use attribute dictionaries (#3810)
+>>> from django.newforms import *
+>>> extra_attrs = {'class': 'special'}
+>>> class TestForm(Form):
+... f1 = CharField(max_length=10, widget=TextInput(attrs=extra_attrs))
+... f2 = CharField(widget=TextInput(attrs=extra_attrs))
+>>> TestForm(auto_id=False).as_p()
+u'<p>F1: <input type="text" class="special" name="f1" maxlength="10" /></p>\n<p>F2: <input type="text" class="special" name="f2" /></p>'
+
+#######################
+# Tests for form i18n #
+#######################
+There were some problems with form translations in #3600
+
+>>> from django.utils.translation import gettext_lazy, activate, deactivate
+>>> class SomeForm(Form):
+... username = CharField(max_length=10, label=gettext_lazy('Username'))
+>>> f = SomeForm()
+>>> print f.as_p()
+<p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>
+>>> activate('de')
+>>> print f.as_p()
+<p><label for="id_username">Benutzername:</label> <input id="id_username" type="text" name="username" maxlength="10" /></p>
+>>> deactivate()
+
+Unicode decoding problems...
+>>> GENDERS = (('0', u'En tied\xe4'), ('1', u'Mies'), ('2', u'Nainen'))
+>>> class SomeForm(Form):
+... somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect())
+>>> f = SomeForm()
+>>> f.as_p()
+u'<p><label for="id_somechoice_0">Somechoice:</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="0" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="1" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="2" name="somechoice" /> Nainen</label></li>\n</ul></p>'
+
+#######################
+# 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 50bc7a7595..4844267b43 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -1,8 +1,16 @@
# -*- coding: utf-8 -*-
-r"""
+from localflavor import localflavor_tests
+from regressions import regression_tests
+
+form_tests = r"""
>>> from django.newforms import *
>>> import datetime
+>>> import time
>>> import re
+>>> try:
+... from decimal import Decimal
+... except ImportError:
+... from django.utils._decimal import Decimal
###########
# Widgets #
@@ -72,6 +80,22 @@ u'<input type="password" class="special" name="email" />'
>>> w.render('email', 'Å ÄĆŽćžšđ', attrs={'class': 'fun'})
u'<input type="password" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
+The render_value argument lets you specify whether the widget should render
+its value. You may want to do this for security reasons.
+>>> w = PasswordInput(render_value=True)
+>>> w.render('email', 'secret')
+u'<input type="password" name="email" value="secret" />'
+>>> w = PasswordInput(render_value=False)
+>>> w.render('email', '')
+u'<input type="password" name="email" />'
+>>> w.render('email', None)
+u'<input type="password" name="email" />'
+>>> w.render('email', 'secret')
+u'<input type="password" name="email" />'
+>>> w = PasswordInput(attrs={'class': 'fun'}, render_value=False)
+>>> w.render('email', 'secret')
+u'<input type="password" class="fun" name="email" />'
+
# HiddenInput Widget ############################################################
>>> w = HiddenInput()
@@ -106,6 +130,46 @@ u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u
>>> w.render('email', '', attrs={'class': 'special'})
u'<input type="hidden" class="special" name="email" />'
+# MultipleHiddenInput Widget ##################################################
+
+>>> w = MultipleHiddenInput()
+>>> w.render('email', [])
+u''
+>>> w.render('email', None)
+u''
+>>> w.render('email', ['test@example.com'])
+u'<input type="hidden" name="email" value="test@example.com" />'
+>>> w.render('email', ['some "quoted" & ampersanded value'])
+u'<input type="hidden" name="email" value="some &quot;quoted&quot; &amp; ampersanded value" />'
+>>> w.render('email', ['test@example.com', 'foo@example.com'])
+u'<input type="hidden" name="email" value="test@example.com" />\n<input type="hidden" name="email" value="foo@example.com" />'
+>>> w.render('email', ['test@example.com'], attrs={'class': 'fun'})
+u'<input type="hidden" name="email" value="test@example.com" class="fun" />'
+>>> w.render('email', ['test@example.com', 'foo@example.com'], attrs={'class': 'fun'})
+u'<input type="hidden" name="email" value="test@example.com" class="fun" />\n<input type="hidden" name="email" value="foo@example.com" class="fun" />'
+
+You can also pass 'attrs' to the constructor:
+>>> w = MultipleHiddenInput(attrs={'class': 'fun'})
+>>> w.render('email', [])
+u''
+>>> w.render('email', ['foo@example.com'])
+u'<input type="hidden" class="fun" value="foo@example.com" name="email" />'
+>>> w.render('email', ['foo@example.com', 'test@example.com'])
+u'<input type="hidden" class="fun" value="foo@example.com" name="email" />\n<input type="hidden" class="fun" value="test@example.com" name="email" />'
+
+'attrs' passed to render() get precedence over those passed to the constructor:
+>>> w = MultipleHiddenInput(attrs={'class': 'pretty'})
+>>> w.render('email', ['foo@example.com'], attrs={'class': 'special'})
+u'<input type="hidden" class="special" value="foo@example.com" name="email" />'
+
+>>> w.render('email', ['Å ÄĆŽćžšđ'], attrs={'class': 'fun'})
+u'<input type="hidden" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
+
+'attrs' passed to render() get precedence over those passed to the constructor:
+>>> w = MultipleHiddenInput(attrs={'class': 'pretty'})
+>>> w.render('email', ['foo@example.com'], attrs={'class': 'special'})
+u'<input type="hidden" class="special" value="foo@example.com" name="email" />'
+
# FileInput Widget ############################################################
>>> w = FileInput()
@@ -134,30 +198,30 @@ u'<input type="file" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u01
>>> w = Textarea()
>>> w.render('msg', '')
-u'<textarea name="msg"></textarea>'
+u'<textarea rows="10" cols="40" name="msg"></textarea>'
>>> w.render('msg', None)
-u'<textarea name="msg"></textarea>'
+u'<textarea rows="10" cols="40" name="msg"></textarea>'
>>> w.render('msg', 'value')
-u'<textarea name="msg">value</textarea>'
+u'<textarea rows="10" cols="40" name="msg">value</textarea>'
>>> w.render('msg', 'some "quoted" & ampersanded value')
-u'<textarea name="msg">some &quot;quoted&quot; &amp; ampersanded value</textarea>'
->>> w.render('msg', 'value', attrs={'class': 'pretty'})
-u'<textarea name="msg" class="pretty">value</textarea>'
+u'<textarea rows="10" cols="40" name="msg">some &quot;quoted&quot; &amp; ampersanded value</textarea>'
+>>> w.render('msg', 'value', attrs={'class': 'pretty', 'rows': 20})
+u'<textarea class="pretty" rows="20" cols="40" name="msg">value</textarea>'
You can also pass 'attrs' to the constructor:
>>> w = Textarea(attrs={'class': 'pretty'})
>>> w.render('msg', '')
-u'<textarea class="pretty" name="msg"></textarea>'
+u'<textarea rows="10" cols="40" name="msg" class="pretty"></textarea>'
>>> w.render('msg', 'example')
-u'<textarea class="pretty" name="msg">example</textarea>'
+u'<textarea rows="10" cols="40" name="msg" class="pretty">example</textarea>'
'attrs' passed to render() get precedence over those passed to the constructor:
>>> w = Textarea(attrs={'class': 'pretty'})
>>> w.render('msg', '', attrs={'class': 'special'})
-u'<textarea class="special" name="msg"></textarea>'
+u'<textarea rows="10" cols="40" name="msg" class="special"></textarea>'
>>> w.render('msg', 'Å ÄĆŽćžšđ', attrs={'class': 'fun'})
-u'<textarea class="fun" name="msg">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</textarea>'
+u'<textarea rows="10" cols="40" name="msg" class="fun">\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</textarea>'
# CheckboxInput Widget ########################################################
@@ -262,6 +326,7 @@ The value is compared to its str():
</select>
The 'choices' argument can be any iterable:
+>>> from itertools import chain
>>> def get_choices():
... for i in range(5):
... yield (i, i)
@@ -273,6 +338,17 @@ The 'choices' argument can be any iterable:
<option value="3">3</option>
<option value="4">4</option>
</select>
+>>> things = ({'id': 1, 'name': 'And Boom'}, {'id': 2, 'name': 'One More Thing!'})
+>>> class SomeForm(Form):
+... somechoice = ChoiceField(choices=chain((('', '-'*9),), [(thing['id'], thing['name']) for thing in things]))
+>>> f = SomeForm()
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
+>>> f = SomeForm({'somechoice': 2})
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>'
You can also pass 'choices' to the constructor:
>>> w = Select(choices=[(1, 1), (2, 2), (3, 3)])
@@ -296,6 +372,60 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
>>> w.render('email', 'Å ÄĆŽćžšđ', choices=[('Å ÄĆŽćžšđ', 'Å ÄabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
u'<select name="email">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected="selected">\u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</option>\n<option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option>\n</select>'
+If choices is passed to the constructor and is a generator, it can be iterated
+over multiple times without getting consumed:
+>>> w = Select(choices=get_choices())
+>>> print w.render('num', 2)
+<select name="num">
+<option value="0">0</option>
+<option value="1">1</option>
+<option value="2" selected="selected">2</option>
+<option value="3">3</option>
+<option value="4">4</option>
+</select>
+>>> print w.render('num', 3)
+<select name="num">
+<option value="0">0</option>
+<option value="1">1</option>
+<option value="2">2</option>
+<option value="3" selected="selected">3</option>
+<option value="4">4</option>
+</select>
+
+# NullBooleanSelect Widget ####################################################
+
+>>> w = NullBooleanSelect()
+>>> print w.render('is_cool', True)
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2" selected="selected">Yes</option>
+<option value="3">No</option>
+</select>
+>>> print w.render('is_cool', False)
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2">Yes</option>
+<option value="3" selected="selected">No</option>
+</select>
+>>> print w.render('is_cool', None)
+<select name="is_cool">
+<option value="1" selected="selected">Unknown</option>
+<option value="2">Yes</option>
+<option value="3">No</option>
+</select>
+>>> print w.render('is_cool', '2')
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2" selected="selected">Yes</option>
+<option value="3">No</option>
+</select>
+>>> print w.render('is_cool', '3')
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2">Yes</option>
+<option value="3" selected="selected">No</option>
+</select>
+
# SelectMultiple Widget #######################################################
>>> w = SelectMultiple()
@@ -527,12 +657,37 @@ True
>>> r[1].is_checked()
False
>>> r[1].name, r[1].value, r[1].choice_value, r[1].choice_label
-('beatle', u'J', 'P', 'Paul')
+('beatle', u'J', u'P', u'Paul')
>>> r[10]
Traceback (most recent call last):
...
IndexError: list index out of range
+# Unicode choices are correctly rendered as HTML
+>>> w = RadioSelect()
+>>> unicode(w.render('email', 'Å ÄĆŽćžšđ', choices=[('Å ÄĆŽćžšđ', 'Å ÄabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]))
+u'<ul>\n<li><label><input checked="checked" type="radio" name="email" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="radio" name="email" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>'
+
+# Attributes provided at instantiation are passed to the constituent inputs
+>>> w = RadioSelect(attrs={'id':'foo'})
+>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
+<ul>
+<li><label><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li>
+<li><label><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li>
+<li><label><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li>
+<li><label><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li>
+</ul>
+
+# Attributes provided at render-time are passed to the constituent inputs
+>>> w = RadioSelect()
+>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'})
+<ul>
+<li><label><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li>
+<li><label><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li>
+<li><label><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>
+<li><label><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li>
+</ul>
+
# CheckboxSelectMultiple Widget ###############################################
>>> w = CheckboxSelectMultiple()
@@ -640,6 +795,44 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
>>> w.render('nums', ['Å ÄĆŽćžšđ'], choices=[('Å ÄĆŽćžšđ', 'Å ÄabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')])
u'<ul>\n<li><label><input type="checkbox" name="nums" value="1" /> 1</label></li>\n<li><label><input type="checkbox" name="nums" value="2" /> 2</label></li>\n<li><label><input type="checkbox" name="nums" value="3" /> 3</label></li>\n<li><label><input checked="checked" type="checkbox" name="nums" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111</label></li>\n<li><label><input type="checkbox" name="nums" value="\u0107\u017e\u0161\u0111" /> abc\u0107\u017e\u0161\u0111</label></li>\n</ul>'
+# MultiWidget #################################################################
+
+>>> class MyMultiWidget(MultiWidget):
+... def decompress(self, value):
+... if value:
+... return value.split('__')
+... return ['', '']
+... def format_output(self, rendered_widgets):
+... return u'<br />'.join(rendered_widgets)
+>>> w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})))
+>>> w.render('name', ['john', 'lennon'])
+u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />'
+>>> w.render('name', 'john__lennon')
+u'<input type="text" class="big" value="john" name="name_0" /><br /><input type="text" class="small" value="lennon" name="name_1" />'
+>>> w.render('name', 'john__lennon', attrs={'id':'foo'})
+u'<input id="foo_0" type="text" class="big" value="john" name="name_0" /><br /><input id="foo_1" type="text" class="small" value="lennon" name="name_1" />'
+>>> w = MyMultiWidget(widgets=(TextInput(attrs={'class': 'big'}), TextInput(attrs={'class': 'small'})), attrs={'id': 'bar'})
+>>> w.render('name', ['john', 'lennon'])
+u'<input id="bar_0" type="text" class="big" value="john" name="name_0" /><br /><input id="bar_1" type="text" class="small" value="lennon" name="name_1" />'
+
+# SplitDateTimeWidget #########################################################
+
+>>> w = SplitDateTimeWidget()
+>>> w.render('date', '')
+u'<input type="text" name="date_0" /><input type="text" name="date_1" />'
+>>> w.render('date', None)
+u'<input type="text" name="date_0" /><input type="text" name="date_1" />'
+>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
+u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />'
+>>> w.render('date', [datetime.date(2006, 1, 10), datetime.time(7, 30)])
+u'<input type="text" name="date_0" value="2006-01-10" /><input type="text" name="date_1" value="07:30:00" />'
+
+You can also pass 'attrs' to the constructor. In this case, the attrs will be
+included on both widgets.
+>>> w = SplitDateTimeWidget(attrs={'class': 'pretty'})
+>>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30))
+u'<input type="text" class="pretty" value="2006-01-10" name="date_0" /><input type="text" class="pretty" value="07:30:00" name="date_1" />'
+
##########
# Fields #
##########
@@ -658,6 +851,8 @@ Each Field's __init__() takes at least these parameters:
label -- A verbose name for this field, for use in displaying this field in
a form. By default, Django will use a "pretty" version of the form
field name, if the Field is part of a Form.
+ initial -- A value to use in this Field's initial display. This value is
+ *not* used as a fallback if data isn't given.
Other than that, the Field subclasses have class-specific options for
__init__(). For example, CharField has a max_length option.
@@ -764,9 +959,11 @@ ValidationError: [u'Enter a whole number.']
>>> f = IntegerField(required=False)
>>> f.clean('')
-u''
+>>> repr(f.clean(''))
+'None'
>>> f.clean(None)
-u''
+>>> repr(f.clean(None))
+'None'
>>> f.clean('1')
1
>>> isinstance(f.clean('1'), int)
@@ -853,6 +1050,133 @@ Traceback (most recent call last):
...
ValidationError: [u'Ensure this value is less than or equal to 20.']
+# FloatField ##################################################################
+
+>>> f = FloatField()
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('1')
+1.0
+>>> isinstance(f.clean('1'), float)
+True
+>>> f.clean('23')
+23.0
+>>> f.clean('3.14')
+3.1400000000000001
+>>> f.clean('a')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a number.']
+>>> f.clean('1.0 ')
+1.0
+>>> f.clean(' 1.0')
+1.0
+>>> f.clean(' 1.0 ')
+1.0
+>>> f.clean('1.0a')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a number.']
+
+>>> f = FloatField(required=False)
+>>> f.clean('')
+
+>>> f.clean(None)
+
+>>> f.clean('1')
+1.0
+
+FloatField accepts min_value and max_value just like IntegerField:
+>>> f = FloatField(max_value=1.5, min_value=0.5)
+
+>>> f.clean('1.6')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value is less than or equal to 1.5.']
+>>> f.clean('0.4')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value is greater than or equal to 0.5.']
+>>> f.clean('1.5')
+1.5
+>>> f.clean('0.5')
+0.5
+
+# DecimalField ################################################################
+
+>>> f = DecimalField(max_digits=4, decimal_places=2)
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('1')
+Decimal("1")
+>>> isinstance(f.clean('1'), Decimal)
+True
+>>> f.clean('23')
+Decimal("23")
+>>> f.clean('3.14')
+Decimal("3.14")
+>>> f.clean('a')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a number.']
+>>> f.clean('1.0 ')
+Decimal("1.0")
+>>> f.clean(' 1.0')
+Decimal("1.0")
+>>> f.clean(' 1.0 ')
+Decimal("1.0")
+>>> f.clean('1.0a')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a number.']
+>>> f.clean('123.45')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure that there are no more than 4 digits in total.']
+>>> f.clean('1.234')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure that there are no more than 2 decimal places.']
+>>> f.clean('123.4')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure that there are no more than 2 digits before the decimal point.']
+>>> f = DecimalField(max_digits=4, decimal_places=2, required=False)
+>>> f.clean('')
+
+>>> f.clean(None)
+
+>>> f.clean('1')
+Decimal("1")
+
+DecimalField accepts min_value and max_value just like IntegerField:
+>>> f = DecimalField(max_digits=4, decimal_places=2, max_value=Decimal('1.5'), min_value=Decimal('0.5'))
+
+>>> f.clean('1.6')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value is less than or equal to 1.5.']
+>>> f.clean('0.4')
+Traceback (most recent call last):
+...
+ValidationError: [u'Ensure this value is greater than or equal to 0.5.']
+>>> f.clean('1.5')
+Decimal("1.5")
+>>> f.clean('0.5')
+Decimal("0.5")
+
# DateField ###################################################################
>>> import datetime
@@ -1283,8 +1607,13 @@ ValidationError: [u'This URL appears to be a broken link.']
Traceback (most recent call last):
...
ValidationError: [u'This URL appears to be a broken link.']
+>>> f = URLField(verify_exists=True, required=False)
+>>> f.clean('')
+u''
+>>> f.clean('http://www.google.com') # This will fail if there's no Internet connection
+u'http://www.google.com'
-EmailField also access min_length and max_length parameters, for convenience.
+URLField also access min_length and max_length parameters, for convenience.
>>> f = URLField(min_length=15, max_length=20)
>>> f.clean('http://f.com')
Traceback (most recent call last):
@@ -1353,7 +1682,7 @@ u'1'
>>> f.clean('3')
Traceback (most recent call last):
...
-ValidationError: [u'Select a valid choice. 3 is not one of the available choices.']
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
>>> f = ChoiceField(choices=[('1', '1'), ('2', '2')], required=False)
>>> f.clean('')
@@ -1367,7 +1696,7 @@ u'1'
>>> f.clean('3')
Traceback (most recent call last):
...
-ValidationError: [u'Select a valid choice. 3 is not one of the available choices.']
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
>>> f = ChoiceField(choices=[('J', 'John'), ('P', 'Paul')])
>>> f.clean('J')
@@ -1375,7 +1704,21 @@ u'J'
>>> f.clean('John')
Traceback (most recent call last):
...
-ValidationError: [u'Select a valid choice. John is not one of the available choices.']
+ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
+
+# NullBooleanField ############################################################
+
+>>> f = NullBooleanField()
+>>> f.clean('')
+>>> f.clean(True)
+True
+>>> f.clean(False)
+False
+>>> f.clean(None)
+>>> f.clean('1')
+>>> f.clean('2')
+>>> f.clean('3')
+>>> f.clean('hello')
# MultipleChoiceField #########################################################
@@ -1483,6 +1826,58 @@ u''
>>> f.clean(None)
u''
+# SplitDateTimeField ##########################################################
+
+>>> f = SplitDateTimeField()
+>>> f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)])
+datetime.datetime(2006, 1, 10, 7, 30)
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+>>> f.clean('hello')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a list of values.']
+>>> f.clean(['hello', 'there'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid date.', u'Enter a valid time.']
+>>> f.clean(['2006-01-10', 'there'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid time.']
+>>> f.clean(['hello', '07:30'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid date.']
+
+>>> f = SplitDateTimeField(required=False)
+>>> f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)])
+datetime.datetime(2006, 1, 10, 7, 30)
+>>> f.clean(None)
+>>> f.clean('')
+>>> f.clean('hello')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a list of values.']
+>>> f.clean(['hello', 'there'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid date.', u'Enter a valid time.']
+>>> f.clean(['2006-01-10', 'there'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid time.']
+>>> f.clean(['hello', '07:30'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid date.']
+
#########
# Forms #
#########
@@ -1500,6 +1895,8 @@ You can pass it data in __init__(), as a dictionary.
Pass a dictionary to a Form's __init__().
>>> p = Person({'first_name': u'John', 'last_name': u'Lennon', 'birthday': u'1940-10-9'})
+>>> p.is_bound
+True
>>> p.errors
{}
>>> p.is_valid()
@@ -1508,7 +1905,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" />
@@ -1538,10 +1935,16 @@ Birthday 1940-10-9
Empty dictionaries are valid, too.
>>> p = Person({})
+>>> p.is_bound
+True
>>> p.errors
{'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.cleaned_data
+Traceback (most recent call last):
+...
+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>
@@ -1563,13 +1966,19 @@ False
<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></p>
If you don't pass any values to the Form's __init__(), or if you pass None,
-the Form won't do any validation. Form.errors will be an empty dictionary *but*
-Form.is_valid() will return False.
+the Form will be considered unbound and won't do any validation. Form.errors
+will be an empty dictionary *but* Form.is_valid() will return False.
>>> p = Person()
+>>> p.is_bound
+False
>>> p.errors
{}
>>> p.is_valid()
False
+>>> p.cleaned_data
+Traceback (most recent call last):
+...
+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>
@@ -1608,9 +2017,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
->>> repr(p.clean_data)
-'None'
+>>> p.cleaned_data
+Traceback (most recent call last):
+...
+AttributeError: 'Person' object has no attribute 'cleaned_data'
>>> p['first_name'].errors
[u'This field is required.']
>>> p['first_name'].errors.as_ul()
@@ -1626,6 +2036,45 @@ u'* This field is required.'
>>> print p['birthday']
<input type="text" name="birthday" id="id_birthday" />
+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 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.cleaned_data
+{'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
+
+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 cleaned_data includes it. For CharFields, it's set to the
+empty string.
+>>> class OptionalPersonForm(Form):
+... first_name = CharField()
+... last_name = CharField()
+... nick_name = CharField(required=False)
+>>> data = {'first_name': u'John', 'last_name': u'Lennon'}
+>>> f = OptionalPersonForm(data)
+>>> f.is_valid()
+True
+>>> f.cleaned_data
+{'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'}
+
+For DateFields, it's set to None.
+>>> class OptionalPersonForm(Form):
+... first_name = CharField()
+... last_name = CharField()
+... birth_date = DateField(required=False)
+>>> data = {'first_name': u'John', 'last_name': u'Lennon'}
+>>> f = OptionalPersonForm(data)
+>>> f.is_valid()
+True
+>>> 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.
If it's a string that contains '%s', Django will use that as a format string
into which the field's name will be inserted. It will also put a <label> around
@@ -1703,12 +2152,12 @@ Any Field can have a Widget class passed to its constructor:
>>> print f['subject']
<input type="text" name="subject" />
>>> print f['message']
-<textarea name="message"></textarea>
+<textarea rows="10" cols="40" name="message"></textarea>
as_textarea(), as_text() and as_hidden() are shortcuts for changing the output
widget type:
>>> f['subject'].as_textarea()
-u'<textarea name="subject"></textarea>'
+u'<textarea rows="10" cols="40" name="subject"></textarea>'
>>> f['message'].as_text()
u'<input type="text" name="message" />'
>>> f['message'].as_hidden()
@@ -1728,7 +2177,7 @@ as_hidden():
u'<input type="text" name="message" />'
>>> f = ContactForm({'subject': 'Hello', 'message': 'I love you.'}, auto_id=False)
>>> f['subject'].as_textarea()
-u'<textarea name="subject">Hello</textarea>'
+u'<textarea rows="10" cols="40" name="subject">Hello</textarea>'
>>> f['message'].as_text()
u'<input type="text" name="message" value="I love you." />'
>>> f['message'].as_hidden()
@@ -1751,6 +2200,70 @@ For a form with a <select>, use ChoiceField:
<option value="J">Java</option>
</select>
+A subtlety: If one of the choices' value is the empty string and the form is
+unbound, then the <option> for the empty-string choice will get selected="selected".
+>>> class FrameworkForm(Form):
+... name = CharField()
+... language = ChoiceField(choices=[('', '------'), ('P', 'Python'), ('J', 'Java')])
+>>> f = FrameworkForm(auto_id=False)
+>>> print f['language']
+<select name="language">
+<option value="" selected="selected">------</option>
+<option value="P">Python</option>
+<option value="J">Java</option>
+</select>
+
+You can specify widget attributes in the Widget constructor.
+>>> class FrameworkForm(Form):
+... name = CharField()
+... language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=Select(attrs={'class': 'foo'}))
+>>> f = FrameworkForm(auto_id=False)
+>>> print f['language']
+<select class="foo" name="language">
+<option value="P">Python</option>
+<option value="J">Java</option>
+</select>
+>>> f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False)
+>>> print f['language']
+<select class="foo" name="language">
+<option value="P" selected="selected">Python</option>
+<option value="J">Java</option>
+</select>
+
+When passing a custom widget instance to ChoiceField, note that setting
+'choices' on the widget is meaningless. The widget will use the choices
+defined on the Field, not the ones defined on the Widget.
+>>> class FrameworkForm(Form):
+... name = CharField()
+... language = ChoiceField(choices=[('P', 'Python'), ('J', 'Java')], widget=Select(choices=[('R', 'Ruby'), ('P', 'Perl')], attrs={'class': 'foo'}))
+>>> f = FrameworkForm(auto_id=False)
+>>> print f['language']
+<select class="foo" name="language">
+<option value="P">Python</option>
+<option value="J">Java</option>
+</select>
+>>> f = FrameworkForm({'name': 'Django', 'language': 'P'}, auto_id=False)
+>>> print f['language']
+<select class="foo" name="language">
+<option value="P" selected="selected">Python</option>
+<option value="J">Java</option>
+</select>
+
+You can set a ChoiceField's choices after the fact.
+>>> class FrameworkForm(Form):
+... name = CharField()
+... language = ChoiceField()
+>>> f = FrameworkForm(auto_id=False)
+>>> print f['language']
+<select name="language">
+</select>
+>>> f.fields['language'].choices = [('P', 'Python'), ('J', 'Java')]
+>>> print f['language']
+<select name="language">
+<option value="P">Python</option>
+<option value="J">Java</option>
+</select>
+
Add widget=RadioSelect to use that widget with a ChoiceField.
>>> class FrameworkForm(Form):
... name = CharField()
@@ -1832,6 +2345,17 @@ MultipleChoiceField is a special case, as its data is required to be a list:
<option value="P" selected="selected">Paul McCartney</option>
</select>
+MultipleChoiceField rendered as_hidden() is a special case. Because it can
+have multiple values, its as_hidden() renders multiple <input type="hidden">
+tags.
+>>> f = SongForm({'name': 'Yesterday', 'composers': ['P']}, auto_id=False)
+>>> print f['composers'].as_hidden()
+<input type="hidden" name="composers" value="P" />
+>>> f = SongForm({'name': 'From Me To You', 'composers': ['P', 'J']}, auto_id=False)
+>>> print f['composers'].as_hidden()
+<input type="hidden" name="composers" value="P" />
+<input type="hidden" name="composers" value="J" />
+
MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
>>> class SongForm(Form):
... name = CharField()
@@ -1855,6 +2379,16 @@ MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
<li><label><input checked="checked" type="checkbox" name="composers" value="P" /> Paul McCartney</label></li>
</ul>
+Regarding auto_id, CheckboxSelectMultiple is a special case. Each checkbox
+gets a distinct ID, formed by appending an underscore plus the checkbox's
+zero-based index.
+>>> f = SongForm(auto_id='%s_id')
+>>> print f['composers']
+<ul>
+<li><label><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li>
+<li><label><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li>
+</ul>
+
Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict
conveniently work with this.
>>> data = {'name': 'Yesterday', 'composers': ['J', 'P']}
@@ -1867,11 +2401,20 @@ conveniently work with this.
>>> f.errors
{}
>>> from django.utils.datastructures import MultiValueDict
->>> data = MultiValueDict(dict(name='Yesterday', composers=['J', 'P']))
+>>> data = MultiValueDict(dict(name=['Yesterday'], composers=['J', 'P']))
>>> f = SongForm(data)
>>> f.errors
{}
+The MultipleHiddenInput widget renders multiple values as hidden fields.
+>>> class SongFormHidden(Form):
+... name = CharField()
+... composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')], widget=MultipleHiddenInput)
+>>> f = SongFormHidden(MultiValueDict(dict(name=['Yesterday'], composers=['J', 'P'])), auto_id=False)
+>>> print f.as_ul()
+<li>Name: <input type="text" name="name" value="Yesterday" /><input type="hidden" name="composers" value="J" />
+<input type="hidden" name="composers" value="P" /></li>
+
When using CheckboxSelectMultiple, the framework expects a list of input and
returns a list of input.
>>> f = SongForm({'name': 'Yesterday'}, auto_id=False)
@@ -1880,19 +2423,34 @@ 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.cleaned_data['special_name'])
+
+>>> f = EscapingForm({'special_name': "Nothing to escape"}, auto_id=False)
+>>> print f
+<tr><th>Special name:</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Nothing to escape&#39;</li></ul><input type="text" name="special_name" value="Nothing to escape" /></td></tr>
+>>> f = EscapingForm({'special_name': "Should escape < & > and <script>alert('xss')</script>"}, auto_id=False)
+>>> print f
+<tr><th>Special name:</th><td><ul class="errorlist"><li>Something&#39;s wrong with &#39;Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;&#39;</li></ul><input type="text" name="special_name" value="Should escape &lt; &amp; &gt; and &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;" /></td></tr>
+
+# Validating multiple fields in relation to another ###########################
+
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):
@@ -1900,9 +2458,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
{}
@@ -1915,14 +2473,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):
@@ -1930,9 +2488,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
{}
@@ -1959,9 +2517,11 @@ 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 ########################################################
+
It's possible to construct a Form dynamically by adding to the self.fields
dictionary in __init__(). Don't forget to call Form.__init__() within the
subclass' __init__().
@@ -1977,6 +2537,83 @@ subclass' __init__().
<tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr>
<tr><th>Birthday:</th><td><input type="text" name="birthday" /></td></tr>
+Instances of a dynamic Form do not persist fields from one Form instance to
+the next.
+>>> class MyForm(Form):
+... def __init__(self, data=None, auto_id=False, field_list=[]):
+... Form.__init__(self, data, auto_id)
+... for field in field_list:
+... self.fields[field[0]] = field[1]
+>>> field_list = [('field1', CharField()), ('field2', CharField())]
+>>> my_form = MyForm(field_list=field_list)
+>>> print my_form
+<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr>
+<tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr>
+>>> field_list = [('field3', CharField()), ('field4', CharField())]
+>>> my_form = MyForm(field_list=field_list)
+>>> print my_form
+<tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr>
+<tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr>
+
+>>> class MyForm(Form):
+... default_field_1 = CharField()
+... default_field_2 = CharField()
+... def __init__(self, data=None, auto_id=False, field_list=[]):
+... Form.__init__(self, data, auto_id)
+... for field in field_list:
+... self.fields[field[0]] = field[1]
+>>> field_list = [('field1', CharField()), ('field2', CharField())]
+>>> my_form = MyForm(field_list=field_list)
+>>> print my_form
+<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr>
+<tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr>
+<tr><th>Field1:</th><td><input type="text" name="field1" /></td></tr>
+<tr><th>Field2:</th><td><input type="text" name="field2" /></td></tr>
+>>> field_list = [('field3', CharField()), ('field4', CharField())]
+>>> my_form = MyForm(field_list=field_list)
+>>> print my_form
+<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" /></td></tr>
+<tr><th>Default field 2:</th><td><input type="text" name="default_field_2" /></td></tr>
+<tr><th>Field3:</th><td><input type="text" name="field3" /></td></tr>
+<tr><th>Field4:</th><td><input type="text" name="field4" /></td></tr>
+
+Similarly, changes to field attributes do not persist from one Form instance
+to the next.
+>>> class Person(Form):
+... first_name = CharField(required=False)
+... last_name = CharField(required=False)
+... def __init__(self, names_required=False, *args, **kwargs):
+... super(Person, self).__init__(*args, **kwargs)
+... if names_required:
+... self.fields['first_name'].required = True
+... self.fields['last_name'].required = True
+>>> f = Person(names_required=False)
+>>> f['first_name'].field.required, f['last_name'].field.required
+(False, False)
+>>> f = Person(names_required=True)
+>>> f['first_name'].field.required, f['last_name'].field.required
+(True, True)
+>>> f = Person(names_required=False)
+>>> f['first_name'].field.required, f['last_name'].field.required
+(False, False)
+>>> class Person(Form):
+... first_name = CharField(max_length=30)
+... last_name = CharField(max_length=30)
+... def __init__(self, name_max_length=None, *args, **kwargs):
+... super(Person, self).__init__(*args, **kwargs)
+... if name_max_length:
+... self.fields['first_name'].max_length = name_max_length
+... self.fields['last_name'].max_length = name_max_length
+>>> f = Person(name_max_length=None)
+>>> f['first_name'].field.max_length, f['last_name'].field.max_length
+(30, 30)
+>>> f = Person(name_max_length=20)
+>>> f['first_name'].field.max_length, f['last_name'].field.max_length
+(20, 20)
+>>> f = Person(name_max_length=None)
+>>> f['first_name'].field.max_length, f['last_name'].field.max_length
+(30, 30)
+
HiddenInput widgets are displayed differently in the as_table(), as_ul()
and as_p() output of a Form -- their verbose names are not displayed, and a
separate row is not displayed. They're displayed in the last row of the
@@ -2108,6 +2745,8 @@ in "attrs".
<li>Username: <input type="text" name="username" maxlength="10" /></li>
<li>Password: <input type="password" name="password" maxlength="10" /></li>
+# Specifying labels ###########################################################
+
You can specify the label for a field by using the 'label' argument to a Field
class. If you don't specify 'label', Django will use the field name with
underscores converted to spaces, and the initial letter capitalized.
@@ -2121,6 +2760,27 @@ underscores converted to spaces, and the initial letter capitalized.
<li>Password1: <input type="password" name="password1" /></li>
<li>Password (again): <input type="password" name="password2" /></li>
+Labels for as_* methods will only end in a colon if they don't end in other
+punctuation already.
+>>> class Questions(Form):
+... q1 = CharField(label='The first question')
+... q2 = CharField(label='What is your name?')
+... q3 = CharField(label='The answer to life is:')
+... q4 = CharField(label='Answer this question!')
+... q5 = CharField(label='The last question. Period.')
+>>> print Questions(auto_id=False).as_p()
+<p>The first question: <input type="text" name="q1" /></p>
+<p>What is your name? <input type="text" name="q2" /></p>
+<p>The answer to life is: <input type="text" name="q3" /></p>
+<p>Answer this question! <input type="text" name="q4" /></p>
+<p>The last question. Period. <input type="text" name="q5" /></p>
+>>> print Questions().as_p()
+<p><label for="id_q1">The first question:</label> <input type="text" name="q1" id="id_q1" /></p>
+<p><label for="id_q2">What is your name?</label> <input type="text" name="q2" id="id_q2" /></p>
+<p><label for="id_q3">The answer to life is:</label> <input type="text" name="q3" id="id_q3" /></p>
+<p><label for="id_q4">Answer this question!</label> <input type="text" name="q4" id="id_q4" /></p>
+<p><label for="id_q5">The last question. Period.</label> <input type="text" name="q5" id="id_q5" /></p>
+
A label can be a Unicode object or a bytestring with special characters.
>>> class UserRegistration(Form):
... username = CharField(max_length=10, label='Å ÄĆŽćžšđ')
@@ -2156,6 +2816,242 @@ is default behavior.
<li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></li>
<li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li>
+# Initial data ################################################################
+
+You can specify initial data for a field by using the 'initial' argument to a
+Field class. This initial data is displayed when a Form is rendered with *no*
+data. It is not displayed when a Form is rendered with any data (including an
+empty dictionary). Also, the initial value is *not* used if data for a
+particular required field isn't provided.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, initial='django')
+... password = CharField(widget=PasswordInput)
+
+Here, we're not submitting any data, so the initial value will be displayed.
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+
+Here, we're submitting data, so the initial value will *not* be displayed.
+>>> p = UserRegistration({}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u''}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u'foo'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+
+An 'initial' value is *not* used as a fallback if data is not provided. In this
+example, we don't provide a value for 'username', and the form raises a
+validation error rather than using the initial value for 'username'.
+>>> p = UserRegistration({'password': 'secret'})
+>>> p.errors
+{'username': [u'This field is required.']}
+>>> p.is_valid()
+False
+
+# Dynamic initial data ########################################################
+
+The previous technique dealt with "hard-coded" initial data, but it's also
+possible to specify initial data after you've already created the Form class
+(i.e., at runtime). Use the 'initial' parameter to the Form constructor. This
+should be a dictionary containing initial values for one or more fields in the
+form, keyed by field name.
+
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10)
+... password = CharField(widget=PasswordInput)
+
+Here, we're not submitting any data, so the initial value will be displayed.
+>>> p = UserRegistration(initial={'username': 'django'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration(initial={'username': 'stephane'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+
+The 'initial' parameter is meaningless if you pass data.
+>>> p = UserRegistration({}, initial={'username': 'django'}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u''}, initial={'username': 'django'}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u'foo'}, initial={'username': 'django'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+
+A dynamic 'initial' value is *not* used as a fallback if data is not provided.
+In this example, we don't provide a value for 'username', and the form raises a
+validation error rather than using the initial value for 'username'.
+>>> p = UserRegistration({'password': 'secret'}, initial={'username': 'django'})
+>>> p.errors
+{'username': [u'This field is required.']}
+>>> p.is_valid()
+False
+
+If a Form defines 'initial' *and* 'initial' is passed as a parameter to Form(),
+then the latter will get precedence.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, initial='django')
+... password = CharField(widget=PasswordInput)
+>>> p = UserRegistration(initial={'username': 'babik'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="babik" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+
+# Callable initial data ########################################################
+
+The previous technique dealt with raw values as initial data, but it's also
+possible to specify callable data.
+
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10)
+... password = CharField(widget=PasswordInput)
+
+We need to define functions that get called later.
+>>> def initial_django():
+... return 'django'
+>>> def initial_stephane():
+... return 'stephane'
+
+Here, we're not submitting any data, so the initial value will be displayed.
+>>> p = UserRegistration(initial={'username': initial_django}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+
+The 'initial' parameter is meaningless if you pass data.
+>>> p = UserRegistration({}, initial={'username': initial_django}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u''}, initial={'username': initial_django}, auto_id=False)
+>>> print p.as_ul()
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration({'username': u'foo'}, initial={'username': initial_django}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+
+A callable 'initial' value is *not* used as a fallback if data is not provided.
+In this example, we don't provide a value for 'username', and the form raises a
+validation error rather than using the initial value for 'username'.
+>>> p = UserRegistration({'password': 'secret'}, initial={'username': initial_django})
+>>> p.errors
+{'username': [u'This field is required.']}
+>>> p.is_valid()
+False
+
+If a Form defines 'initial' *and* 'initial' is passed as a parameter to Form(),
+then the latter will get precedence.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, initial=initial_django)
+... password = CharField(widget=PasswordInput)
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+>>> p = UserRegistration(initial={'username': initial_stephane}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li>
+<li>Password: <input type="password" name="password" /></li>
+
+# Help text ###################################################################
+
+You can specify descriptive text for a field by using the 'help_text' argument
+to a Field class. This help text is displayed when a Form is rendered.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, help_text='e.g., user@example.com')
+... password = CharField(widget=PasswordInput, help_text='Choose wisely.')
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li>
+<li>Password: <input type="password" name="password" /> Choose wisely.</li>
+>>> print p.as_p()
+<p>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</p>
+<p>Password: <input type="password" name="password" /> Choose wisely.</p>
+>>> print p.as_table()
+<tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /><br />e.g., user@example.com</td></tr>
+<tr><th>Password:</th><td><input type="password" name="password" /><br />Choose wisely.</td></tr>
+
+The help text is displayed whether or not data is provided for the form.
+>>> p = UserRegistration({'username': u'foo'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /> e.g., user@example.com</li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> Choose wisely.</li>
+
+help_text is not displayed for hidden fields. It can be used for documentation
+purposes, though.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, help_text='e.g., user@example.com')
+... password = CharField(widget=PasswordInput)
+... next = CharField(widget=HiddenInput, initial='/', help_text='Redirect destination')
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" maxlength="10" /> e.g., user@example.com</li>
+<li>Password: <input type="password" name="password" /><input type="hidden" name="next" value="/" /></li>
+
+Help text can include arbitrary Unicode characters.
+>>> class UserRegistration(Form):
+... username = CharField(max_length=10, help_text='Å ÄĆŽćžšđ')
+>>> p = UserRegistration(auto_id=False)
+>>> p.as_ul()
+u'<li>Username: <input type="text" name="username" maxlength="10" /> \u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111</li>'
+
+# Subclassing forms ###########################################################
+
+You can subclass a Form to add fields. The resulting form subclass will have
+all of the fields of the parent Form, plus whichever fields you define in the
+subclass.
+>>> class Person(Form):
+... first_name = CharField()
+... last_name = CharField()
+... birthday = DateField()
+>>> class Musician(Person):
+... instrument = CharField()
+>>> p = Person(auto_id=False)
+>>> print p.as_ul()
+<li>First name: <input type="text" name="first_name" /></li>
+<li>Last name: <input type="text" name="last_name" /></li>
+<li>Birthday: <input type="text" name="birthday" /></li>
+>>> m = Musician(auto_id=False)
+>>> print m.as_ul()
+<li>First name: <input type="text" name="first_name" /></li>
+<li>Last name: <input type="text" name="last_name" /></li>
+<li>Birthday: <input type="text" name="birthday" /></li>
+<li>Instrument: <input type="text" name="instrument" /></li>
+
+Yes, you can subclass multiple forms. The fields are added in the order in
+which the parent classes are listed.
+>>> class Person(Form):
+... first_name = CharField()
+... last_name = CharField()
+... birthday = DateField()
+>>> class Instrument(Form):
+... instrument = CharField()
+>>> class Beatle(Person, Instrument):
+... haircut_type = CharField()
+>>> b = Beatle(auto_id=False)
+>>> print b.as_ul()
+<li>First name: <input type="text" name="first_name" /></li>
+<li>Last name: <input type="text" name="last_name" /></li>
+<li>Birthday: <input type="text" name="birthday" /></li>
+<li>Instrument: <input type="text" name="instrument" /></li>
+<li>Haircut type: <input type="text" name="haircut_type" /></li>
+
# Forms with prefixes #########################################################
Sometimes it's necessary to have multiple forms display on the same HTML page,
@@ -2189,7 +3085,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
@@ -2233,12 +3129,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
@@ -2264,9 +3160,60 @@ 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 ################################################
+
+NullBooleanField is a bit of a special case because its presentation (widget)
+is different than its data. This is handled transparently, though.
+
+>>> class Person(Form):
+... name = CharField()
+... is_cool = NullBooleanField()
+>>> p = Person({'name': u'Joe'}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1" selected="selected">Unknown</option>
+<option value="2">Yes</option>
+<option value="3">No</option>
+</select>
+>>> p = Person({'name': u'Joe', 'is_cool': u'1'}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1" selected="selected">Unknown</option>
+<option value="2">Yes</option>
+<option value="3">No</option>
+</select>
+>>> p = Person({'name': u'Joe', 'is_cool': u'2'}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2" selected="selected">Yes</option>
+<option value="3">No</option>
+</select>
+>>> p = Person({'name': u'Joe', 'is_cool': u'3'}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2">Yes</option>
+<option value="3" selected="selected">No</option>
+</select>
+>>> p = Person({'name': u'Joe', 'is_cool': True}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2" selected="selected">Yes</option>
+<option value="3">No</option>
+</select>
+>>> p = Person({'name': u'Joe', 'is_cool': False}, auto_id=False)
+>>> print p['is_cool']
+<select name="is_cool">
+<option value="1">Unknown</option>
+<option value="2">Yes</option>
+<option value="3" selected="selected">No</option>
+</select>
+
# Basic form processing in a view #############################################
>>> from django.template import Template, Context
@@ -2275,16 +3222,16 @@ True
... 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}))
@@ -2318,13 +3265,13 @@ VALID: {'username': u'adrian', 'password1': u'secret', 'password2': u'secret'}
# Some ideas for using templates with forms ###################################
>>> class UserRegistration(Form):
-... username = CharField(max_length=10)
+... username = CharField(max_length=10, help_text="Good luck picking a username that doesn't already exist.")
... 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
@@ -2395,6 +3342,33 @@ field an "id" attribute.
<input type="submit" />
</form>
+User form.[field].help_text to output a field's help text. If the given field
+does not have help text, nothing will be output.
+>>> t = Template('''<form action="">
+... <p>{{ form.username.label_tag }}: {{ form.username }}<br />{{ form.username.help_text }}</p>
+... <p>{{ form.password1.label_tag }}: {{ form.password1 }}</p>
+... <p>{{ form.password2.label_tag }}: {{ form.password2 }}</p>
+... <input type="submit" />
+... </form>''')
+>>> print t.render(Context({'form': UserRegistration(auto_id=False)}))
+<form action="">
+<p>Username: <input type="text" name="username" maxlength="10" /><br />Good luck picking a username that doesn't already exist.</p>
+<p>Password1: <input type="password" name="password1" /></p>
+<p>Password2: <input type="password" name="password2" /></p>
+<input type="submit" />
+</form>
+>>> Template('{{ form.password1.help_text }}').render(Context({'form': UserRegistration(auto_id=False)}))
+''
+
+The label_tag() method takes an optional attrs argument: a dictionary of HTML
+attributes to add to the <label> tag.
+>>> f = UserRegistration(auto_id='id_%s')
+>>> for bf in f:
+... print bf.label_tag(attrs={'class': 'pretty'})
+<label for="id_username" class="pretty">Username</label>
+<label for="id_password1" class="pretty">Password1</label>
+<label for="id_password2" class="pretty">Password2</label>
+
To display the errors that aren't associated with a particular field -- e.g.,
the errors caused by Form.clean() -- use {{ form.non_field_errors }} in the
template. If used on its own, it is displayed as a <ul> (or an empty string, if
@@ -2428,17 +3402,17 @@ the list of errors is empty). You can also use it in {% if %} statements.
<input type="submit" />
</form>
-#################
-# Extra widgets #
-#################
+###############
+# Extra stuff #
+###############
-The newforms library comes with some extra, higher-level Widget classes that
-demonstrate some of the library's abilities.
+The newforms library comes with some extra, higher-level Field and Widget
+classes that demonstrate some of the library's abilities.
# SelectDateWidget ############################################################
>>> from django.newforms.extras import SelectDateWidget
->>> w = SelectDateWidget()
+>>> w = SelectDateWidget(years=('2007','2008','2009','2010','2011','2012','2013','2014','2015','2016'))
>>> print w.render('mydate', '')
<select name="mydate_month">
<option value="1">January</option>
@@ -2488,7 +3462,6 @@ demonstrate some of the library's abilities.
<option value="31">31</option>
</select>
<select name="mydate_year">
-<option value="2006">2006</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
@@ -2498,6 +3471,7 @@ demonstrate some of the library's abilities.
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
+<option value="2016">2016</option>
</select>
>>> w.render('mydate', None) == w.render('mydate', '')
True
@@ -2550,7 +3524,6 @@ True
<option value="31">31</option>
</select>
<select name="mydate_year">
-<option value="2006">2006</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
@@ -2560,10 +3533,155 @@ True
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
+<option value="2016">2016</option>
+</select>
+
+# MultiWidget and MultiValueField #############################################
+# MultiWidgets are widgets composed of other widgets. They are usually
+# combined with MultiValueFields - a field that is composed of other fields.
+# MulitWidgets can themselved be composed of other MultiWidgets.
+# SplitDateTimeWidget is one example of a MultiWidget.
+
+>>> class ComplexMultiWidget(MultiWidget):
+... def __init__(self, attrs=None):
+... widgets = (
+... TextInput(),
+... SelectMultiple(choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))),
+... SplitDateTimeWidget(),
+... )
+... super(ComplexMultiWidget, self).__init__(widgets, attrs)
+...
+... def decompress(self, value):
+... if value:
+... data = value.split(',')
+... return [data[0], data[1], datetime.datetime(*time.strptime(data[2], "%Y-%m-%d %H:%M:%S")[0:6])]
+... return [None, None, None]
+... def format_output(self, rendered_widgets):
+... return u'\n'.join(rendered_widgets)
+>>> w = ComplexMultiWidget()
+>>> print w.render('name', 'some text,JP,2007-04-25 06:24:00')
+<input type="text" name="name_0" value="some text" />
+<select multiple="multiple" name="name_1">
+<option value="J" selected="selected">John</option>
+<option value="P" selected="selected">Paul</option>
+<option value="G">George</option>
+<option value="R">Ringo</option>
+</select>
+<input type="text" name="name_2_0" value="2007-04-25" /><input type="text" name="name_2_1" value="06:24:00" />
+
+>>> class ComplexField(MultiValueField):
+... def __init__(self, required=True, widget=None, label=None, initial=None):
+... fields = (
+... CharField(),
+... MultipleChoiceField(choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))),
+... SplitDateTimeField()
+... )
+... super(ComplexField, self).__init__(fields, required, widget, label, initial)
+...
+... def compress(self, data_list):
+... if data_list:
+... return '%s,%s,%s' % (data_list[0],''.join(data_list[1]),data_list[2])
+... return None
+
+>>> f = ComplexField(widget=w)
+>>> f.clean(['some text', ['J','P'], ['2007-04-25','6:24:00']])
+u'some text,JP,2007-04-25 06:24:00'
+>>> f.clean(['some text',['X'], ['2007-04-25','6:24:00']])
+Traceback (most recent call last):
+...
+ValidationError: [u'Select a valid choice. X is not one of the available choices.']
+
+# If insufficient data is provided, None is substituted
+>>> f.clean(['some text',['JP']])
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> class ComplexFieldForm(Form):
+... field1 = ComplexField(widget=w)
+>>> f = ComplexFieldForm()
+>>> print f
+<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" id="id_field1_0" />
+<select multiple="multiple" name="field1_1" id="id_field1_1">
+<option value="J">John</option>
+<option value="P">Paul</option>
+<option value="G">George</option>
+<option value="R">Ringo</option>
+</select>
+<input type="text" name="field1_2_0" id="id_field1_2_0" /><input type="text" name="field1_2_1" id="id_field1_2_1" /></td></tr>
+
+>>> f = ComplexFieldForm({'field1_0':'some text','field1_1':['J','P'], 'field1_2_0':'2007-04-25', 'field1_2_1':'06:24:00'})
+>>> print f
+<tr><th><label for="id_field1_0">Field1:</label></th><td><input type="text" name="field1_0" value="some text" id="id_field1_0" />
+<select multiple="multiple" name="field1_1" id="id_field1_1">
+<option value="J" selected="selected">John</option>
+<option value="P" selected="selected">Paul</option>
+<option value="G">George</option>
+<option value="R">Ringo</option>
</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.cleaned_data
+{'field1': u'some text,JP,2007-04-25 06:24:00'}
+
+#################################
+# Tests of underlying functions #
+#################################
+
+# smart_unicode tests
+>>> from django.utils.encoding import smart_unicode
+>>> class Test:
+... def __str__(self):
+... return 'Å ÄĆŽćžšđ'
+>>> class TestU:
+... def __str__(self):
+... return 'Foo'
+... def __unicode__(self):
+... return u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
+>>> smart_unicode(Test())
+u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
+>>> smart_unicode(TestU())
+u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
+>>> smart_unicode(1)
+u'1'
+>>> smart_unicode('foo')
+u'foo'
+
+# flatatt tests
+>>> from django.newforms.util import flatatt
+>>> flatatt({'id': "header"})
+u' id="header"'
+>>> flatatt({'class': "news", 'title': "Read this"})
+u' class="news" title="Read this"'
+>>> flatatt({})
+u''
+####################################
+# Test accessing errors in clean() #
+####################################
+
+>>> class UserForm(Form):
+... username = CharField(max_length=10)
+... password = CharField(widget=PasswordInput)
+... def clean(self):
+... data = self.cleaned_data
+... if not self.errors:
+... data['username'] = data['username'].lower()
+... return data
+
+>>> f = UserForm({'username': 'SirRobin', 'password': 'blue'})
+>>> f.is_valid()
+True
+>>> f.cleaned_data['username']
+u'sirrobin'
"""
+__test__ = {
+ 'form_tests': form_tests,
+ 'localflavor': localflavor_tests,
+ 'regressions': regression_tests,
+}
+
if __name__ == "__main__":
import doctest
doctest.testmod()
diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py
index 385c3048d9..e7245104e9 100644
--- a/tests/regressiontests/httpwrappers/tests.py
+++ b/tests/regressiontests/httpwrappers/tests.py
@@ -34,6 +34,9 @@ AttributeError: This QueryDict instance is immutable
>>> q.has_key('foo')
False
+>>> 'foo' in q
+False
+
>>> q.items()
[]
@@ -93,6 +96,12 @@ MultiValueDictKeyError: "Key 'foo' not found in <MultiValueDict: {}>"
>>> q['name']
'john'
+>>> del q['name']
+>>> 'name' in q
+False
+
+>>> q['name'] = 'john'
+
>>> q.get('foo', 'default')
'default'
@@ -124,6 +133,9 @@ MultiValueDictKeyError: "Key 'foo' not found in <MultiValueDict: {}>"
>>> q.has_key('foo')
True
+>>> 'foo' in q
+True
+
>>> q.items()
[('foo', 'another'), ('name', 'john')]
@@ -154,6 +166,9 @@ True
>>> q.pop('foo')
['bar', 'baz', 'another', 'hello']
+>>> q.pop('foo', 'not there')
+'not there'
+
>>> q.get('foo', 'not there')
'not there'
@@ -218,9 +233,15 @@ AttributeError: This QueryDict instance is immutable
>>> q.has_key('foo')
True
+>>> 'foo' in q
+True
+
>>> q.has_key('bar')
False
+>>> 'bar' in q
+False
+
>>> q.items()
[('foo', 'bar')]
@@ -303,9 +324,15 @@ AttributeError: This QueryDict instance is immutable
>>> q.has_key('vote')
True
+>>> 'vote' in q
+True
+
>>> q.has_key('foo')
False
+>>> 'foo' in q
+False
+
>>> q.items()
[('vote', 'no')]
@@ -349,6 +376,11 @@ AttributeError: This QueryDict instance is immutable
>>> q.urlencode()
'vote=yes&vote=no'
+>>> del q['vote']
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
"""
from django.http import QueryDict
diff --git a/tests/regressiontests/humanize/__init__.py b/tests/regressiontests/humanize/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/humanize/__init__.py
diff --git a/tests/regressiontests/humanize/models.py b/tests/regressiontests/humanize/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/humanize/models.py
diff --git a/tests/regressiontests/humanize/tests.py b/tests/regressiontests/humanize/tests.py
new file mode 100644
index 0000000000..eca65f7575
--- /dev/null
+++ b/tests/regressiontests/humanize/tests.py
@@ -0,0 +1,54 @@
+import unittest
+from django.template import Template, Context, add_to_builtins
+
+add_to_builtins('django.contrib.humanize.templatetags.humanize')
+
+class HumanizeTests(unittest.TestCase):
+
+ def humanize_tester(self, test_list, result_list, method):
+ # Using max below ensures we go through both lists
+ # However, if the lists are not equal length, this raises an exception
+ for index in xrange(len(max(test_list,result_list))):
+ test_content = test_list[index]
+ t = Template('{{ test_content|%s }}' % method)
+ rendered = t.render(Context(locals())).strip()
+ self.assertEqual(rendered, result_list[index],
+ msg="""%s test failed, produced %s,
+should've produced %s""" % (method, rendered, result_list[index]))
+
+ def test_ordinal(self):
+ test_list = ('1','2','3','4','11','12',
+ '13','101','102','103','111',
+ 'something else')
+ result_list = ('1st', '2nd', '3rd', '4th', '11th',
+ '12th', '13th', '101st', '102nd', '103rd',
+ '111th', 'something else')
+
+ self.humanize_tester(test_list, result_list, 'ordinal')
+
+ def test_intcomma(self):
+ test_list = (100, 1000, 10123, 10311, 1000000, 1234567.25,
+ '100', '1000', '10123', '10311', '1000000', '1234567.1234567')
+ result_list = ('100', '1,000', '10,123', '10,311', '1,000,000', '1,234,567.25',
+ '100', '1,000', '10,123', '10,311', '1,000,000', '1,234,567.1234567')
+
+ self.humanize_tester(test_list, result_list, 'intcomma')
+
+ def test_intword(self):
+ test_list = ('100', '1000000', '1200000', '1290000',
+ '1000000000','2000000000','6000000000000')
+ result_list = ('100', '1.0 million', '1.2 million', '1.3 million',
+ '1.0 billion', '2.0 billion', '6.0 trillion')
+
+ self.humanize_tester(test_list, result_list, 'intword')
+
+ def test_apnumber(self):
+ test_list = [str(x) for x in xrange(1,11)]
+ result_list = ('one', 'two', 'three', 'four', 'five', 'six',
+ 'seven', 'eight', 'nine', '10')
+
+ self.humanize_tester(test_list, result_list, 'apnumber')
+
+if __name__ == '__main__':
+ unittest.main()
+
diff --git a/tests/regressiontests/invalid_admin_options/__init__.py b/tests/regressiontests/invalid_admin_options/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/invalid_admin_options/__init__.py
diff --git a/tests/regressiontests/invalid_admin_options/models.py b/tests/regressiontests/invalid_admin_options/models.py
new file mode 100644
index 0000000000..43bcc533ba
--- /dev/null
+++ b/tests/regressiontests/invalid_admin_options/models.py
@@ -0,0 +1,337 @@
+"""
+Admin options
+
+Test invalid and valid admin options to make sure that
+model validation is working properly.
+"""
+
+from django.db import models
+model_errors = ""
+
+# TODO: Invalid admin options should not cause a metaclass error
+##This should fail gracefully but is causing a metaclass error
+#class BadAdminOption(models.Model):
+# "Test nonexistent admin option"
+# name = models.CharField(maxlength=30)
+#
+# class Admin:
+# nonexistent = 'option'
+#
+#model_errors += """invalid_admin_options.badadminoption: "admin" attribute, if given, must be set to a models.AdminOptions() instance.
+#"""
+
+class ListDisplayBadOne(models.Model):
+ "Test list_display, list_display must be a list or tuple"
+ first_name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_display = 'first_name'
+
+model_errors += """invalid_admin_options.listdisplaybadone: "admin.list_display", if given, must be set to a list or tuple.
+"""
+
+class ListDisplayBadTwo(models.Model):
+ "Test list_display, list_display items must be attributes, methods or properties."
+ first_name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_display = ['first_name','nonexistent']
+
+model_errors += """invalid_admin_options.listdisplaybadtwo: "admin.list_display" refers to 'nonexistent', which isn't an attribute, method or property.
+"""
+class ListDisplayBadThree(models.Model):
+ "Test list_display, list_display items can not be a ManyToManyField."
+ first_name = models.CharField(maxlength=30)
+ nick_names = models.ManyToManyField('ListDisplayGood')
+
+ class Admin:
+ list_display = ['first_name','nick_names']
+
+model_errors += """invalid_admin_options.listdisplaybadthree: "admin.list_display" doesn't support ManyToManyFields ('nick_names').
+"""
+
+class ListDisplayGood(models.Model):
+ "Test list_display, Admin list_display can be a attribute, method or property."
+ first_name = models.CharField(maxlength=30)
+
+ def _last_name(self):
+ return self.first_name
+ last_name = property(_last_name)
+
+ def full_name(self):
+ return "%s %s" % (self.first_name, self.last_name)
+
+ class Admin:
+ list_display = ['first_name','last_name','full_name']
+
+class ListDisplayLinksBadOne(models.Model):
+ "Test list_display_links, item must be included in list_display."
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_display = ['last_name']
+ list_display_links = ['first_name']
+
+model_errors += """invalid_admin_options.listdisplaylinksbadone: "admin.list_display_links" refers to 'first_name', which is not defined in "admin.list_display".
+"""
+
+class ListDisplayLinksBadTwo(models.Model):
+ "Test list_display_links, must be a list or tuple."
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_display = ['first_name','last_name']
+ list_display_links = 'last_name'
+
+model_errors += """invalid_admin_options.listdisplaylinksbadtwo: "admin.list_display_links", if given, must be set to a list or tuple.
+"""
+
+# TODO: Fix list_display_links validation or remove the check for list_display
+## This is failing but the validation which should fail is not.
+#class ListDisplayLinksBadThree(models.Model):
+# "Test list_display_links, must define list_display to use list_display_links."
+# first_name = models.CharField(maxlength=30)
+# last_name = models.CharField(maxlength=30)
+#
+# class Admin:
+# list_display_links = ('first_name',)
+#
+#model_errors += """invalid_admin_options.listdisplaylinksbadthree: "admin.list_display" must be defined for "admin.list_display_links" to be used.
+#"""
+
+class ListDisplayLinksGood(models.Model):
+ "Test list_display_links, Admin list_display_list can be a attribute, method or property."
+ first_name = models.CharField(maxlength=30)
+
+ def _last_name(self):
+ return self.first_name
+ last_name = property(_last_name)
+
+ def full_name(self):
+ return "%s %s" % (self.first_name, self.last_name)
+
+ class Admin:
+ list_display = ['first_name','last_name','full_name']
+ list_display_links = ['first_name','last_name','full_name']
+
+class ListFilterBadOne(models.Model):
+ "Test list_filter, must be a list or tuple."
+ first_name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_filter = 'first_name'
+
+model_errors += """invalid_admin_options.listfilterbadone: "admin.list_filter", if given, must be set to a list or tuple.
+"""
+
+class ListFilterBadTwo(models.Model):
+ "Test list_filter, must be a field not a property or method."
+ first_name = models.CharField(maxlength=30)
+
+ def _last_name(self):
+ return self.first_name
+ last_name = property(_last_name)
+
+ def full_name(self):
+ return "%s %s" % (self.first_name, self.last_name)
+
+ class Admin:
+ list_filter = ['first_name','last_name','full_name']
+
+model_errors += """invalid_admin_options.listfilterbadtwo: "admin.list_filter" refers to 'last_name', which isn't a field.
+invalid_admin_options.listfilterbadtwo: "admin.list_filter" refers to 'full_name', which isn't a field.
+"""
+
+class DateHierarchyBadOne(models.Model):
+ "Test date_hierarchy, must be a date or datetime field."
+ first_name = models.CharField(maxlength=30)
+ birth_day = models.DateField()
+
+ class Admin:
+ date_hierarchy = 'first_name'
+
+# TODO: Date Hierarchy needs to check if field is a date/datetime field.
+#model_errors += """invalid_admin_options.datehierarchybadone: "admin.date_hierarchy" refers to 'first_name', which isn't a date field or datetime field.
+#"""
+
+class DateHierarchyBadTwo(models.Model):
+ "Test date_hieracrhy, must be a field."
+ first_name = models.CharField(maxlength=30)
+ birth_day = models.DateField()
+
+ class Admin:
+ date_hierarchy = 'nonexistent'
+
+model_errors += """invalid_admin_options.datehierarchybadtwo: "admin.date_hierarchy" refers to 'nonexistent', which isn't a field.
+"""
+
+class DateHierarchyGood(models.Model):
+ "Test date_hieracrhy, must be a field."
+ first_name = models.CharField(maxlength=30)
+ birth_day = models.DateField()
+
+ class Admin:
+ date_hierarchy = 'birth_day'
+
+class SearchFieldsBadOne(models.Model):
+ "Test search_fields, must be a list or tuple."
+ first_name = models.CharField(maxlength=30)
+
+ class Admin:
+ search_fields = ('nonexistent')
+
+# TODO: Add search_fields validation
+#model_errors += """invalid_admin_options.seacrhfieldsbadone: "admin.search_fields", if given, must be set to a list or tuple.
+#"""
+
+class SearchFieldsBadTwo(models.Model):
+ "Test search_fields, must be a field."
+ first_name = models.CharField(maxlength=30)
+
+ def _last_name(self):
+ return self.first_name
+ last_name = property(_last_name)
+
+ class Admin:
+ search_fields = ['first_name','last_name']
+
+# TODO: Add search_fields validation
+#model_errors += """invalid_admin_options.seacrhfieldsbadone: "admin.search_fields" refers to 'last_name', which isn't a field.
+#"""
+
+class SearchFieldsGood(models.Model):
+ "Test search_fields, must be a list or tuple."
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ search_fields = ['first_name','last_name']
+
+
+class JsBadOne(models.Model):
+ "Test js, must be a list or tuple"
+ name = models.CharField(maxlength=30)
+
+ class Admin:
+ js = 'test.js'
+
+# TODO: Add a js validator
+#model_errors += """invalid_admin_options.jsbadone: "admin.js", if given, must be set to a list or tuple.
+#"""
+
+class SaveAsBad(models.Model):
+ "Test save_as, should be True or False"
+ name = models.CharField(maxlength=30)
+
+ class Admin:
+ save_as = 'not True or False'
+
+# TODO: Add a save_as validator.
+#model_errors += """invalid_admin_options.saveasbad: "admin.save_as", if given, must be set to True or False.
+#"""
+
+class SaveOnTopBad(models.Model):
+ "Test save_on_top, should be True or False"
+ name = models.CharField(maxlength=30)
+
+ class Admin:
+ save_on_top = 'not True or False'
+
+# TODO: Add a save_on_top validator.
+#model_errors += """invalid_admin_options.saveontopbad: "admin.save_on_top", if given, must be set to True or False.
+#"""
+
+class ListSelectRelatedBad(models.Model):
+ "Test list_select_related, should be True or False"
+ name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_select_related = 'not True or False'
+
+# TODO: Add a list_select_related validator.
+#model_errors += """invalid_admin_options.listselectrelatebad: "admin.list_select_related", if given, must be set to True or False.
+#"""
+
+class ListPerPageBad(models.Model):
+ "Test list_per_page, should be a positive integer value."
+ name = models.CharField(maxlength=30)
+
+ class Admin:
+ list_per_page = 89.3
+
+# TODO: Add a list_per_page validator.
+#model_errors += """invalid_admin_options.listperpagebad: "admin.list_per_page", if given, must be a positive integer.
+#"""
+
+class FieldsBadOne(models.Model):
+ "Test fields, should be a tuple"
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ fields = 'not a tuple'
+
+# TODO: Add a fields validator.
+#model_errors += """invalid_admin_options.fieldsbadone: "admin.fields", if given, must be a tuple.
+#"""
+
+class FieldsBadTwo(models.Model):
+ """Test fields, 'fields' dict option is required."""
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ fields = ('Name', {'description': 'this fieldset needs fields'})
+
+# TODO: Add a fields validator.
+#model_errors += """invalid_admin_options.fieldsbadtwo: "admin.fields" each fieldset must include a 'fields' dict.
+#"""
+
+class FieldsBadThree(models.Model):
+ """Test fields, 'classes' and 'description' are the only allowable extra dict options."""
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ fields = ('Name', {'fields': ('first_name','last_name'),'badoption': 'verybadoption'})
+
+# TODO: Add a fields validator.
+#model_errors += """invalid_admin_options.fieldsbadthree: "admin.fields" fieldset options must be either 'classes' or 'description'.
+#"""
+
+class FieldsGood(models.Model):
+ "Test fields, working example"
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+ birth_day = models.DateField()
+
+ class Admin:
+ fields = (
+ ('Name', {'fields': ('first_name','last_name'),'classes': 'collapse'}),
+ (None, {'fields': ('birth_day',),'description': 'enter your b-day'})
+ )
+
+class OrderingBad(models.Model):
+ "Test ordering, must be a field."
+ first_name = models.CharField(maxlength=30)
+ last_name = models.CharField(maxlength=30)
+
+ class Admin:
+ ordering = 'nonexistent'
+
+# TODO: Add a ordering validator.
+#model_errors += """invalid_admin_options.orderingbad: "admin.ordering" refers to 'nonexistent', which isn't a field.
+#"""
+
+## TODO: Add a manager validator, this should fail gracefully.
+#class ManagerBad(models.Model):
+# "Test manager, must be a manager object."
+# first_name = models.CharField(maxlength=30)
+#
+# class Admin:
+# manager = 'nonexistent'
+#
+#model_errors += """invalid_admin_options.managerbad: "admin.manager" refers to 'nonexistent', which isn't a Manager().
+#""" \ No newline at end of file
diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py
index 6c067446b1..8ddec98da4 100644
--- a/tests/regressiontests/many_to_one_regress/models.py
+++ b/tests/regressiontests/many_to_one_regress/models.py
@@ -1,13 +1,34 @@
from django.db import models
+# If ticket #1578 ever slips back in, these models will not be able to be
+# created (the field names being lower-cased versions of their opposite
+# classes is important here).
+
class First(models.Model):
second = models.IntegerField()
class Second(models.Model):
first = models.ForeignKey(First, related_name = 'the_first')
-# If ticket #1578 ever slips back in, these models will not be able to be
-# created (the field names being lower-cased versions of their opposite
-# classes is important here).
+# Protect against repetition of #1839, #2415 and #2536.
+class Third(models.Model):
+ name = models.CharField(maxlength=20)
+ third = models.ForeignKey('self', null=True, related_name='child_set')
+
+class Parent(models.Model):
+ name = models.CharField(maxlength=20)
+ bestchild = models.ForeignKey('Child', null=True, related_name='favored_by')
+
+class Child(models.Model):
+ name = models.CharField(maxlength=20)
+ parent = models.ForeignKey(Parent)
+
-__test__ = {'API_TESTS':""}
+__test__ = {'API_TESTS':"""
+>>> Third.AddManipulator().save(dict(id='3', name='An example', another=None))
+<Third: Third object>
+>>> parent = Parent(name = 'fred')
+>>> parent.save()
+>>> Child.AddManipulator().save(dict(name='bam-bam', parent=parent.id))
+<Child: Child object>
+"""}
diff --git a/tests/regressiontests/null_queries/models.py b/tests/regressiontests/null_queries/models.py
index 09024f18c2..21944d9e7a 100644
--- a/tests/regressiontests/null_queries/models.py
+++ b/tests/regressiontests/null_queries/models.py
@@ -32,7 +32,7 @@ __test__ = {'API_TESTS':"""
>>> Choice.objects.filter(foo__exact=None)
Traceback (most recent call last):
...
-TypeError: Cannot resolve keyword 'foo' into field
+TypeError: Cannot resolve keyword 'foo' into field. Choices are: id, poll, choice
# Can't use None on anything other than __exact
>>> Choice.objects.filter(id__gt=None)
diff --git a/tests/regressiontests/serializers_regress/__init__.py b/tests/regressiontests/serializers_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/__init__.py
diff --git a/tests/regressiontests/serializers_regress/models.py b/tests/regressiontests/serializers_regress/models.py
new file mode 100644
index 0000000000..b441885f10
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/models.py
@@ -0,0 +1,211 @@
+"""
+A test spanning all the capabilities of all the serializers.
+
+This class sets up a model for each model field type
+(except for image types, because of the PIL dependency).
+"""
+
+from django.db import models
+from django.contrib.contenttypes import generic
+from django.contrib.contenttypes.models import ContentType
+
+# The following classes are for testing basic data
+# marshalling, including NULL values.
+
+class BooleanData(models.Model):
+ data = models.BooleanField(null=True)
+
+class CharData(models.Model):
+ data = models.CharField(maxlength=30, null=True)
+
+class DateData(models.Model):
+ data = models.DateField(null=True)
+
+class DateTimeData(models.Model):
+ data = models.DateTimeField(null=True)
+
+class DecimalData(models.Model):
+ data = models.DecimalField(null=True, decimal_places=3, max_digits=5)
+
+class EmailData(models.Model):
+ data = models.EmailField(null=True)
+
+class FileData(models.Model):
+ data = models.FileField(null=True, upload_to='/foo/bar')
+
+class FilePathData(models.Model):
+ data = models.FilePathField(null=True)
+
+class FloatData(models.Model):
+ data = models.FloatField(null=True)
+
+class IntegerData(models.Model):
+ data = models.IntegerField(null=True)
+
+# class ImageData(models.Model):
+# data = models.ImageField(null=True)
+
+class IPAddressData(models.Model):
+ data = models.IPAddressField(null=True)
+
+class NullBooleanData(models.Model):
+ data = models.NullBooleanField(null=True)
+
+class PhoneData(models.Model):
+ data = models.PhoneNumberField(null=True)
+
+class PositiveIntegerData(models.Model):
+ data = models.PositiveIntegerField(null=True)
+
+class PositiveSmallIntegerData(models.Model):
+ data = models.PositiveSmallIntegerField(null=True)
+
+class SlugData(models.Model):
+ data = models.SlugField(null=True)
+
+class SmallData(models.Model):
+ data = models.SmallIntegerField(null=True)
+
+class TextData(models.Model):
+ data = models.TextField(null=True)
+
+class TimeData(models.Model):
+ data = models.TimeField(null=True)
+
+class USStateData(models.Model):
+ data = models.USStateField(null=True)
+
+class XMLData(models.Model):
+ data = models.XMLField(null=True)
+
+class Tag(models.Model):
+ """A tag on an item."""
+ data = models.SlugField()
+ content_type = models.ForeignKey(ContentType)
+ object_id = models.PositiveIntegerField()
+
+ content_object = generic.GenericForeignKey()
+
+ class Meta:
+ ordering = ["data"]
+
+class GenericData(models.Model):
+ data = models.CharField(maxlength=30)
+
+ tags = generic.GenericRelation(Tag)
+
+# The following test classes are all for validation
+# of related objects; in particular, forward, backward,
+# and self references.
+
+class Anchor(models.Model):
+ """This is a model that can be used as
+ 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)
+
+class M2MData(models.Model):
+ data = models.ManyToManyField(Anchor, null=True)
+
+class O2OData(models.Model):
+ data = models.OneToOneField(Anchor, null=True)
+
+class FKSelfData(models.Model):
+ data = models.ForeignKey('self', null=True)
+
+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')
+
+class FKDataToO2O(models.Model):
+ data = models.ForeignKey(O2OData, null=True)
+
+# The following test classes are for validating the
+# deserialization of objects that use a user-defined
+# field as the primary key.
+# Some of these data types have been commented out
+# because they can't be used as a primary key on one
+# or all database backends.
+
+class BooleanPKData(models.Model):
+ data = models.BooleanField(primary_key=True)
+
+class CharPKData(models.Model):
+ data = models.CharField(maxlength=30, primary_key=True)
+
+# class DatePKData(models.Model):
+# data = models.DateField(primary_key=True)
+
+# class DateTimePKData(models.Model):
+# data = models.DateTimeField(primary_key=True)
+
+class DecimalPKData(models.Model):
+ data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5)
+
+class EmailPKData(models.Model):
+ data = models.EmailField(primary_key=True)
+
+class FilePKData(models.Model):
+ data = models.FileField(primary_key=True, upload_to='/foo/bar')
+
+class FilePathPKData(models.Model):
+ data = models.FilePathField(primary_key=True)
+
+class FloatPKData(models.Model):
+ data = models.FloatField(primary_key=True)
+
+class IntegerPKData(models.Model):
+ data = models.IntegerField(primary_key=True)
+
+# class ImagePKData(models.Model):
+# data = models.ImageField(primary_key=True)
+
+class IPAddressPKData(models.Model):
+ data = models.IPAddressField(primary_key=True)
+
+class NullBooleanPKData(models.Model):
+ data = models.NullBooleanField(primary_key=True)
+
+class PhonePKData(models.Model):
+ data = models.PhoneNumberField(primary_key=True)
+
+class PositiveIntegerPKData(models.Model):
+ data = models.PositiveIntegerField(primary_key=True)
+
+class PositiveSmallIntegerPKData(models.Model):
+ data = models.PositiveSmallIntegerField(primary_key=True)
+
+class SlugPKData(models.Model):
+ data = models.SlugField(primary_key=True)
+
+class SmallPKData(models.Model):
+ data = models.SmallIntegerField(primary_key=True)
+
+# class TextPKData(models.Model):
+# data = models.TextField(primary_key=True)
+
+# class TimePKData(models.Model):
+# data = models.TimeField(primary_key=True)
+
+class USStatePKData(models.Model):
+ data = models.USStateField(primary_key=True)
+
+# class XMLPKData(models.Model):
+# data = models.XMLField(primary_key=True)
+
+class ComplexModel(models.Model):
+ field1 = models.CharField(maxlength=10)
+ field2 = models.CharField(maxlength=10)
+ field3 = models.CharField(maxlength=10)
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
new file mode 100644
index 0000000000..1a144c8356
--- /dev/null
+++ b/tests/regressiontests/serializers_regress/tests.py
@@ -0,0 +1,320 @@
+"""
+A test spanning all the capabilities of all the serializers.
+
+This class defines sample data and a dynamically generated
+test case that is capable of testing the capabilities of
+the serializers. This includes all valid data values, plus
+forward, backwards and self references.
+"""
+
+
+import unittest, datetime
+from cStringIO import StringIO
+
+from django.utils.functional import curry
+from django.core import serializers
+from django.db import transaction
+from django.core import management
+
+from models import *
+try:
+ import decimal
+except ImportError:
+ from django.utils import _decimal as decimal
+
+# A set of functions that can be used to recreate
+# test data objects of various kinds
+def data_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.data = data
+ instance.save()
+ return instance
+
+def generic_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.data = data[0]
+ instance.save()
+ for tag in data[1:]:
+ instance.tags.create(data=tag)
+ return instance
+
+def fk_create(pk, klass, data):
+ instance = klass(id=pk)
+ setattr(instance, 'data_id', data)
+ instance.save()
+ return instance
+
+def m2m_create(pk, klass, data):
+ instance = klass(id=pk)
+ instance.save()
+ instance.data = data
+ return instance
+
+def o2o_create(pk, klass, data):
+ instance = klass()
+ instance.data_id = data
+ instance.save()
+ return instance
+
+def pk_create(pk, klass, data):
+ instance = klass()
+ instance.data = data
+ instance.save()
+ return instance
+
+# A set of functions that can be used to compare
+# test data objects of various kinds
+def data_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, instance.data,
+ "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" % (pk,data, type(data), instance.data, type(instance.data)))
+
+def generic_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data[0], instance.data)
+ testcase.assertEqual(data[1:], [t.data for t in instance.tags.all()])
+
+def fk_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, instance.data_id)
+
+def m2m_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(id=pk)
+ testcase.assertEqual(data, [obj.id for obj in instance.data.all()])
+
+def o2o_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(data=data)
+ testcase.assertEqual(data, instance.data_id)
+
+def pk_compare(testcase, pk, klass, data):
+ instance = klass.objects.get(data=data)
+ testcase.assertEqual(data, instance.data)
+
+# Define some data types. Each data type is
+# actually a pair of functions; one to create
+# and one to compare objects of that type
+data_obj = (data_create, data_compare)
+generic_obj = (generic_create, generic_compare)
+fk_obj = (fk_create, fk_compare)
+m2m_obj = (m2m_create, m2m_compare)
+o2o_obj = (o2o_create, o2o_compare)
+pk_obj = (pk_create, pk_compare)
+
+test_data = [
+ # Format: (data type, PK value, Model Class, data)
+ (data_obj, 1, BooleanData, True),
+ (data_obj, 2, BooleanData, False),
+ (data_obj, 10, CharData, "Test Char Data"),
+ (data_obj, 11, CharData, ""),
+ (data_obj, 12, CharData, "None"),
+ (data_obj, 13, CharData, "null"),
+ (data_obj, 14, CharData, "NULL"),
+ (data_obj, 15, CharData, None),
+ (data_obj, 20, DateData, datetime.date(2006,6,16)),
+ (data_obj, 21, DateData, None),
+ (data_obj, 30, DateTimeData, datetime.datetime(2006,6,16,10,42,37)),
+ (data_obj, 31, DateTimeData, None),
+ (data_obj, 40, EmailData, "hovercraft@example.com"),
+ (data_obj, 41, EmailData, None),
+ (data_obj, 50, FileData, 'file:///foo/bar/whiz.txt'),
+ (data_obj, 51, FileData, None),
+ (data_obj, 60, FilePathData, "/foo/bar/whiz.txt"),
+ (data_obj, 61, FilePathData, None),
+ (data_obj, 70, DecimalData, decimal.Decimal('12.345')),
+ (data_obj, 71, DecimalData, decimal.Decimal('-12.345')),
+ (data_obj, 72, DecimalData, decimal.Decimal('0.0')),
+ (data_obj, 73, DecimalData, None),
+ (data_obj, 74, FloatData, 12.345),
+ (data_obj, 75, FloatData, -12.345),
+ (data_obj, 76, FloatData, 0.0),
+ (data_obj, 77, FloatData, None),
+ (data_obj, 80, IntegerData, 123456789),
+ (data_obj, 81, IntegerData, -123456789),
+ (data_obj, 82, IntegerData, 0),
+ (data_obj, 83, IntegerData, None),
+ #(XX, ImageData
+ (data_obj, 90, IPAddressData, "127.0.0.1"),
+ (data_obj, 91, IPAddressData, None),
+ (data_obj, 100, NullBooleanData, True),
+ (data_obj, 101, NullBooleanData, False),
+ (data_obj, 102, NullBooleanData, None),
+ (data_obj, 110, PhoneData, "212-634-5789"),
+ (data_obj, 111, PhoneData, None),
+ (data_obj, 120, PositiveIntegerData, 123456789),
+ (data_obj, 121, PositiveIntegerData, None),
+ (data_obj, 130, PositiveSmallIntegerData, 12),
+ (data_obj, 131, PositiveSmallIntegerData, None),
+ (data_obj, 140, SlugData, "this-is-a-slug"),
+ (data_obj, 141, SlugData, None),
+ (data_obj, 150, SmallData, 12),
+ (data_obj, 151, SmallData, -12),
+ (data_obj, 152, SmallData, 0),
+ (data_obj, 153, SmallData, None),
+ (data_obj, 160, TextData, """This is a long piece of text.
+It contains line breaks.
+Several of them.
+The end."""),
+ (data_obj, 161, TextData, ""),
+ (data_obj, 162, TextData, None),
+ (data_obj, 170, TimeData, datetime.time(10,42,37)),
+ (data_obj, 171, TimeData, None),
+ (data_obj, 180, USStateData, "MA"),
+ (data_obj, 181, USStateData, None),
+ (data_obj, 190, XMLData, "<foo></foo>"),
+ (data_obj, 191, XMLData, None),
+
+ (generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']),
+ (generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']),
+
+ (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
+ (fk_obj, 402, FKData, None), # Empty reference
+
+ (m2m_obj, 410, M2MData, []), # Empty set
+ (m2m_obj, 411, M2MData, [300,301]), # Post reference
+ (m2m_obj, 412, M2MData, [500,501]), # Pre reference
+ (m2m_obj, 413, M2MData, [300,301,500,501]), # Pre and Post reference
+
+ (o2o_obj, None, O2OData, 300), # Post reference
+ (o2o_obj, None, O2OData, 500), # Pre reference
+
+ (fk_obj, 430, FKSelfData, 431), # Pre reference
+ (fk_obj, 431, FKSelfData, 430), # Post reference
+ (fk_obj, 432, FKSelfData, None), # Empty reference
+
+ (m2m_obj, 440, M2MSelfData, []),
+ (m2m_obj, 441, M2MSelfData, []),
+ (m2m_obj, 442, M2MSelfData, [440, 441]),
+ (m2m_obj, 443, M2MSelfData, [445, 446]),
+ (m2m_obj, 444, M2MSelfData, [440, 441, 445, 446]),
+ (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),
+
+ (fk_obj, 460, FKDataToO2O, 300),
+
+ (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),
+ (pk_obj, 610, CharPKData, "Test Char PKData"),
+# (pk_obj, 620, DatePKData, datetime.date(2006,6,16)),
+# (pk_obj, 630, DateTimePKData, datetime.datetime(2006,6,16,10,42,37)),
+ (pk_obj, 640, EmailPKData, "hovercraft@example.com"),
+ (pk_obj, 650, FilePKData, 'file:///foo/bar/whiz.txt'),
+ (pk_obj, 660, FilePathPKData, "/foo/bar/whiz.txt"),
+ (pk_obj, 670, DecimalPKData, decimal.Decimal('12.345')),
+ (pk_obj, 671, DecimalPKData, decimal.Decimal('-12.345')),
+ (pk_obj, 672, DecimalPKData, decimal.Decimal('0.0')),
+ (pk_obj, 673, FloatPKData, 12.345),
+ (pk_obj, 674, FloatPKData, -12.345),
+ (pk_obj, 675, FloatPKData, 0.0),
+ (pk_obj, 680, IntegerPKData, 123456789),
+ (pk_obj, 681, IntegerPKData, -123456789),
+ (pk_obj, 682, IntegerPKData, 0),
+# (XX, ImagePKData
+ (pk_obj, 690, IPAddressPKData, "127.0.0.1"),
+ (pk_obj, 700, NullBooleanPKData, True),
+ (pk_obj, 701, NullBooleanPKData, False),
+ (pk_obj, 710, PhonePKData, "212-634-5789"),
+ (pk_obj, 720, PositiveIntegerPKData, 123456789),
+ (pk_obj, 730, PositiveSmallIntegerPKData, 12),
+ (pk_obj, 740, SlugPKData, "this-is-a-slug"),
+ (pk_obj, 750, SmallPKData, 12),
+ (pk_obj, 751, SmallPKData, -12),
+ (pk_obj, 752, SmallPKData, 0),
+# (pk_obj, 760, TextPKData, """This is a long piece of text.
+# It contains line breaks.
+# Several of them.
+# The end."""),
+# (pk_obj, 770, TimePKData, datetime.time(10,42,37)),
+ (pk_obj, 780, USStatePKData, "MA"),
+# (pk_obj, 790, XMLPKData, "<foo></foo>"),
+]
+
+# Dynamically create serializer tests to ensure that all
+# registered serializers are automatically tested.
+class SerializerTests(unittest.TestCase):
+ pass
+
+def serializerTest(format, self):
+ # Clear the database first
+ management.flush(verbosity=0, interactive=False)
+
+ # Create all the objects defined in the test data
+ objects = []
+ transaction.enter_transaction_management()
+ transaction.managed(True)
+ for (func, pk, klass, datum) in test_data:
+ objects.append(func[0](pk, klass, datum))
+ transaction.commit()
+ transaction.leave_transaction_management()
+
+ # Add the generic tagged objects to the object list
+ objects.extend(Tag.objects.all())
+
+ # Serialize the test database
+ serialized_data = serializers.serialize(format, objects, indent=2)
+
+ # Flush the database and recreate from the serialized data
+ management.flush(verbosity=0, interactive=False)
+ transaction.enter_transaction_management()
+ transaction.managed(True)
+ for obj in serializers.deserialize(format, serialized_data):
+ obj.save()
+ transaction.commit()
+ transaction.leave_transaction_management()
+
+ # Assert that the deserialized data is the same
+ # as the original source
+ for (func, pk, klass, datum) in test_data:
+ func[1](self, pk, klass, datum)
+
+def fieldsTest(format, self):
+ # Clear the database first
+ management.flush(verbosity=0, interactive=False)
+
+ obj = ComplexModel(field1='first',field2='second',field3='third')
+ obj.save()
+
+ # Serialize then deserialize the test database
+ serialized_data = serializers.serialize(format, [obj], indent=2, fields=('field1','field3'))
+ result = serializers.deserialize(format, serialized_data).next()
+
+ # Check that the deserialized object contains data in only the serialized fields.
+ self.assertEqual(result.object.field1, 'first')
+ self.assertEqual(result.object.field2, '')
+ self.assertEqual(result.object.field3, 'third')
+
+def streamTest(format, self):
+ # Clear the database first
+ management.flush(verbosity=0, interactive=False)
+
+ obj = ComplexModel(field1='first',field2='second',field3='third')
+ obj.save()
+
+ # Serialize the test database to a stream
+ stream = StringIO()
+ serializers.serialize(format, [obj], indent=2, stream=stream)
+
+ # Serialize normally for a comparison
+ string_data = serializers.serialize(format, [obj], indent=2)
+
+ # Check that the two are the same
+ self.assertEqual(string_data, stream.getvalue())
+ stream.close()
+
+for format in serializers.get_serializer_formats():
+ setattr(SerializerTests, 'test_'+format+'_serializer', curry(serializerTest, format))
+ setattr(SerializerTests, 'test_'+format+'_serializer_fields', curry(fieldsTest, format))
+ if format != 'python':
+ setattr(SerializerTests, 'test_'+format+'_serializer_stream', curry(streamTest, format))
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index 0a41f5b5b7..e983a539ae 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -127,61 +127,97 @@ class Templates(unittest.TestCase):
# Fail silently when accessing a non-simple method
'basic-syntax20': ("{{ var.method2 }}", {"var": SomeClass()}, ("","INVALID")),
+ # Don't get confused when parsing something that is almost, but not
+ # quite, a template tag.
+ 'basic-syntax21': ("a {{ moo %} b", {}, "a {{ moo %} b"),
+ 'basic-syntax22': ("{{ moo #}", {}, "{{ moo #}"),
+
+ # Will try to treat "moo #} {{ cow" as the variable. Not ideal, but
+ # costly to work around, so this triggers an error.
+ 'basic-syntax23': ("{{ moo #} {{ cow }}", {"cow": "cow"}, template.TemplateSyntaxError),
+
+ # Embedded newlines make it not-a-tag.
+ 'basic-syntax24': ("{{ moo\n }}", {}, "{{ moo\n }}"),
+
+ # List-index syntax allows a template to access a certain item of a subscriptable object.
+ 'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"),
+
+ # Fail silently when the list index is out of range.
+ 'list-index02': ("{{ var.5 }}", {"var": ["first item", "second item"]}, ("", "INVALID")),
+
+ # Fail silently when the variable is not a subscriptable object.
+ 'list-index03': ("{{ var.1 }}", {"var": None}, ("", "INVALID")),
+
+ # Fail silently when variable is a dict without the specified key.
+ 'list-index04': ("{{ var.1 }}", {"var": {}}, ("", "INVALID")),
+
+ # Dictionary lookup wins out when dict's key is a string.
+ 'list-index05': ("{{ var.1 }}", {"var": {'1': "hello"}}, "hello"),
+
+ # But list-index lookup wins out when dict's key is an int, which
+ # behind the scenes is really a dictionary lookup (for a dict)
+ # after converting the key to an int.
+ 'list-index06': ("{{ var.1 }}", {"var": {1: "hello"}}, "hello"),
+
+ # Dictionary lookup wins out when there is a string and int version of the key.
+ 'list-index07': ("{{ var.1 }}", {"var": {'1': "hello", 1: "world"}}, "hello"),
+
# Basic filter usage
- 'basic-syntax21': ("{{ var|upper }}", {"var": "Django is the greatest!"}, "DJANGO IS THE GREATEST!"),
+ 'filter-syntax01': ("{{ var|upper }}", {"var": "Django is the greatest!"}, "DJANGO IS THE GREATEST!"),
# Chained filters
- 'basic-syntax22': ("{{ var|upper|lower }}", {"var": "Django is the greatest!"}, "django is the greatest!"),
+ 'filter-syntax02': ("{{ var|upper|lower }}", {"var": "Django is the greatest!"}, "django is the greatest!"),
# Raise TemplateSyntaxError for space between a variable and filter pipe
- 'basic-syntax23': ("{{ var |upper }}", {}, template.TemplateSyntaxError),
+ 'filter-syntax03': ("{{ var |upper }}", {}, template.TemplateSyntaxError),
# Raise TemplateSyntaxError for space after a filter pipe
- 'basic-syntax24': ("{{ var| upper }}", {}, template.TemplateSyntaxError),
+ 'filter-syntax04': ("{{ var| upper }}", {}, template.TemplateSyntaxError),
# Raise TemplateSyntaxError for a nonexistent filter
- 'basic-syntax25': ("{{ var|does_not_exist }}", {}, template.TemplateSyntaxError),
+ 'filter-syntax05': ("{{ var|does_not_exist }}", {}, template.TemplateSyntaxError),
# Raise TemplateSyntaxError when trying to access a filter containing an illegal character
- 'basic-syntax26': ("{{ var|fil(ter) }}", {}, template.TemplateSyntaxError),
+ 'filter-syntax06': ("{{ var|fil(ter) }}", {}, template.TemplateSyntaxError),
# Raise TemplateSyntaxError for invalid block tags
- 'basic-syntax27': ("{% nothing_to_see_here %}", {}, template.TemplateSyntaxError),
+ 'filter-syntax07': ("{% nothing_to_see_here %}", {}, template.TemplateSyntaxError),
# Raise TemplateSyntaxError for empty block tags
- 'basic-syntax28': ("{% %}", {}, template.TemplateSyntaxError),
+ 'filter-syntax08': ("{% %}", {}, template.TemplateSyntaxError),
# Chained filters, with an argument to the first one
- 'basic-syntax29': ('{{ var|removetags:"b i"|upper|lower }}', {"var": "<b><i>Yes</i></b>"}, "yes"),
+ 'filter-syntax09': ('{{ var|removetags:"b i"|upper|lower }}', {"var": "<b><i>Yes</i></b>"}, "yes"),
# Escaped string as argument
- 'basic-syntax30': (r'{{ var|default_if_none:" endquote\" hah" }}', {"var": None}, ' endquote" hah'),
+ 'filter-syntax10': (r'{{ var|default_if_none:" endquote\" hah" }}', {"var": None}, ' endquote" hah'),
# Variable as argument
- 'basic-syntax31': (r'{{ var|default_if_none:var2 }}', {"var": None, "var2": "happy"}, 'happy'),
+ 'filter-syntax11': (r'{{ var|default_if_none:var2 }}', {"var": None, "var2": "happy"}, 'happy'),
# Default argument testing
- 'basic-syntax32': (r'{{ var|yesno:"yup,nup,mup" }} {{ var|yesno }}', {"var": True}, 'yup yes'),
+ 'filter-syntax12': (r'{{ var|yesno:"yup,nup,mup" }} {{ var|yesno }}', {"var": True}, 'yup yes'),
- # Fail silently for methods that raise an exception with a "silent_variable_failure" attribute
- 'basic-syntax33': (r'1{{ var.method3 }}2', {"var": SomeClass()}, ("12", "1INVALID2")),
+ # Fail silently for methods that raise an exception with a
+ # "silent_variable_failure" attribute
+ 'filter-syntax13': (r'1{{ var.method3 }}2', {"var": SomeClass()}, ("12", "1INVALID2")),
- # In methods that raise an exception without a "silent_variable_attribute" set to True,
- # the exception propogates
- 'basic-syntax34': (r'1{{ var.method4 }}2', {"var": SomeClass()}, SomeOtherException),
+ # In methods that raise an exception without a
+ # "silent_variable_attribute" set to True, the exception propagates
+ 'filter-syntax14': (r'1{{ var.method4 }}2', {"var": SomeClass()}, SomeOtherException),
# Escaped backslash in argument
- 'basic-syntax35': (r'{{ var|default_if_none:"foo\bar" }}', {"var": None}, r'foo\bar'),
+ 'filter-syntax15': (r'{{ var|default_if_none:"foo\bar" }}', {"var": None}, r'foo\bar'),
# Escaped backslash using known escape char
- 'basic-syntax35': (r'{{ var|default_if_none:"foo\now" }}', {"var": None}, r'foo\now'),
+ 'filter-syntax16': (r'{{ var|default_if_none:"foo\now" }}', {"var": None}, r'foo\now'),
# Empty strings can be passed as arguments to filters
- 'basic-syntax36': (r'{{ var|join:"" }}', {'var': ['a', 'b', 'c']}, 'abc'),
+ 'filter-syntax17': (r'{{ var|join:"" }}', {'var': ['a', 'b', 'c']}, 'abc'),
- # If a variable has a __str__() that returns a Unicode object, the value
- # will be converted to a bytestring.
- 'basic-syntax37': (r'{{ var }}', {'var': UnicodeInStrClass()}, '\xc5\xa0\xc4\x90\xc4\x86\xc5\xbd\xc4\x87\xc5\xbe\xc5\xa1\xc4\x91'),
+ # If a variable has a __str__() that returns a Unicode object, the
+ # value will be converted to a bytestring.
+ 'filter-syntax18': (r'{{ var }}', {'var': UnicodeInStrClass()}, '\xc5\xa0\xc4\x90\xc4\x86\xc5\xbd\xc4\x87\xc5\xbe\xc5\xa1\xc4\x91'),
### COMMENT SYNTAX ########################################################
'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"),
@@ -236,6 +272,7 @@ class Templates(unittest.TestCase):
'filter01': ('{% filter upper %}{% endfilter %}', {}, ''),
'filter02': ('{% filter upper %}django{% endfilter %}', {}, 'DJANGO'),
'filter03': ('{% filter upper|lower %}django{% endfilter %}', {}, 'django'),
+ 'filter04': ('{% filter cut:remove %}djangospam{% endfilter %}', {'remove': 'spam'}, 'django'),
### FIRSTOF TAG ###########################################################
'firstof01': ('{% firstof a b c %}', {'a':0,'b':0,'c':0}, ''),
@@ -252,6 +289,20 @@ class Templates(unittest.TestCase):
'for-tag-vars02': ("{% for val in values %}{{ forloop.counter0 }}{% endfor %}", {"values": [6, 6, 6]}, "012"),
'for-tag-vars03': ("{% for val in values %}{{ forloop.revcounter }}{% endfor %}", {"values": [6, 6, 6]}, "321"),
'for-tag-vars04': ("{% for val in values %}{{ forloop.revcounter0 }}{% endfor %}", {"values": [6, 6, 6]}, "210"),
+ 'for-tag-unpack01': ("{% for key,value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, "one:1/two:2/"),
+ 'for-tag-unpack03': ("{% for key, value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, "one:1/two:2/"),
+ 'for-tag-unpack04': ("{% for key , value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, "one:1/two:2/"),
+ 'for-tag-unpack05': ("{% for key ,value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, "one:1/two:2/"),
+ 'for-tag-unpack06': ("{% for key value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, template.TemplateSyntaxError),
+ 'for-tag-unpack07': ("{% for key,,value in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, template.TemplateSyntaxError),
+ 'for-tag-unpack08': ("{% for key,value, in items %}{{ key }}:{{ value }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, template.TemplateSyntaxError),
+ # Ensure that a single loopvar doesn't truncate the list in val.
+ 'for-tag-unpack09': ("{% for val in items %}{{ val.0 }}:{{ val.1 }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, "one:1/two:2/"),
+ # Otherwise, silently truncate if the length of loopvars differs to the length of each set of items.
+ 'for-tag-unpack10': ("{% for x,y in items %}{{ x }}:{{ y }}/{% endfor %}", {"items": (('one', 1, 'carrot'), ('two', 2, 'orange'))}, "one:1/two:2/"),
+ 'for-tag-unpack11': ("{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}", {"items": (('one', 1), ('two', 2))}, ("one:1,/two:2,/", "one:1,INVALID/two:2,INVALID/")),
+ 'for-tag-unpack12': ("{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}", {"items": (('one', 1, 'carrot'), ('two', 2))}, ("one:1,carrot/two:2,/", "one:1,carrot/two:2,INVALID/")),
+ 'for-tag-unpack13': ("{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}", {"items": (('one', 1, 'carrot'), ('two', 2, 'cheese'))}, ("one:1,carrot/two:2,cheese/", "one:1,carrot/two:2,cheese/")),
### IF TAG ################################################################
'if-tag01': ("{% if foo %}yes{% else %}no{% endif %}", {"foo": True}, "yes"),
@@ -378,6 +429,20 @@ class Templates(unittest.TestCase):
'ifequal-split09': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slash\man"}, "yes"),
'ifequal-split10': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slashman"}, "no"),
+ # NUMERIC RESOLUTION
+ 'ifequal-numeric01': ('{% ifequal x 5 %}yes{% endifequal %}', {'x': '5'}, ''),
+ 'ifequal-numeric02': ('{% ifequal x 5 %}yes{% endifequal %}', {'x': 5}, 'yes'),
+ 'ifequal-numeric03': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5}, ''),
+ 'ifequal-numeric04': ('{% ifequal x 5.2 %}yes{% endifequal %}', {'x': 5.2}, 'yes'),
+ 'ifequal-numeric05': ('{% ifequal x 0.2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
+ 'ifequal-numeric06': ('{% ifequal x .2 %}yes{% endifequal %}', {'x': .2}, 'yes'),
+ 'ifequal-numeric07': ('{% ifequal x 2. %}yes{% endifequal %}', {'x': 2}, ''),
+ 'ifequal-numeric08': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': 5}, ''),
+ 'ifequal-numeric09': ('{% ifequal x "5" %}yes{% endifequal %}', {'x': '5'}, 'yes'),
+ 'ifequal-numeric10': ('{% ifequal x -5 %}yes{% endifequal %}', {'x': -5}, 'yes'),
+ 'ifequal-numeric11': ('{% ifequal x -5.2 %}yes{% endifequal %}', {'x': -5.2}, 'yes'),
+ 'ifequal-numeric12': ('{% ifequal x +5 %}yes{% endifequal %}', {'x': 5}, 'yes'),
+
### IFNOTEQUAL TAG ########################################################
'ifnotequal01': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 2}, "yes"),
'ifnotequal02': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 1}, ""),
@@ -390,6 +455,21 @@ class Templates(unittest.TestCase):
'include03': ('{% include template_name %}', {'template_name': 'basic-syntax02', 'headline': 'Included'}, "Included"),
'include04': ('a{% include "nonexistent" %}b', {}, "ab"),
+ ### NAMED ENDBLOCKS #######################################################
+
+ # Basic test
+ 'namedendblocks01': ("1{% block first %}_{% block second %}2{% endblock second %}_{% endblock first %}3", {}, '1_2_3'),
+
+ # Unbalanced blocks
+ 'namedendblocks02': ("1{% block first %}_{% block second %}2{% endblock first %}_{% endblock second %}3", {}, template.TemplateSyntaxError),
+ 'namedendblocks03': ("1{% block first %}_{% block second %}2{% endblock %}_{% endblock second %}3", {}, template.TemplateSyntaxError),
+ 'namedendblocks04': ("1{% block first %}_{% block second %}2{% endblock second %}_{% endblock third %}3", {}, template.TemplateSyntaxError),
+ 'namedendblocks05': ("1{% block first %}_{% block second %}2{% endblock first %}", {}, template.TemplateSyntaxError),
+
+ # Mixed named and unnamed endblocks
+ 'namedendblocks06': ("1{% block first %}_{% block second %}2{% endblock %}_{% endblock first %}3", {}, '1_2_3'),
+ 'namedendblocks07': ("1{% block first %}_{% block second %}2{% endblock second %}_{% endblock %}3", {}, '1_2_3'),
+
### INHERITANCE ###########################################################
# Standard template with no inheritance
@@ -470,8 +550,8 @@ class Templates(unittest.TestCase):
### I18N ##################################################################
# {% spaceless %} tag
- 'spaceless01': ("{% spaceless %} <b> <i> text </i> </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"),
- 'spaceless02': ("{% spaceless %} <b> \n <i> text </i> \n </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"),
+ 'spaceless01': ("{% spaceless %} <b> <i> text </i> </b> {% endspaceless %}", {}, "<b><i> text </i></b>"),
+ 'spaceless02': ("{% spaceless %} <b> \n <i> text </i> \n </b> {% endspaceless %}", {}, "<b><i> text </i></b>"),
'spaceless03': ("{% spaceless %}<b><i>text</i></b>{% endspaceless %}", {}, "<b><i>text</i></b>"),
# simple translation of a string delimited by '
@@ -520,6 +600,8 @@ class Templates(unittest.TestCase):
'invalidstr03': ('{% for v in var %}({{ v }}){% endfor %}', {}, ''),
'invalidstr04': ('{% if var %}Yes{% else %}No{% endif %}', {}, 'No'),
'invalidstr04': ('{% if var|default:"Foo" %}Yes{% else %}No{% endif %}', {}, 'Yes'),
+ 'invalidstr05': ('{{ var }}', {}, ('', 'INVALID %s', 'var')),
+ 'invalidstr06': ('{{ var.prop }}', {'var': {}}, ('', 'INVALID %s', 'var.prop')),
### MULTILINE #############################################################
@@ -598,6 +680,13 @@ class Templates(unittest.TestCase):
'widthratio09': ('{% widthratio a b %}', {'a':50,'b':100}, template.TemplateSyntaxError),
'widthratio10': ('{% widthratio a b 100.0 %}', {'a':50,'b':100}, template.TemplateSyntaxError),
+ ### WITH TAG ########################################################
+ 'with01': ('{% with dict.key as key %}{{ key }}{% endwith %}', {'dict': {'key':50}}, '50'),
+ 'with02': ('{{ key }}{% with dict.key as key %}{{ key }}-{{ dict.key }}-{{ key }}{% endwith %}{{ key }}', {'dict': {'key':50}}, ('50-50-50', 'INVALID50-50-50INVALID')),
+
+ 'with-error01': ('{% with dict.key xx key %}{{ key }}{% endwith %}', {'dict': {'key':50}}, template.TemplateSyntaxError),
+ 'with-error02': ('{% with dict.key as %}{{ key }}{% endwith %}', {'dict': {'key':50}}, template.TemplateSyntaxError),
+
### NOW TAG ########################################################
# Simple case
'now01' : ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)),
@@ -630,6 +719,18 @@ class Templates(unittest.TestCase):
# Compare to a given parameter
'timeuntil04' : ('{{ a|timeuntil:b }}', {'a':NOW - timedelta(days=1), 'b':NOW - timedelta(days=2)}, '1 day'),
'timeuntil05' : ('{{ a|timeuntil:b }}', {'a':NOW - timedelta(days=2), 'b':NOW - timedelta(days=2, minutes=1)}, '1 minute'),
+
+ ### URL TAG ########################################################
+ # Successes
+ 'url01' : ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'),
+ 'url02' : ('{% url regressiontests.templates.views.client_action client.id, action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+ 'url03' : ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'),
+ 'url04' : ('{% url named-client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
+
+ # Failures
+ 'url-fail01' : ('{% url %}', {}, template.TemplateSyntaxError),
+ 'url-fail02' : ('{% url no_such_view %}', {}, ''),
+ 'url-fail03' : ('{% url regressiontests.templates.views.client no_such_param="value" %}', {}, ''),
}
# Register our custom template loader.
@@ -652,6 +753,7 @@ class Templates(unittest.TestCase):
# Set TEMPLATE_STRING_IF_INVALID to a known string
old_invalid = settings.TEMPLATE_STRING_IF_INVALID
+ expected_invalid_str = 'INVALID'
for name, vals in tests:
install()
@@ -659,6 +761,10 @@ class Templates(unittest.TestCase):
if isinstance(vals[2], tuple):
normal_string_result = vals[2][0]
invalid_string_result = vals[2][1]
+ if '%s' in invalid_string_result:
+ expected_invalid_str = 'INVALID %s'
+ invalid_string_result = invalid_string_result % vals[2][2]
+ template.invalid_var_format_string = True
else:
normal_string_result = vals[2]
invalid_string_result = vals[2]
@@ -669,7 +775,7 @@ class Templates(unittest.TestCase):
activate('en-us')
for invalid_str, result in [('', normal_string_result),
- ('INVALID', invalid_string_result)]:
+ (expected_invalid_str, invalid_string_result)]:
settings.TEMPLATE_STRING_IF_INVALID = invalid_str
try:
output = loader.get_template(name).render(template.Context(vals[1]))
@@ -683,6 +789,10 @@ class Templates(unittest.TestCase):
if 'LANGUAGE_CODE' in vals[1]:
deactivate()
+ if template.invalid_var_format_string:
+ expected_invalid_str = 'INVALID'
+ template.invalid_var_format_string = False
+
loader.template_source_loaders = old_template_loaders
deactivate()
settings.TEMPLATE_DEBUG = old_td
diff --git a/tests/regressiontests/templates/urls.py b/tests/regressiontests/templates/urls.py
new file mode 100644
index 0000000000..eaa9fd5d9f
--- /dev/null
+++ b/tests/regressiontests/templates/urls.py
@@ -0,0 +1,11 @@
+from django.conf.urls.defaults import *
+from regressiontests.templates import views
+
+urlpatterns = patterns('',
+
+ # Test urls for testing reverse lookups
+ (r'^$', views.index),
+ (r'^client/(\d+)/$', views.client),
+ (r'^client/(\d+)/(?P<action>[^/]+)/$', views.client_action),
+ url(r'^named-client/(\d+)/$', views.client, name="named-client"),
+)
diff --git a/tests/regressiontests/templates/views.py b/tests/regressiontests/templates/views.py
new file mode 100644
index 0000000000..b68809944a
--- /dev/null
+++ b/tests/regressiontests/templates/views.py
@@ -0,0 +1,10 @@
+# Fake views for testing url reverse lookup
+
+def index(request):
+ pass
+
+def client(request, id):
+ pass
+
+def client_action(request, id, action):
+ pass
diff --git a/tests/regressiontests/test_client_regress/__init__.py b/tests/regressiontests/test_client_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/test_client_regress/__init__.py
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
new file mode 100644
index 0000000000..40d022a47a
--- /dev/null
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -0,0 +1,164 @@
+"""
+Regression tests for the Test Client, especially the customized assertions.
+
+"""
+from django.test import Client, TestCase
+from django.core import mail
+
+class AssertTemplateUsedTests(TestCase):
+ fixtures = ['testdata.json']
+
+ def test_no_context(self):
+ "Template usage assertions work then templates aren't in use"
+ response = self.client.get('/test_client_regress/no_template_view/')
+
+ # Check that the no template case doesn't mess with the template assertions
+ self.assertTemplateNotUsed(response, 'GET Template')
+
+ try:
+ self.assertTemplateUsed(response, 'GET Template')
+ except AssertionError, e:
+ self.assertEquals(str(e), "No templates used to render the response")
+
+ def test_single_context(self):
+ "Template assertions work when there is a single context"
+ response = self.client.get('/test_client/post_view/', {})
+
+ #
+ try:
+ self.assertTemplateNotUsed(response, 'Empty GET Template')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Template 'Empty GET Template' was used unexpectedly in rendering the response")
+
+ try:
+ self.assertTemplateUsed(response, 'Empty POST Template')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Template 'Empty POST Template' was not used to render the response. Actual template was 'Empty GET Template'")
+
+ def test_multiple_context(self):
+ "Template assertions work when there are multiple contexts"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'foo@example.com',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view_with_template/', post_data)
+ self.assertContains(response, 'POST data OK')
+ try:
+ self.assertTemplateNotUsed(response, "form_view.html")
+ except AssertionError, e:
+ self.assertEquals(str(e), "Template 'form_view.html' was used unexpectedly in rendering the response")
+
+ try:
+ self.assertTemplateNotUsed(response, 'base.html')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Template 'base.html' was used unexpectedly in rendering the response")
+
+ try:
+ 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"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ try:
+ self.assertFormError(response, 'wrong_form', 'some_field', 'Some error.')
+ except AssertionError, e:
+ self.assertEqual(str(e), "The form 'wrong_form' was not used to render the response")
+
+ def test_unknown_field(self):
+ "An assertion is raised if the field name is unknown"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ try:
+ self.assertFormError(response, 'form', 'some_field', 'Some error.')
+ except AssertionError, e:
+ self.assertEqual(str(e), "The form 'form' in context 0 does not contain the field 'some_field'")
+
+ def test_noerror_field(self):
+ "An assertion is raised if the field doesn't have any errors"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ try:
+ self.assertFormError(response, 'form', 'value', 'Some error.')
+ except AssertionError, e:
+ self.assertEqual(str(e), "The field 'value' on form 'form' in context 0 contains no errors")
+
+ def test_unknown_error(self):
+ "An assertion is raised if the field doesn't contain the provided error"
+ post_data = {
+ 'text': 'Hello World',
+ 'email': 'not an email address',
+ 'value': 37,
+ 'single': 'b',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.post('/test_client/form_view/', post_data)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Invalid POST Template")
+
+ try:
+ self.assertFormError(response, 'form', 'email', 'Some error.')
+ except AssertionError, e:
+ self.assertEqual(str(e), "The field 'email' on form 'form' in context 0 does not contain the error 'Some error.' (actual errors: [u'Enter a valid e-mail address.'])")
+
diff --git a/tests/regressiontests/test_client_regress/urls.py b/tests/regressiontests/test_client_regress/urls.py
new file mode 100644
index 0000000000..e9cd0aea15
--- /dev/null
+++ b/tests/regressiontests/test_client_regress/urls.py
@@ -0,0 +1,7 @@
+from django.conf.urls.defaults import *
+from django.views.generic.simple import redirect_to
+import views
+
+urlpatterns = patterns('',
+ (r'^no_template_view/$', views.no_template_view),
+)
diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py
new file mode 100644
index 0000000000..d8dd2b349c
--- /dev/null
+++ b/tests/regressiontests/test_client_regress/views.py
@@ -0,0 +1,8 @@
+from django.core.mail import EmailMessage, SMTPConnection
+from django.http import HttpResponse
+from django.shortcuts import render_to_response
+
+def no_template_view(request):
+ "A simple view that expects a GET request, and returns a rendered template"
+ return HttpResponse("No template used")
+
diff --git a/tests/regressiontests/text/__init__.py b/tests/regressiontests/text/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/text/__init__.py
diff --git a/tests/regressiontests/text/models.py b/tests/regressiontests/text/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/text/models.py
diff --git a/tests/regressiontests/text/tests.py b/tests/regressiontests/text/tests.py
new file mode 100644
index 0000000000..f758ecaf90
--- /dev/null
+++ b/tests/regressiontests/text/tests.py
@@ -0,0 +1,17 @@
+"""
+# Tests for stuff in django.utils.text.
+
+>>> from django.utils.text import *
+
+### smart_split ###########################################################
+>>> list(smart_split(r'''This is "a person" test.'''))
+['This', 'is', '"a person"', 'test.']
+>>> print list(smart_split(r'''This is "a person's" test.'''))[2]
+"a person's"
+>>> print list(smart_split(r'''This is "a person\\"s" test.'''))[2]
+"a person"s"
+>>> list(smart_split('''"a 'one'''))
+['"a', "'one"]
+>>> print list(smart_split(r'''all friends' tests'''))[1]
+friends'
+"""
diff --git a/tests/runtests.py b/tests/runtests.py
index 20189c2d99..7d1ee1e29c 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -3,11 +3,15 @@
import os, sys, traceback
import unittest
+import django.contrib as contrib
+CONTRIB_DIR_NAME = 'django.contrib'
MODEL_TESTS_DIR_NAME = 'modeltests'
REGRESSION_TESTS_DIR_NAME = 'regressiontests'
+
TEST_DATABASE_NAME = 'django_test_db'
TEST_TEMPLATE_DIR = 'templates'
+CONTRIB_DIR = os.path.dirname(contrib.__file__)
MODEL_TEST_DIR = os.path.join(os.path.dirname(__file__), MODEL_TESTS_DIR_NAME)
REGRESSION_TEST_DIR = os.path.join(os.path.dirname(__file__), REGRESSION_TESTS_DIR_NAME)
@@ -24,7 +28,7 @@ ALWAYS_INSTALLED_APPS = [
def get_test_models():
models = []
- for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR):
+ for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR), (CONTRIB_DIR_NAME, CONTRIB_DIR):
for f in os.listdir(dirpath):
if f.startswith('__init__') or f.startswith('.') or f.startswith('sql') or f.startswith('invalid'):
continue
@@ -33,7 +37,7 @@ def get_test_models():
def get_invalid_models():
models = []
- for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR):
+ for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR), (CONTRIB_DIR_NAME, CONTRIB_DIR):
for f in os.listdir(dirpath):
if f.startswith('__init__') or f.startswith('.') or f.startswith('sql'):
continue
@@ -77,13 +81,19 @@ def django_tests(verbosity, tests_to_run):
old_root_urlconf = settings.ROOT_URLCONF
old_template_dirs = settings.TEMPLATE_DIRS
old_use_i18n = settings.USE_I18N
+ old_middleware_classes = settings.MIDDLEWARE_CLASSES
- # Redirect some settings for the duration of these tests
+ # Redirect some settings for the duration of these tests.
settings.TEST_DATABASE_NAME = TEST_DATABASE_NAME
settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS
settings.ROOT_URLCONF = 'urls'
settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), TEST_TEMPLATE_DIR),)
settings.USE_I18N = True
+ settings.MIDDLEWARE_CLASSES = (
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ )
# Load all the ALWAYS_INSTALLED_APPS.
# (This import statement is intentionally delayed until after we
@@ -91,7 +101,7 @@ def django_tests(verbosity, tests_to_run):
from django.db.models.loading import get_apps, load_app
get_apps()
- # Load all the test model apps
+ # Load all the test model apps.
test_models = []
for model_dir, model_name in get_test_models():
model_label = '.'.join([model_dir, model_name])
@@ -103,13 +113,15 @@ def django_tests(verbosity, tests_to_run):
if verbosity >= 1:
print "Importing model %s" % model_name
mod = load_app(model_label)
- settings.INSTALLED_APPS.append(model_label)
- test_models.append(mod)
+ if mod:
+ if model_label not in settings.INSTALLED_APPS:
+ settings.INSTALLED_APPS.append(model_label)
+ test_models.append(mod)
except Exception, e:
sys.stderr.write("Error while importing %s:" % model_name + ''.join(traceback.format_exception(*sys.exc_info())[1:]))
continue
- # Add tests for invalid models
+ # Add tests for invalid models.
extra_tests = []
for model_dir, model_name in get_invalid_models():
model_label = '.'.join([model_dir, model_name])
@@ -118,14 +130,17 @@ def django_tests(verbosity, tests_to_run):
# Run the test suite, including the extra validation tests.
from django.test.simple import run_tests
- run_tests(test_models, verbosity, extra_tests=extra_tests)
+ failures = run_tests(test_models, verbosity, extra_tests=extra_tests)
+ if failures:
+ sys.exit(failures)
- # Restore the old settings
+ # Restore the old settings.
settings.INSTALLED_APPS = old_installed_apps
settings.TESTS_DATABASE_NAME = old_test_database_name
settings.ROOT_URLCONF = old_root_urlconf
settings.TEMPLATE_DIRS = old_template_dirs
settings.USE_I18N = old_use_i18n
+ settings.MIDDLEWARE_CLASSES = old_middleware_classes
if __name__ == "__main__":
from optparse import OptionParser
@@ -139,5 +154,7 @@ if __name__ == "__main__":
options, args = parser.parse_args()
if options.settings:
os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
-
+ elif "DJANGO_SETTINGS_MODULE" not in os.environ:
+ parser.error("DJANGO_SETTINGS_MODULE is not set in the environment. "
+ "Set it or use --settings.")
django_tests(int(options.verbosity), args)
diff --git a/tests/templates/base.html b/tests/templates/base.html
new file mode 100644
index 0000000000..611bc094a9
--- /dev/null
+++ b/tests/templates/base.html
@@ -0,0 +1,8 @@
+<html>
+<head></head>
+<body>
+<h1>Django Internal Tests: {% block title %}{% endblock %}</h1>
+{% block content %}
+{% endblock %}
+</body>
+</html> \ No newline at end of file
diff --git a/tests/templates/form_view.html b/tests/templates/form_view.html
new file mode 100644
index 0000000000..1487217547
--- /dev/null
+++ b/tests/templates/form_view.html
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+{% block title %}Submit data{% endblock %}
+{% block content %}
+<h1>{{ message }}</h1>
+<form method='post' action='.'>
+{% if form.errors %}
+<p class='warning'>Please correct the errors below:</p>
+{% endif %}
+<ul class='form'>
+{{ form }}
+<li><input type='submit' value='Submit'></li>
+</ul>
+</form>
+
+{% endblock %} \ No newline at end of file
diff --git a/tests/templates/login.html b/tests/templates/login.html
index 8a0974c9a1..d55e9ddc75 100644
--- a/tests/templates/login.html
+++ b/tests/templates/login.html
@@ -1,7 +1,6 @@
-<html>
-<head></head>
-<body>
-<h1>Django Internal Tests: Login</h1>
+{% extends "base.html" %}
+{% block title %}Login{% endblock %}
+{% block content %}
{% if form.has_errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
@@ -15,5 +14,4 @@
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
-</body>
-</html> \ No newline at end of file
+{% endblock %} \ No newline at end of file
diff --git a/tests/urls.py b/tests/urls.py
index 39d5aaee6b..dd475b0ea7 100644
--- a/tests/urls.py
+++ b/tests/urls.py
@@ -3,8 +3,12 @@ from django.conf.urls.defaults import *
urlpatterns = patterns('',
# test_client modeltest urls
(r'^test_client/', include('modeltests.test_client.urls')),
+ (r'^test_client_regress/', include('regressiontests.test_client_regress.urls')),
# Always provide the auth system login and logout views
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
- (r'^accounts/logout/$', 'django.contrib.auth.views.login'),
+ (r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
+
+ # test urlconf for {% url %} template tag
+ (r'^url_tag/', include('regressiontests.templates.urls')),
)