From a2e30a41dd00baaa85f0162934327ff0e3dfce51 Mon Sep 17 00:00:00 2001 From: Paul McMillan Date: Mon, 9 Aug 2010 22:11:28 +0000 Subject: [PATCH] [soc2010/test-refactor] Merged back up to trunk git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/test-refactor@13566 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 3 + django/conf/global_settings.py | 3 +- django/conf/locale/cs/LC_MESSAGES/django.mo | Bin 76848 -> 77011 bytes django/conf/locale/cs/LC_MESSAGES/django.po | 186 +- django/conf/locale/cs/LC_MESSAGES/djangojs.mo | Bin 2695 -> 2695 bytes django/conf/locale/cs/LC_MESSAGES/djangojs.po | 4 +- django/conf/locale/da/LC_MESSAGES/djangojs.mo | Bin 1662 -> 2587 bytes django/conf/locale/da/LC_MESSAGES/djangojs.po | 37 +- django/conf/locale/de/LC_MESSAGES/django.mo | Bin 77515 -> 77651 bytes django/conf/locale/de/LC_MESSAGES/django.po | 158 +- .../conf/locale/es_AR/LC_MESSAGES/django.mo | Bin 77570 -> 77722 bytes .../conf/locale/es_AR/LC_MESSAGES/django.po | 182 +- .../conf/locale/es_AR/LC_MESSAGES/djangojs.mo | Bin 2828 -> 2512 bytes .../conf/locale/es_AR/LC_MESSAGES/djangojs.po | 32 +- django/conf/locale/ml/LC_MESSAGES/django.mo | Bin 0 -> 64084 bytes django/conf/locale/ml/LC_MESSAGES/django.po | 5044 +++++++++++++++++ django/conf/locale/ml/LC_MESSAGES/djangojs.mo | Bin 0 -> 4350 bytes django/conf/locale/ml/LC_MESSAGES/djangojs.po | 156 + django/conf/locale/ml/__init__.py | 0 django/conf/locale/ml/formats.py | 38 + django/conf/locale/sr/LC_MESSAGES/django.mo | Bin 56881 -> 57173 bytes django/conf/locale/sr/LC_MESSAGES/django.po | 231 +- django/conf/locale/sr/LC_MESSAGES/djangojs.mo | Bin 3011 -> 2683 bytes django/conf/locale/sr/LC_MESSAGES/djangojs.po | 53 +- django/conf/locale/sr/formats.py | 12 +- .../conf/locale/sr_Latn/LC_MESSAGES/django.mo | Bin 45424 -> 45656 bytes .../conf/locale/sr_Latn/LC_MESSAGES/django.po | 804 ++- django/conf/locale/sr_Latn/formats.py | 12 +- django/contrib/admin/options.py | 2 +- django/contrib/admin/sites.py | 6 +- .../templates/admin/auth/user/add_form.html | 5 +- .../contrib/databrowse/plugins/calendars.py | 2 +- .../databrowse/plugins/fieldchoices.py | 2 +- django/contrib/sessions/backends/file.py | 2 +- django/contrib/sessions/tests.py | 601 +- django/core/management/__init__.py | 10 +- django/core/management/base.py | 2 +- django/core/management/commands/dumpdata.py | 27 +- django/core/management/commands/loaddata.py | 16 +- django/core/management/commands/syncdb.py | 14 +- django/core/urlresolvers.py | 43 +- django/db/__init__.py | 2 + django/db/backends/creation.py | 9 +- django/db/backends/oracle/creation.py | 6 +- django/db/backends/sqlite3/creation.py | 6 +- django/db/models/base.py | 4 +- django/db/models/fields/__init__.py | 3 + django/db/models/fields/related.py | 18 +- django/db/models/query.py | 5 +- django/db/models/signals.py | 10 +- django/forms/forms.py | 8 +- django/forms/formsets.py | 14 +- django/forms/widgets.py | 28 +- django/template/defaultfilters.py | 4 + django/test/client.py | 6 +- django/test/testcases.py | 8 +- django/test/utils.py | 6 + django/utils/text.py | 12 +- django/utils/translation/trans_real.py | 2 +- docs/faq/install.txt | 2 +- docs/internals/contributing.txt | 4 + docs/ref/contrib/admin/index.txt | 43 +- docs/ref/contrib/contenttypes.txt | 18 +- docs/ref/contrib/formtools/form-wizard.txt | 6 +- docs/ref/django-admin.txt | 6 + docs/ref/forms/widgets.txt | 43 +- docs/ref/models/querysets.txt | 11 - docs/ref/request-response.txt | 4 +- docs/ref/settings.txt | 148 +- docs/ref/signals.txt | 29 +- docs/ref/templates/builtins.txt | 4 + docs/releases/1.1-beta-1.txt | 23 +- docs/releases/1.1.txt | 5 +- docs/releases/1.3.txt | 25 + docs/topics/auth.txt | 9 +- docs/topics/db/aggregation.txt | 2 +- docs/topics/db/models.txt | 2 +- docs/topics/db/optimization.txt | 13 +- docs/topics/db/sql.txt | 6 +- docs/topics/email.txt | 2 +- docs/topics/forms/modelforms.txt | 2 +- docs/topics/http/urls.txt | 78 +- docs/topics/i18n/internationalization.txt | 2 +- docs/topics/serialization.txt | 2 +- setup.cfg | 2 +- tests/modeltests/fixtures/tests.py | 51 +- tests/modeltests/model_forms/models.py | 14 +- tests/regressiontests/admin_views/models.py | 6 + tests/regressiontests/admin_views/tests.py | 29 +- tests/regressiontests/forms/forms.py | 40 +- tests/regressiontests/forms/input_formats.py | 894 +++ tests/regressiontests/forms/localflavor/au.py | 2 +- tests/regressiontests/forms/tests.py | 2 + tests/regressiontests/forms/widgets.py | 33 +- tests/regressiontests/localflavor/models.py | 8 - tests/regressiontests/localflavor/tests.py | 84 +- .../localflavor/us/__init__.py | 0 .../localflavor/{ => us}/forms.py | 6 +- .../regressiontests/localflavor/us/models.py | 13 + tests/regressiontests/localflavor/us/tests.py | 82 + .../model_forms_regress/tests.py | 2 +- .../multiple_database/tests.py | 112 + .../test_client_regress/models.py | 26 + .../included_namespace_urls.py | 7 + .../urlpatterns_reverse/namespace_urls.py | 9 + .../urlpatterns_reverse/tests.py | 73 +- .../urlpatterns_reverse/views.py | 6 + tests/runtests.py | 6 +- 108 files changed, 8165 insertions(+), 1669 deletions(-) create mode 100644 django/conf/locale/ml/LC_MESSAGES/django.mo create mode 100644 django/conf/locale/ml/LC_MESSAGES/django.po create mode 100644 django/conf/locale/ml/LC_MESSAGES/djangojs.mo create mode 100644 django/conf/locale/ml/LC_MESSAGES/djangojs.po create mode 100644 django/conf/locale/ml/__init__.py create mode 100644 django/conf/locale/ml/formats.py create mode 100644 tests/regressiontests/forms/input_formats.py create mode 100644 tests/regressiontests/localflavor/us/__init__.py rename tests/regressiontests/localflavor/{ => us}/forms.py (51%) create mode 100644 tests/regressiontests/localflavor/us/models.py create mode 100644 tests/regressiontests/localflavor/us/tests.py diff --git a/AUTHORS b/AUTHORS index 96278827c5..7324a699a5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -184,11 +184,13 @@ answer newbie questions, and generally made Django that much better: Idan Gazit geber@datacollect.com Baishampayan Ghose + Joshua Ginsberg Dimitris Glezos glin@seznam.cz martin.glueck@gmail.com Artyom Gnilov Ben Godfrey + Andrew Godwin GomoX Guilherme Mesquita Gondim Mario Gonzalez @@ -337,6 +339,7 @@ answer newbie questions, and generally made Django that much better: Aljosa Mohorovic Ramiro Morales Eric Moritz + Gregor Müllegger Robin Munn James Murty msundstr diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index cdff2ff13f..6033297e5c 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -54,7 +54,7 @@ LANGUAGES = ( ('en', gettext_noop('English')), ('en-gb', gettext_noop('British English')), ('es', gettext_noop('Spanish')), - ('es-ar', gettext_noop('Argentinean Spanish')), + ('es-ar', gettext_noop('Argentinian Spanish')), ('et', gettext_noop('Estonian')), ('eu', gettext_noop('Basque')), ('fa', gettext_noop('Persian')), @@ -78,6 +78,7 @@ LANGUAGES = ( ('lt', gettext_noop('Lithuanian')), ('lv', gettext_noop('Latvian')), ('mk', gettext_noop('Macedonian')), + ('ml', gettext_noop('Malayalam')), ('mn', gettext_noop('Mongolian')), ('nl', gettext_noop('Dutch')), ('no', gettext_noop('Norwegian')), diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo index 9251a58fbed5f895732155cf7a2440635b01d85c..82e12e8e090118f61d26c8779017aa1073361fc3 100644 GIT binary patch delta 24780 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 Udu?cYlZ42W6&HY)%B0DprgSO5S3 diff --git a/django/conf/locale/cs/LC_MESSAGES/django.po b/django/conf/locale/cs/LC_MESSAGES/django.po index 4984d42517..b1a2e697d4 100644 --- a/django/conf/locale/cs/LC_MESSAGES/django.po +++ b/django/conf/locale/cs/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-09 14:26+0200\n" -"PO-Revision-Date: 2010-05-09 14:09+0100\n" +"POT-Creation-Date: 2010-08-06 18:35+0200\n" +"PO-Revision-Date: 2010-08-06 18:33+0100\n" "Last-Translator: Vlada Macek \n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" @@ -70,7 +70,7 @@ msgid "Spanish" msgstr "španělsky" #: conf/global_settings.py:57 -msgid "Argentinean Spanish" +msgid "Argentinian Spanish" msgstr "španělsky (Argentina)" #: conf/global_settings.py:58 @@ -122,138 +122,146 @@ msgid "Hungarian" msgstr "maďarsky" #: conf/global_settings.py:70 +msgid "Indonesian" +msgstr "indonésky" + +#: conf/global_settings.py:71 msgid "Icelandic" msgstr "islandsky" -#: conf/global_settings.py:71 +#: conf/global_settings.py:72 msgid "Italian" msgstr "italsky" -#: conf/global_settings.py:72 +#: conf/global_settings.py:73 msgid "Japanese" msgstr "japonsky" -#: conf/global_settings.py:73 +#: conf/global_settings.py:74 msgid "Georgian" msgstr "gruzínsky" -#: conf/global_settings.py:74 +#: conf/global_settings.py:75 msgid "Khmer" msgstr "khmersky" -#: conf/global_settings.py:75 +#: conf/global_settings.py:76 msgid "Kannada" msgstr "kannadsky" -#: conf/global_settings.py:76 +#: conf/global_settings.py:77 msgid "Korean" msgstr "korejsky" -#: conf/global_settings.py:77 +#: conf/global_settings.py:78 msgid "Lithuanian" msgstr "litevsky" -#: conf/global_settings.py:78 +#: conf/global_settings.py:79 msgid "Latvian" msgstr "lotyšsky" -#: conf/global_settings.py:79 +#: conf/global_settings.py:80 msgid "Macedonian" msgstr "makedonsky" -#: conf/global_settings.py:80 +#: conf/global_settings.py:81 +msgid "Malayalam" +msgstr "malajálamsky" + +#: conf/global_settings.py:82 msgid "Mongolian" msgstr "mongolsky" -#: conf/global_settings.py:81 +#: conf/global_settings.py:83 msgid "Dutch" msgstr "holandsky" -#: conf/global_settings.py:82 +#: conf/global_settings.py:84 msgid "Norwegian" msgstr "norsky" -#: conf/global_settings.py:83 +#: conf/global_settings.py:85 msgid "Norwegian Bokmal" msgstr "norsky (Bokmål)" -#: conf/global_settings.py:84 +#: conf/global_settings.py:86 msgid "Norwegian Nynorsk" msgstr "norsky (Nynorsk)" -#: conf/global_settings.py:85 +#: conf/global_settings.py:87 msgid "Polish" msgstr "polsky" -#: conf/global_settings.py:86 +#: conf/global_settings.py:88 msgid "Portuguese" msgstr "portugalsky" -#: conf/global_settings.py:87 +#: conf/global_settings.py:89 msgid "Brazilian Portuguese" msgstr "portugalsky (Brazílie)" -#: conf/global_settings.py:88 +#: conf/global_settings.py:90 msgid "Romanian" msgstr "rumunsky" -#: conf/global_settings.py:89 +#: conf/global_settings.py:91 msgid "Russian" msgstr "rusky" -#: conf/global_settings.py:90 +#: conf/global_settings.py:92 msgid "Slovak" msgstr "slovensky" -#: conf/global_settings.py:91 +#: conf/global_settings.py:93 msgid "Slovenian" msgstr "slovinsky" -#: conf/global_settings.py:92 +#: conf/global_settings.py:94 msgid "Albanian" msgstr "albánsky" -#: conf/global_settings.py:93 +#: conf/global_settings.py:95 msgid "Serbian" msgstr "srbsky" -#: conf/global_settings.py:94 +#: conf/global_settings.py:96 msgid "Serbian Latin" msgstr "srbsky (latinkou)" -#: conf/global_settings.py:95 +#: conf/global_settings.py:97 msgid "Swedish" msgstr "švédsky" -#: conf/global_settings.py:96 +#: conf/global_settings.py:98 msgid "Tamil" msgstr "tamilsky" -#: conf/global_settings.py:97 +#: conf/global_settings.py:99 msgid "Telugu" msgstr "telužsky" -#: conf/global_settings.py:98 +#: conf/global_settings.py:100 msgid "Thai" msgstr "thajsky" -#: conf/global_settings.py:99 +#: conf/global_settings.py:101 msgid "Turkish" msgstr "turecky" -#: conf/global_settings.py:100 +#: conf/global_settings.py:102 msgid "Ukrainian" msgstr "ukrajinsky" -#: conf/global_settings.py:101 +#: conf/global_settings.py:103 msgid "Vietnamese" msgstr "vietnamsky" -#: conf/global_settings.py:102 +#: conf/global_settings.py:104 msgid "Simplified Chinese" msgstr "čínsky (zjednodušeně)" -#: conf/global_settings.py:103 +#: conf/global_settings.py:105 msgid "Traditional Chinese" msgstr "čínsky (tradičně)" @@ -305,15 +313,15 @@ msgstr "Tento měsíc" msgid "This year" msgstr "Tento rok" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "Yes" msgstr "Ano" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "No" msgstr "Ne" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:478 msgid "Unknown" msgstr "Neznámé" @@ -359,7 +367,7 @@ msgid "Changed %s." msgstr "Změněno: %s" #: contrib/admin/options.py:559 contrib/admin/options.py:569 -#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 +#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845 #: forms/models.py:568 msgid "and" msgstr "a" @@ -853,7 +861,7 @@ msgstr "Uložit a přidat další položku" msgid "Save and continue editing" msgstr "Uložit a pokračovat v úpravách" -#: contrib/admin/templates/admin/auth/user/add_form.html:5 +#: 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." @@ -861,6 +869,10 @@ msgstr "" "Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více " "uživatelských nastavení." +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Vložte uživatelské jméno a heslo." + #: contrib/admin/templates/admin/auth/user/change_password.html:28 #, python-format msgid "Enter a new password for the user %(username)s." @@ -1418,8 +1430,8 @@ msgstr "zpráva" msgid "Logged out" msgstr "Odhlášeno" -#: contrib/auth/management/commands/createsuperuser.py:23 -#: core/validators.py:120 forms/fields.py:428 +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 forms/fields.py:427 msgid "Enter a valid e-mail address." msgstr "Vložte platnou e-mailovou adresu." @@ -1491,7 +1503,7 @@ msgid "Email address" msgstr "E-mailová adresa" #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 -#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109 msgid "URL" msgstr "URL" @@ -1541,7 +1553,7 @@ msgstr "komentář" msgid "date/time submitted" msgstr "datum a čas byly zaslané" -#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +#: contrib/comments/models.py:60 db/models/fields/__init__.py:904 msgid "IP address" msgstr "Adresa IP" @@ -4473,22 +4485,22 @@ msgstr "weby" msgid "Enter a valid value." msgstr "Vložte platnou hodnotu." -#: core/validators.py:87 forms/fields.py:529 +#: core/validators.py:87 forms/fields.py:528 msgid "Enter a valid URL." msgstr "Vložte platnou adresu URL." -#: core/validators.py:89 forms/fields.py:530 +#: core/validators.py:89 forms/fields.py:529 msgid "This URL appears to be a broken link." msgstr "Tato adresa URL je zřejmě neplatný odkaz." -#: core/validators.py:123 forms/fields.py:873 +#: core/validators.py:123 forms/fields.py:877 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "" "Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a " "pomlček." -#: core/validators.py:126 forms/fields.py:866 +#: core/validators.py:126 forms/fields.py:870 msgid "Enter a valid IPv4 address." msgstr "Vložte platnou adresu typu IPv4." @@ -4501,12 +4513,12 @@ msgstr "Vložte pouze číslice oddělené čárkami." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)." -#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 +#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Hodnota musí být menší nebo rovna %(limit_value)s." -#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 +#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Hodnota musí být větší nebo rovna %(limit_value)s." @@ -4529,13 +4541,13 @@ msgstr "" "Hodnota smí mít nejvýše %(limit_value)d znaků, ale nyní jich má %(show_value)" "d." -#: db/models/base.py:822 +#: db/models/base.py:823 #, python-format msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgstr "" "Pole %(field_name)s musí být unikátní testem %(lookup)s pole %(date_field)s." -#: db/models/base.py:837 db/models/base.py:845 +#: db/models/base.py:838 db/models/base.py:846 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "" @@ -4559,13 +4571,13 @@ msgstr "Pole nemůže být prázdné." msgid "Field of type: %(field_type)s" msgstr "Pole typu: %(field_type)s" -#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 -#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 -#: db/models/fields/__init__.py:999 +#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860 +#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980 +#: db/models/fields/__init__.py:1007 msgid "Integer" msgstr "Celé číslo" -#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858 msgid "This value must be an integer." msgstr "Hodnota musí být celé číslo." @@ -4577,7 +4589,7 @@ msgstr "Hodnota musí být buď Ano (True) nebo Ne (False)." msgid "Boolean (Either True or False)" msgstr "Pravdivost (buď Ano (True), nebo Ne (False))" -#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990 #, python-format msgid "String (up to %(max_length)s)" msgstr "Řetězec (max. %(max_length)s znaků)" @@ -4619,44 +4631,44 @@ msgstr "Desetinné číslo" msgid "E-mail address" msgstr "E-mailová adresa" -#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/__init__.py:807 db/models/fields/files.py:220 #: db/models/fields/files.py:331 msgid "File path" msgstr "Cesta k souboru" -#: db/models/fields/__init__.py:822 +#: db/models/fields/__init__.py:830 msgid "This value must be a float." msgstr "Hodnota musí být desetinné číslo." -#: db/models/fields/__init__.py:824 +#: db/models/fields/__init__.py:832 msgid "Floating point number" msgstr "Číslo s pohyblivou řádovou čárkou" -#: db/models/fields/__init__.py:883 +#: db/models/fields/__init__.py:891 msgid "Big (8 byte) integer" msgstr "Velké číslo (8 bajtů)" -#: db/models/fields/__init__.py:912 +#: db/models/fields/__init__.py:920 msgid "This value must be either None, True or False." msgstr "Hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)." -#: db/models/fields/__init__.py:914 +#: db/models/fields/__init__.py:922 msgid "Boolean (Either True, False or None)" msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))" -#: db/models/fields/__init__.py:1005 +#: db/models/fields/__init__.py:1013 msgid "Text" msgstr "Text" -#: db/models/fields/__init__.py:1021 +#: db/models/fields/__init__.py:1029 msgid "Time" msgstr "Čas" -#: db/models/fields/__init__.py:1025 +#: db/models/fields/__init__.py:1033 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Vložte platný čas ve tvaru HH:MM[:ss[.uuuuuu]]" -#: db/models/fields/__init__.py:1109 +#: db/models/fields/__init__.py:1125 msgid "XML text" msgstr "XML text" @@ -4669,22 +4681,22 @@ msgstr "Položka typu %(model)s s primárním klíčem %(pk)r neexistuje." msgid "Foreign Key (type determined by related field)" msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)" -#: db/models/fields/related.py:918 +#: db/models/fields/related.py:919 msgid "One-to-one relationship" msgstr "Vazba jedna-jedna" -#: db/models/fields/related.py:980 +#: db/models/fields/related.py:981 msgid "Many-to-many relationship" msgstr "Vazba mnoho-mnoho" -#: db/models/fields/related.py:1000 +#: db/models/fields/related.py:1001 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo " "\"Command\" na Macu)." -#: db/models/fields/related.py:1061 +#: db/models/fields/related.py:1062 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -4697,74 +4709,74 @@ msgstr[2] "Vložte platné ID položky %(self)s. Hodnoty %(value)r jsou neplatn msgid "This field is required." msgstr "Pole je povinné." -#: forms/fields.py:204 +#: forms/fields.py:203 msgid "Enter a whole number." msgstr "Vložte celé číslo." -#: forms/fields.py:235 forms/fields.py:256 +#: forms/fields.py:234 forms/fields.py:255 msgid "Enter a number." msgstr "Vložte číslo." -#: forms/fields.py:259 +#: forms/fields.py:258 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Hodnota nesmí celkem mít více než %s cifer." -#: forms/fields.py:260 +#: forms/fields.py:259 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Hodnota nesmí mít za desetinnou čárkou více než %s cifer." -#: forms/fields.py:261 +#: forms/fields.py:260 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Hodnota nesmí mít před desetinnou čárkou více než %s cifer." -#: forms/fields.py:323 forms/fields.py:838 +#: forms/fields.py:322 forms/fields.py:837 msgid "Enter a valid date." msgstr "Vložte platné datum." -#: forms/fields.py:351 forms/fields.py:839 +#: forms/fields.py:350 forms/fields.py:838 msgid "Enter a valid time." msgstr "Vložte platný čas." -#: forms/fields.py:377 +#: forms/fields.py:376 msgid "Enter a valid date/time." msgstr "Vložte platné datum a čas." -#: forms/fields.py:435 +#: forms/fields.py:434 msgid "No file was submitted. Check the encoding type on the form." msgstr "" "Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře." -#: forms/fields.py:436 +#: forms/fields.py:435 msgid "No file was submitted." msgstr "Žádný soubor nebyl odeslán." -#: forms/fields.py:437 +#: forms/fields.py:436 msgid "The submitted file is empty." msgstr "Odeslaný soubor je prázdný." -#: forms/fields.py:438 +#: forms/fields.py:437 #, python-format msgid "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." msgstr "" "Délka názvu souboru má být nejvýše %(max)d znaků, ale nyní je %(length)d." -#: forms/fields.py:473 +#: forms/fields.py:472 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" "Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen." -#: forms/fields.py:596 forms/fields.py:671 +#: forms/fields.py:595 forms/fields.py:670 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici." -#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 +#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002 msgid "Enter a list of values." msgstr "Vložte seznam hodnot." diff --git a/django/conf/locale/cs/LC_MESSAGES/djangojs.mo b/django/conf/locale/cs/LC_MESSAGES/djangojs.mo index 1cf448fe723feb6170beb69ca0f7b096b966f10c..8efa6f6e4cfb247d91e4bb15ee7fefe1cb9b302d 100644 GIT binary patch delta 62 zcmZn{Z5Q3}iq+6U*T77{(89{tRNKJFzKTp>su_V<>!N|bSK-U1S KZnHF74hsMqe-JwW delta 62 zcmZn{Z5Q3}iq+6m*T7Q2(8S8vK-<8`zKTp>su_V<>!N|bSK-U1K L&S0}NTMi2V8JZ9) diff --git a/django/conf/locale/cs/LC_MESSAGES/djangojs.po b/django/conf/locale/cs/LC_MESSAGES/djangojs.po index 0b958e290c..e4f06a96ed 100644 --- a/django/conf/locale/cs/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/cs/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-09 14:30+0200\n" -"PO-Revision-Date: 2010-05-09 14:04+0100\n" +"POT-Creation-Date: 2010-08-06 18:35+0200\n" +"PO-Revision-Date: 2010-08-06 18:34+0100\n" "Last-Translator: Vlada Macek \n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" diff --git a/django/conf/locale/da/LC_MESSAGES/djangojs.mo b/django/conf/locale/da/LC_MESSAGES/djangojs.mo index 697f1a9f6a80d1d5d2d7771f29151434837d4232..47490d86205c3666adce3c33f2963f731fae7b35 100644 GIT binary patch literal 2587 zcmaKt%WoS+9LJ|n9t{Obc|U}H5{lZ2tm{Oyjlx5Oq;AtBO;tOsDumF)`}2C@^^7|^ z>(>7O2Tn-90WO?cgv5aZhg^{_h)cx<2?@~?7ZBpoBdYlRcAZBbWaXL9&dhIqubKV% z_k(*sS9o3-wSU2JwBPoi!_#{}sT1I3@L}*9@Iml9a6kAx_$c_pX#FSfag2Wk$H1H5 zKJd>GZ-EbCd>h;g?uD{da33goJ_KdH4dSP|=)~@2Q1o5}3H%5Yxv#-#@LN#y{sD@f zzd*5j3;Yti4SoiGflWQI0^y^G@hfl=;~Ov{`}RDd6n<(9-2w0*DD$t4H~}8S_!ubh zod(5D9TfjQ01=w%fZ~q@>tFySjvq(70gBu&pve6S%Kn?+tKi=tTvq#G{0;B`C~_x3 z@n;d8=xczVg71S8=Re>l;Ky)Ej!!zYat2SMJ%=X#7C8guk^IOV*?i=Vsqw=Zr$;h!EgC=Ev;nV};AY@> z*R|uME8U8kjbk<2*Cy3#DbskS=5)$7)*dgm$*G!aJC`wO3Z~0jqqJDa*cMw-)}FM? zrLNggr%lZ2jJCP<1FG?wFJ6|lZ?dO&A#%jnVp&E`p-1*&r|aCeP8tu%uZ zo^}0lVxF7Di&{3ZHAy?Dv(8y`SJZj#LQ2(XnHqEvtwwcKFET&_mwRfqooVvn>f%YcR#CgU1|dn-mTMVy#+&IY zoeS<>=V-v8Lg#S&xFKa`R~8A9vcL2^P02EJVbXKt^U||2B|DtTZE5oUso>az;(l)C zWT92KE9!P67!i27ThkQ-7uFbQ%R)t+^KKpAMzjz|7uaVwml>L0M}%(dJolUr(Q=lU zIC?KnvZ&!^XzbidBbxK9a#5M(4S2MCZM7 zQ&Th5YALs*vk*1Bwppr!^D|U4*3v1TUokkmCGGK5z16~8Qck7C%)3b!A8DoOy6=oF z!QWgb95q;X;o|bb^2zORCM(skIcEb~m>KloZ{VxpXfM^qzA1MN2EyB`jaoFlEhp}@ z*heRA)5W-5Gc>(s!q`>?(c9IfuhS&_|H5&?SCOz)4U@Kp8|%VkcpVo!HAzun7K;kQ zUd>vYrzu`846mmNaX^iUvtDjHVKjxB!s>z;EOyqs?iZrP{Hj;=&U&7XO3h}aL2>aR z+bT5cQfQ168grjQ)7h=i=pgkb)`>cstJ*qyJ1R3PMVVPrHRn0#gm68NB5O>N8*&MC zQiCFM!DOmF+(30n;8cNzk&2SgiY?G^<*?>iW|xK=C?knlpt2uja)FZJHLvF7`}Bp4 zK&ZU<%;OYiH6a$`a?x};OnHpN`#{#=90<9OJ;ZRidc$kf;uOWILh~FZWLGxakR|+3 zP`bD@I3`*xG(;V%dp)QygaQ}ie5B@_;_l``Wfz~I>JFz8?gk_ZN!sC1z<&YMvfKh{ zq2n$87A1v!wr~gk4Ja#OTL*%kE=$DaO^9(S!|RaP%!as&u(w>x#qb?QahLD1iR@#K zU(-A6pT?&w0hGy<3~gteT3%D^T`!8=6&oScoKfKWhz2{l2H8TW8H(a|tQGYiRmRuR delta 541 zcmY+dw%cT;IF^>8Sq>SZGg;2?o|vErJ=0Q()( zKPjLlETa}uLu!^Qq)VM?6K_xp{&sDn#&wV`KTP_)Nzj^rpzTn8b@Z`aPGZpGjTgQ7mOrQ@rCJdG#vJ=XYGw#Ie(HrF51hx gr@2&+)1*z0#GGL((U(3bomKL=((Hbrv1fIRKO^}(0ssI2 diff --git a/django/conf/locale/da/LC_MESSAGES/djangojs.po b/django/conf/locale/da/LC_MESSAGES/djangojs.po index 4db7601294..f220938ae1 100644 --- a/django/conf/locale/da/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/da/LC_MESSAGES/djangojs.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-04-26 15:49+0200\n" -"PO-Revision-Date: 2008-08-13 22:00+0200\n" -"Last-Translator: Finn Gruwier Larsen\n" +"POT-Creation-Date: 2010-08-07 11:57+0200\n" +"PO-Revision-Date: 2010-08-07 22:00+0200\n" +"Last-Translator: Finn Gruwier Larsen\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,13 +44,42 @@ msgstr "Foretag dit/dine valg og klik " msgid "Clear all" msgstr "Fravælg alle" -#: contrib/admin/media/js/actions.js:17 +#: contrib/admin/media/js/actions.js:18 #: contrib/admin/media/js/actions.min.js:1 msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s af %(cnt)s valgt" msgstr[1] "%(sel)s af %(cnt)s valgt" +#: contrib/admin/media/js/actions.js:109 +#: contrib/admin/media/js/actions.min.js:5 +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du " +"udfører en handling fra drop-down-menuen, vil du miste disse ændringer." + +#: contrib/admin/media/js/actions.js:121 +#: contrib/admin/media/js/actions.min.js:6 +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller " +"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen." + +#: contrib/admin/media/js/actions.js:123 +#: contrib/admin/media/js/actions.min.js:6 +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. " +"Det, du søger er formentlig Udfør-knappen i stedet for Gem-knappen." + #: contrib/admin/media/js/calendar.js:24 #: contrib/admin/media/js/dateparse.js:32 msgid "" diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo index 5f88e60a6894e364019b02b7fd37566a0f3d32e6..79151f8fe1a8b6d94f55903a6d9b2ba39be331b3 100644 GIT binary patch delta 24708 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 delta 24659 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 U*d7o3x81pYJ@vK&?`9SHKQcKPa{vGU diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po index 521bd3c89c..b59b339b2e 100644 --- a/django/conf/locale/de/LC_MESSAGES/django.po +++ b/django/conf/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-13 15:30+0200\n" +"POT-Creation-Date: 2010-08-06 18:53+0200\n" "PO-Revision-Date: 2010-04-26 13:53+0100\n" "Last-Translator: Jannis Leidel \n" "Language-Team: \n" @@ -72,7 +72,7 @@ msgid "Spanish" msgstr "Spanisch" #: conf/global_settings.py:57 -msgid "Argentinean Spanish" +msgid "Argentinian Spanish" msgstr "Argentinisches Spanisch" #: conf/global_settings.py:58 @@ -168,98 +168,102 @@ msgid "Macedonian" msgstr "Mazedonisch" #: conf/global_settings.py:81 +msgid "Malayalam" +msgstr "Malayalam" + +#: conf/global_settings.py:82 msgid "Mongolian" msgstr "Mongolisch" -#: conf/global_settings.py:82 +#: conf/global_settings.py:83 msgid "Dutch" msgstr "Holländisch" -#: conf/global_settings.py:83 +#: conf/global_settings.py:84 msgid "Norwegian" msgstr "Norwegisch" -#: conf/global_settings.py:84 +#: conf/global_settings.py:85 msgid "Norwegian Bokmal" msgstr "Norwegisch (Bokmål)" -#: conf/global_settings.py:85 +#: conf/global_settings.py:86 msgid "Norwegian Nynorsk" msgstr "Norwegisch (Nynorsk)" -#: conf/global_settings.py:86 +#: conf/global_settings.py:87 msgid "Polish" msgstr "Polnisch" -#: conf/global_settings.py:87 +#: conf/global_settings.py:88 msgid "Portuguese" msgstr "Portugiesisch" -#: conf/global_settings.py:88 +#: conf/global_settings.py:89 msgid "Brazilian Portuguese" msgstr "Brasilianisches Portugiesisch" -#: conf/global_settings.py:89 +#: conf/global_settings.py:90 msgid "Romanian" msgstr "Rumänisch" -#: conf/global_settings.py:90 +#: conf/global_settings.py:91 msgid "Russian" msgstr "Russisch" -#: conf/global_settings.py:91 +#: conf/global_settings.py:92 msgid "Slovak" msgstr "Slowakisch" -#: conf/global_settings.py:92 +#: conf/global_settings.py:93 msgid "Slovenian" msgstr "Slowenisch" -#: conf/global_settings.py:93 +#: conf/global_settings.py:94 msgid "Albanian" msgstr "Albanisch" -#: conf/global_settings.py:94 +#: conf/global_settings.py:95 msgid "Serbian" msgstr "Serbisch" -#: conf/global_settings.py:95 +#: conf/global_settings.py:96 msgid "Serbian Latin" msgstr "Serbisch (Latein)" -#: conf/global_settings.py:96 +#: conf/global_settings.py:97 msgid "Swedish" msgstr "Schwedisch" -#: conf/global_settings.py:97 +#: conf/global_settings.py:98 msgid "Tamil" msgstr "Tamilisch" -#: conf/global_settings.py:98 +#: conf/global_settings.py:99 msgid "Telugu" msgstr "Telugisch" -#: conf/global_settings.py:99 +#: conf/global_settings.py:100 msgid "Thai" msgstr "Thailändisch" -#: conf/global_settings.py:100 +#: conf/global_settings.py:101 msgid "Turkish" msgstr "Türkisch" -#: conf/global_settings.py:101 +#: conf/global_settings.py:102 msgid "Ukrainian" msgstr "Ukrainisch" -#: conf/global_settings.py:102 +#: conf/global_settings.py:103 msgid "Vietnamese" msgstr "Vietnamesisch" -#: conf/global_settings.py:103 +#: conf/global_settings.py:104 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" -#: conf/global_settings.py:104 +#: conf/global_settings.py:105 msgid "Traditional Chinese" msgstr "Traditionelles Chinesisch" @@ -311,15 +315,15 @@ msgstr "Diesen Monat" msgid "This year" msgstr "Dieses Jahr" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "Yes" msgstr "Ja" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "No" msgstr "Nein" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:478 msgid "Unknown" msgstr "Unbekannt" @@ -696,7 +700,7 @@ msgid "Filter" msgstr "Filter" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300 msgid "Delete" msgstr "Löschen" @@ -859,7 +863,7 @@ msgstr "Sichern und neu hinzufügen" msgid "Save and continue editing" msgstr "Sichern und weiter bearbeiten" -#: contrib/admin/templates/admin/auth/user/add_form.html:5 +#: 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." @@ -867,6 +871,10 @@ msgstr "" "Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere " "Optionen für den Benutzer geändert werden." +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Bitte einen Benutzernamen und ein Passwort eingeben." + #: contrib/admin/templates/admin/auth/user/change_password.html:28 #, python-format msgid "Enter a new password for the user %(username)s." @@ -1437,8 +1445,8 @@ msgstr "Mitteilung" msgid "Logged out" msgstr "Abgemeldet" -#: contrib/auth/management/commands/createsuperuser.py:23 -#: core/validators.py:120 forms/fields.py:428 +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 forms/fields.py:427 msgid "Enter a valid e-mail address." msgstr "Bitte eine gültige E-Mail-Adresse eingeben." @@ -1506,7 +1514,7 @@ msgid "Email address" msgstr "E-Mail-Adresse" #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 -#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109 msgid "URL" msgstr "Adresse (URL)" @@ -1557,7 +1565,7 @@ msgstr "Kommentar" msgid "date/time submitted" msgstr "Datum/Zeit Erstellung" -#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +#: contrib/comments/models.py:60 db/models/fields/__init__.py:904 msgid "IP address" msgstr "IP-Adresse" @@ -4509,22 +4517,22 @@ msgstr "Sites" msgid "Enter a valid value." msgstr "Bitte einen gültigen Wert eingeben." -#: core/validators.py:87 forms/fields.py:529 +#: core/validators.py:87 forms/fields.py:528 msgid "Enter a valid URL." msgstr "Bitte eine gültige Adresse eingeben." -#: core/validators.py:89 forms/fields.py:530 +#: core/validators.py:89 forms/fields.py:529 msgid "This URL appears to be a broken link." msgstr "Diese Adresse scheint nicht gültig zu sein." -#: core/validators.py:123 forms/fields.py:873 +#: core/validators.py:123 forms/fields.py:877 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "" "Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen " "und Bindestrichen, eingeben." -#: core/validators.py:126 forms/fields.py:866 +#: core/validators.py:126 forms/fields.py:870 msgid "Enter a valid IPv4 address." msgstr "Bitte eine gültige IPv4-Adresse eingeben." @@ -4539,12 +4547,12 @@ msgstr "" "Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist %(show_value)" "s)" -#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 +#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein." -#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 +#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein." @@ -4595,13 +4603,13 @@ msgstr "Dieses Feld darf nicht leer sein." msgid "Field of type: %(field_type)s" msgstr "Feldtyp: %(field_type)s" -#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 -#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 -#: db/models/fields/__init__.py:999 +#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860 +#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980 +#: db/models/fields/__init__.py:1007 msgid "Integer" msgstr "Ganzzahl" -#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858 msgid "This value must be an integer." msgstr "Dieser Wert muss eine Ganzzahl sein." @@ -4613,7 +4621,7 @@ msgstr "Dieser Wert muss True oder False sein." msgid "Boolean (Either True or False)" msgstr "Boolescher Wert (True oder False)" -#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990 #, python-format msgid "String (up to %(max_length)s)" msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)" @@ -4657,44 +4665,44 @@ msgstr "Dezimalzahl" msgid "E-mail address" msgstr "E-Mail-Adresse" -#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/__init__.py:807 db/models/fields/files.py:220 #: db/models/fields/files.py:331 msgid "File path" msgstr "Dateipfad" -#: db/models/fields/__init__.py:822 +#: db/models/fields/__init__.py:830 msgid "This value must be a float." msgstr "Dieser Wert muss eine Gleitkommazahl sein." -#: db/models/fields/__init__.py:824 +#: db/models/fields/__init__.py:832 msgid "Floating point number" msgstr "Gleitkommazahl" -#: db/models/fields/__init__.py:883 +#: db/models/fields/__init__.py:891 msgid "Big (8 byte) integer" msgstr "Große Ganzzahl (8 Byte)" -#: db/models/fields/__init__.py:912 +#: db/models/fields/__init__.py:920 msgid "This value must be either None, True or False." msgstr "Dieser Wert muss None, True oder False sein." -#: db/models/fields/__init__.py:914 +#: db/models/fields/__init__.py:922 msgid "Boolean (Either True, False or None)" msgstr "Boolescher Wert (True, False oder None)" -#: db/models/fields/__init__.py:1005 +#: db/models/fields/__init__.py:1013 msgid "Text" msgstr "Text" -#: db/models/fields/__init__.py:1021 +#: db/models/fields/__init__.py:1029 msgid "Time" msgstr "Zeit" -#: db/models/fields/__init__.py:1025 +#: db/models/fields/__init__.py:1033 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Bitte eine gültige Zeit im Format HH:MM[:ss[.uuuuuu]] eingeben." -#: db/models/fields/__init__.py:1109 +#: db/models/fields/__init__.py:1125 msgid "XML text" msgstr "XML-Text" @@ -4707,22 +4715,22 @@ msgstr "Modell %(model)s mit dem Primärschlüssel %(pk)r ist nicht vorhanden." msgid "Foreign Key (type determined by related field)" msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)" -#: db/models/fields/related.py:918 +#: db/models/fields/related.py:919 msgid "One-to-one relationship" msgstr "One-to-one-Beziehung" -#: db/models/fields/related.py:980 +#: db/models/fields/related.py:981 msgid "Many-to-many relationship" msgstr "Many-to-many-Beziehung" -#: db/models/fields/related.py:1000 +#: db/models/fields/related.py:1001 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um " "mehrere Einträge auszuwählen." -#: db/models/fields/related.py:1061 +#: db/models/fields/related.py:1062 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -4736,55 +4744,55 @@ msgstr[1] "" msgid "This field is required." msgstr "Dieses Feld ist zwingend erforderlich." -#: forms/fields.py:204 +#: forms/fields.py:203 msgid "Enter a whole number." msgstr "Bitte eine ganze Zahl eingeben." -#: forms/fields.py:235 forms/fields.py:256 +#: forms/fields.py:234 forms/fields.py:255 msgid "Enter a number." msgstr "Bitte eine Zahl eingeben." -#: forms/fields.py:259 +#: forms/fields.py:258 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein." -#: forms/fields.py:260 +#: forms/fields.py:259 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein." -#: forms/fields.py:261 +#: forms/fields.py:260 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Bitte geben Sie nicht mehr als %s Ziffern vor dem Komma ein." -#: forms/fields.py:323 forms/fields.py:838 +#: forms/fields.py:322 forms/fields.py:837 msgid "Enter a valid date." msgstr "Bitte ein gültiges Datum eingeben." -#: forms/fields.py:351 forms/fields.py:839 +#: forms/fields.py:350 forms/fields.py:838 msgid "Enter a valid time." msgstr "Bitte eine gültige Uhrzeit eingeben." -#: forms/fields.py:377 +#: forms/fields.py:376 msgid "Enter a valid date/time." msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben." -#: forms/fields.py:435 +#: forms/fields.py:434 msgid "No file was submitted. Check the encoding type on the form." msgstr "" "Es wurde keine Datei übermittelt. Überprüfen Sie das Encoding des Formulars." -#: forms/fields.py:436 +#: forms/fields.py:435 msgid "No file was submitted." msgstr "Es wurde keine Datei übertragen." -#: forms/fields.py:437 +#: forms/fields.py:436 msgid "The submitted file is empty." msgstr "Die ausgewählte Datei ist leer." -#: forms/fields.py:438 +#: forms/fields.py:437 #, python-format msgid "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." @@ -4792,7 +4800,7 @@ msgstr "" "Bitte sicherstellen, dass der Dateiname maximal %(max)d Zeichen hat. (Er hat " "%(length)d)." -#: forms/fields.py:473 +#: forms/fields.py:472 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -4800,17 +4808,17 @@ msgstr "" "Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild oder ist " "defekt." -#: forms/fields.py:596 forms/fields.py:671 +#: forms/fields.py:595 forms/fields.py:670 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" "Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl." -#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 +#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002 msgid "Enter a list of values." msgstr "Bitte eine Liste mit Werten eingeben." -#: forms/formsets.py:298 forms/formsets.py:300 +#: forms/formsets.py:296 forms/formsets.py:298 msgid "Order" msgstr "Reihenfolge" diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo index 1aee7ccc22dfb650894db710eaa247171c83c745..4e2c1d713d24a8bc870d22f32c6ec147012d7e89 100644 GIT binary patch delta 24794 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 diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po index 061cd7d1ba..ece046f4cc 100644 --- a/django/conf/locale/es_AR/LC_MESSAGES/django.po +++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-11 08:35-0300\n" -"PO-Revision-Date: 2010-05-17 10:52-0300\n" +"POT-Creation-Date: 2010-08-06 15:38-0300\n" +"PO-Revision-Date: 2010-08-06 16:02-0300\n" "Last-Translator: Ramiro \n" "Language-Team: Django-I18N \n" "Language: es_AR\n" @@ -70,7 +70,7 @@ msgid "Spanish" msgstr "español" #: conf/global_settings.py:57 -msgid "Argentinean Spanish" +msgid "Argentinian Spanish" msgstr "español de Argentina" #: conf/global_settings.py:58 @@ -166,98 +166,102 @@ msgid "Macedonian" msgstr "macedonio" #: conf/global_settings.py:81 +msgid "Malayalam" +msgstr "Malayalam" + +#: conf/global_settings.py:82 msgid "Mongolian" msgstr "mongol" -#: conf/global_settings.py:82 +#: conf/global_settings.py:83 msgid "Dutch" msgstr "holandés" -#: conf/global_settings.py:83 +#: conf/global_settings.py:84 msgid "Norwegian" msgstr "noruego" -#: conf/global_settings.py:84 +#: conf/global_settings.py:85 msgid "Norwegian Bokmal" msgstr "bokmål" -#: conf/global_settings.py:85 +#: conf/global_settings.py:86 msgid "Norwegian Nynorsk" msgstr "nynorsk" -#: conf/global_settings.py:86 +#: conf/global_settings.py:87 msgid "Polish" msgstr "polaco" -#: conf/global_settings.py:87 +#: conf/global_settings.py:88 msgid "Portuguese" msgstr "portugués" -#: conf/global_settings.py:88 +#: conf/global_settings.py:89 msgid "Brazilian Portuguese" msgstr "portugués de Brasil" -#: conf/global_settings.py:89 +#: conf/global_settings.py:90 msgid "Romanian" msgstr "rumano" -#: conf/global_settings.py:90 +#: conf/global_settings.py:91 msgid "Russian" msgstr "ruso" -#: conf/global_settings.py:91 +#: conf/global_settings.py:92 msgid "Slovak" msgstr "eslovaco" -#: conf/global_settings.py:92 +#: conf/global_settings.py:93 msgid "Slovenian" msgstr "esloveno" -#: conf/global_settings.py:93 +#: conf/global_settings.py:94 msgid "Albanian" msgstr "albanés" -#: conf/global_settings.py:94 +#: conf/global_settings.py:95 msgid "Serbian" msgstr "serbio" -#: conf/global_settings.py:95 +#: conf/global_settings.py:96 msgid "Serbian Latin" msgstr "Latín de Serbia" -#: conf/global_settings.py:96 +#: conf/global_settings.py:97 msgid "Swedish" msgstr "sueco" -#: conf/global_settings.py:97 +#: conf/global_settings.py:98 msgid "Tamil" msgstr "tamil" -#: conf/global_settings.py:98 +#: conf/global_settings.py:99 msgid "Telugu" msgstr "telugu" -#: conf/global_settings.py:99 +#: conf/global_settings.py:100 msgid "Thai" msgstr "tailandés" -#: conf/global_settings.py:100 +#: conf/global_settings.py:101 msgid "Turkish" msgstr "turco" -#: conf/global_settings.py:101 +#: conf/global_settings.py:102 msgid "Ukrainian" msgstr "ucraniano" -#: conf/global_settings.py:102 +#: conf/global_settings.py:103 msgid "Vietnamese" msgstr "vietnamita" -#: conf/global_settings.py:103 +#: conf/global_settings.py:104 msgid "Simplified Chinese" msgstr "chino simplificado" -#: conf/global_settings.py:104 +#: conf/global_settings.py:105 msgid "Traditional Chinese" msgstr "chino tradicional" @@ -309,15 +313,15 @@ msgstr "Este mes" msgid "This year" msgstr "Este año" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "Yes" msgstr "Sí" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "No" msgstr "No" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:478 msgid "Unknown" msgstr "Desconocido" @@ -363,7 +367,7 @@ msgid "Changed %s." msgstr "Modifica %s." #: contrib/admin/options.py:559 contrib/admin/options.py:569 -#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 +#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845 #: forms/models.py:568 msgid "and" msgstr "y" @@ -692,7 +696,7 @@ msgid "Filter" msgstr "Filtrar" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300 msgid "Delete" msgstr "Eliminar" @@ -855,13 +859,17 @@ msgstr "Guardar y agregar otro" msgid "Save and continue editing" msgstr "Guardar y continuar editando" -#: contrib/admin/templates/admin/auth/user/add_form.html:5 +#: 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." +"Primero introduzca un nombre de usuario y una contraseña. Luego podrá " +"configurar opciones adicionales acerca del usuario." + +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Introduzca un nombre de usuario y una contraseña." #: contrib/admin/templates/admin/auth/user/change_password.html:28 #, python-format @@ -1435,8 +1443,8 @@ msgstr "mensaje" msgid "Logged out" msgstr "Sesión cerrada" -#: contrib/auth/management/commands/createsuperuser.py:23 -#: core/validators.py:120 forms/fields.py:428 +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 forms/fields.py:427 msgid "Enter a valid e-mail address." msgstr "Introduzca una dirección de correo electrónico válida" @@ -1504,7 +1512,7 @@ msgid "Email address" msgstr "Dirección de correo electrónico" #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 -#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109 msgid "URL" msgstr "URL" @@ -1553,7 +1561,7 @@ msgstr "comentario" msgid "date/time submitted" msgstr "fecha/hora de envío" -#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +#: contrib/comments/models.py:60 db/models/fields/__init__.py:904 msgid "IP address" msgstr "Dirección IP" @@ -4503,20 +4511,20 @@ msgstr "sitios" msgid "Enter a valid value." msgstr "Introduzca un valor válido." -#: core/validators.py:87 forms/fields.py:529 +#: core/validators.py:87 forms/fields.py:528 msgid "Enter a valid URL." msgstr "Introduzca una URL válida." -#: core/validators.py:89 forms/fields.py:530 +#: core/validators.py:89 forms/fields.py:529 msgid "This URL appears to be a broken link." msgstr "La URL parece ser un enlace roto." -#: core/validators.py:123 forms/fields.py:873 +#: core/validators.py:123 forms/fields.py:877 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "Introduzca un 'slug' válido consistente de letras, números o guiones." -#: core/validators.py:126 forms/fields.py:866 +#: core/validators.py:126 forms/fields.py:870 msgid "Enter a valid IPv4 address." msgstr "Introduzca una dirección IPv4 válida" @@ -4528,15 +4536,15 @@ msgstr "Introduzca sólo dígitos separados por comas." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "" -"Asegúrese de que este valor sea %(limit_value)s (actualmente es %(show_value)" -"s)." +"Asegúrese de que este valor sea %(limit_value)s (actualmente es " +"%(show_value)s)." -#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 +#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." -#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 +#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." @@ -4544,8 +4552,8 @@ msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." #: core/validators.py:164 #, python-format msgid "" -"Ensure this value has at least %(limit_value)d characters (it has %" -"(show_value)d)." +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." msgstr "" "Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene " "%(show_value)d)." @@ -4553,20 +4561,20 @@ msgstr "" #: core/validators.py:170 #, python-format msgid "" -"Ensure this value has at most %(limit_value)d characters (it has %" -"(show_value)d)." +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." msgstr "" "Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " "(tiene %(show_value)d)." -#: db/models/base.py:822 +#: db/models/base.py:823 #, python-format msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgstr "" "%(field_name)s debe ser único/a para un %(lookup)s %(date_field)s " "determinado." -#: db/models/base.py:837 db/models/base.py:845 +#: db/models/base.py:838 db/models/base.py:846 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." @@ -4589,13 +4597,13 @@ msgstr "Este campo no puede estar en blanco." msgid "Field of type: %(field_type)s" msgstr "Campo tipo: %(field_type)s" -#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 -#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 -#: db/models/fields/__init__.py:999 +#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860 +#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980 +#: db/models/fields/__init__.py:1007 msgid "Integer" msgstr "Entero" -#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858 msgid "This value must be an integer." msgstr "Este valor debe ser un número entero." @@ -4607,7 +4615,7 @@ msgstr "Este valor debe ser True o False." msgid "Boolean (Either True or False)" msgstr "Booleano (Verdadero o Falso)" -#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990 #, python-format msgid "String (up to %(max_length)s)" msgstr "Cadena (máximo %(max_length)s)" @@ -4651,44 +4659,44 @@ msgstr "Número decimal" msgid "E-mail address" msgstr "Dirección de correo electrónico" -#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/__init__.py:807 db/models/fields/files.py:220 #: db/models/fields/files.py:331 msgid "File path" msgstr "Ruta de archivo" -#: db/models/fields/__init__.py:822 +#: db/models/fields/__init__.py:830 msgid "This value must be a float." msgstr "Este valor debe ser un valor en representación de punto flotante." -#: db/models/fields/__init__.py:824 +#: db/models/fields/__init__.py:832 msgid "Floating point number" msgstr "Número de punto flotante" -#: db/models/fields/__init__.py:883 +#: db/models/fields/__init__.py:891 msgid "Big (8 byte) integer" msgstr "Entero grande (8 bytes)" -#: db/models/fields/__init__.py:912 +#: db/models/fields/__init__.py:920 msgid "This value must be either None, True or False." msgstr "Este valor debe ser None, True o False." -#: db/models/fields/__init__.py:914 +#: db/models/fields/__init__.py:922 msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" -#: db/models/fields/__init__.py:1005 +#: db/models/fields/__init__.py:1013 msgid "Text" msgstr "Texto" -#: db/models/fields/__init__.py:1021 +#: db/models/fields/__init__.py:1029 msgid "Time" msgstr "Hora" -#: db/models/fields/__init__.py:1025 +#: db/models/fields/__init__.py:1033 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Introduzca un valor de hora válido en formato HH:MM[:ss[.uuuuuu]]." -#: db/models/fields/__init__.py:1109 +#: db/models/fields/__init__.py:1125 msgid "XML text" msgstr "Texto XML" @@ -4701,22 +4709,22 @@ msgstr "No existe un modelo %(model)s con una clave primaria %(pk)r." msgid "Foreign Key (type determined by related field)" msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" -#: db/models/fields/related.py:918 +#: db/models/fields/related.py:919 msgid "One-to-one relationship" msgstr "Relación uno-a-uno" -#: db/models/fields/related.py:980 +#: db/models/fields/related.py:981 msgid "Many-to-many relationship" msgstr "Relación muchos-a-muchos" -#: db/models/fields/related.py:1000 +#: db/models/fields/related.py:1001 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:1061 +#: db/models/fields/related.py:1062 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -4732,55 +4740,55 @@ msgstr[1] "" msgid "This field is required." msgstr "Este campo es obligatorio." -#: forms/fields.py:204 +#: forms/fields.py:203 msgid "Enter a whole number." msgstr "Introduzca un número entero." -#: forms/fields.py:235 forms/fields.py:256 +#: forms/fields.py:234 forms/fields.py:255 msgid "Enter a number." msgstr "Introduzca un número." -#: forms/fields.py:259 +#: forms/fields.py:258 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Asegúrese de que no existan en total mas de %s dígitos." -#: forms/fields.py:260 +#: forms/fields.py:259 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Asegúrese de que no existan mas de %s lugares decimales." -#: forms/fields.py:261 +#: forms/fields.py:260 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal." -#: forms/fields.py:323 forms/fields.py:838 +#: forms/fields.py:322 forms/fields.py:837 msgid "Enter a valid date." msgstr "Introduzca una fecha válida." -#: forms/fields.py:351 forms/fields.py:839 +#: forms/fields.py:350 forms/fields.py:838 msgid "Enter a valid time." msgstr "Introduzca un valor de hora válido." -#: forms/fields.py:377 +#: forms/fields.py:376 msgid "Enter a valid date/time." msgstr "Introduzca un valor de fecha/hora válido." -#: forms/fields.py:435 +#: forms/fields.py:434 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." -#: forms/fields.py:436 +#: forms/fields.py:435 msgid "No file was submitted." msgstr "No se envió ningún archivo." -#: forms/fields.py:437 +#: forms/fields.py:436 msgid "The submitted file is empty." msgstr "El archivo enviado está vacío." -#: forms/fields.py:438 +#: forms/fields.py:437 #, python-format msgid "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." @@ -4788,7 +4796,7 @@ msgstr "" "Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " "(tiene %(length)d)." -#: forms/fields.py:473 +#: forms/fields.py:472 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -4796,18 +4804,18 @@ msgstr "" "Seleccione una imagen válida. El archivo que ha seleccionado no es una " "imagen o es un un archivo de imagen corrupto." -#: forms/fields.py:596 forms/fields.py:671 +#: forms/fields.py:595 forms/fields.py:670 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" "Seleccione una opción válida. %(value)s no es una de las opciones " "disponibles." -#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 +#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002 msgid "Enter a list of values." msgstr "Introduzca una lista de valores." -#: forms/formsets.py:298 forms/formsets.py:300 +#: forms/formsets.py:296 forms/formsets.py:298 msgid "Order" msgstr "Ordenar" diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo index f894397efb6533f459739ce64da4ef3092e452b6..e69f6fe95db4531d1fbd57e43bb164f292555d7c 100644 GIT binary patch delta 630 zcmXxhJ4-_`6u|NHTCK18ek_UsQS5Lb*0+;Gbr9dLiijxELb0e&b&x{AO>hvdE*%{G z0E$Bg1w|2jfR2Lb2XN8B!Oj1<*3gq*k|sGP?Ox4OW$LZMd#GqNL>=)!)DuY$9qkjl z@C)-WU@4W424&uZe(b{n9Kl?iMK3PkG%ll@%VgKDFh{ABx@902+-JXd!EWYnC>PbT zOAgkfBxuGo8a%*zT*pPSr77|m`*x_L8*`Do%Yp?VQv5R%W#l)DZ zi3~a#5(i_AaUx-Gal*KmXk>EHgb4>DA^sjXj8E?W{@#zf|MNU|w;aEpXnpI8JT}Df zKyNMpuE1{iBj6g0vfh9ZV_GJH z+jTa&p&Cs>4on$xnF@m@o`!0C8w#9*dfy9p5x#_K{2i*#PpFC4;5^)bkKj`ts=>3| zJRfQq^PI^T8zWs?iS9x!bB|#!d;qnRXHbn7g8kQUKkFs93w{drSD+TM3c1W0LmsX} z^_jp#3!8*d@*9VV8hZ?z9l}A@b5IT5!t-zu(uDaH?Ei-P212+k!WdkJ@8Jx5LN@)1 z`u5aU;~>&vk05QXr3thejeY14!q*%_{|BGT97Wpkf#5*9JdCu6I7%Qbuov|q4eeO} zlkL#|%q07L+a2)5yVd>^O7~`pMU$De9M`((+LH9!gJFr6JGju3czI)0?SFq3k&YyWbxWt6G$T>lCJ>^Eo^k?n$3Xos;3= zkysASve*0bQ)QL_1g5y=Kx-`6^=j%=6 zEIG{EUt$l($6Tl4aBN293Z-S`vfS7%Odqtx^?Y#}cEuMQy diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po index 5f6278533a..387449ecc2 100644 --- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-04 22:01-0300\n" -"PO-Revision-Date: 2010-05-04 22:10-0300\n" +"POT-Creation-Date: 2010-08-06 15:47-0300\n" +"PO-Revision-Date: 2010-08-06 15:52-0300\n" "Last-Translator: Ramiro Morales \n" "Language-Team: Django-I18N \n" "Language: es_AR\n" @@ -17,45 +17,17 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 2.0.1\n" -#: contrib/admin/media/js/SelectFilter2.js:37 -#, perl-format -msgid "Available %s" -msgstr "%s disponibles" - -#: contrib/admin/media/js/SelectFilter2.js:45 -msgid "Choose all" -msgstr "Seleccionar todos" - -#: contrib/admin/media/js/SelectFilter2.js:50 -msgid "Add" -msgstr "Agregar" - -#: contrib/admin/media/js/SelectFilter2.js:52 -msgid "Remove" -msgstr "Eliminar" - -#: contrib/admin/media/js/SelectFilter2.js:57 -#, perl-format -msgid "Chosen %s" -msgstr "%s elegidos" - -#: contrib/admin/media/js/SelectFilter2.js:58 -msgid "Select your choice(s) and click " -msgstr "Seleccione los items a agregar y haga click en " - #: contrib/admin/media/js/SelectFilter2.js:63 msgid "Clear all" msgstr "Eliminar todos" #: contrib/admin/media/js/actions.js:18 -#: contrib/admin/media/js/actions.min.js:1 msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" #: contrib/admin/media/js/actions.js:109 -#: contrib/admin/media/js/actions.min.js:5 msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." diff --git a/django/conf/locale/ml/LC_MESSAGES/django.mo b/django/conf/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..654b4fc4ee2bb44b4997dc086ba6dc2ce507db78 GIT binary patch literal 64084 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 H-KW-Hsa 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 hT0~f8+RR|)p*qYf%vrk1-F6evw, 2010. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Django SVN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-27 11:01+0530\n" +"PO-Revision-Date: 2010-05-28 15:09+0530\n" +"Last-Translator: Rajeesh Nair \n" +"Language-Team: MALAYALAM \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Malayalam\n" +"X-Poedit-Country: INDIA\n" + +#: conf/global_settings.py:44 +msgid "Arabic" +msgstr "അറബി" + +#: conf/global_settings.py:45 +msgid "Bulgarian" +msgstr "ബള്‍ഗേറിയന്‍" + +#: conf/global_settings.py:46 +msgid "Bengali" +msgstr "ബംഗാളി" + +#: conf/global_settings.py:47 +msgid "Bosnian" +msgstr "ബോസ്നിയന്‍" + +#: conf/global_settings.py:48 +msgid "Catalan" +msgstr "കാറ്റലന്‍" + +#: conf/global_settings.py:49 +msgid "Czech" +msgstr "ചെക്" + +#: conf/global_settings.py:50 +msgid "Welsh" +msgstr "വെല്‍ഷ്" + +#: conf/global_settings.py:51 +msgid "Danish" +msgstr "ഡാനിഷ്" + +#: conf/global_settings.py:52 +msgid "German" +msgstr "ജര്‍മന്‍" + +#: conf/global_settings.py:53 +msgid "Greek" +msgstr "ഗ്രീക്ക്" + +#: conf/global_settings.py:54 +msgid "English" +msgstr "ഇംഗ്ളീഷ്" + +#: conf/global_settings.py:55 +msgid "British English" +msgstr "ബ്രിട്ടീഷ് ഇംഗ്ളീഷ്" + +#: conf/global_settings.py:56 +msgid "Spanish" +msgstr "സ്പാനിഷ്" + +#: conf/global_settings.py:57 +msgid "Argentinean Spanish" +msgstr "അര്‍ജന്റീനിയന്‍ സ്പാനിഷ്" + +#: conf/global_settings.py:58 +msgid "Estonian" +msgstr "എസ്ടോണിയന്‍ സ്പാനിഷ്" + +#: conf/global_settings.py:59 +msgid "Basque" +msgstr "ബാസ്ക്യു" + +#: conf/global_settings.py:60 +msgid "Persian" +msgstr "പേര്‍ഷ്യന്‍" + +#: conf/global_settings.py:61 +msgid "Finnish" +msgstr "ഫിന്നിഷ്" + +#: conf/global_settings.py:62 +msgid "French" +msgstr "ഫ്രെഞ്ച്" + +#: conf/global_settings.py:63 +msgid "Frisian" +msgstr "ഫ്രിസിയന്‍" + +#: conf/global_settings.py:64 +msgid "Irish" +msgstr "ഐറിഷ്" + +#: conf/global_settings.py:65 +msgid "Galician" +msgstr "ഗലിഷ്യന്‍" + +#: conf/global_settings.py:66 +msgid "Hebrew" +msgstr "ഹീബ്റു" + +#: conf/global_settings.py:67 +msgid "Hindi" +msgstr "ഹിന്ദി" + +#: conf/global_settings.py:68 +msgid "Croatian" +msgstr "ക്രൊയേഷ്യന്‍" + +#: conf/global_settings.py:69 +msgid "Hungarian" +msgstr "ഹംഗേറിയന്‍" + +#: conf/global_settings.py:70 +msgid "Indonesian" +msgstr "ഇന്‍ദൊനേഷ്യന്‍" + +#: conf/global_settings.py:71 +msgid "Icelandic" +msgstr "ഐസ്ലാന്‍ഡിക്" + +#: conf/global_settings.py:72 +msgid "Italian" +msgstr "ഇറ്റാലിയന്‍" + +#: conf/global_settings.py:73 +msgid "Japanese" +msgstr "ജാപ്പനീസ്" + +#: conf/global_settings.py:74 +msgid "Georgian" +msgstr "ജോര്‍ജിയന്‍" + +#: conf/global_settings.py:75 +msgid "Khmer" +msgstr "" + +#: conf/global_settings.py:76 +msgid "Kannada" +msgstr "കന്നഡ" + +#: conf/global_settings.py:77 +msgid "Korean" +msgstr "കൊറിയന്‍" + +#: conf/global_settings.py:78 +msgid "Lithuanian" +msgstr "ലിത്വാനിയന്‍" + +#: conf/global_settings.py:79 +msgid "Latvian" +msgstr "ലാറ്റ്വിയന്‍" + +#: conf/global_settings.py:80 +msgid "Macedonian" +msgstr "മാസിഡോണിയന്‍" + +#: conf/global_settings.py:81 +msgid "Mongolian" +msgstr "മംഗോളിയന്‍" + +#: conf/global_settings.py:82 +msgid "Dutch" +msgstr "ഡച്ച്" + +#: conf/global_settings.py:83 +msgid "Norwegian" +msgstr "" + +#: conf/global_settings.py:84 +msgid "Norwegian Bokmal" +msgstr "" + +#: conf/global_settings.py:85 +msgid "Norwegian Nynorsk" +msgstr "" + +#: conf/global_settings.py:86 +msgid "Polish" +msgstr "" + +#: conf/global_settings.py:87 +msgid "Portuguese" +msgstr "" + +#: conf/global_settings.py:88 +msgid "Brazilian Portuguese" +msgstr "" + +#: conf/global_settings.py:89 +msgid "Romanian" +msgstr "" + +#: conf/global_settings.py:90 +msgid "Russian" +msgstr "" + +#: conf/global_settings.py:91 +msgid "Slovak" +msgstr "" + +#: conf/global_settings.py:92 +msgid "Slovenian" +msgstr "" + +#: conf/global_settings.py:93 +msgid "Albanian" +msgstr "" + +#: conf/global_settings.py:94 +msgid "Serbian" +msgstr "" + +#: conf/global_settings.py:95 +msgid "Serbian Latin" +msgstr "" + +#: conf/global_settings.py:96 +msgid "Swedish" +msgstr "" + +#: conf/global_settings.py:97 +msgid "Tamil" +msgstr "" + +#: conf/global_settings.py:98 +msgid "Telugu" +msgstr "" + +#: conf/global_settings.py:99 +msgid "Thai" +msgstr "" + +#: conf/global_settings.py:100 +msgid "Turkish" +msgstr "" + +#: conf/global_settings.py:101 +msgid "Ukrainian" +msgstr "" + +#: conf/global_settings.py:102 +msgid "Vietnamese" +msgstr "" + +#: conf/global_settings.py:103 +msgid "Simplified Chinese" +msgstr "" + +#: conf/global_settings.py:104 +msgid "Traditional Chinese" +msgstr "" + +#: contrib/admin/actions.py:48 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s വിജയകരമായി ഡിലീറ്റ് ചെയ്തു." + +#: contrib/admin/actions.py:55 contrib/admin/options.py:1125 +msgid "Are you sure?" +msgstr "തീര്‍ച്ചയാണോ?" + +#: contrib/admin/actions.py:73 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "തെരഞ്ഞെടുത്ത %(verbose_name_plural)s ഡിലീറ്റ് ചെയ്യുക." + +#: contrib/admin/filterspecs.py:44 +#, python-format +msgid "" +"

By %s:

\n" +"
    \n" +msgstr "" +"

    By %s:

    \n" +"
      \n" + +#: contrib/admin/filterspecs.py:75 contrib/admin/filterspecs.py:92 +#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173 +msgid "All" +msgstr "എല്ലാം" + +#: contrib/admin/filterspecs.py:113 +msgid "Any date" +msgstr "ഏതെങ്കിലും തീയതി" + +#: contrib/admin/filterspecs.py:114 +msgid "Today" +msgstr "ഇന്ന്" + +#: contrib/admin/filterspecs.py:117 +msgid "Past 7 days" +msgstr "കഴിഞ്ഞ ഏഴു ദിവസം" + +#: contrib/admin/filterspecs.py:119 +msgid "This month" +msgstr "ഈ മാസം" + +#: contrib/admin/filterspecs.py:121 +msgid "This year" +msgstr "ഈ വര്‍ഷം" + +#: contrib/admin/filterspecs.py:147 forms/widgets.py:466 +msgid "Yes" +msgstr "അതെ" + +#: contrib/admin/filterspecs.py:147 forms/widgets.py:466 +msgid "No" +msgstr "അല്ല" + +#: contrib/admin/filterspecs.py:154 forms/widgets.py:466 +msgid "Unknown" +msgstr "അജ്ഞാതം" + +#: contrib/admin/helpers.py:20 +msgid "Action:" +msgstr "ആക്ഷന്‍" + +#: contrib/admin/models.py:19 +msgid "action time" +msgstr "ആക്ഷന്‍ സമയം" + +#: contrib/admin/models.py:22 +msgid "object id" +msgstr "ഒബ്ജെക്ട് ഐഡി" + +#: contrib/admin/models.py:23 +msgid "object repr" +msgstr "ഒബ്ജെക്ട് സൂചന" + +#: contrib/admin/models.py:24 +msgid "action flag" +msgstr "ആക്ഷന്‍ ഫ്ളാഗ്" + +#: contrib/admin/models.py:25 +msgid "change message" +msgstr "സന്ദേശം മാറ്റുക" + +#: contrib/admin/models.py:28 +msgid "log entry" +msgstr "ലോഗ് എന്ട്രി" + +#: contrib/admin/models.py:29 +msgid "log entries" +msgstr "ലോഗ് എന്ട്രികള്‍" + +#: contrib/admin/options.py:138 contrib/admin/options.py:153 +msgid "None" +msgstr "ഒന്നുമില്ല" + +#: contrib/admin/options.py:559 +#, python-format +msgid "Changed %s." +msgstr "%s മാറ്റി." + +#: contrib/admin/options.py:559 contrib/admin/options.py:569 +#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845 +#: forms/models.py:568 +msgid "and" +msgstr "ഉം" + +#: contrib/admin/options.py:564 +#, python-format +msgid "Added %(name)s \"%(object)s\"." +msgstr "%(name)s \"%(object)s\" ചേര്‍ത്തു." + +#: contrib/admin/options.py:568 +#, python-format +msgid "Changed %(list)s for %(name)s \"%(object)s\"." +msgstr "%(name)s \"%(object)s\" ന്റെ %(list)s മാറ്റി." + +#: contrib/admin/options.py:573 +#, python-format +msgid "Deleted %(name)s \"%(object)s\"." +msgstr "%(name)s \"%(object)s\" ഡിലീറ്റ് ചെയ്തു." + +#: contrib/admin/options.py:577 +msgid "No fields changed." +msgstr "ഒരു മാറ്റവുമില്ല." + +#: contrib/admin/options.py:643 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" വിജയകരമായി കൂട്ടിച്ചേര്ത്തു." + +#: contrib/admin/options.py:647 contrib/admin/options.py:680 +msgid "You may edit it again below." +msgstr "താഴെ നിന്ന് വീണ്ടും മാറ്റം വരുത്താം" + +#: contrib/admin/options.py:657 contrib/admin/options.py:690 +#, python-format +msgid "You may add another %s below." +msgstr "%s ഒന്നു കൂടി ചേര്‍ക്കാം" + +#: contrib/admin/options.py:678 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "%(name)s \"%(obj)s\" ല്‍ മാറ്റം വരുത്തി." + +#: contrib/admin/options.py:686 +#, python-format +msgid "" +"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "%(name)s \"%(obj)s\" കൂട്ടി ചേര്‍ത്തു. താഴെ നിന്നും മാറ്റം വരുത്താം." + +#: contrib/admin/options.py:740 contrib/admin/options.py:997 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നും മാറ്റിയിട്ടില്ല." + +#: contrib/admin/options.py:759 +msgid "No action selected." +msgstr "ആക്ഷനൊന്നും തെരഞ്ഞെടുത്തില്ല." + +#: contrib/admin/options.py:840 +#, python-format +msgid "Add %s" +msgstr "%s ചേര്‍ക്കുക" + +#: contrib/admin/options.py:866 contrib/admin/options.py:1105 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(key)r എന്ന പ്രാഥമിക കീ ഉള്ള %(name)s വസ്തു ഒന്നും നിലവിലില്ല." + +#: contrib/admin/options.py:931 +#, python-format +msgid "Change %s" +msgstr "%s മാറ്റാം" + +#: contrib/admin/options.py:977 +msgid "Database error" +msgstr "ഡേറ്റാബേസ് തകരാറാണ്." + +#: contrib/admin/options.py:1039 +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." +msgstr[1] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." + +#: contrib/admin/options.py:1066 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s തെരഞ്ഞെടുത്തു." +msgstr[1] "%(total_count)sഉം തെരഞ്ഞെടുത്തു." + +#: contrib/admin/options.py:1071 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s ല്‍ ഒന്നും തെരഞ്ഞെടുത്തില്ല." + +#: contrib/admin/options.py:1118 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" ഡിലീറ്റ് ചെയ്തു." + +#: contrib/admin/options.py:1155 +#, python-format +msgid "Change history: %s" +msgstr "%s ലെ മാറ്റങ്ങള്‍." + +#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:14 +#: contrib/auth/forms.py:81 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "ദയവായി ശരിയായ യൂസര്‍നാമവും പാസ്വേര്ഡും നല്കുക. ഇംഗ്ളീഷ് അക്ഷരങ്ങള്‍ വല്യക്ഷരമാണോ അല്ലയോ എന്നത് " +"ശ്രദ്ധിക്കണം" + +#: contrib/admin/sites.py:307 contrib/admin/views/decorators.py:40 +msgid "Please log in again, because your session has expired." +msgstr "താങ്കളുടെ സെഷന്റെ കാലാവധി കഴിഞ്ഞു. വീണ്ടും ലോഗിന്‍ ചെയ്യണം." + +#: contrib/admin/sites.py:314 contrib/admin/views/decorators.py:47 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "നിങ്ങളുടെ ബ്രൗസര്‍ കുക്കീസ് സ്വീകരിക്കാന്‍ തയ്യാറല്ലെന്നു തോന്നുന്നു. കുക്കീസ് പ്രവര്‍ത്തനക്ഷമമാക്കിയ ശേഷം " +"ഈ പേജ് രീലോഡ് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക." + +#: contrib/admin/sites.py:330 contrib/admin/sites.py:336 +#: contrib/admin/views/decorators.py:66 +msgid "Usernames cannot contain the '@' character." +msgstr "യൂസര്‍നാമത്തില്‍ '@' എന്ന ചിഹ്നം പാടില്ല." + +#: contrib/admin/sites.py:333 contrib/admin/views/decorators.py:62 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "നിങ്ങളുടെ ഇ-മെയില്‍ അഡ്രസ്സ് അല്ല യൂസര്‍നാമം. പകരം '%s' ഉപയോഗിച്ച് നോക്കുക." + +#: contrib/admin/sites.py:389 +msgid "Site administration" +msgstr "സൈറ്റ് ഭരണം" + +#: contrib/admin/sites.py:403 contrib/admin/templates/admin/login.html:26 +#: contrib/admin/templates/registration/password_reset_complete.html:14 +#: contrib/admin/views/decorators.py:20 +msgid "Log in" +msgstr "ലോഗ്-ഇന്‍" + +#: contrib/admin/sites.py:448 +#, python-format +msgid "%s administration" +msgstr "%s ഭരണം" + +#: contrib/admin/widgets.py:75 +msgid "Date:" +msgstr "തീയതി:" + +#: contrib/admin/widgets.py:75 +msgid "Time:" +msgstr "സമയം:" + +#: contrib/admin/widgets.py:99 +msgid "Currently:" +msgstr "" + +#: contrib/admin/widgets.py:99 +msgid "Change:" +msgstr "മാറ്റുക:" + +#: contrib/admin/widgets.py:129 +msgid "Lookup" +msgstr "തിരയുക" + +#: contrib/admin/widgets.py:244 +msgid "Add Another" +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/500.html:4 +#: contrib/admin/templates/admin/app_index.html:8 +#: contrib/admin/templates/admin/base.html:55 +#: contrib/admin/templates/admin/change_form.html:18 +#: contrib/admin/templates/admin/change_list.html:42 +#: contrib/admin/templates/admin/delete_confirmation.html:6 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:6 +#: contrib/admin/templates/admin/invalid_setup.html:4 +#: contrib/admin/templates/admin/object_history.html:6 +#: contrib/admin/templates/admin/auth/user/change_password.html:11 +#: 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:5 +#: contrib/admin/templates/registration/password_reset_complete.html:4 +#: contrib/admin/templates/registration/password_reset_confirm.html:4 +#: contrib/admin/templates/registration/password_reset_done.html:4 +#: contrib/admin/templates/registration/password_reset_form.html:4 +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3 +msgid "Home" +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 (500)" +msgstr "സെര്‍വര്‍ തകരാറാണ് (500)" + +#: 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/actions.html:4 +msgid "Run the selected action" +msgstr "തെരഞ്ഞെടുത്ത ആക്ഷന്‍ നടപ്പിലാക്കുക" + +#: contrib/admin/templates/admin/actions.html:4 +msgid "Go" +msgstr "" + +#: contrib/admin/templates/admin/actions.html:11 +msgid "Click here to select the objects across all pages" +msgstr "എല്ലാ പേജിലേയും വസ്തുക്കള്‍ തെരഞ്ഞെടുക്കാന്‍ ഇവിടെ ക്ലിക് ചെയ്യുക." + +#: contrib/admin/templates/admin/actions.html:11 +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "മുഴുവന്‍ %(total_count)s %(module_name)s ഉം തെരഞ്ഞെടുക്കുക" + +#: contrib/admin/templates/admin/actions.html:13 +msgid "Clear selection" +msgstr "തെരഞ്ഞെടുത്തത് റദ്ദാക്കുക." + +#: contrib/admin/templates/admin/app_index.html:10 +#: contrib/admin/templates/admin/index.html:19 +#, python-format +msgid "%(name)s" +msgstr "" + +#: contrib/admin/templates/admin/base.html:28 +msgid "Welcome," +msgstr "സ്വാഗതം, " + +#: contrib/admin/templates/admin/base.html:33 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3 +msgid "Documentation" +msgstr "സഹായക്കുറിപ്പുകള്‍" + +#: contrib/admin/templates/admin/base.html:41 +#: contrib/admin/templates/admin/auth/user/change_password.html:15 +#: contrib/admin/templates/admin/auth/user/change_password.html:48 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "Change password" +msgstr "പാസ് വേര്‍ഡ് മാറ്റുക." + +#: contrib/admin/templates/admin/base.html:48 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "Log out" +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/change_form.html:21 +#: contrib/admin/templates/admin/index.html:29 +msgid "Add" +msgstr "" + +#: contrib/admin/templates/admin/change_form.html:28 +#: contrib/admin/templates/admin/object_history.html:10 +msgid "History" +msgstr "ചരിത്രം" + +#: contrib/admin/templates/admin/change_form.html:29 +#: contrib/admin/templates/admin/edit_inline/stacked.html:9 +#: contrib/admin/templates/admin/edit_inline/tabular.html:28 +msgid "View on site" +msgstr "" + +#: contrib/admin/templates/admin/change_form.html:39 +#: contrib/admin/templates/admin/change_list.html:71 +#: contrib/admin/templates/admin/auth/user/change_password.html:24 +#: contrib/admin/templates/registration/password_change_form.html:15 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "ദയവായി താഴെയുള്ള തെറ്റ് പരിഹരിക്കുക." +msgstr[1] "ദയവായി താഴെയുള്ള തെറ്റുകള്‍ പരിഹരിക്കുക." + +#: contrib/admin/templates/admin/change_list.html:63 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: contrib/admin/templates/admin/change_list.html:82 +msgid "Filter" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:10 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 +msgid "Delete" +msgstr "" + +#: contrib/admin/templates/admin/delete_confirmation.html:16 +#, 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:23 +#, 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:28 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:33 +msgid "Yes, I'm sure" +msgstr "അതെ, തീര്‍ച്ചയാണ്" + +#: contrib/admin/templates/admin/delete_selected_confirmation.html:9 +msgid "Delete multiple objects" +msgstr "ഒന്നിലേറെ വസ്തുക്കള്‍ ഡിലീറ്റ് ചെയ്തോളൂ" + +#: contrib/admin/templates/admin/delete_selected_confirmation.html:15 +#, python-format +msgid "" +"Deleting the %(object_name)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 ഡിലീറ്റ് ചെയ്യുമ്പോള്‍ അതുമായി ബന്ധമുള്ള വസ്തുക്കളും" +"ഡിലീറ്റ് ആവും. പക്ഷേ നിങ്ങള്‍ക്ക് താഴെ പറഞ്ഞ തരം വസ്തുക്കള്‍ ഡിലീറ്റ് ചെയ്യാനുള്ള അനുമതി ഇല്ല:" + +#: contrib/admin/templates/admin/delete_selected_confirmation.html:22 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(object_name)s objects? All of " +"the following objects and their related items will be deleted:" +msgstr "തെരഞ്ഞെടുത്ത %(object_name)s എല്ലാം ഡിലീറ്റ് ചെയ്യണമെന്ന് തീര്‍ച്ചയാണോ?" +"താഴെപ്പറയുന്ന വസ്തുക്കളും അതുമായി ബന്ധമുള്ളതെല്ലാം ഡിലീറ്റ് ആവും:" + +#: contrib/admin/templates/admin/filter.html:2 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: contrib/admin/templates/admin/index.html:18 +#, python-format +msgid "Models available in the %(name)s application." +msgstr "" + +#: contrib/admin/templates/admin/index.html:35 +msgid "Change" +msgstr "മാറ്റുക" + +#: contrib/admin/templates/admin/index.html:45 +msgid "You don't have permission to edit anything." +msgstr "ഒന്നിലും മാറ്റം വരുത്താനുള്ള അനുമതി ഇല്ല." + +#: contrib/admin/templates/admin/index.html:53 +msgid "Recent Actions" +msgstr "സമീപകാല പ്രവ്രുത്തികള്‍" + +#: contrib/admin/templates/admin/index.html:54 +msgid "My Actions" +msgstr "എന്റെ പ്രവ്രുത്തികള്‍" + +#: contrib/admin/templates/admin/index.html:58 +msgid "None available" +msgstr "ഒന്നും ലഭ്യമല്ല" + +#: contrib/admin/templates/admin/index.html:72 +msgid "Unknown content" +msgstr "ഉള്ളടക്കം അറിയില്ല." + +#: 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 "നിങ്ങളുടെ ഡേറ്റാബേസ് ഇന്‍സ്ടാലേഷനില്‍ എന്തോ പിശകുണ്ട്. ശരിയായ ടേബിളുകള്‍ ഉണ്ടെന്നും ഡേറ്റാബേസ് " +"വായനായോഗ്യമാണെന്നും ഉറപ്പു വരുത്തുക." + +#: contrib/admin/templates/admin/login.html:19 +msgid "Username:" +msgstr "യൂസര്‍ നാമം" + +#: contrib/admin/templates/admin/login.html:22 +msgid "Password:" +msgstr "പാസ് വേര്‍ഡ്" + +#: contrib/admin/templates/admin/object_history.html:22 +msgid "Date/time" +msgstr "തീയതി/സമയം" + +#: contrib/admin/templates/admin/object_history.html:23 +msgid "User" +msgstr "യൂസര്‍" + +#: contrib/admin/templates/admin/object_history.html:24 +msgid "Action" +msgstr "ആക്ഷന്‍" + +#: contrib/admin/templates/admin/object_history.html:38 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "ഈ വസ്തുവിന്റെ മാറ്റങ്ങളുടെ ചരിത്രം ലഭ്യമല്ല. ഒരുപക്ഷെ ഇത് അഡ്മിന്‍ സൈറ്റ് വഴി ചേര്‍ത്തതായിരിക്കില്ല." + +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "എല്ലാം കാണട്ടെ" + +#: contrib/admin/templates/admin/pagination.html:11 +#: contrib/admin/templates/admin/submit_line.html:3 +msgid "Save" +msgstr "സേവ് ചെയ്യണം" + +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Search" +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/submit_line.html:5 +msgid "Save as new" +msgstr "പുതിയതായി സേവ് ചെയ്യണം" + +#: contrib/admin/templates/admin/submit_line.html:6 +msgid "Save and add another" +msgstr "സേവ് ചെയ്ത ശേഷം വേറെ ചേര്‍ക്കണം" + +#: contrib/admin/templates/admin/submit_line.html:7 +msgid "Save and continue editing" +msgstr "സേവ് ചെയ്ത ശേഷം മാറ്റം വരുത്താം" + +#: contrib/admin/templates/admin/auth/user/add_form.html:5 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "ആദ്യം, യൂസര്‍ നാമവും പാസ് വേര്‍ഡും നല്കണം. പിന്നെ, കൂടുതല്‍ കാര്യങ്ങള്‍ മാറ്റാവുന്നതാണ്." + +#: contrib/admin/templates/admin/auth/user/change_password.html:28 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s ന് പുതിയ പാസ് വേര്‍ഡ് നല്കുക." + +#: contrib/admin/templates/admin/auth/user/change_password.html:35 +#: contrib/auth/forms.py:17 contrib/auth/forms.py:61 contrib/auth/forms.py:186 +msgid "Password" +msgstr "പാസ് വേര്‍ഡ്" + +#: contrib/admin/templates/admin/auth/user/change_password.html:41 +#: contrib/admin/templates/registration/password_change_form.html:37 +#: contrib/auth/forms.py:187 +msgid "Password (again)" +msgstr "പാസ് വേര്‍ഡ് (വീണ്ടും)" + +#: contrib/admin/templates/admin/auth/user/change_password.html:42 +#: contrib/auth/forms.py:19 +msgid "Enter the same password as above, for verification." +msgstr "പാസ് വേര്‍ഡ് മുകളിലെ പോലെ തന്നെ നല്കുക. (ഉറപ്പു വരുത്താനാണ്.)" + +#: contrib/admin/templates/admin/edit_inline/stacked.html:64 +#: contrib/admin/templates/admin/edit_inline/tabular.html:110 +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "%(verbose_name)s ഒന്നു കൂടി ചേര്‍ക്കുക" + +#: contrib/admin/templates/admin/edit_inline/stacked.html:67 +#: contrib/admin/templates/admin/edit_inline/tabular.html:113 +#: contrib/comments/templates/comments/delete.html:12 +msgid "Remove" +msgstr "നീക്കം ചെയ്യുക" + +#: contrib/admin/templates/admin/edit_inline/tabular.html:15 +msgid "Delete?" +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_change_done.html:4 +#: contrib/admin/templates/registration/password_change_form.html:5 +#: contrib/admin/templates/registration/password_change_form.html:7 +#: contrib/admin/templates/registration/password_change_form.html:19 +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:21 +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:27 +#: contrib/auth/forms.py:170 +msgid "Old password" +msgstr "പഴയ പാസ് വേര്‍ഡ്" + +#: contrib/admin/templates/registration/password_change_form.html:32 +#: contrib/auth/forms.py:144 +msgid "New password" +msgstr "പുതിയ പാസ് വേര്‍ഡ്" + +#: contrib/admin/templates/registration/password_change_form.html:43 +#: contrib/admin/templates/registration/password_reset_confirm.html:21 +msgid "Change my password" +msgstr "എന്റെ പാസ് വേര്‍ഡ് മാറ്റണം" + +#: contrib/admin/templates/registration/password_reset_complete.html:4 +#: contrib/admin/templates/registration/password_reset_confirm.html:6 +#: 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_complete.html:6 +#: contrib/admin/templates/registration/password_reset_complete.html:10 +msgid "Password reset complete" +msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ പൂര്‍ണം" + +#: contrib/admin/templates/registration/password_reset_complete.html:12 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് തയ്യാര്‍. ഇനി ലോഗ്-ഇന്‍ ചെയ്യാം." + +#: contrib/admin/templates/registration/password_reset_confirm.html:4 +msgid "Password reset confirmation" +msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ ഉറപ്പാക്കല്‍" + +#: contrib/admin/templates/registration/password_reset_confirm.html:12 +msgid "Enter new password" +msgstr "പുതിയ പാസ് വേര്‍ഡ് നല്കൂ" + +#: contrib/admin/templates/registration/password_reset_confirm.html:14 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "ദയവായി നിങ്ങളുടെ പുതിയ പാസ് വേര്‍ഡ് രണ്ടു തവണ നല്കണം. ശരിയായാണ് ടൈപ്പു ചെയ്തത് എന്നു ഉറപ്പിക്കാനാണ്." + +#: contrib/admin/templates/registration/password_reset_confirm.html:18 +msgid "New password:" +msgstr "പുതിയ പാസ് വേര്‍ഡ്:" + +#: contrib/admin/templates/registration/password_reset_confirm.html:20 +msgid "Confirm password:" +msgstr "പാസ് വേര്‍ഡ് ഉറപ്പാക്കൂ:" + +#: contrib/admin/templates/registration/password_reset_confirm.html:26 +msgid "Password reset unsuccessful" +msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ പരാജയം" + +#: contrib/admin/templates/registration/password_reset_confirm.html:28 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new 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 you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കാനായി നിര്‍ദ്ദേശങ്ങള്‍ അടങ്ങിയ ഒരു ഈ-മെയില്‍ നിങ്ങള്‍ നല്കിയ" +"വിലാസത്തില്‍ അയച്ചിട്ടുണ്ട്. അത് നിങ്ങള്‍ക്ക് ഉടന്‍ ലഭിക്കേണ്ടതാണ്." + +#: contrib/admin/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "നിങ്ങള്‍ പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കാന്‍ അപേക്ഷിച്ചതു കൊണ്ടാണ് ഈ ഇ-മെയില്‍ നിങ്ങള്‍ക്ക് ലഭിക്കുന്നത്." + +#: contrib/admin/templates/registration/password_reset_email.html:3 +#, python-format +msgid "for your user account at %(site_name)s" +msgstr "നിങ്ങളുടെ %(site_name)s എന്ന സൈറ്റിലെ അക്കൗണ്ടിനു വേണ്ടി." + +#: contrib/admin/templates/registration/password_reset_email.html:5 +msgid "Please go to the following page and choose a new password:" +msgstr "ദയവായി താഴെ പറയുന്ന പേജ് സന്ദര്‍ശിച്ച് പുതിയ പാസ് വേര്‍ഡ് തെരഞ്ഞെടുക്കുക:" + +#: contrib/admin/templates/registration/password_reset_email.html:9 +msgid "Your username, in case you've forgotten:" +msgstr "നിങ്ങള്‍ മറന്നെങ്കില്‍, നിങ്ങളുടെ യൂസര്‍ നാമം, :" + +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Thanks for using our site!" +msgstr "ഞങ്ങളുടെ സൈറ്റ് ഉപയോഗിച്ചതിന് നന്ദി!" + +#: contrib/admin/templates/registration/password_reset_email.html:13 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: contrib/admin/templates/registration/password_reset_form.html:12 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +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/templatetags/admin_list.py:257 +msgid "All dates" +msgstr "എല്ലാ തീയതികളും" + +#: contrib/admin/views/main.py:65 +#, python-format +msgid "Select %s" +msgstr "%s തെരഞ്ഞെടുക്കൂ" + +#: contrib/admin/views/main.py:65 +#, python-format +msgid "Select %s to change" +msgstr "മാറ്റാനുള്ള %s തെരഞ്ഞെടുക്കൂ" + +#: contrib/admin/views/template.py:38 contrib/sites/models.py:38 +msgid "site" +msgstr "സൈറ്റ്" + +#: contrib/admin/views/template.py:40 +msgid "template" +msgstr "ടെമ്പ്ലേറ്റ്" + +#: contrib/admindocs/views.py:61 contrib/admindocs/views.py:63 +#: contrib/admindocs/views.py:65 +msgid "tag:" +msgstr "ടാഗ്:" + +#: contrib/admindocs/views.py:94 contrib/admindocs/views.py:96 +#: contrib/admindocs/views.py:98 +msgid "filter:" +msgstr "അരിപ്പ:" + +#: contrib/admindocs/views.py:158 contrib/admindocs/views.py:160 +#: contrib/admindocs/views.py:162 +msgid "view:" +msgstr "വ്യൂ" + +#: contrib/admindocs/views.py:190 +#, python-format +msgid "App %r not found" +msgstr "%r എന്ന App കണ്ടില്ല." + +#: contrib/admindocs/views.py:197 +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "%(app_label)r എന്ന Appല്‍ %(model_name)r എന്ന മാത്രുക കണ്ടില്ല." + +#: contrib/admindocs/views.py:209 +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "ബന്ധപ്പെട്ട `%(app_label)s.%(data_type)s` വസ്തു" + +#: contrib/admindocs/views.py:209 contrib/admindocs/views.py:228 +#: contrib/admindocs/views.py:233 contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:261 contrib/admindocs/views.py:266 +msgid "model:" +msgstr "മാത്രുക:" + +#: contrib/admindocs/views.py:224 contrib/admindocs/views.py:256 +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "ബന്ധപ്പെട്ട `%(app_label)s.%(object_name)s` വസ്തുക്കള്‍" + +#: contrib/admindocs/views.py:228 contrib/admindocs/views.py:261 +#, python-format +msgid "all %s" +msgstr "%s എല്ലാം" + +#: contrib/admindocs/views.py:233 contrib/admindocs/views.py:266 +#, python-format +msgid "number of %s" +msgstr "%sന്റെ എണ്ണം" + +#: contrib/admindocs/views.py:271 +#, python-format +msgid "Fields on %s objects" +msgstr "%s വസ്തുക്കളിലെ വിവരങ്ങള്‍" + +#: contrib/admindocs/views.py:361 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s വിലാസ മാത്രുക (urlpattern object) ആണെന്ന് തോന്നുന്നില്ല." + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3 +msgid "Bookmarklets" +msgstr "ബുക്ക് മാര്‍ക്കുകള്‍" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4 +msgid "Documentation bookmarklets" +msgstr "സഹായക്കുറിപ്പുകളുടെ ബുക്ക്മാര്‍ക്കുകള്‍" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8 +msgid "" +"\n" +"

      To install bookmarklets, drag the link to your bookmarks\n" +"toolbar, or right-click the link and add it to your bookmarks. Now you can\n" +"select the bookmarklet from any page in the site. Note that some of these\n" +"bookmarklets require you to be viewing the site from a computer designated\n" +"as \"internal\" (talk to your system administrator if you aren't sure if\n" +"your computer is \"internal\").

      \n" +msgstr "" +"\n" +"

      ബുക്ക്മാര്‍ക്ക്ലെറ്റുകള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യാന്‍, ലിങ്കിനെ നിങ്ങളുടെ ബുക്ക്മാര്‍ക് ടൂള്‍ബാറിലേക്ക് \n" +"വലിച്ചിടുകയോ, ലിങ്കിന്‍മേല്‍ റൈറ്റ്ക്ളിക് ചെയ്ത് ബുക്ക്മാര്‍ക്കായി ചേര്‍ക്കുകയോ ചെയ്യുക. ഇനി സൈറ്റിലെ ഏതു പേജില്‍ നിന്നും\n" +" ഈ ബുക്ക്മാര്ക് തെരഞ്ഞെടുക്കാം. ചില ബുക്ക്മാര്‍ക്കുകള്‍ ഇന്റേണല്‍ ആയ കമ്പ്യൂട്ടറില്‍ നിന്നേ ലഭ്യമാവൂ എന്നു ശ്രദ്ധിക്കണം.\n" +"നിങ്ങളുടെ കംപ്യൂട്ടര്‍ അത്തരത്തില്‍ പെട്ടതാണോ എന്നറിയാന്‍ സിസ്റ്റം അഡ്മിനിസ്ട്രേട്ടറെ ബന്ധപ്പെടുക.

      \n" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18 +msgid "Documentation for this page" +msgstr "ഈ പേജിന്റെ സഹായക്കുറിപ്പുകള്‍" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19 +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "ഏതു പേജില്‍ നിന്നും അതിന്റെ ഉദ്ഭവമായ വ്യൂവിന്റെ സഹായക്കുറിപ്പിലേക്കു ചാടാന്‍" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21 +msgid "Show object ID" +msgstr "വസ്തുവിന്റെ ഐഡി കാണിക്കുക." + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22 +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "ഒറ്റ വസ്തുവിനെ പ്രതിനിധീകരിക്കുന്ന പേജുകളുടെ ഉള്ളടക്കത്തിന്റെ തരവും തനതായ IDയും കാണിക്കുന്നു." + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24 +msgid "Edit this object (current window)" +msgstr "ഈ വസ്തുവില് മാറ്റം വരുത്തുക (ഇതേ വിന്‍ഡോ)" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25 +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "ഒറ്റ വസ്തുവിനെ പ്രതിനിധീകരിക്കുന്ന പേജുകള്‍ക്കുള്ള അഡ്മിന്‍ പേജിലേക്ക് ചാടുന്നു." + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27 +msgid "Edit this object (new window)" +msgstr "ഈ വസ്തുവില് മാറ്റം വരുത്തുക (പുതിയ വിന്‍ഡോ)" + +#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28 +msgid "As above, but opens the admin page in a new window." +msgstr "മുകളിലേതു പോലെ, പക്ഷെ, അഡ്മിന്‍ പേജ് പുതിയ വിന്ഡോവിലാണ് തുറക്കുക." + +#: contrib/auth/admin.py:29 +msgid "Personal info" +msgstr "വ്യക്തിപരമായ വിവരങ്ങള്‍" + +#: contrib/auth/admin.py:30 +msgid "Permissions" +msgstr "അനുമതികള്‍" + +#: contrib/auth/admin.py:31 +msgid "Important dates" +msgstr "പ്രധാന തീയതികള്‍" + +#: contrib/auth/admin.py:32 +msgid "Groups" +msgstr "ഗ്രൂപ്പുകള്‍" + +#: contrib/auth/admin.py:114 +msgid "Password changed successfully." +msgstr "പാസ് വേര്‍ഡ് മാറ്റിയിരിക്കുന്നു." + +#: contrib/auth/admin.py:124 +#, python-format +msgid "Change password: %s" +msgstr "പാസ് വേര്‍ഡ് മാറ്റുക: %s" + +#: contrib/auth/forms.py:14 contrib/auth/forms.py:48 contrib/auth/forms.py:60 +msgid "Username" +msgstr "യൂസര്‍ നാമം (ഉപയോക്ത്രു നാമം)" + +#: contrib/auth/forms.py:15 contrib/auth/forms.py:49 +msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "നിര്‍ബന്ധം. 30 ഓ അതില്‍ കുറവോ ചിഹ്നങ്ങള്‍. അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, " +"പിന്നെ @/./+/-/_എന്നിവയും മാത്രം." + +#: contrib/auth/forms.py:16 contrib/auth/forms.py:50 +msgid "This value may contain only letters, numbers and @/./+/-/_ characters." +msgstr "അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, പിന്നെ @/./+/-/_എന്നിവയും മാത്രം." + +#: contrib/auth/forms.py:18 +msgid "Password confirmation" +msgstr "പാസ് വേര്‍ഡ് ഉറപ്പാക്കല്‍" + +#: contrib/auth/forms.py:31 +msgid "A user with that username already exists." +msgstr "ആ പേരുള്ള ഒരു ഉപയോക്താവ് നിലവിലുണ്ട്." + +#: contrib/auth/forms.py:37 contrib/auth/forms.py:156 +#: contrib/auth/forms.py:198 +msgid "The two password fields didn't match." +msgstr "പാസ് വേര്‍ഡ് നല്കിയ കള്ളികള്‍ രണ്ടും തമ്മില്‍ സാമ്യമില്ല." + +#: contrib/auth/forms.py:83 +msgid "This account is inactive." +msgstr "ഈ അക്കൗണ്ട് മരവിപ്പിച്ചതാണ്." + +#: contrib/auth/forms.py:88 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "നിങ്ങളുടെ വെബ്-ബ്രൗസറിലെ കുക്കീസൊന്നും പ്രവര്‍ത്തിക്കുന്നില്ല. ഇതിലേക്ക് പ്രവേശിക്കാന്‍ അവ ആവശ്യമാണ്." + +#: contrib/auth/forms.py:101 +msgid "E-mail" +msgstr "ഇ-മെയില്‍" + +#: contrib/auth/forms.py:110 +msgid "" +"That e-mail address doesn't have an associated user account. Are you sure " +"you've registered?" +msgstr "ആ ഇ-മെയിലുമായി ബന്ധപ്പെട്ട യൂസര് അക്കൗണ്ടൊന്നും നിലവിലില്ല. രജിസ്റ്റര്‍ ചെയ്തെന്നു തീര്‍ച്ചയാണോ?" + +#: contrib/auth/forms.py:136 +#, python-format +msgid "Password reset on %s" +msgstr "%s ലെ പാസ് വേര്‍ഡ് പുനസ്ഥാപിച്ചു." + +#: contrib/auth/forms.py:145 +msgid "New password confirmation" +msgstr "പുതിയ പാസ് വേര്‍ഡ് ഉറപ്പാക്കല്‍" + +#: contrib/auth/forms.py:178 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "നിങ്ങളുടെ പഴയ പാസ് വേര്‍ഡ് തെറ്റായാണ് നല്കിയത്. തിരുത്തുക." + +#: contrib/auth/models.py:66 contrib/auth/models.py:94 +msgid "name" +msgstr "പേര്" + +#: contrib/auth/models.py:68 +msgid "codename" +msgstr "കോഡ്-നാമം" + +#: contrib/auth/models.py:72 +msgid "permission" +msgstr "അനുമതി" + +#: contrib/auth/models.py:73 contrib/auth/models.py:95 +msgid "permissions" +msgstr "അനുമതികള്‍" + +#: contrib/auth/models.py:98 +msgid "group" +msgstr "ഗ്രൂപ്പ്" + +#: contrib/auth/models.py:99 contrib/auth/models.py:206 +msgid "groups" +msgstr "ഗ്രൂപ്പുകള്‍" + +#: contrib/auth/models.py:196 +msgid "username" +msgstr "യൂസര്‍ നാമം (ഉപയോക്ത്രു നാമം)" + +#: contrib/auth/models.py:196 +msgid "" +"Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters" +msgstr "നിര്‍ബന്ധം. 30 ഓ അതില്‍ കുറവോ ചിഹ്നങ്ങള്‍. അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, " +"പിന്നെ @/./+/-/_എന്നിവയും മാത്രം." + +#: contrib/auth/models.py:197 +msgid "first name" +msgstr "പേര് - ആദ്യഭാഗം" + +#: contrib/auth/models.py:198 +msgid "last name" +msgstr "പേര് - അന്ത്യഭാഗം" + +#: contrib/auth/models.py:199 +msgid "e-mail address" +msgstr "ഇ-മെയില്‍ വിലാസം" + +#: contrib/auth/models.py:200 +msgid "password" +msgstr "പാസ് വേര്‍ഡ്" + +#: contrib/auth/models.py:200 +msgid "" +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." +msgstr "'[algo]$[salt]$[hexdigest]' അല്ലെങ്കില്‍ പാസ് വേര്‍ഡ് " +"മാറ്റാനുള്ള ഫോം ഉപയോഗിക്കുക." + +#: contrib/auth/models.py:201 +msgid "staff status" +msgstr "സ്റ്റാഫ് പദവി" + +#: contrib/auth/models.py:201 +msgid "Designates whether the user can log into this admin site." +msgstr "ഈ യൂസര്‍ക്ക് ഈ അഡ്മിന് സൈറ്റിലേക്ക് പ്രവേശിക്കാമോ എന്നു വ്യക്തമാക്കാന്‍" + +#: contrib/auth/models.py:202 +msgid "active" +msgstr "സജീവം" + +#: contrib/auth/models.py:202 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "ഈ യൂസര്‍ സജീവമാണോയെന്ന് വ്യക്തമാക്കുന്നു. അക്കൗണ്ട് ഡിലീറ്റ് ചെയ്യുന്നതിനു പകരം ഇത് ഒഴിവാക്കുക." + +#: contrib/auth/models.py:203 +msgid "superuser status" +msgstr "സൂപ്പര്‍-യൂസര്‍ പദവി" + +#: contrib/auth/models.py:203 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "ഈ ഉപയോക്താവിന് എടുത്തു പറയാതെ തന്നെ എല്ലാ അനുമതികളും ലഭിക്കുന്നതാണെന്ന് വ്യക്തമാക്കുന്നു" + +#: contrib/auth/models.py:204 +msgid "last login" +msgstr "അവസാനമായി ലോഗിന്‍ ചെയ്തതു" + +#: contrib/auth/models.py:205 +msgid "date joined" +msgstr "ചേര്‍ന്ന തീയതി" + +#: contrib/auth/models.py:207 +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:208 +msgid "user permissions" +msgstr "യൂസര്‍ (ഉപയോക്താവ്)നുള്ള അനുമതികള്‍" + +#: contrib/auth/models.py:212 contrib/comments/models.py:50 +#: contrib/comments/models.py:168 +msgid "user" +msgstr "യൂസര്‍ (ഉപയോക്താവ്)" + +#: contrib/auth/models.py:213 +msgid "users" +msgstr "യൂസേര്‍സ് (ഉപയോക്താക്കള്‍)" + +#: contrib/auth/models.py:394 +msgid "message" +msgstr "സന്ദേശം" + +#: contrib/auth/views.py:79 +msgid "Logged out" +msgstr "ലോഗ്-ഔട്ട് ചെയ്തു (പുറത്തിറങ്ങി)" + +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 forms/fields.py:427 +msgid "Enter a valid e-mail address." +msgstr "ശരിയായ ഇ-മെയില്‍ വിലാസം നല്കുക." + +#: contrib/comments/admin.py:12 +msgid "Content" +msgstr "ഉള്ളടക്കം" + +#: contrib/comments/admin.py:15 +msgid "Metadata" +msgstr "" + +#: contrib/comments/admin.py:40 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "അടയാളപ്പെടുത്തി" +msgstr[1] "അടയാളപ്പെടുത്തി" + +#: contrib/comments/admin.py:41 +msgid "Flag selected comments" +msgstr "തെരഞ്ഞെടുത്ത അഭിപ്രായങ്ങള്‍ അടയാളപ്പെടുത്തുക" + +#: contrib/comments/admin.py:45 +msgid "approved" +msgid_plural "approved" +msgstr[0] "അംഗീകരിച്ചു" +msgstr[1] "അംഗീകരിച്ചു" + +#: contrib/comments/admin.py:46 +msgid "Approve selected comments" +msgstr "തെരഞ്ഞെടുത്ത അഭിപ്രായങ്ങള്‍ അംഗീകരിക്കുക" + +#: contrib/comments/admin.py:50 +msgid "removed" +msgid_plural "removed" +msgstr[0] "നീക്കം ചെയ്തു" +msgstr[1] "നീക്കം ചെയ്തു" + +#: contrib/comments/admin.py:51 +msgid "Remove selected comments" +msgstr "തെരഞ്ഞെടുത്ത അഭിപ്രായങ്ങള്‍ നീക്കം ചെയ്യുക" + +#: contrib/comments/admin.py:63 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "1 അഭിപ്രായം വിജയകരമായി %(action)s." +msgstr[1] "%(count)s അഭിപ്രായങ്ങള്‍ വിജയകരമായി %(action)s." + +#: contrib/comments/feeds.py:13 +#, python-format +msgid "%(site_name)s comments" +msgstr "%(site_name)s അഭിപ്രായങ്ങള്‍" + +#: contrib/comments/feeds.py:23 +#, python-format +msgid "Latest comments on %(site_name)s" +msgstr "%(site_name)s ലെ ഏറ്റവും പുതിയ അഭിപ്രായങ്ങള്‍" + +#: contrib/comments/forms.py:93 +msgid "Name" +msgstr "പേര്" + +#: contrib/comments/forms.py:94 +msgid "Email address" +msgstr "ഇ-മെയില്‍ വിലാസം" + +#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 +#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +msgid "URL" +msgstr "URL(വെബ്-വിലാസം)" + +#: contrib/comments/forms.py:96 +msgid "Comment" +msgstr "അഭിപ്രായം" + +#: contrib/comments/forms.py:175 +#, 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 എന്നീ വാക്കുകള്‍ ഇവിടെ അനുവദനീയമല്ല." + +#: contrib/comments/forms.py:182 +msgid "" +"If you enter anything in this field your comment will be treated as spam" +msgstr "ഈ കള്ളിയില്‍ എന്തെങ്കിലും രേഖപ്പെടുത്തിയാല്‍ നിങ്ങളുടെ അഭിപ്രായം സ്പാം ആയി കണക്കാക്കും" + +#: contrib/comments/models.py:22 contrib/contenttypes/models.py:81 +msgid "content type" +msgstr "ഏതു തരം ഉള്ളടക്കം" + +#: contrib/comments/models.py:24 +msgid "object ID" +msgstr "വസ്തു ID" + +#: contrib/comments/models.py:52 +msgid "user's name" +msgstr "യൂസറുടെ പേര്" + +#: contrib/comments/models.py:53 +msgid "user's email address" +msgstr "യൂസറുടെ ഇ-മെയില്‍ വിലാസം" + +#: contrib/comments/models.py:54 +msgid "user's URL" +msgstr "യൂസറുടെ URL" + +#: contrib/comments/models.py:56 contrib/comments/models.py:76 +#: contrib/comments/models.py:169 +msgid "comment" +msgstr "അഭിപ്രായം" + +#: contrib/comments/models.py:59 +msgid "date/time submitted" +msgstr "സമര്‍പ്പിച്ച തീയതി/സമയം" + +#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +msgid "IP address" +msgstr "IP വിലാസം" + +#: contrib/comments/models.py:61 +msgid "is public" +msgstr "പരസ്യമാണ്" + +#: contrib/comments/models.py:62 +msgid "" +"Uncheck this box to make the comment effectively disappear from the site." +msgstr "അഭിപ്രായം സൈറ്റില്‍ നിന്നും ഫലപ്രദമായി നീക്കം ചെയ്യാന്‍ ഈ ബോക്സിലെ ടിക് ഒഴിവാക്കുക." + +#: contrib/comments/models.py:64 +msgid "is removed" +msgstr "നീക്കം ചെയ്തു." + +#: contrib/comments/models.py:65 +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:77 +msgid "comments" +msgstr "അഭിപ്രായങ്ങള്‍" + +#: contrib/comments/models.py:119 +msgid "" +"This comment was posted by an authenticated user and thus the name is read-" +"only." +msgstr "ഈ അഭിപ്രായം ഒരു അംഗീകൃത യൂസര്‍ രേഖപ്പെടുത്തിയതാണ്. അതിനാല്‍ പേര് വായിക്കാന്‍ മാത്രം." + +#: contrib/comments/models.py:128 +msgid "" +"This comment was posted by an authenticated user and thus the email is read-" +"only." +msgstr "ഈ അഭിപ്രായം ഒരു അംഗീകൃത യൂസര്‍ രേഖപ്പെടുത്തിയതാണ്. അതിനാല്‍ ഇ-മെയില്‍ വിലാസം വായിക്കാന്‍ മാത്രം." + +#: contrib/comments/models.py:153 +#, python-format +msgid "" +"Posted by %(user)s at %(date)s\n" +"\n" +"%(comment)s\n" +"\n" +"http://%(domain)s%(url)s" +msgstr "" +"%(date)sന് %(user)s രേഖപ്പെടുത്തിയത്:\n" +"\n" +"%(comment)s\n" +"\n" +"http://%(domain)s%(url)s" + +#: contrib/comments/models.py:170 +msgid "flag" +msgstr "അടയാളം" + +#: contrib/comments/models.py:171 +msgid "date" +msgstr "തീയതി" + +#: contrib/comments/models.py:181 +msgid "comment flag" +msgstr "അഭിപ്രായ അടയാളം" + +#: contrib/comments/models.py:182 +msgid "comment flags" +msgstr "അഭിപ്രായ അടയാളങ്ങള്‍" + +#: contrib/comments/templates/comments/approve.html:4 +msgid "Approve a comment" +msgstr "അഭിപ്രായം അംഗീകരിക്കൂ" + +#: contrib/comments/templates/comments/approve.html:7 +msgid "Really make this comment public?" +msgstr "ശരിക്കും ഈ അഭിപ്രായം പരസ്യമാക്കണോ?" + +#: contrib/comments/templates/comments/approve.html:12 +msgid "Approve" +msgstr "അംഗീകരിക്കൂ" + +#: contrib/comments/templates/comments/approved.html:4 +msgid "Thanks for approving" +msgstr "അംഗീകരിച്ചതിനു നന്ദി" + +#: contrib/comments/templates/comments/approved.html:7 +#: contrib/comments/templates/comments/deleted.html:7 +#: contrib/comments/templates/comments/flagged.html:7 +msgid "" +"Thanks for taking the time to improve the quality of discussion on our site" +msgstr "നമ്മുടെ സൈറ്റിലെ ചര്‍ച്ചകളുടെ നിലവാരം ഉയര്‍ത്താന്‍ സമയം ചെലവഴിച്ചതിനു നന്ദി." + +#: contrib/comments/templates/comments/delete.html:4 +msgid "Remove a comment" +msgstr "അഭിപ്രായം നീക്കം ചെയ്യൂ" + +#: contrib/comments/templates/comments/delete.html:7 +msgid "Really remove this comment?" +msgstr "ഈ അഭിപ്രായം ശരിക്കും നീക്കം ചെയ്യണോ?" + +#: contrib/comments/templates/comments/deleted.html:4 +msgid "Thanks for removing" +msgstr "നീക്കം ചെയ്തതിനു നന്ദി" + +#: contrib/comments/templates/comments/flag.html:4 +msgid "Flag this comment" +msgstr "ഈ അഭിപ്രായം അടയാളപ്പെടുത്തൂ" + +#: contrib/comments/templates/comments/flag.html:7 +msgid "Really flag this comment?" +msgstr "ഈ അഭിപ്രായം ശരിക്കും അടയാളപ്പെടുത്തണോ?" + +#: contrib/comments/templates/comments/flag.html:12 +msgid "Flag" +msgstr "അടയാളം" + +#: contrib/comments/templates/comments/flagged.html:4 +msgid "Thanks for flagging" +msgstr "അടയാളപ്പെടുത്തിയതിനു നന്ദി" + +#: contrib/comments/templates/comments/form.html:17 +#: contrib/comments/templates/comments/preview.html:32 +msgid "Post" +msgstr "രേഖപ്പെടുത്തൂ" + +#: contrib/comments/templates/comments/form.html:18 +#: contrib/comments/templates/comments/preview.html:33 +msgid "Preview" +msgstr "അവലോകനം" + +#: contrib/comments/templates/comments/posted.html:4 +msgid "Thanks for commenting" +msgstr "അഭിപ്രായം രേഖപ്പെടുത്തിയതിനു നന്ദി" + +#: contrib/comments/templates/comments/posted.html:7 +msgid "Thank you for your comment" +msgstr "അഭിപ്രായത്തിനു നന്ദി" + +#: contrib/comments/templates/comments/preview.html:4 +#: contrib/comments/templates/comments/preview.html:13 +msgid "Preview your comment" +msgstr "അഭിപ്രായം അവലോകനം ചെയ്യുക" + +#: contrib/comments/templates/comments/preview.html:11 +msgid "Please correct the error below" +msgid_plural "Please correct the errors below" +msgstr[0] "ദയവായി താഴെ പറയുന്ന തെറ്റ് തിരുത്തുക" +msgstr[1] "ദയവായി താഴെ പറയുന്ന തെറ്റുകള്‍ തിരുത്തുക" + +#: contrib/comments/templates/comments/preview.html:16 +msgid "Post your comment" +msgstr "അഭിപ്രായം രേഖപ്പെടുത്തുക" + +#: contrib/comments/templates/comments/preview.html:16 +msgid "or make changes" +msgstr "അല്ലെങ്കില്‍ മാറ്റം വരുത്തുക." + +#: contrib/contenttypes/models.py:77 +msgid "python model class name" +msgstr "" + +#: contrib/contenttypes/models.py:82 +msgid "content types" +msgstr "ഉള്ളടക്കം ഏതൊക്കെ തരം" + +#: contrib/flatpages/admin.py:9 +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "ഉദാ: '/about/contact/'. ആദ്യവും അവസാനവും സ്ളാഷുകള്‍ നിര്‍ബന്ധം." + +#: contrib/flatpages/admin.py:11 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "ഇതില്‍ അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, വരകള്‍, സ്ളാഷുകള്‍ എന്നിവ മാത്രമേ പാടുള്ളൂ. " + +#: contrib/flatpages/admin.py:22 +msgid "Advanced options" +msgstr "ഉയര്‍ന്ന സൗകര്യങ്ങള്‍" + +#: contrib/flatpages/models.py:8 +msgid "title" +msgstr "ശീര്‍ഷകം" + +#: contrib/flatpages/models.py:9 +msgid "content" +msgstr "ഉള്ളടക്കം" + +#: contrib/flatpages/models.py:10 +msgid "enable comments" +msgstr "അഭിപ്രായങ്ങള്‍ അനുവദിക്കുക" + +#: contrib/flatpages/models.py:11 +msgid "template name" +msgstr "ടെമ്പ്ലേറ്റിന്റെ പേര്" + +#: contrib/flatpages/models.py:12 +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:13 +msgid "registration required" +msgstr "രജിസ്ട്രേഷന്‍ ആവശ്യമാണ്" + +#: contrib/flatpages/models.py:13 +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/formtools/wizard.py:140 +msgid "" +"We apologize, but your form has expired. Please continue filling out the " +"form from this page." +msgstr "ക്ഷമിക്കണം, താങ്കളുടെ ഫോം കാലഹരണപ്പെട്ടു കഴിഞ്ഞു. ദയവായി ഈ പേജിലെ ഫോം പൂരിപ്പിച്ച് തുടരുക." + +#: contrib/gis/db/models/fields.py:50 +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +#: contrib/gis/db/models/fields.py:270 +msgid "Point" +msgstr "ബിന്ദു" + +#: contrib/gis/db/models/fields.py:274 +msgid "Line string" +msgstr "" + +#: contrib/gis/db/models/fields.py:278 +msgid "Polygon" +msgstr "ബഹുഭുജം" + +#: contrib/gis/db/models/fields.py:282 +msgid "Multi-point" +msgstr "ബഹുബിന്ദു" + +#: contrib/gis/db/models/fields.py:286 +msgid "Multi-line string" +msgstr "" + +#: contrib/gis/db/models/fields.py:290 +msgid "Multi polygon" +msgstr "ബഹു ബഹുഭുജം" + +#: contrib/gis/db/models/fields.py:294 +msgid "Geometry collection" +msgstr "ജ്യാമിതി ശേഖരം" + +#: contrib/gis/forms/fields.py:17 +msgid "No geometry value provided." +msgstr "" + +#: contrib/gis/forms/fields.py:18 +msgid "Invalid geometry value." +msgstr "" + +#: contrib/gis/forms/fields.py:19 +msgid "Invalid geometry type." +msgstr "" + +#: contrib/gis/forms/fields.py:20 +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "th" +msgstr "ആം" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "st" +msgstr "ആം" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "nd" +msgstr "ആം" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "rd" +msgstr "ആം" + +#: contrib/humanize/templatetags/humanize.py:51 +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f മില്ല്യണ്‍ (ദശലക്ഷം)" +msgstr[1] "%(value).1f മില്ല്യണ്‍ (ദശലക്ഷം)" + +#: contrib/humanize/templatetags/humanize.py:54 +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f ബില്ല്യണ്‍ (ശതകോടി)" +msgstr[1] "%(value).1f ബില്ല്യണ്‍ (ശതകോടി)" + +#: contrib/humanize/templatetags/humanize.py:57 +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f ട്രില്ല്യണ്‍ (ലക്ഷം കോടി)" +msgstr[1] "%(value).1f ട്രില്ല്യണ്‍ (ലക്ഷം കോടി)" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "one" +msgstr "ഒന്ന്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "two" +msgstr "രണ്ട്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "three" +msgstr "മൂന്ന്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "four" +msgstr "നാല്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "five" +msgstr "അഞ്ച്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "six" +msgstr "ആറ്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "seven" +msgstr "ഏഴ്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "eight" +msgstr "എട്ട്" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "nine" +msgstr "ഒന്‍പത്" + +#: contrib/humanize/templatetags/humanize.py:93 +msgid "today" +msgstr "ഇന്ന്" + +#: contrib/humanize/templatetags/humanize.py:95 +msgid "tomorrow" +msgstr "നാളെ" + +#: contrib/humanize/templatetags/humanize.py:97 +msgid "yesterday" +msgstr "ഇന്നലെ" + +#: contrib/localflavor/ar/forms.py:28 +msgid "Enter a postal code in the format NNNN or ANNNNAAA." +msgstr "" + +#: contrib/localflavor/ar/forms.py:50 contrib/localflavor/br/forms.py:92 +#: contrib/localflavor/br/forms.py:131 contrib/localflavor/pe/forms.py:24 +#: contrib/localflavor/pe/forms.py:52 +msgid "This field requires only numbers." +msgstr "" + +#: contrib/localflavor/ar/forms.py:51 +msgid "This field requires 7 or 8 digits." +msgstr "" + +#: contrib/localflavor/ar/forms.py:80 +msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format." +msgstr "" + +#: contrib/localflavor/ar/forms.py:81 +msgid "Invalid CUIT." +msgstr "" + +#: contrib/localflavor/at/at_states.py:5 +msgid "Burgenland" +msgstr "" + +#: contrib/localflavor/at/at_states.py:6 +msgid "Carinthia" +msgstr "" + +#: contrib/localflavor/at/at_states.py:7 +msgid "Lower Austria" +msgstr "" + +#: contrib/localflavor/at/at_states.py:8 +msgid "Upper Austria" +msgstr "" + +#: contrib/localflavor/at/at_states.py:9 +msgid "Salzburg" +msgstr "" + +#: contrib/localflavor/at/at_states.py:10 +msgid "Styria" +msgstr "" + +#: contrib/localflavor/at/at_states.py:11 +msgid "Tyrol" +msgstr "" + +#: contrib/localflavor/at/at_states.py:12 +msgid "Vorarlberg" +msgstr "" + +#: contrib/localflavor/at/at_states.py:13 +msgid "Vienna" +msgstr "" + +#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:17 +#: contrib/localflavor/no/forms.py:13 +msgid "Enter a zip code in the format XXXX." +msgstr "" + +#: contrib/localflavor/at/forms.py:48 +msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format." +msgstr "" + +#: contrib/localflavor/au/forms.py:17 +msgid "Enter a 4 digit post code." +msgstr "" + +#: contrib/localflavor/br/forms.py:17 +msgid "Enter a zip code in the format XXXXX-XXX." +msgstr "" + +#: contrib/localflavor/br/forms.py:26 +msgid "Phone numbers must be in XX-XXXX-XXXX format." +msgstr "" + +#: contrib/localflavor/br/forms.py:54 +msgid "" +"Select a valid brazilian state. That state is not one of the available " +"states." +msgstr "" + +#: contrib/localflavor/br/forms.py:90 +msgid "Invalid CPF number." +msgstr "" + +#: contrib/localflavor/br/forms.py:91 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "" + +#: contrib/localflavor/br/forms.py:130 +msgid "Invalid CNPJ number." +msgstr "" + +#: contrib/localflavor/br/forms.py:132 +msgid "This field requires at least 14 digits" +msgstr "" + +#: contrib/localflavor/ca/forms.py:25 +msgid "Enter a postal code in the format XXX XXX." +msgstr "" + +#: contrib/localflavor/ca/forms.py:96 +msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format." +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:6 +msgid "Appenzell Innerrhoden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:7 +msgid "Appenzell Ausserrhoden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:8 +msgid "Basel-Stadt" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:9 +msgid "Basel-Land" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:10 +msgid "Berne" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:11 +msgid "Fribourg" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:12 +msgid "Geneva" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:13 +msgid "Glarus" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:14 +msgid "Graubuenden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:15 +msgid "Jura" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:16 +msgid "Lucerne" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:17 +msgid "Neuchatel" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:18 +msgid "Nidwalden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:19 +msgid "Obwalden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:20 +msgid "Schaffhausen" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:21 +msgid "Schwyz" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:22 +msgid "Solothurn" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:23 +msgid "St. Gallen" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:24 +msgid "Thurgau" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:25 +msgid "Ticino" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:26 +msgid "Uri" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:27 +msgid "Valais" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:28 +msgid "Vaud" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:29 +msgid "Zug" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:30 +msgid "Zurich" +msgstr "" + +#: contrib/localflavor/ch/forms.py:65 +msgid "" +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "" + +#: contrib/localflavor/cl/forms.py:30 +msgid "Enter a valid Chilean RUT." +msgstr "" + +#: contrib/localflavor/cl/forms.py:31 +msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "" + +#: contrib/localflavor/cl/forms.py:32 +msgid "The Chilean RUT is not valid." +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:8 +msgid "Prague" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:9 +msgid "Central Bohemian Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:10 +msgid "South Bohemian Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:11 +msgid "Pilsen Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:12 +msgid "Carlsbad Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:13 +msgid "Usti Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:14 +msgid "Liberec Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:15 +msgid "Hradec Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:16 +msgid "Pardubice Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:17 +msgid "Vysocina Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:18 +msgid "South Moravian Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:19 +msgid "Olomouc Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:20 +msgid "Zlin Region" +msgstr "" + +#: contrib/localflavor/cz/cz_regions.py:21 +msgid "Moravian-Silesian Region" +msgstr "" + +#: contrib/localflavor/cz/forms.py:28 contrib/localflavor/sk/forms.py:30 +msgid "Enter a postal code in the format XXXXX or XXX XX." +msgstr "" + +#: contrib/localflavor/cz/forms.py:48 +msgid "Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX." +msgstr "" + +#: contrib/localflavor/cz/forms.py:49 +msgid "Invalid optional parameter Gender, valid values are 'f' and 'm'" +msgstr "" + +#: contrib/localflavor/cz/forms.py:50 +msgid "Enter a valid birth number." +msgstr "" + +#: contrib/localflavor/cz/forms.py:107 +msgid "Enter a valid IC number." +msgstr "" + +#: contrib/localflavor/de/de_states.py:5 +msgid "Baden-Wuerttemberg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:6 +msgid "Bavaria" +msgstr "" + +#: contrib/localflavor/de/de_states.py:7 +msgid "Berlin" +msgstr "" + +#: contrib/localflavor/de/de_states.py:8 +msgid "Brandenburg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:9 +msgid "Bremen" +msgstr "" + +#: contrib/localflavor/de/de_states.py:10 +msgid "Hamburg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:11 +msgid "Hessen" +msgstr "" + +#: contrib/localflavor/de/de_states.py:12 +msgid "Mecklenburg-Western Pomerania" +msgstr "" + +#: contrib/localflavor/de/de_states.py:13 +msgid "Lower Saxony" +msgstr "" + +#: contrib/localflavor/de/de_states.py:14 +msgid "North Rhine-Westphalia" +msgstr "" + +#: contrib/localflavor/de/de_states.py:15 +msgid "Rhineland-Palatinate" +msgstr "" + +#: contrib/localflavor/de/de_states.py:16 +msgid "Saarland" +msgstr "" + +#: contrib/localflavor/de/de_states.py:17 +msgid "Saxony" +msgstr "" + +#: contrib/localflavor/de/de_states.py:18 +msgid "Saxony-Anhalt" +msgstr "" + +#: contrib/localflavor/de/de_states.py:19 +msgid "Schleswig-Holstein" +msgstr "" + +#: contrib/localflavor/de/de_states.py:20 +msgid "Thuringia" +msgstr "" + +#: contrib/localflavor/de/forms.py:15 contrib/localflavor/fi/forms.py:13 +#: contrib/localflavor/fr/forms.py:16 +msgid "Enter a zip code in the format XXXXX." +msgstr "" + +#: contrib/localflavor/de/forms.py:42 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:5 +msgid "Arava" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:6 +msgid "Albacete" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:7 +msgid "Alacant" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:8 +msgid "Almeria" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:9 +msgid "Avila" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:10 +msgid "Badajoz" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:11 +msgid "Illes Balears" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:12 +msgid "Barcelona" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:13 +msgid "Burgos" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:14 +msgid "Caceres" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:15 +msgid "Cadiz" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:16 +msgid "Castello" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:17 +msgid "Ciudad Real" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:18 +msgid "Cordoba" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:19 +msgid "A Coruna" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:20 +msgid "Cuenca" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:21 +msgid "Girona" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:22 +msgid "Granada" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:23 +msgid "Guadalajara" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:24 +msgid "Guipuzkoa" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:25 +msgid "Huelva" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:26 +msgid "Huesca" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:27 +msgid "Jaen" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:28 +msgid "Leon" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:29 +msgid "Lleida" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:30 +#: contrib/localflavor/es/es_regions.py:17 +msgid "La Rioja" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:31 +msgid "Lugo" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:32 +#: contrib/localflavor/es/es_regions.py:18 +msgid "Madrid" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:33 +msgid "Malaga" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:34 +msgid "Murcia" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:35 +msgid "Navarre" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:36 +msgid "Ourense" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:37 +msgid "Asturias" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:38 +msgid "Palencia" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:39 +msgid "Las Palmas" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:40 +msgid "Pontevedra" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:41 +msgid "Salamanca" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:42 +msgid "Santa Cruz de Tenerife" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:43 +#: contrib/localflavor/es/es_regions.py:11 +msgid "Cantabria" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:44 +msgid "Segovia" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:45 +msgid "Seville" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:46 +msgid "Soria" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:47 +msgid "Tarragona" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:48 +msgid "Teruel" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:49 +msgid "Toledo" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:50 +msgid "Valencia" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:51 +msgid "Valladolid" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:52 +msgid "Bizkaia" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:53 +msgid "Zamora" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:54 +msgid "Zaragoza" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:55 +msgid "Ceuta" +msgstr "" + +#: contrib/localflavor/es/es_provinces.py:56 +msgid "Melilla" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:5 +msgid "Andalusia" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:6 +msgid "Aragon" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:7 +msgid "Principality of Asturias" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:8 +msgid "Balearic Islands" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:9 +msgid "Basque Country" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:10 +msgid "Canary Islands" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:12 +msgid "Castile-La Mancha" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:13 +msgid "Castile and Leon" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:14 +msgid "Catalonia" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:15 +msgid "Extremadura" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:16 +msgid "Galicia" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:19 +msgid "Region of Murcia" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:20 +msgid "Foral Community of Navarre" +msgstr "" + +#: contrib/localflavor/es/es_regions.py:21 +msgid "Valencian Community" +msgstr "" + +#: contrib/localflavor/es/forms.py:20 +msgid "Enter a valid postal code in the range and format 01XXX - 52XXX." +msgstr "" + +#: contrib/localflavor/es/forms.py:40 +msgid "" +"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or " +"9XXXXXXXX." +msgstr "" + +#: contrib/localflavor/es/forms.py:67 +msgid "Please enter a valid NIF, NIE, or CIF." +msgstr "" + +#: contrib/localflavor/es/forms.py:68 +msgid "Please enter a valid NIF or NIE." +msgstr "" + +#: contrib/localflavor/es/forms.py:69 +msgid "Invalid checksum for NIF." +msgstr "" + +#: contrib/localflavor/es/forms.py:70 +msgid "Invalid checksum for NIE." +msgstr "" + +#: contrib/localflavor/es/forms.py:71 +msgid "Invalid checksum for CIF." +msgstr "" + +#: contrib/localflavor/es/forms.py:143 +msgid "" +"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX." +msgstr "" + +#: contrib/localflavor/es/forms.py:144 +msgid "Invalid checksum for bank account number." +msgstr "" + +#: contrib/localflavor/fi/forms.py:29 +msgid "Enter a valid Finnish social security number." +msgstr "" + +#: contrib/localflavor/fr/forms.py:31 +msgid "Phone numbers must be in 0X XX XX XX XX format." +msgstr "" + +#: contrib/localflavor/id/forms.py:28 +msgid "Enter a valid post code" +msgstr "" + +#: contrib/localflavor/id/forms.py:68 contrib/localflavor/nl/forms.py:53 +msgid "Enter a valid phone number" +msgstr "" + +#: contrib/localflavor/id/forms.py:107 +msgid "Enter a valid vehicle license plate number" +msgstr "" + +#: contrib/localflavor/id/forms.py:170 +msgid "Enter a valid NIK/KTP number" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:9 +#: contrib/localflavor/id/id_choices.py:73 +msgid "Bali" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:10 +#: contrib/localflavor/id/id_choices.py:45 +msgid "Banten" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:11 +#: contrib/localflavor/id/id_choices.py:54 +msgid "Bengkulu" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:12 +#: contrib/localflavor/id/id_choices.py:47 +msgid "Yogyakarta" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:13 +#: contrib/localflavor/id/id_choices.py:51 +msgid "Jakarta" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:14 +#: contrib/localflavor/id/id_choices.py:75 +msgid "Gorontalo" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:15 +#: contrib/localflavor/id/id_choices.py:57 +msgid "Jambi" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:16 +msgid "Jawa Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:17 +msgid "Jawa Tengah" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:18 +msgid "Jawa Timur" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:19 +#: contrib/localflavor/id/id_choices.py:88 +msgid "Kalimantan Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:20 +#: contrib/localflavor/id/id_choices.py:66 +msgid "Kalimantan Selatan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:21 +#: contrib/localflavor/id/id_choices.py:89 +msgid "Kalimantan Tengah" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:22 +#: contrib/localflavor/id/id_choices.py:90 +msgid "Kalimantan Timur" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:23 +msgid "Kepulauan Bangka-Belitung" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:24 +#: contrib/localflavor/id/id_choices.py:62 +msgid "Kepulauan Riau" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:25 +#: contrib/localflavor/id/id_choices.py:55 +msgid "Lampung" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:26 +#: contrib/localflavor/id/id_choices.py:70 +msgid "Maluku" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:27 +#: contrib/localflavor/id/id_choices.py:71 +msgid "Maluku Utara" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:28 +#: contrib/localflavor/id/id_choices.py:59 +msgid "Nanggroe Aceh Darussalam" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:29 +msgid "Nusa Tenggara Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:30 +msgid "Nusa Tenggara Timur" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:31 +msgid "Papua" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:32 +msgid "Papua Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:33 +#: contrib/localflavor/id/id_choices.py:60 +msgid "Riau" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:34 +#: contrib/localflavor/id/id_choices.py:68 +msgid "Sulawesi Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:35 +#: contrib/localflavor/id/id_choices.py:69 +msgid "Sulawesi Selatan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:36 +#: contrib/localflavor/id/id_choices.py:76 +msgid "Sulawesi Tengah" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:37 +#: contrib/localflavor/id/id_choices.py:79 +msgid "Sulawesi Tenggara" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:38 +msgid "Sulawesi Utara" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:39 +#: contrib/localflavor/id/id_choices.py:52 +msgid "Sumatera Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:40 +#: contrib/localflavor/id/id_choices.py:56 +msgid "Sumatera Selatan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:41 +#: contrib/localflavor/id/id_choices.py:58 +msgid "Sumatera Utara" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:46 +msgid "Magelang" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:48 +msgid "Surakarta - Solo" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:49 +msgid "Madiun" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:50 +msgid "Kediri" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:53 +msgid "Tapanuli" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:61 +msgid "Kepulauan Bangka Belitung" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:63 +msgid "Corps Consulate" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:64 +msgid "Corps Diplomatic" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:65 +msgid "Bandung" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:67 +msgid "Sulawesi Utara Daratan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:72 +msgid "NTT - Timor" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:74 +msgid "Sulawesi Utara Kepulauan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:77 +msgid "NTB - Lombok" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:78 +msgid "Papua dan Papua Barat" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:80 +msgid "Cirebon" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:81 +msgid "NTB - Sumbawa" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:82 +msgid "NTT - Flores" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:83 +msgid "NTT - Sumba" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:84 +msgid "Bogor" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:85 +msgid "Pekalongan" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:86 +msgid "Semarang" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:87 +msgid "Pati" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:91 +msgid "Surabaya" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:92 +msgid "Madura" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:93 +msgid "Malang" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:94 +msgid "Jember" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:95 +msgid "Banyumas" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:96 +msgid "Federal Government" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:97 +msgid "Bojonegoro" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:98 +msgid "Purwakarta" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:99 +msgid "Sidoarjo" +msgstr "" + +#: contrib/localflavor/id/id_choices.py:100 +msgid "Garut" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:8 +msgid "Antrim" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:9 +msgid "Armagh" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:10 +msgid "Carlow" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:11 +msgid "Cavan" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:12 +msgid "Clare" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:13 +msgid "Cork" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:14 +msgid "Derry" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:15 +msgid "Donegal" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:16 +msgid "Down" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:17 +msgid "Dublin" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:18 +msgid "Fermanagh" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:19 +msgid "Galway" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:20 +msgid "Kerry" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:21 +msgid "Kildare" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:22 +msgid "Kilkenny" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:23 +msgid "Laois" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:24 +msgid "Leitrim" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:25 +msgid "Limerick" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:26 +msgid "Longford" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:27 +msgid "Louth" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:28 +msgid "Mayo" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:29 +msgid "Meath" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:30 +msgid "Monaghan" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:31 +msgid "Offaly" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:32 +msgid "Roscommon" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:33 +msgid "Sligo" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:34 +msgid "Tipperary" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:35 +msgid "Tyrone" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:36 +msgid "Waterford" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:37 +msgid "Westmeath" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:38 +msgid "Wexford" +msgstr "" + +#: contrib/localflavor/ie/ie_counties.py:39 +msgid "Wicklow" +msgstr "" + +#: contrib/localflavor/in_/forms.py:15 +msgid "Enter a zip code in the format XXXXXXX." +msgstr "പിന്‍-കോഡ് XXXXXXX എന്ന മാത്രുകയില്‍ നല്കുക." + +#: contrib/localflavor/is_/forms.py:18 +msgid "" +"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgstr "" + +#: contrib/localflavor/is_/forms.py:19 +msgid "The Icelandic identification number is not valid." +msgstr "" + +#: contrib/localflavor/it/forms.py:15 +msgid "Enter a valid zip code." +msgstr "" + +#: contrib/localflavor/it/forms.py:44 +msgid "Enter a valid Social Security number." +msgstr "" + +#: contrib/localflavor/it/forms.py:69 +msgid "Enter a valid VAT number." +msgstr "" + +#: contrib/localflavor/jp/forms.py:16 +msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." +msgstr "" + +#: 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/kw/forms.py:25 +msgid "Enter a valid Kuwaiti Civil ID number" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:12 +msgid "Aguascalientes" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:13 +msgid "Baja California" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:14 +msgid "Baja California Sur" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:15 +msgid "Campeche" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:16 +msgid "Chihuahua" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:17 +msgid "Chiapas" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:18 +msgid "Coahuila" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:19 +msgid "Colima" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:20 +msgid "Distrito Federal" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:21 +msgid "Durango" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:22 +msgid "Guerrero" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:23 +msgid "Guanajuato" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:24 +msgid "Hidalgo" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:25 +msgid "Jalisco" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:26 +msgid "Estado de México" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:27 +msgid "Michoacán" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:28 +msgid "Morelos" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:29 +msgid "Nayarit" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:30 +msgid "Nuevo León" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:31 +msgid "Oaxaca" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:32 +msgid "Puebla" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:33 +msgid "Querétaro" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:34 +msgid "Quintana Roo" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:35 +msgid "Sinaloa" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:36 +msgid "San Luis Potosí" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:37 +msgid "Sonora" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:38 +msgid "Tabasco" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:39 +msgid "Tamaulipas" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:40 +msgid "Tlaxcala" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:41 +msgid "Veracruz" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:42 +msgid "Yucatán" +msgstr "" + +#: contrib/localflavor/mx/mx_states.py:43 +msgid "Zacatecas" +msgstr "" + +#: contrib/localflavor/nl/forms.py:22 +msgid "Enter a valid postal code" +msgstr "" + +#: contrib/localflavor/nl/forms.py:79 +msgid "Enter a valid SoFi number" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:4 +msgid "Drenthe" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:5 +msgid "Flevoland" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:6 +msgid "Friesland" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:7 +msgid "Gelderland" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:8 +msgid "Groningen" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:9 +msgid "Limburg" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:10 +msgid "Noord-Brabant" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:11 +msgid "Noord-Holland" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:12 +msgid "Overijssel" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:13 +msgid "Utrecht" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:14 +msgid "Zeeland" +msgstr "" + +#: contrib/localflavor/nl/nl_provinces.py:15 +msgid "Zuid-Holland" +msgstr "" + +#: contrib/localflavor/no/forms.py:34 +msgid "Enter a valid Norwegian social security number." +msgstr "" + +#: contrib/localflavor/pe/forms.py:25 +msgid "This field requires 8 digits." +msgstr "" + +#: contrib/localflavor/pe/forms.py:53 +msgid "This field requires 11 digits." +msgstr "" + +#: contrib/localflavor/pl/forms.py:38 +msgid "National Identification Number consists of 11 digits." +msgstr "" + +#: contrib/localflavor/pl/forms.py:39 +msgid "Wrong checksum for the National Identification Number." +msgstr "" + +#: contrib/localflavor/pl/forms.py:71 +msgid "" +"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX." +msgstr "" + +#: contrib/localflavor/pl/forms.py:72 +msgid "Wrong checksum for the Tax Number (NIP)." +msgstr "" + +#: contrib/localflavor/pl/forms.py:109 +msgid "National Business Register Number (REGON) consists of 9 or 14 digits." +msgstr "" + +#: contrib/localflavor/pl/forms.py:110 +msgid "Wrong checksum for the National Business Register Number (REGON)." +msgstr "" + +#: contrib/localflavor/pl/forms.py:148 +msgid "Enter a postal code in the format XX-XXX." +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:8 +msgid "Lower Silesia" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:9 +msgid "Kuyavia-Pomerania" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:10 +msgid "Lublin" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:11 +msgid "Lubusz" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:12 +msgid "Lodz" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:13 +msgid "Lesser Poland" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:14 +msgid "Masovia" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:15 +msgid "Opole" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:16 +msgid "Subcarpatia" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:17 +msgid "Podlasie" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:18 +msgid "Pomerania" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:19 +msgid "Silesia" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:20 +msgid "Swietokrzyskie" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:21 +msgid "Warmia-Masuria" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:22 +msgid "Greater Poland" +msgstr "" + +#: contrib/localflavor/pl/pl_voivodeships.py:23 +msgid "West Pomerania" +msgstr "" + +#: contrib/localflavor/pt/forms.py:17 +msgid "Enter a zip code in the format XXXX-XXX." +msgstr "" + +#: contrib/localflavor/pt/forms.py:37 +msgid "Phone numbers must have 9 digits, or start by + or 00." +msgstr "" + +#: contrib/localflavor/ro/forms.py:19 +msgid "Enter a valid CIF." +msgstr "" + +#: contrib/localflavor/ro/forms.py:56 +msgid "Enter a valid CNP." +msgstr "" + +#: contrib/localflavor/ro/forms.py:141 +msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format" +msgstr "" + +#: contrib/localflavor/ro/forms.py:171 +msgid "Phone numbers must be in XXXX-XXXXXX format." +msgstr "" + +#: contrib/localflavor/ro/forms.py:194 +msgid "Enter a valid postal code in the format XXXXXX" +msgstr "" + +#: contrib/localflavor/se/forms.py:50 +msgid "Enter a valid Swedish organisation number." +msgstr "" + +#: contrib/localflavor/se/forms.py:107 +msgid "Enter a valid Swedish personal identity number." +msgstr "" + +#: contrib/localflavor/se/forms.py:108 +msgid "Co-ordination numbers are not allowed." +msgstr "" + +#: contrib/localflavor/se/forms.py:150 +msgid "Enter a Swedish postal code in the format XXXXX." +msgstr "" + +#: contrib/localflavor/se/se_counties.py:15 +msgid "Stockholm" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:16 +msgid "Västerbotten" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:17 +msgid "Norrbotten" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:18 +msgid "Uppsala" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:19 +msgid "Södermanland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:20 +msgid "Östergötland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:21 +msgid "Jönköping" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:22 +msgid "Kronoberg" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:23 +msgid "Kalmar" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:24 +msgid "Gotland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:25 +msgid "Blekinge" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:26 +msgid "Skåne" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:27 +msgid "Halland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:28 +msgid "Västra Götaland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:29 +msgid "Värmland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:30 +msgid "Örebro" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:31 +msgid "Västmanland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:32 +msgid "Dalarna" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:33 +msgid "Gävleborg" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:34 +msgid "Västernorrland" +msgstr "" + +#: contrib/localflavor/se/se_counties.py:35 +msgid "Jämtland" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:8 +msgid "Banska Bystrica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:9 +msgid "Banska Stiavnica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:10 +msgid "Bardejov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:11 +msgid "Banovce nad Bebravou" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:12 +msgid "Brezno" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:13 +msgid "Bratislava I" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:14 +msgid "Bratislava II" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:15 +msgid "Bratislava III" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:16 +msgid "Bratislava IV" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:17 +msgid "Bratislava V" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:18 +msgid "Bytca" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:19 +msgid "Cadca" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:20 +msgid "Detva" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:21 +msgid "Dolny Kubin" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:22 +msgid "Dunajska Streda" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:23 +msgid "Galanta" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:24 +msgid "Gelnica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:25 +msgid "Hlohovec" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:26 +msgid "Humenne" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:27 +msgid "Ilava" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:28 +msgid "Kezmarok" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:29 +msgid "Komarno" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:30 +msgid "Kosice I" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:31 +msgid "Kosice II" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:32 +msgid "Kosice III" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:33 +msgid "Kosice IV" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:34 +msgid "Kosice - okolie" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:35 +msgid "Krupina" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:36 +msgid "Kysucke Nove Mesto" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:37 +msgid "Levice" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:38 +msgid "Levoca" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:39 +msgid "Liptovsky Mikulas" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:40 +msgid "Lucenec" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:41 +msgid "Malacky" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:42 +msgid "Martin" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:43 +msgid "Medzilaborce" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:44 +msgid "Michalovce" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:45 +msgid "Myjava" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:46 +msgid "Namestovo" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:47 +msgid "Nitra" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:48 +msgid "Nove Mesto nad Vahom" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:49 +msgid "Nove Zamky" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:50 +msgid "Partizanske" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:51 +msgid "Pezinok" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:52 +msgid "Piestany" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:53 +msgid "Poltar" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:54 +msgid "Poprad" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:55 +msgid "Povazska Bystrica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:56 +msgid "Presov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:57 +msgid "Prievidza" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:58 +msgid "Puchov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:59 +msgid "Revuca" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:60 +msgid "Rimavska Sobota" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:61 +msgid "Roznava" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:62 +msgid "Ruzomberok" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:63 +msgid "Sabinov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:64 +msgid "Senec" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:65 +msgid "Senica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:66 +msgid "Skalica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:67 +msgid "Snina" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:68 +msgid "Sobrance" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:69 +msgid "Spisska Nova Ves" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:70 +msgid "Stara Lubovna" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:71 +msgid "Stropkov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:72 +msgid "Svidnik" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:73 +msgid "Sala" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:74 +msgid "Topolcany" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:75 +msgid "Trebisov" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:76 +msgid "Trencin" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:77 +msgid "Trnava" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:78 +msgid "Turcianske Teplice" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:79 +msgid "Tvrdosin" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:80 +msgid "Velky Krtis" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:81 +msgid "Vranov nad Toplou" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:82 +msgid "Zlate Moravce" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:83 +msgid "Zvolen" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:84 +msgid "Zarnovica" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:85 +msgid "Ziar nad Hronom" +msgstr "" + +#: contrib/localflavor/sk/sk_districts.py:86 +msgid "Zilina" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:8 +msgid "Banska Bystrica region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:9 +msgid "Bratislava region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:10 +msgid "Kosice region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:11 +msgid "Nitra region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:12 +msgid "Presov region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:13 +msgid "Trencin region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:14 +msgid "Trnava region" +msgstr "" + +#: contrib/localflavor/sk/sk_regions.py:15 +msgid "Zilina region" +msgstr "" + +#: contrib/localflavor/uk/forms.py:21 +msgid "Enter a valid postcode." +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:11 +msgid "Bedfordshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:12 +msgid "Buckinghamshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:14 +msgid "Cheshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:15 +msgid "Cornwall and Isles of Scilly" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:16 +msgid "Cumbria" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:17 +msgid "Derbyshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:18 +msgid "Devon" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:19 +msgid "Dorset" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:20 +msgid "Durham" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:21 +msgid "East Sussex" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:22 +msgid "Essex" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:23 +msgid "Gloucestershire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:24 +msgid "Greater London" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:25 +msgid "Greater Manchester" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:26 +msgid "Hampshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:27 +msgid "Hertfordshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:28 +msgid "Kent" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:29 +msgid "Lancashire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:30 +msgid "Leicestershire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:31 +msgid "Lincolnshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:32 +msgid "Merseyside" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:33 +msgid "Norfolk" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:34 +msgid "North Yorkshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:35 +msgid "Northamptonshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:36 +msgid "Northumberland" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:37 +msgid "Nottinghamshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:38 +msgid "Oxfordshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:39 +msgid "Shropshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:40 +msgid "Somerset" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:41 +msgid "South Yorkshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:42 +msgid "Staffordshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:43 +msgid "Suffolk" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:44 +msgid "Surrey" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:45 +msgid "Tyne and Wear" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:46 +msgid "Warwickshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:47 +msgid "West Midlands" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:48 +msgid "West Sussex" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:49 +msgid "West Yorkshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:50 +msgid "Wiltshire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:51 +msgid "Worcestershire" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:55 +msgid "County Antrim" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:56 +msgid "County Armagh" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:57 +msgid "County Down" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:58 +msgid "County Fermanagh" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:59 +msgid "County Londonderry" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:60 +msgid "County Tyrone" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:64 +msgid "Clwyd" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:65 +msgid "Dyfed" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:66 +msgid "Gwent" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:67 +msgid "Gwynedd" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:68 +msgid "Mid Glamorgan" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:69 +msgid "Powys" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:70 +msgid "South Glamorgan" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:71 +msgid "West Glamorgan" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:75 +msgid "Borders" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:76 +msgid "Central Scotland" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:77 +msgid "Dumfries and Galloway" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:78 +msgid "Fife" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:79 +msgid "Grampian" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:80 +msgid "Highland" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:81 +msgid "Lothian" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:82 +msgid "Orkney Islands" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:83 +msgid "Shetland Islands" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:84 +msgid "Strathclyde" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:85 +msgid "Tayside" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:86 +msgid "Western Isles" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:90 +msgid "England" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:91 +msgid "Northern Ireland" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:92 +msgid "Scotland" +msgstr "" + +#: contrib/localflavor/uk/uk_regions.py:93 +msgid "Wales" +msgstr "" + +#: contrib/localflavor/us/forms.py:17 +msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." +msgstr "" + +#: contrib/localflavor/us/forms.py:26 +msgid "Phone numbers must be in XXX-XXX-XXXX format." +msgstr "" + +#: contrib/localflavor/us/forms.py:55 +msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." +msgstr "" + +#: contrib/localflavor/us/forms.py:88 +msgid "Enter a U.S. state or territory." +msgstr "" + +#: contrib/localflavor/us/models.py:8 +msgid "U.S. state (two uppercase letters)" +msgstr "" + +#: contrib/localflavor/us/models.py:17 +msgid "Phone number" +msgstr "" + +#: contrib/localflavor/uy/forms.py:28 +msgid "Enter a valid CI number in X.XXX.XXX-X,XXXXXXX-X or XXXXXXXX format." +msgstr "" + +#: contrib/localflavor/uy/forms.py:30 +msgid "Enter a valid CI number." +msgstr "" + +#: contrib/localflavor/za/forms.py:21 +msgid "Enter a valid South African ID number" +msgstr "" + +#: contrib/localflavor/za/forms.py:55 +msgid "Enter a valid South African postal code" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:4 +msgid "Eastern Cape" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:5 +msgid "Free State" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:6 +msgid "Gauteng" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:7 +msgid "KwaZulu-Natal" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:8 +msgid "Limpopo" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:9 +msgid "Mpumalanga" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:10 +msgid "Northern Cape" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:11 +msgid "North West" +msgstr "" + +#: contrib/localflavor/za/za_provinces.py:12 +msgid "Western Cape" +msgstr "" + +#: contrib/messages/tests/base.py:101 +msgid "lazy message" +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/sessions/models.py:45 +msgid "session key" +msgstr "സെഷന്‍ കീ" + +#: contrib/sessions/models.py:47 +msgid "session data" +msgstr "സെഷന്‍ വിവരം" + +#: contrib/sessions/models.py:48 +msgid "expire date" +msgstr "കാലാവധി (തീയതി)" + +#: contrib/sessions/models.py:53 +msgid "session" +msgstr "സെഷന്‍" + +#: contrib/sessions/models.py:54 +msgid "sessions" +msgstr "സെഷനുകള്‍" + +#: contrib/sites/models.py:32 +msgid "domain name" +msgstr "ഡൊമൈന്‍ നാമം" + +#: contrib/sites/models.py:33 +msgid "display name" +msgstr "പ്രദര്‍ശന നാമം" + +#: contrib/sites/models.py:39 +msgid "sites" +msgstr "സൈറ്റുകള്‍" + +#: core/validators.py:20 forms/fields.py:66 +msgid "Enter a valid value." +msgstr "ശരിയായ മൂല്യം നല്കണം." + +#: core/validators.py:87 forms/fields.py:528 +msgid "Enter a valid URL." +msgstr "ശരിയായ URL നല്കണം." + +#: core/validators.py:89 forms/fields.py:529 +msgid "This URL appears to be a broken link." +msgstr "ഈ URL നിലവില്ലാത്ത വിലാസമാണ് കാണിക്കുന്നത്." + +#: core/validators.py:123 forms/fields.py:877 +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "ശരിയായ സ്ളഗ് നല്കുക (അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, ഹൈഫന്‍ എന്നിവ മാത്രം ചേര്‍ന്നത്)." + +#: core/validators.py:126 forms/fields.py:870 +msgid "Enter a valid IPv4 address." +msgstr "ശരിയായ IPv4 വിലാസം നല്കണം" + +#: core/validators.py:129 db/models/fields/__init__.py:572 +msgid "Enter only digits separated by commas." +msgstr "അക്കങ്ങള്‍ മാത്രം (കോമയിട്ടു വേര്‍തിരിച്ചത്)" + +#: core/validators.py:135 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "ഇത് %(limit_value)s ആവണം. (ഇപ്പോള്‍ %(show_value)s)." + +#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കുറവോ ആവണം" + +#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കൂടുതലോ ആവണം" + +#: core/validators.py:164 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d characters (it has %" +"(show_value)d)." +msgstr "ഇതിനു ഏറ്റവും കുറഞ്ഞത് %(limit_value)d അക്ഷരങ്ങള്‍ വേണം. (ഇപ്പോള്‍ " +"%(show_value)d അക്ഷരങ്ങളുണ്ട്.)" + +#: core/validators.py:170 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d characters (it has %" +"(show_value)d)." +msgstr "ഇതിനു പരമാവധി %(limit_value)d അക്ഷരങ്ങളേ ഉള്ളൂ എന്നു ഉറപ്പാക്കുക. (ഇപ്പോള്‍ " +"%(show_value)d അക്ഷരങ്ങളുണ്ട്.)" + +#: db/models/base.py:823 +#, python-format +msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." +msgstr "%(date_field)s %(lookup)s-നു %(field_name)s ആവര്‍ത്തിക്കാന്‍ പാടില്ല." + +#: db/models/base.py:838 db/models/base.py:846 +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(field_label)s-ഓടു കൂടിയ %(model_name)s നിലവിലുണ്ട്." + +#: db/models/fields/__init__.py:63 +#, python-format +msgid "Value %r is not a valid choice." +msgstr "%r അനുയോജ്യമല്ല." + +#: db/models/fields/__init__.py:64 +msgid "This field cannot be null." +msgstr "ഈ കള്ളി ഒഴിച്ചിടരുത്." + +#: db/models/fields/__init__.py:65 +msgid "This field cannot be blank." +msgstr "ഈ കള്ളി ഒഴിച്ചിടരുത്." + +#: db/models/fields/__init__.py:70 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 +#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 +#: db/models/fields/__init__.py:999 +msgid "Integer" +msgstr "പൂര്‍ണ്ണസംഖ്യ" + +#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +msgid "This value must be an integer." +msgstr "പൂര്‍ണ്ണസംഖ്യ മാത്രം" + +#: db/models/fields/__init__.py:490 +msgid "This value must be either True or False." +msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം" + +#: db/models/fields/__init__.py:492 +msgid "Boolean (Either True or False)" +msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം" + +#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: db/models/fields/__init__.py:567 +msgid "Comma-separated integers" +msgstr "കോമയിട്ട് വേര്‍തിരിച്ച സംഖ്യകള്‍" + +#: db/models/fields/__init__.py:581 +msgid "Date (without time)" +msgstr "തീയതി (സമയം വേണ്ട)" + +#: db/models/fields/__init__.py:585 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "ശരിയായ തീയതി YYYY-MM-DD എന്ന മാത്രുകയില്‍ നല്കണം." + +#: db/models/fields/__init__.py:586 +#, python-format +msgid "Invalid date: %s" +msgstr "തെറ്റായ തീയതി: %s" + +#: db/models/fields/__init__.py:667 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format." +msgstr "ശരിയായ തീയതി/സമയം YYYY-MM-DD HH:MM[:ss[.uuuuuu]]എന്ന മാത്രുകയില്‍ നല്കണം." + +#: db/models/fields/__init__.py:669 +msgid "Date (with time)" +msgstr "തീയതി (സമയത്തോടൊപ്പം)" + +#: db/models/fields/__init__.py:735 +msgid "This value must be a decimal number." +msgstr "ഈ വില ദശാംശമാവണം." + +#: db/models/fields/__init__.py:737 +msgid "Decimal number" +msgstr "ദശാംശസംഖ്യ" + +#: db/models/fields/__init__.py:792 +msgid "E-mail address" +msgstr "ഇ-മെയില്‍ വിലാസം" + +#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/files.py:331 +msgid "File path" +msgstr "ഫയല്‍ സ്ഥാനം" + +#: db/models/fields/__init__.py:822 +msgid "This value must be a float." +msgstr "ഈ വില ദശാംശമാവണം." + +#: db/models/fields/__init__.py:824 +msgid "Floating point number" +msgstr "ദശാംശസംഖ്യ" + +#: db/models/fields/__init__.py:883 +msgid "Big (8 byte) integer" +msgstr "8 ബൈറ്റ് പൂര്‍ണസംഖ്യ." + +#: db/models/fields/__init__.py:912 +msgid "This value must be either None, True or False." +msgstr "ഈ മൂല്യം None, True, False എന്നിവയില്‍ ഏതെങ്കിലും ഒന്നാവണം" + +#: db/models/fields/__init__.py:914 +msgid "Boolean (Either True, False or None)" +msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം" + +#: db/models/fields/__init__.py:1005 +msgid "Text" +msgstr "ടെക്സ്റ്റ്" + +#: db/models/fields/__init__.py:1021 +msgid "Time" +msgstr "സമയം" + +#: db/models/fields/__init__.py:1025 +msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." +msgstr "ശരിയായ സമയം HH:MM[:ss[.uuuuuu]] എന്ന മാത്രുകയില്‍ നല്കണം." + +#: db/models/fields/__init__.py:1109 +msgid "XML text" +msgstr "" + +#: db/models/fields/related.py:799 +#, python-format +msgid "Model %(model)s with pk %(pk)r does not exist." +msgstr "" + +#: db/models/fields/related.py:801 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: db/models/fields/related.py:918 +msgid "One-to-one relationship" +msgstr "" + +#: db/models/fields/related.py:980 +msgid "Many-to-many relationship" +msgstr "" + +#: db/models/fields/related.py:1000 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "\"Control\" എന്ന കീ അമര്‍ത്തിപ്പിടിക്കുക. (Macലാണെങ്കില്‍ \"Command\")." + +#: db/models/fields/related.py:1061 +#, 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 അനുയോജ്യമല്ല." + +#: forms/fields.py:65 +msgid "This field is required." +msgstr "ഈ കള്ളി നിര്‍ബന്ധമാണ്." + +#: forms/fields.py:203 +msgid "Enter a whole number." +msgstr "ഒരു പൂര്‍ണസംഖ്യ നല്കുക." + +#: forms/fields.py:234 forms/fields.py:255 +msgid "Enter a number." +msgstr "ഒരു സംഖ്യ നല്കുക." + +#: forms/fields.py:258 +#, python-format +msgid "Ensure that there are no more than %s digits in total." +msgstr "മൊത്തം %s ലേറെ അക്കങ്ങള്‍ ഇല്ലെന്ന് ഉറപ്പു വരുത്തുക." + +#: forms/fields.py:259 +#, python-format +msgid "Ensure that there are no more than %s decimal places." +msgstr "%s ലേറെ ദശാംശസ്ഥാനങ്ങള്‍ ഇല്ലെന്ന് ഉറപ്പു വരുത്തുക." + +#: forms/fields.py:260 +#, python-format +msgid "Ensure that there are no more than %s digits before the decimal point." +msgstr "ദശാംശബിന്ദുവിനു മുമ്പ് %sലേറെ അക്കങ്ങള്‍ ഇല്ലെന്നു ഉറപ്പു വരുത്തുക." + +#: forms/fields.py:322 forms/fields.py:837 +msgid "Enter a valid date." +msgstr "ശരിയായ തീയതി നല്കുക." + +#: forms/fields.py:350 forms/fields.py:838 +msgid "Enter a valid time." +msgstr "ശരിയായ സമയം നല്കുക." + +#: forms/fields.py:376 +msgid "Enter a valid date/time." +msgstr "ശരിയായ തീയതിയും സമയവും നല്കുക." + +#: forms/fields.py:434 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "ഫയലൊന്നും ലഭിച്ചില്ല. ഫോമിലെ എന്‍-കോഡിംഗ് പരിശോധിക്കുക." + +#: forms/fields.py:435 +msgid "No file was submitted." +msgstr "ഫയലൊന്നും ലഭിച്ചില്ല." + +#: forms/fields.py:436 +msgid "The submitted file is empty." +msgstr "ലഭിച്ച ഫയല്‍ ശൂന്യമാണ്." + +#: forms/fields.py:437 +#, python-format +msgid "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr "ഈ ഫയലിന്റെ പേര് പരമാവധി %(max)d അക്ഷരങ്ങളുള്ളതായിരിക്കണം. " +"(ഇപ്പോള്‍ %(length)d അക്ഷരങ്ങള്‍ ഉണ്ട്)." + +#: forms/fields.py:472 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "ശരിയായ ചിത്രം അപ് ലോഡ് ചെയ്യുക. നിങ്ങള്‍ നല്കിയ ഫയല്‍ ഒന്നുകില്‍ ഒരു ചിത്രമല്ല, " +"അല്ലെങ്കില്‍ വികലമാണ്." + +#: forms/fields.py:595 forms/fields.py:670 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. %(value)s ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." + +#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002 +msgid "Enter a list of values." +msgstr "മൂല്യങ്ങളുടെ പട്ടിക(ലിസ്റ്റ്) നല്കുക." + +#: forms/formsets.py:298 forms/formsets.py:300 +msgid "Order" +msgstr "ക്രമം" + +#: forms/models.py:562 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിച്ചത് ദയവായി തിരുത്തുക." + +#: forms/models.py:566 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിക്കാന്‍ പാടില്ല. ദയവായി തിരുത്തുക." + +#: forms/models.py:572 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "%(date_field)s ലെ %(lookup)s നു വേണ്ടി %(field_name)s നു നല്കുന്ന വിവരം " +"ആവര്‍ത്തിക്കാന്‍ പാടില്ല. ദയവായി തിരുത്തുക." + +#: forms/models.py:580 +msgid "Please correct the duplicate values below." +msgstr "താഴെ കൊടുത്തവയില്‍ ആവര്‍ത്തനം ഒഴിവാക്കുക." + +#: forms/models.py:855 +msgid "The inline foreign key did not match the parent instance primary key." +msgstr "" + +#: forms/models.py:921 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. നിങ്ങള്‍ നല്കിയത് ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." + +#: forms/models.py:1003 +#, python-format +msgid "Select a valid choice. %s is not one of the available choices." +msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. %s തന്നിരിക്കുന്നവയില്‍ ഉള്‍പ്പെടുന്നില്ല." + +#: forms/models.py:1005 +#, python-format +msgid "\"%s\" is not a valid value for a primary key." +msgstr "\"%s\" പ്രാഥമിക കീ ആവാന്‍ അനുയോജ്യമായ മൂല്യമല്ല." + +#: template/defaultfilters.py:776 +msgid "yes,no,maybe" +msgstr "ഉണ്ട്, ഇല്ല, ഉണ്ടാവാം" + +#: template/defaultfilters.py:807 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: template/defaultfilters.py:809 +#, python-format +msgid "%.1f KB" +msgstr "" + +#: template/defaultfilters.py:811 +#, python-format +msgid "%.1f MB" +msgstr "" + +#: template/defaultfilters.py:812 +#, python-format +msgid "%.1f GB" +msgstr "" + +#: utils/dateformat.py:42 +msgid "p.m." +msgstr "" + +#: utils/dateformat.py:43 +msgid "a.m." +msgstr "" + +#: utils/dateformat.py:48 +msgid "PM" +msgstr "PM" + +#: utils/dateformat.py:49 +msgid "AM" +msgstr "AM" + +#: utils/dateformat.py:98 +msgid "midnight" +msgstr "അര്‍ധരാത്രി" + +#: utils/dateformat.py:100 +msgid "noon" +msgstr "ഉച്ച" + +#: utils/dates.py:6 +msgid "Monday" +msgstr "തിങ്കള്‍" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "ചൊവ്വ" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "ബുധന്‍" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "വ്യാഴം" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "വെള്ളി" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "ശനി" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "ഞായര്‍" + +#: utils/dates.py:10 +msgid "Mon" +msgstr "തിങ്കള്‍" + +#: utils/dates.py:10 +msgid "Tue" +msgstr "ചൊവ്വ" + +#: utils/dates.py:10 +msgid "Wed" +msgstr "ബുധന്‍" + +#: utils/dates.py:10 +msgid "Thu" +msgstr "വ്യാഴം" + +#: utils/dates.py:10 +msgid "Fri" +msgstr "വെള്ളി" + +#: utils/dates.py:11 +msgid "Sat" +msgstr "ശനി" + +#: utils/dates.py:11 +msgid "Sun" +msgstr "ഞായര്‍" + +#: utils/dates.py:18 +msgid "January" +msgstr "ജനുവരി" + +#: utils/dates.py:18 +msgid "February" +msgstr "ഫെബ്രുവരി" + +#: utils/dates.py:18 utils/dates.py:31 +msgid "March" +msgstr "മാര്‍ച്ച്" + +#: utils/dates.py:18 utils/dates.py:31 +msgid "April" +msgstr "ഏപ്രില്‍" + +#: utils/dates.py:18 utils/dates.py:31 +msgid "May" +msgstr "മേയ്" + +#: utils/dates.py:18 utils/dates.py:31 +msgid "June" +msgstr "ജൂണ്‍" + +#: utils/dates.py:19 utils/dates.py:31 +msgid "July" +msgstr "ജൂലൈ" + +#: utils/dates.py:19 +msgid "August" +msgstr "ആഗസ്ത്" + +#: utils/dates.py:19 +msgid "September" +msgstr "സെപ്തംബര്‍" + +#: utils/dates.py:19 +msgid "October" +msgstr "ഒക്ടോബര്‍" + +#: utils/dates.py:19 +msgid "November" +msgstr "നവംബര്‍" + +#: utils/dates.py:20 +msgid "December" +msgstr "ഡിസംബര്‍" + +#: utils/dates.py:23 +msgid "jan" +msgstr "ജനു." + +#: utils/dates.py:23 +msgid "feb" +msgstr "ഫെബ്രു." + +#: utils/dates.py:23 +msgid "mar" +msgstr "മാര്‍ച്ച്" + +#: utils/dates.py:23 +msgid "apr" +msgstr "ഏപ്രില്‍" + +#: utils/dates.py:23 +msgid "may" +msgstr "മേയ്" + +#: utils/dates.py:23 +msgid "jun" +msgstr "ജൂണ്‍" + +#: utils/dates.py:24 +msgid "jul" +msgstr "ജൂലൈ" + +#: utils/dates.py:24 +msgid "aug" +msgstr "ആഗസ്ത്" + +#: utils/dates.py:24 +msgid "sep" +msgstr "സെപ്ടം." + +#: utils/dates.py:24 +msgid "oct" +msgstr "ഒക്ടോ." + +#: utils/dates.py:24 +msgid "nov" +msgstr "നവം." + +#: utils/dates.py:24 +msgid "dec" +msgstr "ഡിസം." + +#: utils/dates.py:31 +msgid "Jan." +msgstr "ജനു." + +#: utils/dates.py:31 +msgid "Feb." +msgstr "ഫെബ്രു." + +#: utils/dates.py:32 +msgid "Aug." +msgstr "ആഗസ്ത്" + +#: utils/dates.py:32 +msgid "Sept." +msgstr "സെപ്ടം." + +#: utils/dates.py:32 +msgid "Oct." +msgstr "ഒക്ടോ." + +#: utils/dates.py:32 +msgid "Nov." +msgstr "നവം." + +#: utils/dates.py:32 +msgid "Dec." +msgstr "ഡിസം." + +#: utils/text.py:130 +msgid "or" +msgstr "അഥവാ" + +#: utils/timesince.py:21 +msgid "year" +msgid_plural "years" +msgstr[0] "വര്‍ഷം" +msgstr[1] "വര്‍ഷങ്ങള്‍" + +#: utils/timesince.py:22 +msgid "month" +msgid_plural "months" +msgstr[0] "മാസം" +msgstr[1] "മാസങ്ങള്‍" + +#: utils/timesince.py:23 +msgid "week" +msgid_plural "weeks" +msgstr[0] "ആഴ്ച്ച" +msgstr[1] "ആഴ്ച്ചകള്‍" + +#: utils/timesince.py:24 +msgid "day" +msgid_plural "days" +msgstr[0] "ദിവസം" +msgstr[1] "ദിവസങ്ങള്‍" + +#: utils/timesince.py:25 +msgid "hour" +msgid_plural "hours" +msgstr[0] "മണിക്കൂര്‍" +msgstr[1] "മണിക്കൂറുകള്‍" + +#: utils/timesince.py:26 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "മിനുട്ട്" +msgstr[1] "മിനുട്ടുകള്‍" + +#: utils/timesince.py:45 +msgid "minutes" +msgstr "മിനുട്ടുകള്‍" + +#: utils/timesince.py:50 +#, python-format +msgid "%(number)d %(type)s" +msgstr "" + +#: utils/timesince.py:56 +#, python-format +msgid ", %(number)d %(type)s" +msgstr "" + +#: utils/translation/trans_real.py:519 +msgid "DATE_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:520 +msgid "DATETIME_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:521 +msgid "TIME_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:542 +msgid "YEAR_MONTH_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:543 +msgid "MONTH_DAY_FORMAT" +msgstr "" + +#: views/generic/create_update.py:115 +#, python-format +msgid "The %(verbose_name)s was created successfully." +msgstr "%(verbose_name)s നെ സ്രുഷ്ടിച്ചു." + +#: views/generic/create_update.py:158 +#, python-format +msgid "The %(verbose_name)s was updated successfully." +msgstr "%(verbose_name)s നെ മെച്ചപ്പെടുത്തി." + +#: views/generic/create_update.py:201 +#, python-format +msgid "The %(verbose_name)s was deleted." +msgstr "%(verbose_name)s ഡിലീറ്റ് ചെയ്യപ്പെട്ടു." diff --git a/django/conf/locale/ml/LC_MESSAGES/djangojs.mo b/django/conf/locale/ml/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000000000000000000000000000000000..644d8bf949938561f4225a8b80d176c72900a14d GIT binary patch literal 4350 zcmcJRO^_W`6~|i)DkF--Pt?VAF_ol9KPCx-sS#3)6QYBeNz8kIthDF#o%cHF*FE&d zz*}e~u?z|oEiF?Jib~2N1qjjb(GOTT5az#=8&b{4l=1nG<+4w4b z|9$(Od(Qv-&$)N%j`L0M5%3e>@4=6QuYfm$1^6lO z&(-?h!Ot*%8yo}w3El+$tHKY!8<~FuZUeXB>;dp5Q2hK5l4<;ywb3-^V}& zo&m+~1#mxj85FFnh?*g|G=P>vU=HEvY(JckV|4DEh zJP+;zSHKkf4=DRPpLU#|fIkLr0Y3y~|IG~B!P~&6@xL3q0ZspcNR!O}hB08Y6W!z| z{@Cu^#`9SoQZgC=#`l*&=$ky{Tm8eW^HrW(dA?A66s?87)Zp_xU*bVx=W{&5OMawa zxS9!r^q4cgGu7d)RK<&Gd}lk#c;$m`XWGB++Fip1WUJ!Z3L-yP4*c8;)ncGSKW!*{?nty+O5z1- z)K_5~p9rFkT8tBwb+!6VtQPVtV{_s$myZOMm8LMUYYpeR)G!jUhSXAa`n7zPTozwV zPW5%xP)8|09b%O|@;!y6?6=IrP(>PFd`z^PLjHuQ|jPxGK^L8!TGUcdMQpacP{M& zzWeRGle(>VN{t;o(sE}K?MWTogI=bm)ZU3b6Yj*MyLZ3ZGdZ=cKhe?4_C8O1vlyy(~_q)G_b4)@fJGdqJY^PV6j+nBCjyaXK6AxOZUeFhp~& zqurMFdQ+UD(ChQ`)ZM-C-Y{syN$0@W-0a+atI6$YOpMLMQKlmT_LpFu>Bq7=mO?Lx zz9pTPq&mCjfz}~+|Eir3ThxhrU(}9$dTmPWUkI|XAGk+jDTQ0}SVLiTaVE~AEa^|F z+4+OB(_>sh=2j|;*UG`!_fDSWnzA=mSzIayXUgK0vbeyK8JS)z2dB&uUobdzJqN!m zi|5SN=gQ)=+N#6q>MM(vs!+vBSzNI(aq>(#cwAT+wqSIgpgv*USVKH}{y;{;cma39%3&Z4A=NBpgBMbmT8*<5m)&jwK} zi`UCatx6ze1fy}At4m&?IV%VPDbt;Mirln^H}vg22#(9B^0qq+?xrnH~%#_CxLYzrto zTF){5ITOsDDvP&_R}_?WCVZuXaD0jM%Hr~{>@5GLPLNDUc4X~E!+iaY-x+qa#K?kE z7C#&MEsGaS7APt#Y(`l8!sg1zgxWEkhGfJ7N}jA)Q5I<&6k1=o3lxkMQWCW> zcmhD~Q^3FkrAT7IJeQPRXP!&Kv4%s`RiIS1JRsdRuI%#CAPV$#`91c607f~!Py3GjS`hA zCi3Xfpu3?H!Q;D$ zc&$pw;oFk>R&uU6nm`WyCbdQ5tGWfbt!NyDQ5WmarYLQ@9@7=Ye+TP)`16R;8y{!_ zo|En{WfU_Z!F=Ri*!Uz+kYQKI76NdAUX, 2010. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Django SVN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-28 15:32+0530\n" +"PO-Revision-Date: 2010-05-28 15:45+0530\n" +"Last-Translator: Rajeesh Nair \n" +"Language-Team: Malayalam \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Malayalam\n" +"X-Poedit-Country: INDIA\n" + +#: contrib/admin/media/js/SelectFilter2.js:37 +#, perl-format +msgid "Available %s" +msgstr "ലഭ്യമായ %s" + +#: contrib/admin/media/js/SelectFilter2.js:45 +msgid "Choose all" +msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക" + +#: contrib/admin/media/js/SelectFilter2.js:50 +msgid "Add" +msgstr "പുതിയത് ചേര്‍ക്കൂ" + +#: contrib/admin/media/js/SelectFilter2.js:52 +msgid "Remove" +msgstr "നീക്കം ചെയ്യൂ" + +#: contrib/admin/media/js/SelectFilter2.js:57 +#, perl-format +msgid "Chosen %s" +msgstr "തെരഞ്ഞെടുത്ത %s" + +#: contrib/admin/media/js/SelectFilter2.js:58 +msgid "Select your choice(s) and click " +msgstr "ഉചിതമായത് തെരഞ്ഞെടുത്ത ശേഷം ക്ളിക് ചെയ്യൂ" + +#: contrib/admin/media/js/SelectFilter2.js:63 +msgid "Clear all" +msgstr "എല്ലാം ക്ളിയര്‍ ചെയ്യൂ" + +#: contrib/admin/media/js/actions.js:18 +#: contrib/admin/media/js/actions.min.js:1 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)sല്‍ %(sel)s തെരഞ്ഞെടുത്തു" +msgstr[1] "%(cnt)sല്‍ %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു" + +#: contrib/admin/media/js/actions.js:109 +#: contrib/admin/media/js/actions.min.js:5 +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത " +"മാറ്റങ്ങളെല്ലാം നഷ്ടപ്പെടും." + +#: contrib/admin/media/js/actions.js:121 +#: contrib/admin/media/js/actions.min.js:6 +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. പക്ഷേ, കളങ്ങളിലെ മാറ്റങ്ങള്‍ ഇനിയും സേവ് ചെയ്യാനുണ്ട്. ആദ്യം സേവ്" +"ചെയ്യാനായി OK ക്ലിക് ചെയ്യുക. അതിനു ശേഷം ആക്ഷന്‍ ഒന്നു കൂടി പ്രയോഗിക്കേണ്ടി വരും." + +#: contrib/admin/media/js/actions.js:123 +#: contrib/admin/media/js/actions.min.js:6 +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +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/collapse.js:9 contrib/admin/media/js/collapse.js:21 +#: contrib/admin/media/js/collapse.min.js:1 +msgid "Show" +msgstr "കാണട്ടെ" + +#: contrib/admin/media/js/collapse.js:16 +#: contrib/admin/media/js/collapse.min.js:1 +msgid "Hide" +msgstr "മറയട്ടെ" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "ഞായര്‍ തിങ്കള്‍ ചൊവ്വ ബുധന്‍ വ്യാഴം വെള്ളി ശനി" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "Now" +msgstr "ഇപ്പോള്‍" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:52 +msgid "Clock" +msgstr "ഘടികാരം (ക്ലോക്ക്)" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:79 +msgid "Choose a time" +msgstr "സമയം തെരഞ്ഞെടുക്കൂ" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Midnight" +msgstr "അര്‍ധരാത്രി" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:85 +msgid "6 a.m." +msgstr "6 a.m." + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86 +msgid "Noon" +msgstr "ഉച്ച" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187 +msgid "Cancel" +msgstr "റദ്ദാക്കൂ" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181 +msgid "Today" +msgstr "ഇന്ന്" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:136 +msgid "Calendar" +msgstr "കലണ്ടര്‍" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Yesterday" +msgstr "ഇന്നലെ" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Tomorrow" +msgstr "നാളെ" diff --git a/django/conf/locale/ml/__init__.py b/django/conf/locale/ml/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/conf/locale/ml/formats.py b/django/conf/locale/ml/formats.py new file mode 100644 index 0000000000..141f705fb9 --- /dev/null +++ b/django/conf/locale/ml/formats.py @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# This file is distributed under the same license as the Django package. +# + +DATE_FORMAT = 'N j, Y' +TIME_FORMAT = 'P' +DATETIME_FORMAT = 'N j, Y, P' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'F j' +SHORT_DATE_FORMAT = 'm/d/Y' +SHORT_DATETIME_FORMAT = 'm/d/Y P' +FIRST_DAY_OF_WEEK = 0 # Sunday +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' + # '%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' +) +TIME_INPUT_FORMATS = ( + '%H:%M:%S', # '14:30:59' + '%H:%M', # '14:30' +) +DATETIME_INPUT_FORMATS = ( + '%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' +) +DECIMAL_SEPARATOR = '.' +THOUSAND_SEPARATOR = ',' +NUMBER_GROUPING = 3 + diff --git a/django/conf/locale/sr/LC_MESSAGES/django.mo b/django/conf/locale/sr/LC_MESSAGES/django.mo index 3b4121580c9aedff414b8abb32fe2c32170928cc..28995bfad7e09cbd74e6295818208fb9a68874d6 100644 GIT binary patch delta 12616 zcmZA62YgT0|HttwvO^FdF(L^;Vnoc?#2!(KTD1~l?}XCe8++BLm{p_pY!Rzg1y!pR zR5gm0pYr3U+NxHK>i_l5Ir`}1e;+-bpU=7H-gE9b=YGFmy6bT6D@Sv?ZU(q7b~xhP z9H%%&1UOEv+>TQrLbZ+)6XQ6Gayd?AEJS{)GUxC*c0->kj#C%=Vln&(YvK{~#y@QS zHx?wXS=Dh0V?5HI%jrWsP?x| z9p1O~zhD6Qb8FsO=00Jl0mq=OYf_8(FHaCpg{F2arr=am$Ip;`=J?choM5bjy09Z^ z#=6^l7;5Urpa$qd&ERa*eHNhZzXmnX?dXpgwV8jd#c?V$vdgF^y@$HNuc#?~it6Ac z>Ozk?=0<@SL|zQbVpY@t-$u=BAN&|6<8rLbtI`h7A=J5? z?_g1UjKwf-eKW8q)RR;~4X6g{Nt_=xCHbd7f0``>?*??CG zdtrOrjBnx#WUx+~hP*O38+jP#3~FE=ab^a>kSeDpY9QlKn{pPGz#|xs*RcskHOje< z%Na(XC)ijfR$MaAfZAa~uOw>}GLrw7|d<(CkJH{~2 zg|RwnY2#4??1|Cz@1zh6!*%G10nN<^ND)*Xg1T`8Y9JL*Ph8#REm7^-qZ@Wb5A1I1 z6RiVn{Rs5p{1|lcu+BsRjr0WSiB6+lqf0iwf&Ay(MEq zHNYaM%~uiimeoPcL_F%P>C=+=*GN;T@WM&h8E2sebj#M?MQ`#)w*DzzEsFqaNfgM&r*ef~o{1csD9ydsM?TR7X=$H=Kj&a4~8V ztwTTDi|RNNHDl*74_-tK;3n$2KT&(bvyE9AAJp663L(&%#Gu~m=BU?k3hIWdQ6Dht zQ3J_9J@FCLK)yn?`vLW2Kid2eY6gEp4d?}G&As0+GZKaj$mNtFPzO<{8`MN~5Qo}i z?NJ{ziKq{f38>fSL-fbps2gXZ2A++2J%2~dfNxtY5vO4@%)l6Yj>EBhJI5)9D^Q<|r?4S=X&I_!e z_rC^PSes-hYR!{T19}&=wv$m)JQp?P3$ZD#N40x^dg8~ZC-&-Sc6&H#MjD|%_C(!( zDCWl$bm=2?8i8)O3fYg&9aKj#e2i&H8lk4RHLAltwtg^bv!>X5ENY;WFc7Ds2DAcm zHY;iXnW&{W{TAzAkl+#(ESGZ^HIV9^%#@~LbMk|zsdnSTK{Hhmb%Uy?0o6k-T~pK( zcR(%SaMUgzk9v^#sF_%X>TgqL=3fo|ph5%j>0(A0g6bdwKf!2JM>kR50e4YP;@;JK zx%i=GqB^R+7OH(i)RVVB4ZNd0-wicW2`(G-L+$dxm@{=)h*| znd|yucXAg-<8{<|zqie%?QETidfh)owR2?=gcJO2E5f-;GxBz*rC5ri@dg&h4n6oP z#Su6im)Ja{r&;U9$SOKLkd5zTpmx7UFS9hAuqgQ`4AT2Qm!KpS8&Cr|joS4OkXd$q zM^?vqqqiB@MvNf;35#Jsg85vCMmF#Mq*1$MP2tf=EErUcpy zt573bhq}>rERXvz6mO$8ms?*mLq4co9%%D$>`z_+Srumy#^Pg~jOCKdKzE?-zYAUJ z@DPCqoV*d!jmCi*-<=iG#XW4=1A5{xC-3 z)&9)CJApI6ye1yj0_aI~h&2K=kn*U3RkC@UwJG{j-x9sC3wmJ!YK8`)9$*Z5<5bl7 zxdWJgHCSvLtVIoIC;H)D)LzI$Z@hvU$W7FBw^8kWMh)NvdZ6z>v*!6x=fhCfRX}wd zgWBXZT?Fc|v9$$iv$R1U?15_7AIsntj&^YJj?5Gt_`Ppc{6v`P)X9 z)0;peOhR2S5H+AN)-=?BW~16Iv3`KM;VRUOeT3?07iwVp&=)^LU4It&z;V7oUH1sR z_5S}#pw00d)zEve89*TFBe(=s!fL3F`l1Gsf|`l3sDY=UAI?P$U^!}u)}jWs+2%V? z*Jq%c-v9jsy1_xz_wpC03%*6&=mu(lcTppMf-(3M)j{MCW3;sz>blyfjvAxx*Bo{K zc=W{{=+c+X00KXpfVyxN>c$JL%TO1rvTngV6KsZhuMDNHX0p3`T)tqMEo21K5`QIW_klZ z!;a`b#wtJg#>Ju~-b)OZerOh70{OiQeR5-a<-*?QnRsON&2@+6WJ}IcFKaZM; z3#b{pX7jsPk^EOIi=pGpCu4JLLEaY|;|?sXcBrKYa=mL_mq^qTSHkhw*yhKuD*4x_ zDfdq0V;2iy4XlM4&iMc191rIzLRXe2=yRakn3E|J_23%14f{G zn)z~x!cd1@i`xDDu^Wy?4J-?f;!juvw@)(vuy6{s#(tAc$1Sl0d3Vg2A=Ch8V*$PY zD+n}&J8XjksHyn^HPQ>HC%ld&(Q}G13bl#iQF|c~b=@#j2V<}p&OqH~9Y*3#Y=haD zkN%yqQ_bdx#j?4WYV^l-EYw`i@1Ab{;?Qsgf9oMXjioSYruoG)3yYE;KrPW_)Dn5j zGBZ#QgUH)i2VgLH8oJ^LmJ`&)?`(tM+2#pius`*2H~_bxUbBEXS~$+326)dp`aQ?# zO`e-dUDp?f;(2V2wda|)WHR<3-#L%lXe9pg*=Sf6HIV7J1W#ZZc3WV6On!$|$Sb~Y z_DXMTM?MY9<2T5Q;t>#w5*_%o`#>y-_B zcnnnpqHYjs^C~v4hwMYA9qI;GQ8RHD^Wjs}bzUnRhi%{##bn%sL0F8Py9=vgF#d>K z=W<>VgiztX(!5R;P`kSkR>gj(rTG9gz#CW?|BKu4Z`9OpUu9nkG8S<8gs(}s0$;p0oFo2(KyspzGw60s2SLfA$SONJ{xmp1TT_5wfUKk z%m>spbf^9a2I4aerhmtOty$}`=uO@hHS#W~hP|*areIghMh&p)I`ibosDY+h=V1}@ zk5C^_hpZQ|Ao)Gi{a>IrZg0FgJ{(I+yZr@6m-LBSOI6EmS8WcgOjL_ z+Phc|-8Pw@Y!y*U)B`o}RIGxlt(P`2|LVwNv)OEwQBRzN+SMPTZm=EI;aSvFXQO8B zA!@+xyu8qz;TF_XmfOe2Gj2xJhwe8&xz?Z$`F#w)-%uTU9xyXg z5G(2ZuSyWci9T2cr(z-8X6rL?7Wr)~j6*&(1Db;Q$v?qBJcdv33TjEt9yEUo&PL^h z4)O0p7=fCJZkUJuokRjP7>>DdBI?GI)d15`Q@IA!(Kc+1$1oh-51St(Wv~u;OH@bG zurnS)%}~K3rhYbVB|nC)js$~`@-Nw{K;>;eGpC${{)9) zl}vto;99JJV~(58hjo}mejj7;;0bg7@d@T%QyY5H?D{R3PTuNsv(`7Q#ZQ^{xf?d( z{A`TFFHxUp`M%&^w6GLT#2c7^-A|hV97WB9`x*1e*&W{`|L_d+Uzgw!6`FzaXUz={ zqSoju)KYwdzIYG)@UhKbVKBMRIn%x*YRSr3V^P;NK|Og})Dq9YK%C_JPM2G{ck{^Dd~!#ILJC1wIo|n9UMV*d>%va4r*=Pu9~+bFP0;(jM@|3 zQ5}!QA~*pH;!+I4ZRkz^&ItmI{5*!^AE*n1zcqjJ2}7-Aw6!{F3F@MruqCR4@zy2S zl6)ts-E-7Hy|Rq~7)&05E}f`BpeKw&b==O{#o8M+GXqfVW}mYIA*#y8e#! zA*$UIR6n_{ncoq4Q1z9sG5>x9_3epPs3#qcdQHZlE_~NI4b{N{tc1(30G_s9!yxj9 zsCMq(nd|eQ?i++*SOUGV!FSBRo~Q*Cva_`xmL?yK8psMPimR~*9z=EYwXJ`MT0*bu zb`PMIraNjN^D$?}P}i?VZNj52d*W->+AEzuVmXhWRI%ycj`!K~#q|Q5__r zHt`?~!Bo`1mtzZDiJF1CsDb>1>d*Du1|By}gZ!u)1z{ms8%-`>*2_HQEP1=VUY>FUCuJTP^Le8pFvo?Vg-# zPy9W_hdh$<28GXJYpzf)Jjwjs3mMQ3(NF2$T>a?1OEhtrpJ5t}9*qgYVxgh87%ngWh zQ5R$DYSKo>3Cb8sZqDhbVe9qc>Nrd8fmJ!5rV5UGTJvF?SU}09;!S*?;!DxjjE-8w zA5(OEg*z!LDU&E`D0=fVDEjCcNYOEi`dW1KHAZ6tN;PxJ*-Kq(;)6Iam))d!srZ6Y zno1ovaTLB!DQ4@o6Hle+h^3U{raC^PRHw~{ltGlH~#x?b%fKtfW1a}O-fny zub&{_(m0lr@%V~dM`hxkl)s2SpnOVP9yg*d>O;C4r2@G=@n0X+2@X@fq5cr16lFH$ zC3P{VqpsC;oFvL7>xjG9_%U$>%Il+o9r-QJ^XtSJf%>qnO??4keSp8jx%Pry#5&4z ze!7ht60fDMgU#R7`sX3JPRYZ`_M99}IYs^}KCul6|2gJU*Mw{dMsZCC;*+)=Uko|_ zLKIB>>!S|AB}y=DI#O;EU$!U5Y5g~lys#BN*c)9TFG&25vccBro?jBzw|Nz77wSjb zxFMFM;U`#v`UG2_N?e@!u9%-XH{yrHIiGn_$3ELQnD`teH+c*VTjCn>bjm8?CY0X9 zh4Ct-FtI=F>SG~{rmjClN5h;y`6i5C{Coa)Q(2E2 zjKo!xBpPm|1W=b^FX&EQmwXZV+r&>PvxqNH>QleRwp&PjN#YQkM$yrZawaF@Q_$9h z==(~?UdkV~Qh77tYYI5Zryr>hmWuGcP?k5kU%?Qd7N+Nkrd>30$dJ$j3{TN8mk*2qH0!7Ci%J}qz z=pa{7qNCIfv1g`O)#@+e-1vaJ#-Y(dEdGt!ZLoZG{C)3OxW;#VWlJc3`>bh4oglNlGG<9 zsc%O2Y9({$8kpgV{lzCerD@@eesLAOy!#FxmXtg&VOYk37F*rCh9rzj7?LnFBewNh z;l4F1#?%O_T&s5Vs_9FHl=vsD7Mp%_$Qj@Ggkk+hC-hIM9hNbD=-1w%F=1Ipv-bSc zYu16R{aHJ+c3n*4&m&n!GrEqM8Ju2uNrm)X+X6H0%*&rQ=m7P5xadgM-mHCUb#YSG f!K?!rk5>eE6gW)9p{$)3ml?ATXS`ffz25%;fd0JE delta 12419 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 G)%rgHqJl91 diff --git a/django/conf/locale/sr/LC_MESSAGES/django.po b/django/conf/locale/sr/LC_MESSAGES/django.po index 51e9ab54dd..23c68cbfe1 100644 --- a/django/conf/locale/sr/LC_MESSAGES/django.po +++ b/django/conf/locale/sr/LC_MESSAGES/django.po @@ -4,17 +4,18 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-07 20:44+0200\n" -"PO-Revision-Date: 2010-03-23 23:39+0100\n" +"POT-Creation-Date: 2010-08-06 19:53+0200\n" +"PO-Revision-Date: 2010-08-06 19:47+0100\n" "Last-Translator: Janos Guljas \n" "Language-Team: Branko Vukelic & Janos Guljas " " & Nesh & Petar \n" +"Language: \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" #: conf/global_settings.py:44 msgid "Arabic" @@ -69,7 +70,7 @@ msgid "Spanish" msgstr "шпански" #: conf/global_settings.py:57 -msgid "Argentinean Spanish" +msgid "Argentinian Spanish" msgstr "аргентински шпански" #: conf/global_settings.py:58 @@ -121,138 +122,146 @@ msgid "Hungarian" msgstr "мађарски" #: conf/global_settings.py:70 +msgid "Indonesian" +msgstr "индонежански" + +#: conf/global_settings.py:71 msgid "Icelandic" msgstr "исландски" -#: conf/global_settings.py:71 +#: conf/global_settings.py:72 msgid "Italian" msgstr "италијански" -#: conf/global_settings.py:72 +#: conf/global_settings.py:73 msgid "Japanese" msgstr "јапански" -#: conf/global_settings.py:73 +#: conf/global_settings.py:74 msgid "Georgian" msgstr "грузијски" -#: conf/global_settings.py:74 +#: conf/global_settings.py:75 msgid "Khmer" msgstr "камбодијски" -#: conf/global_settings.py:75 +#: conf/global_settings.py:76 msgid "Kannada" msgstr "канада" -#: conf/global_settings.py:76 +#: conf/global_settings.py:77 msgid "Korean" msgstr "корејски" -#: conf/global_settings.py:77 +#: conf/global_settings.py:78 msgid "Lithuanian" msgstr "литвански" -#: conf/global_settings.py:78 +#: conf/global_settings.py:79 msgid "Latvian" msgstr "латвијски" -#: conf/global_settings.py:79 +#: conf/global_settings.py:80 msgid "Macedonian" msgstr "македонски" -#: conf/global_settings.py:80 +#: conf/global_settings.py:81 +msgid "Malayalam" +msgstr "малајаламски" + +#: conf/global_settings.py:82 msgid "Mongolian" msgstr "монголски" -#: conf/global_settings.py:81 +#: conf/global_settings.py:83 msgid "Dutch" msgstr "холандски" -#: conf/global_settings.py:82 +#: conf/global_settings.py:84 msgid "Norwegian" msgstr "норвешки" -#: conf/global_settings.py:83 +#: conf/global_settings.py:85 msgid "Norwegian Bokmal" msgstr "норвешки кнјжевни" -#: conf/global_settings.py:84 +#: conf/global_settings.py:86 msgid "Norwegian Nynorsk" msgstr "норвешки нови" -#: conf/global_settings.py:85 +#: conf/global_settings.py:87 msgid "Polish" msgstr "пољски" -#: conf/global_settings.py:86 +#: conf/global_settings.py:88 msgid "Portuguese" msgstr "португалски" -#: conf/global_settings.py:87 +#: conf/global_settings.py:89 msgid "Brazilian Portuguese" msgstr "бразилски португалски" -#: conf/global_settings.py:88 +#: conf/global_settings.py:90 msgid "Romanian" msgstr "румунски" -#: conf/global_settings.py:89 +#: conf/global_settings.py:91 msgid "Russian" msgstr "руски" -#: conf/global_settings.py:90 +#: conf/global_settings.py:92 msgid "Slovak" msgstr "словачки" -#: conf/global_settings.py:91 +#: conf/global_settings.py:93 msgid "Slovenian" msgstr "словеначки" -#: conf/global_settings.py:92 +#: conf/global_settings.py:94 msgid "Albanian" msgstr "албански" -#: conf/global_settings.py:93 +#: conf/global_settings.py:95 msgid "Serbian" msgstr "српски" -#: conf/global_settings.py:94 +#: conf/global_settings.py:96 msgid "Serbian Latin" msgstr "српски (латиница)" -#: conf/global_settings.py:95 +#: conf/global_settings.py:97 msgid "Swedish" msgstr "шведски" -#: conf/global_settings.py:96 +#: conf/global_settings.py:98 msgid "Tamil" msgstr "тамилски" -#: conf/global_settings.py:97 +#: conf/global_settings.py:99 msgid "Telugu" msgstr "телугу" -#: conf/global_settings.py:98 +#: conf/global_settings.py:100 msgid "Thai" msgstr "тајландски" -#: conf/global_settings.py:99 +#: conf/global_settings.py:101 msgid "Turkish" msgstr "турски" -#: conf/global_settings.py:100 +#: conf/global_settings.py:102 msgid "Ukrainian" msgstr "украјински" -#: conf/global_settings.py:101 +#: conf/global_settings.py:103 msgid "Vietnamese" msgstr "вијетнамски" -#: conf/global_settings.py:102 +#: conf/global_settings.py:104 msgid "Simplified Chinese" msgstr "новокинески" -#: conf/global_settings.py:103 +#: conf/global_settings.py:105 msgid "Traditional Chinese" msgstr "старокинески" @@ -304,15 +313,15 @@ msgstr "Овај месец" msgid "This year" msgstr "Ова година" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "Yes" msgstr "Да" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:478 msgid "No" msgstr "Не" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:478 msgid "Unknown" msgstr "Непознато" @@ -358,7 +367,7 @@ msgid "Changed %s." msgstr "Измењена поља %s" #: contrib/admin/options.py:559 contrib/admin/options.py:569 -#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 +#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845 #: forms/models.py:568 msgid "and" msgstr "и" @@ -457,9 +466,9 @@ msgstr[1] "%(total_count)s изабрано" msgstr[2] "%(total_count)s изабраних" #: contrib/admin/options.py:1071 -#, fuzzy, python-format +#, python-format msgid "0 of %(cnt)s selected" -msgstr "0 од %(cnt)d изабрано" +msgstr "0 од %(cnt)s изабрано" #: contrib/admin/options.py:1118 #, python-format @@ -687,7 +696,7 @@ msgid "Filter" msgstr "Филтер" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300 msgid "Delete" msgstr "Обриши" @@ -849,7 +858,7 @@ msgstr "Сачувај и додај следећи" msgid "Save and continue editing" msgstr "Сачувај и настави са изменама" -#: contrib/admin/templates/admin/auth/user/add_form.html:5 +#: 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." @@ -857,6 +866,10 @@ msgstr "" "Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још " "корисничких подешавања." +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Унесите корисничко име и лозинку" + #: contrib/admin/templates/admin/auth/user/change_password.html:28 #, python-format msgid "Enter a new password for the user %(username)s." @@ -1050,7 +1063,7 @@ msgstr "Имејл адреса:" msgid "Reset my password" msgstr "Ресетуј моју лозинку" -#: contrib/admin/templatetags/admin_list.py:239 +#: contrib/admin/templatetags/admin_list.py:257 msgid "All dates" msgstr "Сви датуми" @@ -1424,8 +1437,8 @@ msgstr "порука" msgid "Logged out" msgstr "Одјављен" -#: contrib/auth/management/commands/createsuperuser.py:23 -#: core/validators.py:120 forms/fields.py:428 +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 forms/fields.py:427 msgid "Enter a valid e-mail address." msgstr "Унесите важећу имејл адресу." @@ -1497,7 +1510,7 @@ msgid "Email address" msgstr "Имејл адреса" #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 -#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109 msgid "URL" msgstr "URL" @@ -1547,7 +1560,7 @@ msgstr "коментар" msgid "date/time submitted" msgstr "датум/време постављања" -#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +#: contrib/comments/models.py:60 db/models/fields/__init__.py:904 msgid "IP address" msgstr "IP адреса" @@ -4471,22 +4484,22 @@ msgstr "сајтови" msgid "Enter a valid value." msgstr "Унесите исправну вредност." -#: core/validators.py:87 forms/fields.py:529 +#: core/validators.py:87 forms/fields.py:528 msgid "Enter a valid URL." msgstr "Унесите исправан URL." -#: core/validators.py:89 forms/fields.py:530 +#: core/validators.py:89 forms/fields.py:529 msgid "This URL appears to be a broken link." msgstr "Овај URL изгледа не води никуда." -#: core/validators.py:123 forms/fields.py:873 +#: core/validators.py:123 forms/fields.py:877 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "" "Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или " "циртица." -#: core/validators.py:126 forms/fields.py:866 +#: core/validators.py:126 forms/fields.py:870 msgid "Enter a valid IPv4 address." msgstr "Унесите исправну IPv4 адресу." @@ -4499,12 +4512,12 @@ msgstr "Унесите само бројке раздвојене запетам msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)." -#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 +#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико." -#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 +#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." @@ -4512,27 +4525,27 @@ msgstr "Ова вредност мора бити већа од %(limit_value)s #: core/validators.py:164 #, python-format msgid "" -"Ensure this value has at least %(limit_value)d characters (it has %" -"(show_value)d)." +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." msgstr "" -"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има %" -"(show_value)d)." +"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има " +"%(show_value)d)." #: core/validators.py:170 #, python-format msgid "" -"Ensure this value has at most %(limit_value)d characters (it has %" -"(show_value)d)." +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." msgstr "" -"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има %" -"(show_value)d)." +"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има " +"%(show_value)d)." -#: db/models/base.py:822 +#: db/models/base.py:823 #, python-format msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgstr "%(field_name)s мора да буде јединствен за %(date_field)s %(lookup)s." -#: db/models/base.py:837 db/models/base.py:845 +#: db/models/base.py:838 db/models/base.py:846 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s са овом вредношћу %(field_label)s већ постоји." @@ -4555,13 +4568,13 @@ msgstr "Ово поље не може да остане празно." msgid "Field of type: %(field_type)s" msgstr "Поње типа: %(field_type)s" -#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 -#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 -#: db/models/fields/__init__.py:999 +#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860 +#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980 +#: db/models/fields/__init__.py:1007 msgid "Integer" msgstr "Цео број" -#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858 msgid "This value must be an integer." msgstr "Ова вредност мора бити целобројна." @@ -4573,7 +4586,7 @@ msgstr "Ова вредност мора бити True или False." msgid "Boolean (Either True or False)" msgstr "Булова вредност (True или False)" -#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990 #, python-format msgid "String (up to %(max_length)s)" msgstr "Стринг (највише %(max_length)s знакова)" @@ -4615,44 +4628,44 @@ msgstr "Децимални број" msgid "E-mail address" msgstr "Имејл адреса" -#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/__init__.py:807 db/models/fields/files.py:220 #: db/models/fields/files.py:331 msgid "File path" msgstr "Путања фајла" -#: db/models/fields/__init__.py:822 +#: db/models/fields/__init__.py:830 msgid "This value must be a float." msgstr "Ова вредност мора бити број са клизећом запетом" -#: db/models/fields/__init__.py:824 +#: db/models/fields/__init__.py:832 msgid "Floating point number" msgstr "Број са покреном запетом" -#: db/models/fields/__init__.py:883 +#: db/models/fields/__init__.py:891 msgid "Big (8 byte) integer" msgstr "Велики цео број" -#: db/models/fields/__init__.py:912 +#: db/models/fields/__init__.py:920 msgid "This value must be either None, True or False." msgstr "Ова вредност мора бити или None, или True, или False." -#: db/models/fields/__init__.py:914 +#: db/models/fields/__init__.py:922 msgid "Boolean (Either True, False or None)" msgstr "Булова вредност (True, False или None)" -#: db/models/fields/__init__.py:1005 +#: db/models/fields/__init__.py:1013 msgid "Text" msgstr "Текст" -#: db/models/fields/__init__.py:1021 +#: db/models/fields/__init__.py:1029 msgid "Time" msgstr "Време" -#: db/models/fields/__init__.py:1025 +#: db/models/fields/__init__.py:1033 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Унесите исправно време у формату ЧЧ:ММ[:сс[.уууууу]]." -#: db/models/fields/__init__.py:1109 +#: db/models/fields/__init__.py:1125 msgid "XML text" msgstr "XML текст" @@ -4665,22 +4678,22 @@ msgstr "Објекат класе %(model)s са примарним кључем msgid "Foreign Key (type determined by related field)" msgstr "Страни кључ (тип одређује референтно поље)" -#: db/models/fields/related.py:918 +#: db/models/fields/related.py:919 msgid "One-to-one relationship" msgstr "Релација један на један" -#: db/models/fields/related.py:980 +#: db/models/fields/related.py:981 msgid "Many-to-many relationship" msgstr "Релација више на више" -#: db/models/fields/related.py:1000 +#: db/models/fields/related.py:1001 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне " "ставке." -#: db/models/fields/related.py:1061 +#: db/models/fields/related.py:1062 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -4693,62 +4706,62 @@ msgstr[2] "Унесите исправан %(self)s IDs. Вредности %(va msgid "This field is required." msgstr "Ово поље се мора попунити." -#: forms/fields.py:204 +#: forms/fields.py:203 msgid "Enter a whole number." msgstr "Унесите цео број." -#: forms/fields.py:235 forms/fields.py:256 +#: forms/fields.py:234 forms/fields.py:255 msgid "Enter a number." msgstr "Унесите број." -#: forms/fields.py:259 +#: forms/fields.py:258 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Не сме бити укупно више од %s цифара. Проверите." -#: forms/fields.py:260 +#: forms/fields.py:259 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Не сме бити укупно више од %s децималних места. Проверите." -#: forms/fields.py:261 +#: forms/fields.py:260 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Не сме бити укупно више од %s цифара пре запете. Проверите." -#: forms/fields.py:323 forms/fields.py:838 +#: forms/fields.py:322 forms/fields.py:837 msgid "Enter a valid date." msgstr "Унесите исправан датум." -#: forms/fields.py:351 forms/fields.py:839 +#: forms/fields.py:350 forms/fields.py:838 msgid "Enter a valid time." msgstr "Унесите исправно време" -#: forms/fields.py:377 +#: forms/fields.py:376 msgid "Enter a valid date/time." msgstr "Унесите исправан датум/време." -#: forms/fields.py:435 +#: forms/fields.py:434 msgid "No file was submitted. Check the encoding type on the form." msgstr "Фајл није пребачен. Проверите тип енкодирања формулара." -#: forms/fields.py:436 +#: forms/fields.py:435 msgid "No file was submitted." msgstr "Фајл није пребачен." -#: forms/fields.py:437 +#: forms/fields.py:436 msgid "The submitted file is empty." msgstr "Пребачен фајл је празан." -#: forms/fields.py:438 +#: forms/fields.py:437 #, python-format msgid "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." msgstr "" -"Назив фајла мора да садржи бар %(max)d словних места (тренутно има %(length)" -"d)." +"Назив фајла мора да садржи бар %(max)d словних места (тренутно има " +"%(length)d)." -#: forms/fields.py:473 +#: forms/fields.py:472 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -4756,17 +4769,17 @@ msgstr "" "Пребаците исправан фајл. Фајл који је пребачен или није слика, или је " "оштећен." -#: forms/fields.py:596 forms/fields.py:671 +#: forms/fields.py:595 forms/fields.py:670 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" "%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених." -#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 +#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002 msgid "Enter a list of values." msgstr "Унесите листу вредности." -#: forms/formsets.py:298 forms/formsets.py:300 +#: forms/formsets.py:296 forms/formsets.py:298 msgid "Order" msgstr "Редослед" @@ -5103,23 +5116,23 @@ msgstr "%(number)d %(type)s" msgid ", %(number)d %(type)s" msgstr ", %(number)d %(type)s" -#: utils/translation/trans_real.py:518 +#: utils/translation/trans_real.py:519 msgid "DATE_FORMAT" msgstr "j. F Y." -#: utils/translation/trans_real.py:519 +#: utils/translation/trans_real.py:520 msgid "DATETIME_FORMAT" msgstr "j. F Y. H:i Т" -#: utils/translation/trans_real.py:520 +#: utils/translation/trans_real.py:521 msgid "TIME_FORMAT" msgstr "G:i" -#: utils/translation/trans_real.py:541 +#: utils/translation/trans_real.py:542 msgid "YEAR_MONTH_FORMAT" msgstr "F Y." -#: utils/translation/trans_real.py:542 +#: utils/translation/trans_real.py:543 msgid "MONTH_DAY_FORMAT" msgstr "j. F" diff --git a/django/conf/locale/sr/LC_MESSAGES/djangojs.mo b/django/conf/locale/sr/LC_MESSAGES/djangojs.mo index 6de25a218c3219cdcb717b433e3e7ce9e1c611aa..b74e78cc4b8b119ac483560bc5822646050f335a 100644 GIT binary patch delta 611 zcmXZZJuE{}6u|M@=c`J6wHT=0g&>hs>Z28dK}ZA(!bD4GBH|;`#L%RR#4L|RBGNRe z#r9&5STKk%Jd4EA$x7M;i^cyuPIBJw-q(BYIq&wa`NyBmH`o zxsnI;;1bovb(D=s^y4AQ`W(j4LRsghOEHMNQr#HGFvjp0_wgHD)K`sU14;8v_;^a^ zQba=j8VUId2{}}v>JO)RF2N}(HzrNhlJ%qn-{IUa^_&|}?VY=;8(q74YfYOeqtCoC zg65Zz^3LcfJ*(%*F+F4DN=6M&q$f0>d!s}BVe_-B=$VXfCX(^Q>X5eH%Ew*ignQV$ ZaDVttwSA`TthO`SK6l0$>%H>D^$Q5%Oa1@= delta 918 zcmYk)Ur19?9Ki9j+jLX=W6oM-!68~`P?@xh9t0_b9(-v<5JIl)+D2FBwvr-hYJZ-C z8D&sGQ4#f^PH7}2QBOUc`w~6$=c$*1DDZ6|eSfzR9rin)bI(2JcmCW}n%{&ApPT$Q z6=icZeq)6A=%bOPGu9i_nEgb`-T&Uau4qu7XtaW$U67EI$>yoNIFR`vNA%7zzEZs;w_6}u>T zPqQmAhb^qHF42&Ilh}-pu>qx%1+tQ&_CX=^y+;P;w6s;lY z@3k&RkJy8m5nIJ{uRf}e6FoYnVzy%^&gu)9b2*(zWzq?|HQ%P=LrI-*(up&=^uao0 z)kk->cj}Jz1AF%sx7YkCZLRI`ZJ98y%&eJmZ!1I79dpOsD`wFwn6fN55a`M@*&xVKQrI{xkUBw&0@SeN8Ui1ddn6f)==CmoB7iOAeMrmqq Pc$u0B-s{q%;CtU6h32_L diff --git a/django/conf/locale/sr/LC_MESSAGES/djangojs.po b/django/conf/locale/sr/LC_MESSAGES/djangojs.po index 56a550b375..aecb4267dd 100644 --- a/django/conf/locale/sr/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/sr/LC_MESSAGES/djangojs.po @@ -4,50 +4,24 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-07 20:46+0200\n" +"POT-Creation-Date: 2010-08-06 19:53+0200\n" "PO-Revision-Date: 2009-03-30 14:04+0200\n" "Last-Translator: Janos Guljas \n" "Language-Team: Branko Vukelic & Janos Guljas " " & Nesh & Petar \n" +"Language: \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" - -#: contrib/admin/media/js/SelectFilter2.js:37 -#, perl-format -msgid "Available %s" -msgstr "Доступни %s" - -#: contrib/admin/media/js/SelectFilter2.js:45 -msgid "Choose all" -msgstr "Додај све" - -#: contrib/admin/media/js/SelectFilter2.js:50 -msgid "Add" -msgstr "Додај" - -#: contrib/admin/media/js/SelectFilter2.js:52 -msgid "Remove" -msgstr "Уклони" - -#: contrib/admin/media/js/SelectFilter2.js:57 -#, perl-format -msgid "Chosen %s" -msgstr "Одабрани %s" - -#: contrib/admin/media/js/SelectFilter2.js:58 -msgid "Select your choice(s) and click " -msgstr "Направите избор и кликните " +"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" #: contrib/admin/media/js/SelectFilter2.js:63 msgid "Clear all" msgstr "Врати све" #: contrib/admin/media/js/actions.js:18 -#: contrib/admin/media/js/actions.min.js:1 msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s од %(cnt)s изабран" @@ -55,7 +29,6 @@ msgstr[1] "%(sel)s од %(cnt)s изабрано" msgstr[2] "%(sel)s од %(cnt)s изабраних" #: contrib/admin/media/js/actions.js:109 -#: contrib/admin/media/js/actions.min.js:5 msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." @@ -151,3 +124,21 @@ msgstr "Јуче" #: contrib/admin/media/js/admin/DateTimeShortcuts.js:184 msgid "Tomorrow" msgstr "Сутра" + +#~ msgid "Available %s" +#~ msgstr "Доступни %s" + +#~ msgid "Choose all" +#~ msgstr "Додај све" + +#~ msgid "Add" +#~ msgstr "Додај" + +#~ msgid "Remove" +#~ msgstr "Уклони" + +#~ msgid "Chosen %s" +#~ msgstr "Одабрани %s" + +#~ msgid "Select your choice(s) and click " +#~ msgstr "Направите избор и кликните " diff --git a/django/conf/locale/sr/formats.py b/django/conf/locale/sr/formats.py index 63a20f4574..cb0478ed0f 100644 --- a/django/conf/locale/sr/formats.py +++ b/django/conf/locale/sr/formats.py @@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.' SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' FIRST_DAY_OF_WEEK = 1 DATE_INPUT_FORMATS = ( - '%Y-%m-%d', # '2006-10-25' '%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' + '%Y-%m-%d', # '2006-10-25' # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' @@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = ( '%H:%M', # '14:30' ) DATETIME_INPUT_FORMATS = ( - '%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' '%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59' '%d.%m.%Y. %H:%M', # '25.10.2006. 14:30' '%d.%m.%Y.', # '25.10.2006.' @@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = ( '%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59' '%d. %m. %y. %H:%M', # '25. 10. 06. 14:30' '%d. %m. %y.', # '25. 10. 06.' + '%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' ) -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo b/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo index ad6193b38b3eda3c716b4b3bcf409c6a56949c81..ad04e754de45bb584a10fd148a7d3333fdedd7b0 100644 GIT binary patch delta 12584 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 Yd-%}2{tK`81dXJ>VctFya_dF@4|`WTN&o-= delta 12419 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 diff --git a/django/conf/locale/sr_Latn/LC_MESSAGES/django.po b/django/conf/locale/sr_Latn/LC_MESSAGES/django.po index 7947647f8c..7a289c3d23 100644 --- a/django/conf/locale/sr_Latn/LC_MESSAGES/django.po +++ b/django/conf/locale/sr_Latn/LC_MESSAGES/django.po @@ -4,17 +4,15 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-07 20:46+0200\n" -"PO-Revision-Date: 2010-03-23 23:39+0100\n" +"POT-Creation-Date: 2010-08-06 19:43+0200\n" +"PO-Revision-Date: 2010-08-06 19:47+0100\n" "Last-Translator: Janos Guljas \n" -"Language-Team: Branko Vukelic & Janos Guljas " -" & Nesh & Petar \n" +"Language-Team: Branko Vukelic & Janos Guljas & Nesh & Petar \n" +"Language: \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" #: conf/global_settings.py:44 msgid "Arabic" @@ -69,7 +67,7 @@ msgid "Spanish" msgstr "španski" #: conf/global_settings.py:57 -msgid "Argentinean Spanish" +msgid "Argentinian Spanish" msgstr "argentinski španski" #: conf/global_settings.py:58 @@ -121,138 +119,146 @@ msgid "Hungarian" msgstr "mađarski" #: conf/global_settings.py:70 +msgid "Indonesian" +msgstr "indonežanski" + +#: conf/global_settings.py:71 msgid "Icelandic" msgstr "islandski" -#: conf/global_settings.py:71 +#: conf/global_settings.py:72 msgid "Italian" msgstr "italijanski" -#: conf/global_settings.py:72 +#: conf/global_settings.py:73 msgid "Japanese" msgstr "japanski" -#: conf/global_settings.py:73 +#: conf/global_settings.py:74 msgid "Georgian" msgstr "gruzijski" -#: conf/global_settings.py:74 +#: conf/global_settings.py:75 msgid "Khmer" msgstr "kambodijski" -#: conf/global_settings.py:75 +#: conf/global_settings.py:76 msgid "Kannada" msgstr "kanada" -#: conf/global_settings.py:76 +#: conf/global_settings.py:77 msgid "Korean" msgstr "korejski" -#: conf/global_settings.py:77 +#: conf/global_settings.py:78 msgid "Lithuanian" msgstr "litvanski" -#: conf/global_settings.py:78 +#: conf/global_settings.py:79 msgid "Latvian" msgstr "latvijski" -#: conf/global_settings.py:79 +#: conf/global_settings.py:80 msgid "Macedonian" msgstr "makedonski" -#: conf/global_settings.py:80 +#: conf/global_settings.py:81 +msgid "Malayalam" +msgstr "malajalamski" + +#: conf/global_settings.py:82 msgid "Mongolian" msgstr "mongolski" -#: conf/global_settings.py:81 +#: conf/global_settings.py:83 msgid "Dutch" msgstr "holandski" -#: conf/global_settings.py:82 +#: conf/global_settings.py:84 msgid "Norwegian" msgstr "norveški" -#: conf/global_settings.py:83 +#: conf/global_settings.py:85 msgid "Norwegian Bokmal" msgstr "norveški knjževni" -#: conf/global_settings.py:84 +#: conf/global_settings.py:86 msgid "Norwegian Nynorsk" msgstr "norveški novi" -#: conf/global_settings.py:85 +#: conf/global_settings.py:87 msgid "Polish" msgstr "poljski" -#: conf/global_settings.py:86 +#: conf/global_settings.py:88 msgid "Portuguese" msgstr "portugalski" -#: conf/global_settings.py:87 +#: conf/global_settings.py:89 msgid "Brazilian Portuguese" msgstr "brazilski portugalski" -#: conf/global_settings.py:88 +#: conf/global_settings.py:90 msgid "Romanian" msgstr "rumunski" -#: conf/global_settings.py:89 +#: conf/global_settings.py:91 msgid "Russian" msgstr "ruski" -#: conf/global_settings.py:90 +#: conf/global_settings.py:92 msgid "Slovak" msgstr "slovački" -#: conf/global_settings.py:91 +#: conf/global_settings.py:93 msgid "Slovenian" msgstr "slovenački" -#: conf/global_settings.py:92 +#: conf/global_settings.py:94 msgid "Albanian" msgstr "albanski" -#: conf/global_settings.py:93 +#: conf/global_settings.py:95 msgid "Serbian" msgstr "srpski" -#: conf/global_settings.py:94 +#: conf/global_settings.py:96 msgid "Serbian Latin" msgstr "srpski (latinica)" -#: conf/global_settings.py:95 +#: conf/global_settings.py:97 msgid "Swedish" msgstr "švedski" -#: conf/global_settings.py:96 +#: conf/global_settings.py:98 msgid "Tamil" msgstr "tamilski" -#: conf/global_settings.py:97 +#: conf/global_settings.py:99 msgid "Telugu" msgstr "telugu" -#: conf/global_settings.py:98 +#: conf/global_settings.py:100 msgid "Thai" msgstr "tajlandski" -#: conf/global_settings.py:99 +#: conf/global_settings.py:101 msgid "Turkish" msgstr "turski" -#: conf/global_settings.py:100 +#: conf/global_settings.py:102 msgid "Ukrainian" msgstr "ukrajinski" -#: conf/global_settings.py:101 +#: conf/global_settings.py:103 msgid "Vietnamese" msgstr "vijetnamski" -#: conf/global_settings.py:102 +#: conf/global_settings.py:104 msgid "Simplified Chinese" msgstr "novokineski" -#: conf/global_settings.py:103 +#: conf/global_settings.py:105 msgid "Traditional Chinese" msgstr "starokineski" @@ -261,7 +267,8 @@ msgstr "starokineski" msgid "Successfully deleted %(count)d %(items)s." msgstr "Uspešno obrisano: %(count)d %(items)s." -#: contrib/admin/actions.py:55 contrib/admin/options.py:1125 +#: contrib/admin/actions.py:55 +#: contrib/admin/options.py:1125 msgid "Are you sure?" msgstr "Da li ste sigurni?" @@ -279,8 +286,10 @@ msgstr "" "

      %s:

      \n" "
        \n" -#: contrib/admin/filterspecs.py:75 contrib/admin/filterspecs.py:92 -#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173 +#: contrib/admin/filterspecs.py:75 +#: contrib/admin/filterspecs.py:92 +#: contrib/admin/filterspecs.py:147 +#: contrib/admin/filterspecs.py:173 msgid "All" msgstr "Svi" @@ -304,15 +313,18 @@ msgstr "Ovaj mesec" msgid "This year" msgstr "Ova godina" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 +#: forms/widgets.py:478 msgid "Yes" msgstr "Da" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:147 +#: forms/widgets.py:478 msgid "No" msgstr "Ne" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 +#: contrib/admin/filterspecs.py:154 +#: forms/widgets.py:478 msgid "Unknown" msgstr "Nepoznato" @@ -348,7 +360,8 @@ msgstr "zapis u logovima" msgid "log entries" msgstr "zapisi u logovima" -#: contrib/admin/options.py:138 contrib/admin/options.py:153 +#: contrib/admin/options.py:138 +#: contrib/admin/options.py:153 msgid "None" msgstr "Ništa" @@ -357,8 +370,10 @@ msgstr "Ništa" msgid "Changed %s." msgstr "Izmenjena polja %s" -#: contrib/admin/options.py:559 contrib/admin/options.py:569 -#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 +#: contrib/admin/options.py:559 +#: contrib/admin/options.py:569 +#: contrib/comments/templates/comments/preview.html:16 +#: db/models/base.py:845 #: forms/models.py:568 msgid "and" msgstr "i" @@ -387,11 +402,13 @@ msgstr "Bez izmena u poljima." msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "Objekat „%(obj)s“ klase %(name)s sačuvan je uspešno." -#: contrib/admin/options.py:647 contrib/admin/options.py:680 +#: contrib/admin/options.py:647 +#: contrib/admin/options.py:680 msgid "You may edit it again below." msgstr "Dole možete ponovo da unosite izmene." -#: contrib/admin/options.py:657 contrib/admin/options.py:690 +#: contrib/admin/options.py:657 +#: contrib/admin/options.py:690 #, python-format msgid "You may add another %s below." msgstr "Dole možete da dodate novi objekat klase %s" @@ -403,19 +420,13 @@ msgstr "Objekat „%(obj)s“ klase %(name)s izmenjen je uspešno." #: contrib/admin/options.py:686 #, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" -"Objekat „%(obj)s“ klase %(name)s dodat je uspešno. Dole možete uneti dodatne " -"izmene." +msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "Objekat „%(obj)s“ klase %(name)s dodat je uspešno. Dole možete uneti dodatne izmene." -#: contrib/admin/options.py:740 contrib/admin/options.py:997 -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan " -"objekat nije promenjen." +#: contrib/admin/options.py:740 +#: contrib/admin/options.py:997 +msgid "Items must be selected in order to perform actions on them. No items have been changed." +msgstr "Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan objekat nije promenjen." #: contrib/admin/options.py:759 msgid "No action selected." @@ -426,7 +437,8 @@ msgstr "Nije izabrana nijedna akcija." msgid "Add %s" msgstr "Dodaj objekat klase %s" -#: contrib/admin/options.py:866 contrib/admin/options.py:1105 +#: contrib/admin/options.py:866 +#: contrib/admin/options.py:1105 #, python-format msgid "%(name)s object with primary key %(key)r does not exist." msgstr "Objekat klase %(name)s sa primarnim ključem %(key)r ne postoji." @@ -457,9 +469,9 @@ msgstr[1] "%(total_count)s izabrano" msgstr[2] "%(total_count)s izabranih" #: contrib/admin/options.py:1071 -#, fuzzy, python-format +#, python-format msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)d izabrano" +msgstr "0 od %(cnt)s izabrano" #: contrib/admin/options.py:1118 #, python-format @@ -471,33 +483,30 @@ msgstr "Objekat „%(obj)s“ klase %(name)s uspešno je obrisan." msgid "Change history: %s" msgstr "Istorijat izmena: %s" -#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:14 +#: contrib/admin/sites.py:18 +#: contrib/admin/views/decorators.py:14 #: contrib/auth/forms.py:81 -msgid "" -"Please enter a correct username and password. Note that both fields are case-" -"sensitive." -msgstr "" -"Unesite tačno korisničko ime i lozinku. Pazite na razliku između malih i " -"velikih slova u oba polja." +msgid "Please enter a correct username and password. Note that both fields are case-sensitive." +msgstr "Unesite tačno korisničko ime i lozinku. Pazite na razliku između malih i velikih slova u oba polja." -#: contrib/admin/sites.py:307 contrib/admin/views/decorators.py:40 +#: contrib/admin/sites.py:307 +#: contrib/admin/views/decorators.py:40 msgid "Please log in again, because your session has expired." msgstr "Prijavite se ponovo pošto je vaša sesija istekla." -#: contrib/admin/sites.py:314 contrib/admin/views/decorators.py:47 -msgid "" -"Looks like your browser isn't configured to accept cookies. Please enable " -"cookies, reload this page, and try again." -msgstr "" -"Izgleda da vaš brauzer nije podešen da prima kolačiće. Uključite kolačiće, " -"osvežite ovu stranicu i probajte ponovo." +#: contrib/admin/sites.py:314 +#: contrib/admin/views/decorators.py:47 +msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again." +msgstr "Izgleda da vaš brauzer nije podešen da prima kolačiće. Uključite kolačiće, osvežite ovu stranicu i probajte ponovo." -#: contrib/admin/sites.py:330 contrib/admin/sites.py:336 +#: contrib/admin/sites.py:330 +#: contrib/admin/sites.py:336 #: contrib/admin/views/decorators.py:66 msgid "Usernames cannot contain the '@' character." msgstr "Korisnička imena ne smeju da sadrže znak „@“." -#: contrib/admin/sites.py:333 contrib/admin/views/decorators.py:62 +#: contrib/admin/sites.py:333 +#: contrib/admin/views/decorators.py:62 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "Vaša imejl adresa nije vaše korisničko ime. Probajte sa „%s“." @@ -506,7 +515,8 @@ msgstr "Vaša imejl adresa nije vaše korisničko ime. Probajte sa „%s“." msgid "Site administration" msgstr "Administracija sistema" -#: contrib/admin/sites.py:403 contrib/admin/templates/admin/login.html:26 +#: contrib/admin/sites.py:403 +#: contrib/admin/templates/admin/login.html:26 #: contrib/admin/templates/registration/password_reset_complete.html:14 #: contrib/admin/views/decorators.py:20 msgid "Log in" @@ -584,12 +594,8 @@ msgid "Server Error (500)" msgstr "Greška na serveru (500)" #: 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 "" -"Došlo je do greške. Administrator sajta je obavešten imejlom i greška će " -"biti uskoro otklonjena. Hvala 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 "Došlo je do greške. Administrator sajta je obavešten imejlom i greška će biti uskoro otklonjena. Hvala na strpljenju." #: contrib/admin/templates/admin/actions.html:4 msgid "Run the selected action" @@ -687,29 +693,20 @@ msgid "Filter" msgstr "Filter" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 +#: contrib/admin/templates/admin/submit_line.html:4 +#: forms/formsets.py:300 msgid "Delete" msgstr "Obriši" #: contrib/admin/templates/admin/delete_confirmation.html:16 #, 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 "" -"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih " -"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za " -"brisanje sledećih tipova objekata:" +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 "Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za brisanje sledećih tipova objekata:" #: contrib/admin/templates/admin/delete_confirmation.html:23 #, 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 "" -"Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? " -"Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" +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 "Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" #: contrib/admin/templates/admin/delete_confirmation.html:28 #: contrib/admin/templates/admin/delete_selected_confirmation.html:33 @@ -722,23 +719,13 @@ msgstr "Brisanje više objekata" #: contrib/admin/templates/admin/delete_selected_confirmation.html:15 #, python-format -msgid "" -"Deleting the %(object_name)s would result in deleting related objects, but " -"your account doesn't have permission to delete the following types of " -"objects:" -msgstr "" -"Uklanjanje %(object_name)s povlači uklanjanje svih objekata koji su povezani " -"sa ovim objektom, ali vaš nalog nema dozvole za brisanje sledećih tipova " -"objekata:" +msgid "Deleting the %(object_name)s would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:" +msgstr "Uklanjanje %(object_name)s povlači uklanjanje svih objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za brisanje sledećih tipova objekata:" #: contrib/admin/templates/admin/delete_selected_confirmation.html:22 #, python-format -msgid "" -"Are you sure you want to delete the selected %(object_name)s objects? All of " -"the following objects and their related items will be deleted:" -msgstr "" -"Da sigurni da želite da obrišete odabrane %(object_name)s? Sledeći objekti " -"koji su u vezi sa ovim objektom će takođe biti obrisani:" +msgid "Are you sure you want to delete the selected %(object_name)s objects? All of the following objects and their related items will be deleted:" +msgstr "Da sigurni da želite da obrišete odabrane %(object_name)s? Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" #: contrib/admin/templates/admin/filter.html:2 #, python-format @@ -775,13 +762,8 @@ msgid "Unknown content" msgstr "Nepoznat sadržaj" #: 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 "" -"Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje " -"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." +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 "Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." #: contrib/admin/templates/admin/login.html:19 msgid "Username:" @@ -804,12 +786,8 @@ msgid "Action" msgstr "Radnja" #: contrib/admin/templates/admin/object_history.html:38 -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj " -"sajt za administraciju." +msgid "This object doesn't have a change history. It probably wasn't added via this admin site." +msgstr "Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj sajt za administraciju." #: contrib/admin/templates/admin/pagination.html:10 msgid "Show all" @@ -849,13 +827,13 @@ msgstr "Sačuvaj i dodaj sledeći" msgid "Save and continue editing" msgstr "Sačuvaj i nastavi sa izmenama" -#: contrib/admin/templates/admin/auth/user/add_form.html:5 -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Prvo unesite korisničko ime i lozinku. Potom ćete moći da menjate još " -"korisničkih podešavanja." +#: 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 "Prvo unesite korisničko ime i lozinku. Potom ćete moći da menjate još korisničkih podešavanja." + +#: contrib/admin/templates/admin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Unesite korisničko ime i lozinku" #: contrib/admin/templates/admin/auth/user/change_password.html:28 #, python-format @@ -863,7 +841,9 @@ msgid "Enter a new password for the user %(username)s." msgstr "Unesite novu lozinku za korisnika %(username)s." #: contrib/admin/templates/admin/auth/user/change_password.html:35 -#: contrib/auth/forms.py:17 contrib/auth/forms.py:61 contrib/auth/forms.py:186 +#: contrib/auth/forms.py:17 +#: contrib/auth/forms.py:61 +#: contrib/auth/forms.py:186 msgid "Password" msgstr "Lozinka" @@ -919,12 +899,8 @@ msgid "Your password was changed." msgstr "Vaša lozinka je izmenjena." #: contrib/admin/templates/registration/password_change_form.html:21 -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 "" -"Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim " -"unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli." +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 "Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli." #: contrib/admin/templates/registration/password_change_form.html:27 #: contrib/auth/forms.py:170 @@ -968,12 +944,8 @@ msgid "Enter new password" msgstr "Unesite novu lozinku" #: contrib/admin/templates/registration/password_reset_confirm.html:14 -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je " -"pravilno uneli." +msgid "Please enter your new password twice so we can verify you typed it in correctly." +msgstr "Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je pravilno uneli." #: contrib/admin/templates/registration/password_reset_confirm.html:18 msgid "New password:" @@ -988,12 +960,8 @@ msgid "Password reset unsuccessful" msgstr "Resetovanje lozinke neuspešno" #: contrib/admin/templates/registration/password_reset_confirm.html:28 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link za resetovanje lozinke nije važeći, verovatno zato što je već " -"iskorišćen. Ponovo zatražite resetovanje lozinke." +msgid "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." +msgstr "Link za resetovanje lozinke nije važeći, verovatno zato što je već iskorišćen. Ponovo zatražite resetovanje lozinke." #: contrib/admin/templates/registration/password_reset_done.html:6 #: contrib/admin/templates/registration/password_reset_done.html:10 @@ -1001,12 +969,8 @@ msgid "Password reset successful" msgstr "Resetovanje lozinke uspešno." #: contrib/admin/templates/registration/password_reset_done.html:12 -msgid "" -"We've e-mailed you instructions for setting your password to the e-mail " -"address you submitted. You should be receiving it shortly." -msgstr "" -"Poslali smo uputstva za postavljanje nove lozinke na imejl adresu koju ste " -"nam dali. Uputstva ćete dobiti uskoro." +msgid "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." +msgstr "Poslali smo uputstva za postavljanje nove lozinke na imejl adresu koju ste nam dali. Uputstva ćete dobiti uskoro." #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" @@ -1035,12 +999,8 @@ msgid "The %(site_name)s team" msgstr "Ekipa sajta %(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 e-mail " -"instructions for setting a new one." -msgstr "" -"Zaboravili ste lozinku? Unesite svoju imejl adresu dole i poslaćemo vam " -"uputstva za postavljanje nove." +msgid "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one." +msgstr "Zaboravili ste lozinku? Unesite svoju imejl adresu dole i poslaćemo vam uputstva za postavljanje nove." #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -1050,7 +1010,7 @@ msgstr "Imejl adresa:" msgid "Reset my password" msgstr "Resetuj moju lozinku" -#: contrib/admin/templatetags/admin_list.py:239 +#: contrib/admin/templatetags/admin_list.py:257 msgid "All dates" msgstr "Svi datumi" @@ -1064,7 +1024,8 @@ msgstr "Odaberi objekat klase %s" msgid "Select %s to change" msgstr "Odaberi objekat klase %s za izmenu" -#: contrib/admin/views/template.py:38 contrib/sites/models.py:38 +#: contrib/admin/views/template.py:38 +#: contrib/sites/models.py:38 msgid "site" msgstr "sajt" @@ -1072,17 +1033,20 @@ msgstr "sajt" msgid "template" msgstr "templejt" -#: contrib/admindocs/views.py:61 contrib/admindocs/views.py:63 +#: contrib/admindocs/views.py:61 +#: contrib/admindocs/views.py:63 #: contrib/admindocs/views.py:65 msgid "tag:" msgstr "tag:" -#: contrib/admindocs/views.py:94 contrib/admindocs/views.py:96 +#: contrib/admindocs/views.py:94 +#: contrib/admindocs/views.py:96 #: contrib/admindocs/views.py:98 msgid "filter:" msgstr "filter:" -#: contrib/admindocs/views.py:158 contrib/admindocs/views.py:160 +#: contrib/admindocs/views.py:158 +#: contrib/admindocs/views.py:160 #: contrib/admindocs/views.py:162 msgid "view:" msgstr "vju:" @@ -1102,28 +1066,34 @@ msgstr "Model %(model_name)r nije pronađen u aplikaciji %(app_label)r" msgid "the related `%(app_label)s.%(data_type)s` object" msgstr "povezani objekti klase `%(app_label)s.%(data_type)s`" -#: contrib/admindocs/views.py:209 contrib/admindocs/views.py:228 -#: contrib/admindocs/views.py:233 contrib/admindocs/views.py:247 -#: contrib/admindocs/views.py:261 contrib/admindocs/views.py:266 +#: contrib/admindocs/views.py:209 +#: contrib/admindocs/views.py:228 +#: contrib/admindocs/views.py:233 +#: contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:261 +#: contrib/admindocs/views.py:266 msgid "model:" msgstr "model:" # WARN: possible breakage in future # This string is interpolated in strings below, which can cause breakage in # future releases. -#: contrib/admindocs/views.py:224 contrib/admindocs/views.py:256 +#: contrib/admindocs/views.py:224 +#: contrib/admindocs/views.py:256 #, python-format msgid "related `%(app_label)s.%(object_name)s` objects" msgstr "klase `%(app_label)s.%(object_name)s`" # WARN: possible breakage in future -#: contrib/admindocs/views.py:228 contrib/admindocs/views.py:261 +#: contrib/admindocs/views.py:228 +#: contrib/admindocs/views.py:261 #, python-format msgid "all %s" msgstr "svi povezani objekti %s" # WARN: possible breakage in future -#: contrib/admindocs/views.py:233 contrib/admindocs/views.py:266 +#: contrib/admindocs/views.py:233 +#: contrib/admindocs/views.py:266 #, python-format msgid "number of %s" msgstr "broj povezanih objekata %s" @@ -1170,24 +1140,16 @@ msgid "Documentation for this page" msgstr "Dokumentacija za ovu stranicu" #: contrib/admindocs/templates/admin_doc/bookmarklets.html:19 -msgid "" -"Jumps you from any page to the documentation for the view that generates " -"that page." -msgstr "" -"Vodi od bilo koje stranice do dokumentaicje pogleda koji je generisao tu " -"stranicu." +msgid "Jumps you from any page to the documentation for the view that generates that page." +msgstr "Vodi od bilo koje stranice do dokumentaicje pogleda koji je generisao tu stranicu." #: contrib/admindocs/templates/admin_doc/bookmarklets.html:21 msgid "Show object ID" msgstr "Prikaži ID objekta" #: contrib/admindocs/templates/admin_doc/bookmarklets.html:22 -msgid "" -"Shows the content-type and unique ID for pages that represent a single " -"object." -msgstr "" -"Prikazuje content-type i jedinstveni ID za stranicu koja prestavlja jedan " -"objekat." +msgid "Shows the content-type and unique ID for pages that represent a single object." +msgstr "Prikazuje content-type i jedinstveni ID za stranicu koja prestavlja jedan objekat." #: contrib/admindocs/templates/admin_doc/bookmarklets.html:24 msgid "Edit this object (current window)" @@ -1195,8 +1157,7 @@ msgstr "Izmeni ovaj objekat (u ovom prozoru)" #: contrib/admindocs/templates/admin_doc/bookmarklets.html:25 msgid "Jumps to the admin page for pages that represent a single object." -msgstr "" -"Vodi u administracioni stranicu za stranice koje prestavljaju jedan objekat" +msgstr "Vodi u administracioni stranicu za stranice koje prestavljaju jedan objekat" #: contrib/admindocs/templates/admin_doc/bookmarklets.html:27 msgid "Edit this object (new window)" @@ -1204,8 +1165,7 @@ msgstr "Izmeni ovaj objekat (novi prozor)" #: contrib/admindocs/templates/admin_doc/bookmarklets.html:28 msgid "As above, but opens the admin page in a new window." -msgstr "" -"Isto kao prethodni, ali otvara administracionu stranicu u novom prozoru." +msgstr "Isto kao prethodni, ali otvara administracionu stranicu u novom prozoru." #: contrib/auth/admin.py:29 msgid "Personal info" @@ -1232,17 +1192,19 @@ msgstr "Lozinka uspešno izmenjena." msgid "Change password: %s" msgstr "Izmeni lozinku: %s" -#: contrib/auth/forms.py:14 contrib/auth/forms.py:48 contrib/auth/forms.py:60 +#: contrib/auth/forms.py:14 +#: contrib/auth/forms.py:48 +#: contrib/auth/forms.py:60 msgid "Username" msgstr "Korisnik" -#: contrib/auth/forms.py:15 contrib/auth/forms.py:49 +#: contrib/auth/forms.py:15 +#: contrib/auth/forms.py:49 msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only." -msgstr "" -"Neophodno. Najviše 30 slovnih mesta. Samo alfanumerički znaci (slova, brojke " -"i @/./+/-/_)." +msgstr "Neophodno. Najviše 30 slovnih mesta. Samo alfanumerički znaci (slova, brojke i @/./+/-/_)." -#: contrib/auth/forms.py:16 contrib/auth/forms.py:50 +#: contrib/auth/forms.py:16 +#: contrib/auth/forms.py:50 msgid "This value may contain only letters, numbers and @/./+/-/_ characters." msgstr "Ova vrednost može sadržati samo slova, brojke i @/./+/-/_." @@ -1254,7 +1216,8 @@ msgstr "Potvrda lozinke" msgid "A user with that username already exists." msgstr "Korisnik sa tim korisničkim imenom već postoji." -#: contrib/auth/forms.py:37 contrib/auth/forms.py:156 +#: contrib/auth/forms.py:37 +#: contrib/auth/forms.py:156 #: contrib/auth/forms.py:198 msgid "The two password fields didn't match." msgstr "Dva polja za lozinke se nisu poklopila." @@ -1264,24 +1227,16 @@ msgid "This account is inactive." msgstr "Ovaj nalog je neaktivan." #: contrib/auth/forms.py:88 -msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -msgstr "" -"Izgleda da su kolačići isključeni u vašem brauzeru. Oni moraju biti " -"uključeni da bi ste se prijavili." +msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." +msgstr "Izgleda da su kolačići isključeni u vašem brauzeru. Oni moraju biti uključeni da bi ste se prijavili." #: contrib/auth/forms.py:101 msgid "E-mail" msgstr "Imejl adresa" #: contrib/auth/forms.py:110 -msgid "" -"That e-mail address doesn't have an associated user account. Are you sure " -"you've registered?" -msgstr "" -"Ta imejl adresa nije u vezi ni sa jednim nalogom. Da li ste sigurni da ste " -"se već registrovali?" +msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?" +msgstr "Ta imejl adresa nije u vezi ni sa jednim nalogom. Da li ste sigurni da ste se već registrovali?" #: contrib/auth/forms.py:136 #, python-format @@ -1296,7 +1251,8 @@ msgstr "Potvrda nove lozinke" msgid "Your old password was entered incorrectly. Please enter it again." msgstr "Vaša stara loznka nije pravilno unesena. Unesite je ponovo." -#: contrib/auth/models.py:66 contrib/auth/models.py:94 +#: contrib/auth/models.py:66 +#: contrib/auth/models.py:94 msgid "name" msgstr "ime" @@ -1308,7 +1264,8 @@ msgstr "šifra dozvole" msgid "permission" msgstr "dozvola" -#: contrib/auth/models.py:73 contrib/auth/models.py:95 +#: contrib/auth/models.py:73 +#: contrib/auth/models.py:95 msgid "permissions" msgstr "dozvole" @@ -1316,7 +1273,8 @@ msgstr "dozvole" msgid "group" msgstr "grupa" -#: contrib/auth/models.py:99 contrib/auth/models.py:206 +#: contrib/auth/models.py:99 +#: contrib/auth/models.py:206 msgid "groups" msgstr "grupe" @@ -1325,11 +1283,8 @@ msgid "username" msgstr "korisničko ime" #: contrib/auth/models.py:196 -msgid "" -"Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters" -msgstr "" -"Neophodno. Najviše 30 slovnih mesta. Samo alfanumerički znaci (slova, brojke " -"i @/./+/-/_)." +msgid "Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters" +msgstr "Neophodno. Najviše 30 slovnih mesta. Samo alfanumerički znaci (slova, brojke i @/./+/-/_)." #: contrib/auth/models.py:197 msgid "first name" @@ -1348,12 +1303,8 @@ msgid "password" msgstr "lozinka" #: contrib/auth/models.py:200 -msgid "" -"Use '[algo]$[salt]$[hexdigest]' or use the change " -"password form." -msgstr "" -"Koristite '[algo]$[salt]$[hexdigest]' ili formular za " -"unos lozinke." +msgid "Use '[algo]$[salt]$[hexdigest]' or use the change password form." +msgstr "Koristite '[algo]$[salt]$[hexdigest]' ili formular za unos lozinke." #: contrib/auth/models.py:201 msgid "staff status" @@ -1361,32 +1312,23 @@ msgstr "status člana posade" #: contrib/auth/models.py:201 msgid "Designates whether the user can log into this admin site." -msgstr "" -"Označava da li korisnik može da se prijavi na ovaj sajt za administraciju." +msgstr "Označava da li korisnik može da se prijavi na ovaj sajt za administraciju." #: contrib/auth/models.py:202 msgid "active" msgstr "aktivan" #: contrib/auth/models.py:202 -msgid "" -"Designates whether this user should be treated as active. Unselect this " -"instead of deleting accounts." -msgstr "" -"Označava da li se korisnik smatra aktivnim. Deselektujte ovo umesto da " -"brišete nalog." +msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts." +msgstr "Označava da li se korisnik smatra aktivnim. Deselektujte ovo umesto da brišete nalog." #: contrib/auth/models.py:203 msgid "superuser status" msgstr "status administratora" #: contrib/auth/models.py:203 -msgid "" -"Designates that this user has all permissions without explicitly assigning " -"them." -msgstr "" -"Označava da li korisnik ima sve dozvole bez dodeljivanja pojedinačnih " -"dozvola." +msgid "Designates that this user has all permissions without explicitly assigning them." +msgstr "Označava da li korisnik ima sve dozvole bez dodeljivanja pojedinačnih dozvola." #: contrib/auth/models.py:204 msgid "last login" @@ -1397,18 +1339,15 @@ msgid "date joined" msgstr "datum registracije" #: contrib/auth/models.py:207 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"Pored ručno dodeljenih dozvola, ovaj korisnik će imati i dozvole dodeljene " -"gurpama 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 "Pored ručno dodeljenih dozvola, ovaj korisnik će imati i dozvole dodeljene gurpama kojima pripada." #: contrib/auth/models.py:208 msgid "user permissions" msgstr "korisničke dozvole" -#: contrib/auth/models.py:212 contrib/comments/models.py:50 +#: contrib/auth/models.py:212 +#: contrib/comments/models.py:50 #: contrib/comments/models.py:168 msgid "user" msgstr "korisnik" @@ -1425,8 +1364,9 @@ msgstr "poruka" msgid "Logged out" msgstr "Odjavljen" -#: contrib/auth/management/commands/createsuperuser.py:23 -#: core/validators.py:120 forms/fields.py:428 +#: contrib/auth/management/commands/createsuperuser.py:24 +#: core/validators.py:120 +#: forms/fields.py:427 msgid "Enter a valid e-mail address." msgstr "Unesite važeću imejl adresu." @@ -1497,8 +1437,10 @@ msgstr "Ime" msgid "Email address" msgstr "Imejl adresa" -#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 -#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 +#: contrib/comments/forms.py:95 +#: contrib/flatpages/admin.py:8 +#: contrib/flatpages/models.py:7 +#: db/models/fields/__init__.py:1109 msgid "URL" msgstr "URL" @@ -1515,11 +1457,11 @@ msgstr[1] "Pazi na jezik! Reči „%s“ ovde nisu dozvoljene." msgstr[2] "Pazi na jezik! Reči „%s“ ovde nisu dozvoljene." #: contrib/comments/forms.py:182 -msgid "" -"If you enter anything in this field your comment will be treated as spam" +msgid "If you enter anything in this field your comment will be treated as spam" msgstr "Ako išta unesete u ovo polje, Vaš komentar će se smatrati spamom." -#: contrib/comments/models.py:22 contrib/contenttypes/models.py:81 +#: contrib/comments/models.py:22 +#: contrib/contenttypes/models.py:81 msgid "content type" msgstr "tip sadržaja" @@ -1539,7 +1481,8 @@ msgstr "korisnikova imejl adresa" msgid "user's URL" msgstr "korisnikov URL" -#: contrib/comments/models.py:56 contrib/comments/models.py:76 +#: contrib/comments/models.py:56 +#: contrib/comments/models.py:76 #: contrib/comments/models.py:169 msgid "comment" msgstr "komentar" @@ -1548,7 +1491,8 @@ msgstr "komentar" msgid "date/time submitted" msgstr "datum/vreme postavljanja" -#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 +#: contrib/comments/models.py:60 +#: db/models/fields/__init__.py:904 msgid "IP address" msgstr "IP adresa" @@ -1557,42 +1501,28 @@ msgid "is public" msgstr "javno" #: contrib/comments/models.py:62 -msgid "" -"Uncheck this box to make the comment effectively disappear from the site." -msgstr "" -"Deselektujte ovo polje ako želite da poruka faktički nestane sa ovog sajta." +msgid "Uncheck this box to make the comment effectively disappear from the site." +msgstr "Deselektujte ovo polje ako želite da poruka faktički nestane sa ovog sajta." #: contrib/comments/models.py:64 msgid "is removed" msgstr "uklonjen" #: contrib/comments/models.py:65 -msgid "" -"Check this box if the comment is inappropriate. A \"This comment has been " -"removed\" message will be displayed instead." -msgstr "" -"Obeležite ovu kućicu ako je komentar neprikladan. Poruka o uklanjanju će " -"biti prikazana umesto komentara." +msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead." +msgstr "Obeležite ovu kućicu ako je komentar neprikladan. Poruka o uklanjanju će biti prikazana umesto komentara." #: contrib/comments/models.py:77 msgid "comments" msgstr "komentari" #: contrib/comments/models.py:119 -msgid "" -"This comment was posted by an authenticated user and thus the name is read-" -"only." -msgstr "" -"Ovaj komentar je postavio prijavljen korisnik i zato je polje sa imenom " -"zaključano." +msgid "This comment was posted by an authenticated user and thus the name is read-only." +msgstr "Ovaj komentar je postavio prijavljen korisnik i zato je polje sa imenom zaključano." #: contrib/comments/models.py:128 -msgid "" -"This comment was posted by an authenticated user and thus the email is read-" -"only." -msgstr "" -"Ovaj komentar je postavio prijavljen korisnik i zato je polje sa imejl " -"adresom zaključano." +msgid "This comment was posted by an authenticated user and thus the email is read-only." +msgstr "Ovaj komentar je postavio prijavljen korisnik i zato je polje sa imejl adresom zaključano." #: contrib/comments/models.py:153 #, python-format @@ -1644,8 +1574,7 @@ msgstr "Hvala na odobrenju!" #: contrib/comments/templates/comments/approved.html:7 #: contrib/comments/templates/comments/deleted.html:7 #: contrib/comments/templates/comments/flagged.html:7 -msgid "" -"Thanks for taking the time to improve the quality of discussion on our site" +msgid "Thanks for taking the time to improve the quality of discussion on our site" msgstr "Hvala na učešću u unapređenju kvaliteta diskusija na našem sajtu." #: contrib/comments/templates/comments/delete.html:4 @@ -1723,19 +1652,12 @@ msgid "content types" msgstr "tipovi sadržaja" #: contrib/flatpages/admin.py:9 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Primer: '/about/contact/'. Pazite na to da postoje i početne i završne kose " -"crte." +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "Primer: '/about/contact/'. Pazite na to da postoje i početne i završne kose crte." #: contrib/flatpages/admin.py:11 -msgid "" -"This value must contain only letters, numbers, underscores, dashes or " -"slashes." -msgstr "" -"Ova vrednost može sadržati samo slova, brojke, donje crte, crtice ili kose " -"crte." +msgid "This value must contain only letters, numbers, underscores, dashes or slashes." +msgstr "Ova vrednost može sadržati samo slova, brojke, donje crte, crtice ili kose crte." #: contrib/flatpages/admin.py:22 msgid "Advanced options" @@ -1758,12 +1680,8 @@ msgid "template name" msgstr "naziv templejta" #: contrib/flatpages/models.py:12 -msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." -msgstr "" -"Primer: 'flatpages/contact_page.html'. Ako ovo ostavite praznim, sistem će " -"koristiti 'flatpages/default.html'." +msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'." +msgstr "Primer: 'flatpages/contact_page.html'. Ako ovo ostavite praznim, sistem će koristiti 'flatpages/default.html'." #: contrib/flatpages/models.py:13 msgid "registration required" @@ -1771,9 +1689,7 @@ msgstr "potrebna registracija" #: contrib/flatpages/models.py:13 msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ako je ovo obeleženo, samo će prijavljeni korisnici moći da vide ovu " -"stranicu." +msgstr "Ako je ovo obeleženo, samo će prijavljeni korisnici moći da vide ovu stranicu." #: contrib/flatpages/models.py:18 msgid "flat page" @@ -1784,17 +1700,12 @@ msgid "flat pages" msgstr "flet stranice" #: contrib/formtools/wizard.py:140 -msgid "" -"We apologize, but your form has expired. Please continue filling out the " -"form from this page." -msgstr "" -"Žao nam je, ali Vaša sesija je istekla. Popunjavanje formulara nastavite na " -"ovoj stranici." +msgid "We apologize, but your form has expired. Please continue filling out the form from this page." +msgstr "Žao nam je, ali Vaša sesija je istekla. Popunjavanje formulara nastavite na ovoj stranici." #: contrib/gis/db/models/fields.py:50 msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." -msgstr "" -"Osnovno „GIS“ polje koje mapira tip geometrije po „OpenGIS“ specifikaciji." +msgstr "Osnovno „GIS“ polje koje mapira tip geometrije po „OpenGIS“ specifikaciji." #: contrib/gis/db/models/fields.py:270 msgid "Point" @@ -1837,9 +1748,7 @@ msgid "Invalid geometry type." msgstr "Nepostojeći tip geometrije." #: contrib/gis/forms/fields.py:20 -msgid "" -"An error occurred when transforming the geometry to the SRID of the geometry " -"form field." +msgid "An error occurred when transforming the geometry to the SRID of the geometry form field." msgstr "Greška se desila tokom transformacije geometrije na „SRID“ tip polja." #: contrib/humanize/templatetags/humanize.py:19 @@ -1934,8 +1843,10 @@ msgstr "juče" msgid "Enter a postal code in the format NNNN or ANNNNAAA." msgstr "Unesite poštanski broj u formatu NNNN ili ANNNNAAA." -#: contrib/localflavor/ar/forms.py:50 contrib/localflavor/br/forms.py:92 -#: contrib/localflavor/br/forms.py:131 contrib/localflavor/pe/forms.py:24 +#: contrib/localflavor/ar/forms.py:50 +#: contrib/localflavor/br/forms.py:92 +#: contrib/localflavor/br/forms.py:131 +#: contrib/localflavor/pe/forms.py:24 #: contrib/localflavor/pe/forms.py:52 msgid "This field requires only numbers." msgstr "Ovo polje mora da sadrži samo brojke." @@ -1988,15 +1899,15 @@ msgstr "Voralber" msgid "Vienna" msgstr "Beč" -#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:17 +#: contrib/localflavor/at/forms.py:20 +#: contrib/localflavor/ch/forms.py:17 #: contrib/localflavor/no/forms.py:13 msgid "Enter a zip code in the format XXXX." msgstr "Unesite poštanski broj u formatu XXXX." #: contrib/localflavor/at/forms.py:48 msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format." -msgstr "" -"Unesite važeći austrijski broj socijalnog osiguranja u formatu XXXX XXXXXX." +msgstr "Unesite važeći austrijski broj socijalnog osiguranja u formatu XXXX XXXXXX." #: contrib/localflavor/au/forms.py:17 msgid "Enter a 4 digit post code." @@ -2011,9 +1922,7 @@ msgid "Phone numbers must be in XX-XXXX-XXXX format." msgstr "Broj telefona mora biti u formatu XX-XXXX-XXXX." #: contrib/localflavor/br/forms.py:54 -msgid "" -"Select a valid brazilian state. That state is not one of the available " -"states." +msgid "Select a valid brazilian state. That state is not one of the available states." msgstr "Odaberite postojeću brazilsku državu. Ta država nije među ponuđenima." #: contrib/localflavor/br/forms.py:90 @@ -2145,9 +2054,7 @@ msgid "Zurich" msgstr "" #: contrib/localflavor/ch/forms.py:65 -msgid "" -"Enter a valid Swiss identity or passport card number in X1234567<0 or " -"1234567890 format." +msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format." msgstr "" #: contrib/localflavor/cl/forms.py:30 @@ -2218,7 +2125,8 @@ msgstr "" msgid "Moravian-Silesian Region" msgstr "" -#: contrib/localflavor/cz/forms.py:28 contrib/localflavor/sk/forms.py:30 +#: contrib/localflavor/cz/forms.py:28 +#: contrib/localflavor/sk/forms.py:30 msgid "Enter a postal code in the format XXXXX or XXX XX." msgstr "" @@ -2302,15 +2210,14 @@ msgstr "" msgid "Thuringia" msgstr "" -#: contrib/localflavor/de/forms.py:15 contrib/localflavor/fi/forms.py:13 +#: contrib/localflavor/de/forms.py:15 +#: contrib/localflavor/fi/forms.py:13 #: contrib/localflavor/fr/forms.py:16 msgid "Enter a zip code in the format XXXXX." msgstr "" #: contrib/localflavor/de/forms.py:42 -msgid "" -"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " -"format." +msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format." msgstr "" #: contrib/localflavor/es/es_provinces.py:5 @@ -2585,9 +2492,7 @@ msgid "Enter a valid postal code in the range and format 01XXX - 52XXX." msgstr "" #: contrib/localflavor/es/forms.py:40 -msgid "" -"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or " -"9XXXXXXXX." +msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX." msgstr "" #: contrib/localflavor/es/forms.py:67 @@ -2611,8 +2516,7 @@ msgid "Invalid checksum for CIF." msgstr "" #: contrib/localflavor/es/forms.py:143 -msgid "" -"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX." +msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX." msgstr "" #: contrib/localflavor/es/forms.py:144 @@ -2631,7 +2535,8 @@ msgstr "" msgid "Enter a valid post code" msgstr "" -#: contrib/localflavor/id/forms.py:68 contrib/localflavor/nl/forms.py:53 +#: contrib/localflavor/id/forms.py:68 +#: contrib/localflavor/nl/forms.py:53 msgid "Enter a valid phone number" msgstr "" @@ -3060,8 +2965,7 @@ msgid "Enter a zip code in the format XXXXXXX." msgstr "" #: contrib/localflavor/is_/forms.py:18 -msgid "" -"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." msgstr "" #: contrib/localflavor/is_/forms.py:19 @@ -3481,8 +3385,7 @@ msgid "Wrong checksum for the National Identification Number." msgstr "" #: contrib/localflavor/pl/forms.py:71 -msgid "" -"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX." +msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX." msgstr "" #: contrib/localflavor/pl/forms.py:72 @@ -4410,24 +4313,16 @@ msgid "redirect from" msgstr "preusmeren sa" #: contrib/redirects/models.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Ovo mora biti apsolutna putanja bez imena domena. Na primer: '/events/" -"search/'." +msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." +msgstr "Ovo mora biti apsolutna putanja bez imena domena. Na primer: '/events/search/'." #: contrib/redirects/models.py:9 msgid "redirect to" 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 ili apsolutna putanja (kao gore) ili pun URL koji počinje sa " -"'http://'." +msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." +msgstr "Ovo može biti ili apsolutna putanja (kao gore) ili pun URL koji počinje sa 'http://'." #: contrib/redirects/models.py:13 msgid "redirect" @@ -4469,30 +4364,33 @@ msgstr "prikazano ime" msgid "sites" msgstr "sajtovi" -#: core/validators.py:20 forms/fields.py:66 +#: core/validators.py:20 +#: forms/fields.py:66 msgid "Enter a valid value." msgstr "Unesite ispravnu vrednost." -#: core/validators.py:87 forms/fields.py:529 +#: core/validators.py:87 +#: forms/fields.py:528 msgid "Enter a valid URL." msgstr "Unesite ispravan URL." -#: core/validators.py:89 forms/fields.py:530 +#: core/validators.py:89 +#: forms/fields.py:529 msgid "This URL appears to be a broken link." msgstr "Ovaj URL izgleda ne vodi nikuda." -#: core/validators.py:123 forms/fields.py:873 -msgid "" -"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili " -"cirtica." +#: core/validators.py:123 +#: forms/fields.py:877 +msgid "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili cirtica." -#: core/validators.py:126 forms/fields.py:866 +#: core/validators.py:126 +#: forms/fields.py:870 msgid "Enter a valid IPv4 address." msgstr "Unesite ispravnu IPv4 adresu." -#: core/validators.py:129 db/models/fields/__init__.py:572 +#: core/validators.py:129 +#: db/models/fields/__init__.py:572 msgid "Enter only digits separated by commas." msgstr "Unesite samo brojke razdvojene zapetama." @@ -4501,40 +4399,37 @@ msgstr "Unesite samo brojke razdvojene zapetama." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "Ovo polje mora da bude %(limit_value)s (trenutno ima %(show_value)s)." -#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 +#: core/validators.py:153 +#: forms/fields.py:204 +#: forms/fields.py:256 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Ova vrednost mora da bude manja od %(limit_value)s. ili tačno toliko." -#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 +#: core/validators.py:158 +#: forms/fields.py:205 +#: forms/fields.py:257 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Ova vrednost mora biti veća od %(limit_value)s ili tačno toliko." #: core/validators.py:164 #, python-format -msgid "" -"Ensure this value has at least %(limit_value)d characters (it has %" -"(show_value)d)." -msgstr "" -"Ovo polje mora da sadrži najmanje %(limit_value)d slovnih mesta (trenutno " -"ima %(show_value)d)." +msgid "Ensure this value has at least %(limit_value)d characters (it has %(show_value)d)." +msgstr "Ovo polje mora da sadrži najmanje %(limit_value)d slovnih mesta (trenutno ima %(show_value)d)." #: core/validators.py:170 #, python-format -msgid "" -"Ensure this value has at most %(limit_value)d characters (it has %" -"(show_value)d)." -msgstr "" -"Ovo polje mora da sadrži najviše %(limit_value)d slovnih mesta (trenutno ima " -"%(show_value)d)." +msgid "Ensure this value has at most %(limit_value)d characters (it has %(show_value)d)." +msgstr "Ovo polje mora da sadrži najviše %(limit_value)d slovnih mesta (trenutno ima %(show_value)d)." -#: db/models/base.py:822 +#: db/models/base.py:823 #, python-format msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgstr "%(field_name)s mora da bude jedinstven za %(date_field)s %(lookup)s." -#: db/models/base.py:837 db/models/base.py:845 +#: db/models/base.py:838 +#: db/models/base.py:846 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s sa ovom vrednošću %(field_label)s već postoji." @@ -4557,13 +4452,16 @@ msgstr "Ovo polje ne može da ostane prazno." msgid "Field of type: %(field_type)s" msgstr "Ponje tipa: %(field_type)s" -#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 -#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 -#: db/models/fields/__init__.py:999 +#: db/models/fields/__init__.py:451 +#: db/models/fields/__init__.py:860 +#: db/models/fields/__init__.py:969 +#: db/models/fields/__init__.py:980 +#: db/models/fields/__init__.py:1007 msgid "Integer" msgstr "Ceo broj" -#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 +#: db/models/fields/__init__.py:455 +#: db/models/fields/__init__.py:858 msgid "This value must be an integer." msgstr "Ova vrednost mora biti celobrojna." @@ -4575,7 +4473,8 @@ msgstr "Ova vrednost mora biti True ili False." msgid "Boolean (Either True or False)" msgstr "Bulova vrednost (True ili False)" -#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 +#: db/models/fields/__init__.py:539 +#: db/models/fields/__init__.py:990 #, python-format msgid "String (up to %(max_length)s)" msgstr "String (najviše %(max_length)s znakova)" @@ -4617,44 +4516,45 @@ msgstr "Decimalni broj" msgid "E-mail address" msgstr "Imejl adresa" -#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 +#: db/models/fields/__init__.py:807 +#: db/models/fields/files.py:220 #: db/models/fields/files.py:331 msgid "File path" msgstr "Putanja fajla" -#: db/models/fields/__init__.py:822 +#: db/models/fields/__init__.py:830 msgid "This value must be a float." msgstr "Ova vrednost mora biti broj sa klizećom zapetom" -#: db/models/fields/__init__.py:824 +#: db/models/fields/__init__.py:832 msgid "Floating point number" msgstr "Broj sa pokrenom zapetom" -#: db/models/fields/__init__.py:883 +#: db/models/fields/__init__.py:891 msgid "Big (8 byte) integer" msgstr "Veliki ceo broj" -#: db/models/fields/__init__.py:912 +#: db/models/fields/__init__.py:920 msgid "This value must be either None, True or False." msgstr "Ova vrednost mora biti ili None, ili True, ili False." -#: db/models/fields/__init__.py:914 +#: db/models/fields/__init__.py:922 msgid "Boolean (Either True, False or None)" msgstr "Bulova vrednost (True, False ili None)" -#: db/models/fields/__init__.py:1005 +#: db/models/fields/__init__.py:1013 msgid "Text" msgstr "Tekst" -#: db/models/fields/__init__.py:1021 +#: db/models/fields/__init__.py:1029 msgid "Time" msgstr "Vreme" -#: db/models/fields/__init__.py:1025 +#: db/models/fields/__init__.py:1033 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Unesite ispravno vreme u formatu ČČ:MM[:ss[.uuuuuu]]." -#: db/models/fields/__init__.py:1109 +#: db/models/fields/__init__.py:1125 msgid "XML text" msgstr "XML tekst" @@ -4667,26 +4567,22 @@ msgstr "Objekat klase %(model)s sa primarnim ključem %(pk)r ne postoji." msgid "Foreign Key (type determined by related field)" msgstr "Strani ključ (tip određuje referentno polje)" -#: db/models/fields/related.py:918 +#: db/models/fields/related.py:919 msgid "One-to-one relationship" msgstr "Relacija jedan na jedan" -#: db/models/fields/related.py:980 +#: db/models/fields/related.py:981 msgid "Many-to-many relationship" msgstr "Relacija više na više" -#: db/models/fields/related.py:1000 -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Držite „Control“, ili „Command“ na Mac-u da biste obeležili više od jedne " -"stavke." +#: db/models/fields/related.py:1001 +msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Držite „Control“, ili „Command“ na Mac-u da biste obeležili više od jedne stavke." -#: db/models/fields/related.py:1061 +#: db/models/fields/related.py:1062 #, 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 ispravan %(self)s IDs. Vrednost %(value)r je neispravna." msgstr[1] "Unesite ispravan %(self)s IDs. Vrednosti %(value)r su neispravne." msgstr[2] "Unesite ispravan %(self)s IDs. Vrednosti %(value)r su neispravne." @@ -4695,80 +4591,79 @@ msgstr[2] "Unesite ispravan %(self)s IDs. Vrednosti %(value)r su neispravne." msgid "This field is required." msgstr "Ovo polje se mora popuniti." -#: forms/fields.py:204 +#: forms/fields.py:203 msgid "Enter a whole number." msgstr "Unesite ceo broj." -#: forms/fields.py:235 forms/fields.py:256 +#: forms/fields.py:234 +#: forms/fields.py:255 msgid "Enter a number." msgstr "Unesite broj." -#: forms/fields.py:259 +#: forms/fields.py:258 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Ne sme biti ukupno više od %s cifara. Proverite." -#: forms/fields.py:260 +#: forms/fields.py:259 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Ne sme biti ukupno više od %s decimalnih mesta. Proverite." -#: forms/fields.py:261 +#: forms/fields.py:260 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Ne sme biti ukupno više od %s cifara pre zapete. Proverite." -#: forms/fields.py:323 forms/fields.py:838 +#: forms/fields.py:322 +#: forms/fields.py:837 msgid "Enter a valid date." msgstr "Unesite ispravan datum." -#: forms/fields.py:351 forms/fields.py:839 +#: forms/fields.py:350 +#: forms/fields.py:838 msgid "Enter a valid time." msgstr "Unesite ispravno vreme" -#: forms/fields.py:377 +#: forms/fields.py:376 msgid "Enter a valid date/time." msgstr "Unesite ispravan datum/vreme." -#: forms/fields.py:435 +#: forms/fields.py:434 msgid "No file was submitted. Check the encoding type on the form." msgstr "Fajl nije prebačen. Proverite tip enkodiranja formulara." -#: forms/fields.py:436 +#: forms/fields.py:435 msgid "No file was submitted." msgstr "Fajl nije prebačen." -#: forms/fields.py:437 +#: forms/fields.py:436 msgid "The submitted file is empty." msgstr "Prebačen fajl je prazan." -#: forms/fields.py:438 +#: forms/fields.py:437 #, python-format -msgid "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr "" -"Naziv fajla mora da sadrži bar %(max)d slovnih mesta (trenutno ima %(length)" -"d)." +msgid "Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr "Naziv fajla mora da sadrži bar %(max)d slovnih mesta (trenutno ima %(length)d)." -#: forms/fields.py:473 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je " -"oštećen." +#: forms/fields.py:472 +msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." +msgstr "Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je oštećen." -#: forms/fields.py:596 forms/fields.py:671 +#: forms/fields.py:595 +#: forms/fields.py:670 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." +msgstr "%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." -#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 +#: forms/fields.py:671 +#: forms/fields.py:733 +#: forms/models.py:1002 msgid "Enter a list of values." msgstr "Unesite listu vrednosti." -#: forms/formsets.py:298 forms/formsets.py:300 +#: forms/formsets.py:296 +#: forms/formsets.py:298 msgid "Order" msgstr "Redosled" @@ -4780,17 +4675,12 @@ msgstr "Ispravite dupliran sadržaj za polja: %(field)s." #: forms/models.py:566 #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." +msgstr "Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." #: forms/models.py:572 #, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude " -"jedinstven za %(lookup)s u %(date_field)s." +msgid "Please correct the duplicate data for %(field_name)s which must be unique for the %(lookup)s in %(date_field)s." +msgstr "Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude jedinstven za %(lookup)s u %(date_field)s." #: forms/models.py:580 msgid "Please correct the duplicate values below." @@ -4929,23 +4819,28 @@ msgstr "januar" msgid "February" msgstr "februar" -#: utils/dates.py:18 utils/dates.py:31 +#: utils/dates.py:18 +#: utils/dates.py:31 msgid "March" msgstr "mart" -#: utils/dates.py:18 utils/dates.py:31 +#: utils/dates.py:18 +#: utils/dates.py:31 msgid "April" msgstr "april" -#: utils/dates.py:18 utils/dates.py:31 +#: utils/dates.py:18 +#: utils/dates.py:31 msgid "May" msgstr "maj" -#: utils/dates.py:18 utils/dates.py:31 +#: utils/dates.py:18 +#: utils/dates.py:31 msgid "June" msgstr "jun" -#: utils/dates.py:19 utils/dates.py:31 +#: utils/dates.py:19 +#: utils/dates.py:31 msgid "July" msgstr "jul" @@ -5105,23 +5000,23 @@ msgstr "%(number)d %(type)s" msgid ", %(number)d %(type)s" msgstr ", %(number)d %(type)s" -#: utils/translation/trans_real.py:518 +#: utils/translation/trans_real.py:519 msgid "DATE_FORMAT" msgstr "j. F Y." -#: utils/translation/trans_real.py:519 +#: utils/translation/trans_real.py:520 msgid "DATETIME_FORMAT" msgstr "j. F Y. H:i T" -#: utils/translation/trans_real.py:520 +#: utils/translation/trans_real.py:521 msgid "TIME_FORMAT" msgstr "G:i" -#: utils/translation/trans_real.py:541 +#: utils/translation/trans_real.py:542 msgid "YEAR_MONTH_FORMAT" msgstr "F Y." -#: utils/translation/trans_real.py:542 +#: utils/translation/trans_real.py:543 msgid "MONTH_DAY_FORMAT" msgstr "j. F" @@ -5139,3 +5034,4 @@ msgstr "%(verbose_name)s je uspešno ažuriran." #, python-format msgid "The %(verbose_name)s was deleted." msgstr "%(verbose_name)s je obrisan." + diff --git a/django/conf/locale/sr_Latn/formats.py b/django/conf/locale/sr_Latn/formats.py index 63a20f4574..cb0478ed0f 100644 --- a/django/conf/locale/sr_Latn/formats.py +++ b/django/conf/locale/sr_Latn/formats.py @@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.' SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' FIRST_DAY_OF_WEEK = 1 DATE_INPUT_FORMATS = ( - '%Y-%m-%d', # '2006-10-25' '%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' + '%Y-%m-%d', # '2006-10-25' # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' @@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = ( '%H:%M', # '14:30' ) DATETIME_INPUT_FORMATS = ( - '%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' '%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59' '%d.%m.%Y. %H:%M', # '25.10.2006. 14:30' '%d.%m.%Y.', # '25.10.2006.' @@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = ( '%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59' '%d. %m. %y. %H:%M', # '25. 10. 06. 14:30' '%d. %m. %y.', # '25. 10. 06.' + '%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' ) -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' NUMBER_GROUPING = 3 diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 1f8ff6dbd1..d44a5121f8 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -501,7 +501,7 @@ class ModelAdmin(BaseModelAdmin): # Convert the actions into a SortedDict keyed by name # and sorted by description. - actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower())) + actions.sort(key=lambda k: k[2].lower()) actions = SortedDict([ (name, (func, name, desc)) for func, name, desc in actions diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index 4446490451..d0d6473a34 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -379,11 +379,11 @@ class AdminSite(object): # Sort the apps alphabetically. app_list = app_dict.values() - app_list.sort(lambda x, y: cmp(x['name'], y['name'])) + app_list.sort(key=lambda x: x['name']) # Sort the models alphabetically within each app. for app in app_list: - app['models'].sort(lambda x, y: cmp(x['name'], y['name'])) + app['models'].sort(key=lambda x: x['name']) context = { 'title': _('Site administration'), @@ -443,7 +443,7 @@ class AdminSite(object): if not app_dict: raise http.Http404('The requested admin page does not exist.') # Sort the models alphabetically within each app. - app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name'])) + app_dict['models'].sort(key=lambda x: x['name']) context = { 'title': _('%s administration') % capfirst(app_label), 'app_list': [app_dict], diff --git a/django/contrib/admin/templates/admin/auth/user/add_form.html b/django/contrib/admin/templates/admin/auth/user/add_form.html index b57f59b82e..c8889eb069 100644 --- a/django/contrib/admin/templates/admin/auth/user/add_form.html +++ b/django/contrib/admin/templates/admin/auth/user/add_form.html @@ -2,8 +2,11 @@ {% load i18n %} {% block form_top %} + {% if not is_popup %}

        {% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}

        - + {% else %} +

        {% trans "Enter a username and password." %}

        + {% endif %} {% endblock %} {% block after_field_sets %} diff --git a/django/contrib/databrowse/plugins/calendars.py b/django/contrib/databrowse/plugins/calendars.py index 9bbd02da26..8a08cfd8eb 100644 --- a/django/contrib/databrowse/plugins/calendars.py +++ b/django/contrib/databrowse/plugins/calendars.py @@ -60,7 +60,7 @@ class CalendarPlugin(DatabrowsePlugin): 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)) + field_list.sort(key=lambda k:k.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): diff --git a/django/contrib/databrowse/plugins/fieldchoices.py b/django/contrib/databrowse/plugins/fieldchoices.py index 8f77792579..e0c01e95e6 100644 --- a/django/contrib/databrowse/plugins/fieldchoices.py +++ b/django/contrib/databrowse/plugins/fieldchoices.py @@ -61,7 +61,7 @@ class FieldChoicePlugin(DatabrowsePlugin): 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)) + field_list.sort(key=lambda k: k.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): diff --git a/django/contrib/sessions/backends/file.py b/django/contrib/sessions/backends/file.py index 3f6350345f..843edca9cf 100644 --- a/django/contrib/sessions/backends/file.py +++ b/django/contrib/sessions/backends/file.py @@ -58,7 +58,7 @@ class SessionStore(SessionBase): finally: session_file.close() except IOError: - pass + self.create() return session_data def create(self): diff --git a/django/contrib/sessions/tests.py b/django/contrib/sessions/tests.py index f0a3c4ec8c..d958d4a778 100644 --- a/django/contrib/sessions/tests.py +++ b/django/contrib/sessions/tests.py @@ -1,388 +1,273 @@ -r""" - ->>> from django.conf import settings ->>> from django.contrib.sessions.backends.db import SessionStore as DatabaseSession ->>> from django.contrib.sessions.backends.cache import SessionStore as CacheSession ->>> from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession ->>> from django.contrib.sessions.backends.file import SessionStore as FileSession ->>> from django.contrib.sessions.backends.base import SessionBase ->>> from django.contrib.sessions.models import Session - ->>> db_session = DatabaseSession() ->>> db_session.modified -False ->>> db_session.get('cat') ->>> db_session['cat'] = "dog" ->>> db_session.modified -True ->>> db_session.pop('cat') -'dog' ->>> db_session.pop('some key', 'does not exist') -'does not exist' ->>> db_session.save() ->>> db_session.exists(db_session.session_key) -True ->>> db_session.delete(db_session.session_key) ->>> db_session.exists(db_session.session_key) -False - ->>> db_session['foo'] = 'bar' ->>> db_session.save() ->>> db_session.exists(db_session.session_key) -True ->>> prev_key = db_session.session_key ->>> db_session.flush() ->>> db_session.exists(prev_key) -False ->>> db_session.session_key == prev_key -False ->>> db_session.modified, db_session.accessed -(True, True) ->>> db_session['a'], db_session['b'] = 'c', 'd' ->>> db_session.save() ->>> prev_key = db_session.session_key ->>> prev_data = db_session.items() ->>> db_session.cycle_key() ->>> db_session.session_key == prev_key -False ->>> db_session.items() == prev_data -True - -# Submitting an invalid session key (either by guessing, or if the db has -# removed the key) results in a new key being generated. ->>> Session.objects.filter(pk=db_session.session_key).delete() ->>> db_session = DatabaseSession(db_session.session_key) ->>> db_session.save() ->>> DatabaseSession('1').get('cat') - -# -# Cached DB session tests -# - ->>> cdb_session = CacheDBSession() ->>> cdb_session.modified -False ->>> cdb_session['cat'] = "dog" ->>> cdb_session.modified -True ->>> cdb_session.pop('cat') -'dog' ->>> cdb_session.pop('some key', 'does not exist') -'does not exist' ->>> cdb_session.save() ->>> cdb_session.exists(cdb_session.session_key) -True ->>> cdb_session.delete(cdb_session.session_key) ->>> cdb_session.exists(cdb_session.session_key) -False - -# -# File session tests. -# - -# Do file session tests in an isolated directory, and kill it after we're done. ->>> original_session_file_path = settings.SESSION_FILE_PATH ->>> import tempfile ->>> temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp() - ->>> file_session = FileSession() ->>> file_session.modified -False ->>> file_session['cat'] = "dog" ->>> file_session.modified -True ->>> file_session.pop('cat') -'dog' ->>> file_session.pop('some key', 'does not exist') -'does not exist' ->>> file_session.save() ->>> file_session.exists(file_session.session_key) -True ->>> file_session.delete(file_session.session_key) ->>> file_session.exists(file_session.session_key) -False ->>> FileSession('1').get('cat') - ->>> file_session['foo'] = 'bar' ->>> file_session.save() ->>> file_session.exists(file_session.session_key) -True ->>> prev_key = file_session.session_key ->>> file_session.flush() ->>> file_session.exists(prev_key) -False ->>> file_session.session_key == prev_key -False ->>> file_session.modified, file_session.accessed -(True, True) ->>> file_session['a'], file_session['b'] = 'c', 'd' ->>> file_session.save() ->>> prev_key = file_session.session_key ->>> prev_data = file_session.items() ->>> file_session.cycle_key() ->>> file_session.session_key == prev_key -False ->>> file_session.items() == prev_data -True - ->>> Session.objects.filter(pk=file_session.session_key).delete() ->>> file_session = FileSession(file_session.session_key) ->>> file_session.save() - -# Make sure the file backend checks for a good storage dir ->>> settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer" ->>> FileSession() -Traceback (innermost last): - ... -ImproperlyConfigured: The session storage path '/if/this/directory/exists/you/have/a/weird/computer' doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data. - -# Clean up after the file tests ->>> settings.SESSION_FILE_PATH = original_session_file_path ->>> import shutil ->>> shutil.rmtree(temp_session_store) - -# -# Cache-based tests -# NB: be careful to delete any sessions created; stale sessions fill up the -# /tmp and eventually overwhelm it after lots of runs (think buildbots) -# - ->>> cache_session = CacheSession() ->>> cache_session.modified -False ->>> cache_session['cat'] = "dog" ->>> cache_session.modified -True ->>> cache_session.pop('cat') -'dog' ->>> cache_session.pop('some key', 'does not exist') -'does not exist' ->>> cache_session.save() ->>> cache_session.delete(cache_session.session_key) ->>> cache_session.exists(cache_session.session_key) -False ->>> cache_session['foo'] = 'bar' ->>> cache_session.save() ->>> cache_session.exists(cache_session.session_key) -True ->>> prev_key = cache_session.session_key ->>> cache_session.flush() ->>> cache_session.exists(prev_key) -False ->>> cache_session.session_key == prev_key -False ->>> cache_session.modified, cache_session.accessed -(True, True) ->>> cache_session['a'], cache_session['b'] = 'c', 'd' ->>> cache_session.save() ->>> prev_key = cache_session.session_key ->>> prev_data = cache_session.items() ->>> cache_session.cycle_key() ->>> cache_session.session_key == prev_key -False ->>> cache_session.items() == prev_data -True ->>> cache_session = CacheSession() ->>> cache_session.save() ->>> key = cache_session.session_key ->>> cache_session.exists(key) -True - ->>> Session.objects.filter(pk=cache_session.session_key).delete() ->>> cache_session = CacheSession(cache_session.session_key) ->>> cache_session.save() ->>> cache_session.delete(cache_session.session_key) - ->>> s = SessionBase() ->>> s._session['some key'] = 'exists' # Pre-populate the session with some data ->>> s.accessed = False # Reset to pretend this wasn't accessed previously - ->>> s.accessed, s.modified -(False, False) - ->>> s.pop('non existant key', 'does not exist') -'does not exist' ->>> s.accessed, s.modified -(True, False) - ->>> s.setdefault('foo', 'bar') -'bar' ->>> s.setdefault('foo', 'baz') -'bar' - ->>> s.accessed = False # Reset the accessed flag - ->>> s.pop('some key') -'exists' ->>> s.accessed, s.modified -(True, True) - ->>> s.pop('some key', 'does not exist') -'does not exist' +from datetime import datetime, timedelta +from django.conf import settings +from django.contrib.sessions.backends.db import SessionStore as DatabaseSession +from django.contrib.sessions.backends.cache import SessionStore as CacheSession +from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession +from django.contrib.sessions.backends.file import SessionStore as FileSession +from django.contrib.sessions.backends.base import SessionBase +from django.contrib.sessions.models import Session +from django.core.exceptions import ImproperlyConfigured +from django.test import TestCase +import shutil +import tempfile +import unittest ->>> s.get('update key', None) +class SessionTestsMixin(object): + # This does not inherit from TestCase to avoid any tests being run with this + # class, which wouldn't work, and to allow different TestCase subclasses to + # be used. -# test .update() ->>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously ->>> s.update({'update key':1}) ->>> s.accessed, s.modified -(True, True) ->>> s.get('update key', None) -1 + backend = None # subclasses must specify -# test .has_key() ->>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously ->>> s.has_key('update key') -True ->>> s.accessed, s.modified -(True, False) + def setUp(self): + self.session = self.backend() -# test .values() ->>> s = SessionBase() ->>> s.values() -[] ->>> s.accessed -True ->>> s['x'] = 1 ->>> s.values() -[1] + def tearDown(self): + # NB: be careful to delete any sessions created; stale sessions fill up + # the /tmp (with some backends) and eventually overwhelm it after lots + # of runs (think buildbots) + self.session.delete() -# test .iterkeys() ->>> s.accessed = False ->>> i = s.iterkeys() ->>> hasattr(i,'__iter__') -True ->>> s.accessed -True ->>> list(i) -['x'] + def test_new_session(self): + self.assertFalse(self.session.modified) + self.assertFalse(self.session.accessed) -# test .itervalues() ->>> s.accessed = False ->>> i = s.itervalues() ->>> hasattr(i,'__iter__') -True ->>> s.accessed -True ->>> list(i) -[1] + def test_get_empty(self): + self.assertEqual(self.session.get('cat'), None) -# test .iteritems() ->>> s.accessed = False ->>> i = s.iteritems() ->>> hasattr(i,'__iter__') -True ->>> s.accessed -True ->>> list(i) -[('x', 1)] + def test_store(self): + self.session['cat'] = "dog" + self.assertTrue(self.session.modified) + self.assertEqual(self.session.pop('cat'), 'dog') -# test .clear() ->>> s.modified = s.accessed = False ->>> s.items() -[('x', 1)] ->>> s.clear() ->>> s.items() -[] ->>> s.accessed, s.modified -(True, True) + def test_pop(self): + self.session['some key'] = 'exists' + # Need to reset these to pretend we haven't accessed it: + self.accessed = False + self.modified = False -######################### -# Custom session expiry # -######################### + self.assertEqual(self.session.pop('some key'), 'exists') + self.assertTrue(self.session.accessed) + self.assertTrue(self.session.modified) + self.assertEqual(self.session.get('some key'), None) ->>> from django.conf import settings ->>> from datetime import datetime, timedelta + def test_pop_default(self): + self.assertEqual(self.session.pop('some key', 'does not exist'), + 'does not exist') + self.assertTrue(self.session.accessed) + self.assertFalse(self.session.modified) ->>> td10 = timedelta(seconds=10) + def test_setdefault(self): + self.assertEqual(self.session.setdefault('foo', 'bar'), 'bar') + self.assertEqual(self.session.setdefault('foo', 'baz'), 'bar') + self.assertTrue(self.session.accessed) + self.assertTrue(self.session.modified) -# A normal session has a max age equal to settings ->>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE -True + def test_update(self): + self.session.update({'update key': 1}) + self.assertTrue(self.session.accessed) + self.assertTrue(self.session.modified) + self.assertEqual(self.session.get('update key', None), 1) -# So does a custom session with an idle expiration time of 0 (but it'll expire -# at browser close) ->>> s.set_expiry(0) ->>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE -True + def test_has_key(self): + self.session['some key'] = 1 + self.session.modified = False + self.session.accessed = False + self.assertTrue(self.session.has_key('some key')) + self.assertTrue(self.session.accessed) + self.assertFalse(self.session.modified) -# Custom session idle expiration time ->>> s.set_expiry(10) ->>> delta = s.get_expiry_date() - datetime.now() ->>> delta.seconds in (9, 10) -True ->>> age = s.get_expiry_age() ->>> age in (9, 10) -True + def test_values(self): + self.assertEqual(self.session.values(), []) + self.assertTrue(self.session.accessed) + self.session['some key'] = 1 + self.assertEqual(self.session.values(), [1]) -# Custom session fixed expiry date (timedelta) ->>> s.set_expiry(td10) ->>> delta = s.get_expiry_date() - datetime.now() ->>> delta.seconds in (9, 10) -True ->>> age = s.get_expiry_age() ->>> age in (9, 10) -True + def test_iterkeys(self): + self.session['x'] = 1 + self.session.modified = False + self.session.accessed = False + i = self.session.iterkeys() + self.assertTrue(hasattr(i, '__iter__')) + self.assertTrue(self.session.accessed) + self.assertFalse(self.session.modified) + self.assertEqual(list(i), ['x']) -# Custom session fixed expiry date (fixed datetime) ->>> s.set_expiry(datetime.now() + td10) ->>> delta = s.get_expiry_date() - datetime.now() ->>> delta.seconds in (9, 10) -True ->>> age = s.get_expiry_age() ->>> age in (9, 10) -True + def test_iterkeys(self): + self.session['x'] = 1 + self.session.modified = False + self.session.accessed = False + i = self.session.itervalues() + self.assertTrue(hasattr(i, '__iter__')) + self.assertTrue(self.session.accessed) + self.assertFalse(self.session.modified) + self.assertEqual(list(i), [1]) -# Set back to default session age ->>> s.set_expiry(None) ->>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE -True + def test_iteritems(self): + self.session['x'] = 1 + self.session.modified = False + self.session.accessed = False + i = self.session.iteritems() + self.assertTrue(hasattr(i, '__iter__')) + self.assertTrue(self.session.accessed) + self.assertFalse(self.session.modified) + self.assertEqual(list(i), [('x',1)]) -# Allow to set back to default session age even if no alternate has been set ->>> s.set_expiry(None) + def test_clear(self): + self.session['x'] = 1 + self.session.modified = False + self.session.accessed = False + self.assertEqual(self.session.items(), [('x',1)]) + self.session.clear() + self.assertEqual(self.session.items(), []) + self.assertTrue(self.session.accessed) + self.assertTrue(self.session.modified) + + def test_save(self): + self.session.save() + self.assertTrue(self.session.exists(self.session.session_key)) + + def test_delete(self): + self.session.delete(self.session.session_key) + self.assertFalse(self.session.exists(self.session.session_key)) + + def test_flush(self): + self.session['foo'] = 'bar' + self.session.save() + prev_key = self.session.session_key + self.session.flush() + self.assertFalse(self.session.exists(prev_key)) + self.assertNotEqual(self.session.session_key, prev_key) + self.assertTrue(self.session.modified) + self.assertTrue(self.session.accessed) + + def test_cycle(self): + self.session['a'], self.session['b'] = 'c', 'd' + self.session.save() + prev_key = self.session.session_key + prev_data = self.session.items() + self.session.cycle_key() + self.assertNotEqual(self.session.session_key, prev_key) + self.assertEqual(self.session.items(), prev_data) + + def test_invalid_key(self): + # Submitting an invalid session key (either by guessing, or if the db has + # removed the key) results in a new key being generated. + session = self.backend('1') + session.save() + self.assertNotEqual(session.session_key, '1') + self.assertEqual(session.get('cat'), None) + session.delete() + + # Custom session expiry + def test_default_expiry(self): + # A normal session has a max age equal to settings + self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE) + + # So does a custom session with an idle expiration time of 0 (but it'll + # expire at browser close) + self.session.set_expiry(0) + self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE) + + def test_custom_expiry_seconds(self): + # Using seconds + self.session.set_expiry(10) + delta = self.session.get_expiry_date() - datetime.now() + self.assertTrue(delta.seconds in (9, 10)) + + age = self.session.get_expiry_age() + self.assertTrue(age in (9, 10)) + + def test_custom_expiry_timedelta(self): + # Using timedelta + self.session.set_expiry(timedelta(seconds=10)) + delta = self.session.get_expiry_date() - datetime.now() + self.assertTrue(delta.seconds in (9, 10)) + + age = self.session.get_expiry_age() + self.assertTrue(age in (9, 10)) + + def test_custom_expiry_timedelta(self): + # Using timedelta + self.session.set_expiry(datetime.now() + timedelta(seconds=10)) + delta = self.session.get_expiry_date() - datetime.now() + self.assertTrue(delta.seconds in (9, 10)) + + age = self.session.get_expiry_age() + self.assertTrue(age in (9, 10)) + + def test_custom_expiry_reset(self): + self.session.set_expiry(None) + self.session.set_expiry(10) + self.session.set_expiry(None) + self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE) + + def test_get_expire_at_browser_close(self): + # Tests get_expire_at_browser_close with different settings and different + # set_expiry calls + try: + original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE + settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False + + self.session.set_expiry(10) + self.assertFalse(self.session.get_expire_at_browser_close()) + + self.session.set_expiry(0) + self.assertTrue(self.session.get_expire_at_browser_close()) + + self.session.set_expiry(None) + self.assertFalse(self.session.get_expire_at_browser_close()) + + settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True + + self.session.set_expiry(10) + self.assertFalse(self.session.get_expire_at_browser_close()) + + self.session.set_expiry(0) + self.assertTrue(self.session.get_expire_at_browser_close()) + + self.session.set_expiry(None) + self.assertTrue(self.session.get_expire_at_browser_close()) + + except: + raise + + finally: + settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close -# We're changing the setting then reverting back to the original setting at the -# end of these tests. ->>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE ->>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False +class DatabaseSessionTests(SessionTestsMixin, TestCase): -# Custom session age ->>> s.set_expiry(10) ->>> s.get_expire_at_browser_close() -False + backend = DatabaseSession -# Custom expire-at-browser-close ->>> s.set_expiry(0) ->>> s.get_expire_at_browser_close() -True -# Default session age ->>> s.set_expiry(None) ->>> s.get_expire_at_browser_close() -False +class CacheDBSessionTests(SessionTestsMixin, TestCase): ->>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True + backend = CacheDBSession -# Custom session age ->>> s.set_expiry(10) ->>> s.get_expire_at_browser_close() -False +# Don't need DB flushing for these tests, so can use unittest.TestCase as base class +class FileSessionTests(SessionTestsMixin, unittest.TestCase): -# Custom expire-at-browser-close ->>> s.set_expiry(0) ->>> s.get_expire_at_browser_close() -True + backend = FileSession -# Default session age ->>> s.set_expiry(None) ->>> s.get_expire_at_browser_close() -True + def setUp(self): + super(FileSessionTests, self).setUp() + # Do file session tests in an isolated directory, and kill it after we're done. + self.original_session_file_path = settings.SESSION_FILE_PATH + self.temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp() ->>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close -""" + def tearDown(self): + settings.SESSION_FILE_PATH = self.original_session_file_path + shutil.rmtree(self.temp_session_store) + super(FileSessionTests, self).tearDown() -if __name__ == '__main__': - import doctest - doctest.testmod() + def test_configuration_check(self): + # Make sure the file backend checks for a good storage dir + settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer" + self.assertRaises(ImproperlyConfigured, self.backend) + + +class CacheSessionTests(SessionTestsMixin, unittest.TestCase): + + backend = CacheSession diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py index 32e744374a..85bf324fdc 100644 --- a/django/core/management/__init__.py +++ b/django/core/management/__init__.py @@ -250,15 +250,15 @@ class ManagementUtility(object): """ try: app_name = get_commands()[subcommand] - if isinstance(app_name, BaseCommand): - # If the command is already loaded, use it directly. - klass = app_name - else: - klass = load_command_class(app_name, subcommand) except KeyError: sys.stderr.write("Unknown command: %r\nType '%s help' for usage.\n" % \ (subcommand, self.prog_name)) sys.exit(1) + if isinstance(app_name, BaseCommand): + # If the command is already loaded, use it directly. + klass = app_name + else: + klass = load_command_class(app_name, subcommand) return klass def autocomplete(self): diff --git a/django/core/management/base.py b/django/core/management/base.py index 6761cb69bc..0dc8d0356c 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -118,7 +118,7 @@ class BaseCommand(object): # Metadata about this command. option_list = ( make_option('-v', '--verbosity', action='store', dest='verbosity', default='1', - type='choice', choices=['0', '1', '2'], + type='choice', choices=['0', '1', '2', '3'], help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'), make_option('--settings', help='The Python path to a settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.'), diff --git a/django/core/management/commands/dumpdata.py b/django/core/management/commands/dumpdata.py index 23c03e7b17..d2fe6cdd07 100644 --- a/django/core/management/commands/dumpdata.py +++ b/django/core/management/commands/dumpdata.py @@ -16,7 +16,7 @@ class Command(BaseCommand): default=DEFAULT_DB_ALIAS, help='Nominates a specific database to load ' 'fixtures into. Defaults to the "default" database.'), make_option('-e', '--exclude', dest='exclude',action='append', default=[], - help='App to exclude (use multiple --exclude to exclude multiple apps).'), + help='An appname or appname.ModelName to exclude (use multiple --exclude to exclude multiple apps/models).'), make_option('-n', '--natural', action='store_true', dest='use_natural_keys', default=False, help='Use natural keys if they are available.'), ) @@ -31,11 +31,25 @@ class Command(BaseCommand): indent = options.get('indent',None) using = options.get('database', DEFAULT_DB_ALIAS) connection = connections[using] - exclude = options.get('exclude',[]) + excludes = options.get('exclude',[]) show_traceback = options.get('traceback', False) use_natural_keys = options.get('use_natural_keys', False) - excluded_apps = set(get_app(app_label) for app_label in exclude) + excluded_apps = set() + excluded_models = set() + for exclude in excludes: + if '.' in exclude: + app_label, model_name = exclude.split('.', 1) + model_obj = get_model(app_label, model_name) + if not model_obj: + raise CommandError('Unknown model in excludes: %s' % exclude) + excluded_models.add(model_obj) + else: + try: + app_obj = get_app(exclude) + excluded_apps.add(app_obj) + except ImproperlyConfigured: + raise CommandError('Unknown app in excludes: %s' % exclude) if len(app_labels) == 0: app_list = SortedDict((app, None) for app in get_apps() if app not in excluded_apps) @@ -48,7 +62,8 @@ class Command(BaseCommand): app = get_app(app_label) except ImproperlyConfigured: raise CommandError("Unknown application: %s" % app_label) - + if app in excluded_apps: + continue model = get_model(app_label, model_label) if model is None: raise CommandError("Unknown model: %s.%s" % (app_label, model_label)) @@ -65,6 +80,8 @@ class Command(BaseCommand): app = get_app(app_label) except ImproperlyConfigured: raise CommandError("Unknown application: %s" % app_label) + if app in excluded_apps: + continue app_list[app] = None # Check that the serialization format exists; this is a shortcut to @@ -80,6 +97,8 @@ class Command(BaseCommand): # Now collate the objects to be serialized. objects = [] for model in sort_dependencies(app_list.items()): + if model in excluded_models: + continue if not model._meta.proxy and router.allow_syncdb(using, model): objects.extend(model._default_manager.using(using).all()) diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py index caf3b11b85..8bf89c90f8 100644 --- a/django/core/management/commands/loaddata.py +++ b/django/core/management/commands/loaddata.py @@ -111,7 +111,7 @@ class Command(BaseCommand): formats = [] if formats: - if verbosity > 1: + if verbosity >= 2: self.stdout.write("Loading '%s' fixtures...\n" % fixture_name) else: sys.stderr.write( @@ -127,7 +127,7 @@ class Command(BaseCommand): fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + [''] for fixture_dir in fixture_dirs: - if verbosity > 1: + if verbosity >= 2: self.stdout.write("Checking %s for fixtures...\n" % humanize(fixture_dir)) label_found = False @@ -140,7 +140,7 @@ class Command(BaseCommand): if p ) - if verbosity > 1: + if verbosity >= 3: self.stdout.write("Trying %s for %s fixture '%s'...\n" % \ (humanize(fixture_dir), file_name, fixture_name)) full_path = os.path.join(fixture_dir, file_name) @@ -157,7 +157,7 @@ class Command(BaseCommand): else: fixture_count += 1 objects_in_fixture = 0 - if verbosity > 0: + if verbosity >= 2: self.stdout.write("Installing %s fixture '%s' from %s.\n" % \ (format, fixture_name, humanize(fixture_dir))) try: @@ -197,7 +197,7 @@ class Command(BaseCommand): return except Exception, e: - if verbosity > 1: + if verbosity >= 2: self.stdout.write("No %s fixture '%s' in %s.\n" % \ (format, fixture_name, humanize(fixture_dir))) @@ -206,7 +206,7 @@ class Command(BaseCommand): if object_count > 0: sequence_sql = connection.ops.sequence_reset_sql(self.style, models) if sequence_sql: - if verbosity > 1: + if verbosity >= 2: self.stdout.write("Resetting sequences\n") for line in sequence_sql: cursor.execute(line) @@ -216,10 +216,10 @@ class Command(BaseCommand): transaction.leave_transaction_management(using=using) if object_count == 0: - if verbosity > 0: + if verbosity >= 1: self.stdout.write("No fixtures found.\n") else: - if verbosity > 0: + if verbosity >= 1: self.stdout.write("Installed %d object(s) from %d fixture(s)\n" % (object_count, fixture_count)) # Close the DB connection. This is required as a workaround for an diff --git a/django/core/management/commands/syncdb.py b/django/core/management/commands/syncdb.py index d1dd49b75e..3c11a263d6 100644 --- a/django/core/management/commands/syncdb.py +++ b/django/core/management/commands/syncdb.py @@ -76,10 +76,12 @@ class Command(NoArgsCommand): ) # Create the tables for each model + if verbosity >= 1: + print "Creating tables ..." for app_name, model_list in manifest.items(): for model in model_list: # Create the model's database table, if it doesn't already exist. - if verbosity >= 2: + if verbosity >= 3: print "Processing %s.%s model" % (app_name, model._meta.object_name) sql, references = connection.creation.sql_create_model(model, self.style, seen_models) seen_models.add(model) @@ -107,12 +109,14 @@ class Command(NoArgsCommand): # Install custom SQL for the app (but only if this # is a model we've just created) + if verbosity >= 1: + print "Installing custom SQL ..." for app_name, model_list in manifest.items(): for model in model_list: if model in created_models: custom_sql = custom_sql_for_model(model, self.style, connection) if custom_sql: - if verbosity >= 1: + if verbosity >= 2: print "Installing custom SQL for %s.%s model" % (app_name, model._meta.object_name) try: for sql in custom_sql: @@ -127,16 +131,18 @@ class Command(NoArgsCommand): else: transaction.commit_unless_managed(using=db) else: - if verbosity >= 2: + if verbosity >= 3: print "No custom SQL for %s.%s model" % (app_name, model._meta.object_name) + if verbosity >= 1: + print "Installing indexes ..." # Install SQL indicies for all newly created models for app_name, model_list in manifest.items(): for model in model_list: if model in created_models: index_sql = connection.creation.sql_indexes_for_model(model, self.style) if index_sql: - if verbosity >= 1: + if verbosity >= 2: print "Installing index for %s.%s model" % (app_name, model._meta.object_name) try: for sql in index_sql: diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index cad57a5d9f..6881bbda9f 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -30,6 +30,40 @@ _prefixes = {} # Overridden URLconfs for each thread are stored here. _urlconfs = {} +class ResolverMatch(object): + def __init__(self, func, args, kwargs, url_name=None, app_name=None, namespaces=None): + self.func = func + self.args = args + self.kwargs = kwargs + self.app_name = app_name + if namespaces: + self.namespaces = [x for x in namespaces if x] + else: + self.namespaces = [] + if not url_name: + if not hasattr(func, '__name__'): + # An instance of a callable class + url_name = '.'.join([func.__class__.__module__, func.__class__.__name__]) + else: + # A function + url_name = '.'.join([func.__module__, func.__name__]) + self.url_name = url_name + + def namespace(self): + return ':'.join(self.namespaces) + namespace = property(namespace) + + def view_name(self): + return ':'.join([ x for x in [ self.namespace, self.url_name ] if x ]) + view_name = property(view_name) + + def __getitem__(self, index): + return (self.func, self.args, self.kwargs)[index] + + def __repr__(self): + return "ResolverMatch(func=%s, args=%s, kwargs=%s, url_name='%s', app_name='%s', namespace='%s')" % ( + self.func, self.args, self.kwargs, self.url_name, self.app_name, self.namespace) + class Resolver404(Http404): pass @@ -120,7 +154,7 @@ class RegexURLPattern(object): # In both cases, pass any extra_kwargs as **kwargs. kwargs.update(self.default_args) - return self.callback, args, kwargs + return ResolverMatch(self.callback, args, kwargs, self.name) def _get_callback(self): if self._callback is not None: @@ -183,7 +217,8 @@ class RegexURLResolver(object): else: bits = normalize(p_pattern) lookups.appendlist(pattern.callback, (bits, p_pattern)) - lookups.appendlist(pattern.name, (bits, p_pattern)) + if pattern.name is not None: + lookups.appendlist(pattern.name, (bits, p_pattern)) self._reverse_dict = lookups self._namespace_dict = namespaces self._app_dict = apps @@ -224,9 +259,9 @@ class RegexURLResolver(object): if sub_match: sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()]) sub_match_dict.update(self.default_kwargs) - for k, v in sub_match[2].iteritems(): + for k, v in sub_match.kwargs.iteritems(): sub_match_dict[smart_str(k)] = v - return sub_match[0], sub_match[1], sub_match_dict + return ResolverMatch(sub_match.func, sub_match.args, sub_match_dict, sub_match.url_name, self.app_name or sub_match.app_name, [self.namespace] + sub_match.namespaces) tried.append(pattern.regex.pattern) raise Resolver404({'tried': tried, 'path': new_path}) raise Resolver404({'path' : path}) diff --git a/django/db/__init__.py b/django/db/__init__.py index 4bae04ab9a..4c4faef694 100644 --- a/django/db/__init__.py +++ b/django/db/__init__.py @@ -35,6 +35,8 @@ if DEFAULT_DB_ALIAS not in settings.DATABASES: raise ImproperlyConfigured("You must default a '%s' database" % DEFAULT_DB_ALIAS) for alias, database in settings.DATABASES.items(): + if 'ENGINE' not in database: + raise ImproperlyConfigured("You must specify a 'ENGINE' for database '%s'" % alias) if database['ENGINE'] in ("postgresql", "postgresql_psycopg2", "sqlite3", "mysql", "oracle"): import warnings if 'django.contrib.gis' in settings.INSTALLED_APPS: diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py index be9b6fc91d..6cdf415f7a 100644 --- a/django/db/backends/creation.py +++ b/django/db/backends/creation.py @@ -350,7 +350,10 @@ class BaseDatabaseCreation(object): can_rollback = self._rollback_works() self.connection.settings_dict["SUPPORTS_TRANSACTIONS"] = can_rollback - call_command('syncdb', verbosity=verbosity, interactive=False, database=self.connection.alias) + # Report syncdb messages at one level lower than that requested. + # This ensures we don't get flooded with messages during testing + # (unless you really ask to be flooded) + call_command('syncdb', verbosity=max(verbosity - 1, 0), interactive=False, database=self.connection.alias) if settings.CACHE_BACKEND.startswith('db://'): from django.core.cache import parse_backend_uri, cache @@ -390,10 +393,8 @@ class BaseDatabaseCreation(object): if autoclobber or confirm == 'yes': try: if verbosity >= 1: - print "Destroying old test database..." + print "Destroying old test database '%s'..." % self.connection.alias cursor.execute("DROP DATABASE %s" % qn(test_database_name)) - if verbosity >= 1: - print "Creating test database..." cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), suffix)) except Exception, e: sys.stderr.write("Got an error recreating the test database: %s\n" % e) diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index e6e242b9f7..8167640aac 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -61,8 +61,6 @@ class DatabaseCreation(BaseDatabaseCreation): cursor = self.connection.cursor() if self._test_database_create(): - if verbosity >= 1: - print 'Creating test database...' try: self._execute_test_db_creation(cursor, parameters, verbosity) except Exception, e: @@ -72,10 +70,8 @@ class DatabaseCreation(BaseDatabaseCreation): if autoclobber or confirm == 'yes': try: if verbosity >= 1: - print "Destroying old test database..." + print "Destroying old test database '%s'..." % self.connection.alias self._execute_test_db_destruction(cursor, parameters, verbosity) - if verbosity >= 1: - print "Creating test database..." self._execute_test_db_creation(cursor, parameters, verbosity) except Exception, e: sys.stderr.write("Got an error recreating the test database: %s\n" % e) diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py index 03897078a2..a65db1160b 100644 --- a/django/db/backends/sqlite3/creation.py +++ b/django/db/backends/sqlite3/creation.py @@ -43,14 +43,12 @@ class DatabaseCreation(BaseDatabaseCreation): if test_database_name and test_database_name != ":memory:": # Erase the old test database if verbosity >= 1: - print "Destroying old test database..." + print "Destroying old test database '%s'..." % self.connection.alias if os.access(test_database_name, os.F_OK): if not autoclobber: confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % test_database_name) if autoclobber or confirm == 'yes': try: - if verbosity >= 1: - print "Destroying old test database..." os.remove(test_database_name) except Exception, e: sys.stderr.write("Got an error deleting the old test database: %s\n" % e) @@ -58,8 +56,6 @@ class DatabaseCreation(BaseDatabaseCreation): else: print "Tests cancelled." sys.exit(1) - if verbosity >= 1: - print "Creating test database..." else: test_database_name = ":memory:" return test_database_name diff --git a/django/db/models/base.py b/django/db/models/base.py index 6304e009d3..07fc501ea0 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -456,7 +456,7 @@ class Model(object): meta = cls._meta if origin and not meta.auto_created: - signals.pre_save.send(sender=origin, instance=self, raw=raw) + signals.pre_save.send(sender=origin, instance=self, raw=raw, using=using) # If we are in a raw save, save the object exactly as presented. # That means that we don't try to be smart about saving attributes @@ -540,7 +540,7 @@ class Model(object): # Signal that the save is complete if origin and not meta.auto_created: signals.post_save.send(sender=origin, instance=self, - created=(not record_exists), raw=raw) + created=(not record_exists), raw=raw, using=using) save_base.alters_data = True diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 4640eb3238..3c58873035 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -459,6 +459,9 @@ class AutoField(Field): kwargs['blank'] = True Field.__init__(self, *args, **kwargs) + def get_internal_type(self): + return "AutoField" + def to_python(self, value): if value is None: return value diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 232d5d5e74..1634d7d974 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -566,7 +566,7 @@ def create_many_related_manager(superclass, rel=False): # duplicate data row for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action='pre_add', instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=new_ids) + model=self.model, pk_set=new_ids, using=db) # Add the ones that aren't there already for obj_id in new_ids: self.through._default_manager.using(db).create(**{ @@ -578,7 +578,7 @@ def create_many_related_manager(superclass, rel=False): # duplicate data row for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action='post_add', instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=new_ids) + model=self.model, pk_set=new_ids, using=db) def _remove_items(self, source_field_name, target_field_name, *objs): # source_col_name: the PK colname in join_table for the source object @@ -594,14 +594,16 @@ def create_many_related_manager(superclass, rel=False): old_ids.add(obj.pk) else: old_ids.add(obj) + # Work out what DB we're operating on + db = router.db_for_write(self.through.__class__, instance=self.instance) + # Send a signal to the other end if need be. if self.reverse or source_field_name == self.source_field_name: # Don't send the signal when we are deleting the # duplicate data row for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action="pre_remove", instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=old_ids) + model=self.model, pk_set=old_ids, using=db) # Remove the specified objects from the join table - db = router.db_for_write(self.through.__class__, instance=self.instance) self.through._default_manager.using(db).filter(**{ source_field_name: self._pk_val, '%s__in' % target_field_name: old_ids @@ -611,17 +613,17 @@ def create_many_related_manager(superclass, rel=False): # duplicate data row for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action="post_remove", instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=old_ids) + model=self.model, pk_set=old_ids, using=db) def _clear_items(self, source_field_name): + db = router.db_for_write(self.through.__class__, instance=self.instance) # source_col_name: the PK colname in join_table for the source object if self.reverse or source_field_name == self.source_field_name: # Don't send the signal when we are clearing the # duplicate data rows for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action="pre_clear", instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=None) - db = router.db_for_write(self.through.__class__, instance=self.instance) + model=self.model, pk_set=None, using=db) self.through._default_manager.using(db).filter(**{ source_field_name: self._pk_val }).delete() @@ -630,7 +632,7 @@ def create_many_related_manager(superclass, rel=False): # duplicate data rows for symmetrical reverse entries. signals.m2m_changed.send(sender=rel.through, action="post_clear", instance=self.instance, reverse=self.reverse, - model=self.model, pk_set=None) + model=self.model, pk_set=None, using=db) return ManyRelatedManager diff --git a/django/db/models/query.py b/django/db/models/query.py index d9fbd9b8cb..9ecfb745fd 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1311,7 +1311,8 @@ def delete_objects(seen_objs, using): # Pre-notify all instances to be deleted. for pk_val, instance in items: if not cls._meta.auto_created: - signals.pre_delete.send(sender=cls, instance=instance) + signals.pre_delete.send(sender=cls, instance=instance, + using=using) pk_list = [pk for pk,instance in items] @@ -1343,7 +1344,7 @@ def delete_objects(seen_objs, using): setattr(instance, field.attname, None) if not cls._meta.auto_created: - signals.post_delete.send(sender=cls, instance=instance) + signals.post_delete.send(sender=cls, instance=instance, using=using) setattr(instance, cls._meta.pk.attname, None) if forced_managed: diff --git a/django/db/models/signals.py b/django/db/models/signals.py index cd0350bc01..48872e7e7f 100644 --- a/django/db/models/signals.py +++ b/django/db/models/signals.py @@ -5,12 +5,12 @@ class_prepared = Signal(providing_args=["class"]) pre_init = Signal(providing_args=["instance", "args", "kwargs"]) post_init = Signal(providing_args=["instance"]) -pre_save = Signal(providing_args=["instance", "raw"]) -post_save = Signal(providing_args=["instance", "raw", "created"]) +pre_save = Signal(providing_args=["instance", "raw", "using"]) +post_save = Signal(providing_args=["instance", "raw", "created", "using"]) -pre_delete = Signal(providing_args=["instance"]) -post_delete = Signal(providing_args=["instance"]) +pre_delete = Signal(providing_args=["instance", "using"]) +post_delete = Signal(providing_args=["instance", "using"]) post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive"]) -m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set"]) +m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"]) diff --git a/django/forms/forms.py b/django/forms/forms.py index b3718efa9a..dc0800b436 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -35,7 +35,7 @@ def get_declared_fields(bases, attrs, with_base_fields=True): Also integrates any additional media definitions """ 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)) + fields.sort(key=lambda x: x[1].creation_counter) # 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 @@ -213,7 +213,7 @@ class BaseForm(StrAndUnicode): normal_row = u'%(label)s%(errors)s%(field)s%(help_text)s', error_row = u'%s', row_ender = u'', - help_text_html = u'
        %s', + help_text_html = u'
        %s', errors_on_separate_row = False) def as_ul(self): @@ -222,7 +222,7 @@ class BaseForm(StrAndUnicode): normal_row = u'%(errors)s%(label)s %(field)s%(help_text)s', error_row = u'
      • %s
      • ', row_ender = '', - help_text_html = u' %s', + help_text_html = u' %s', errors_on_separate_row = False) def as_p(self): @@ -231,7 +231,7 @@ class BaseForm(StrAndUnicode): normal_row = u'%(label)s %(field)s%(help_text)s

        ', error_row = u'%s', row_ender = '

        ', - help_text_html = u' %s', + help_text_html = u' %s', errors_on_separate_row = True) def non_field_errors(self): diff --git a/django/forms/formsets.py b/django/forms/formsets.py index 3804f2b3c1..508950eee9 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -199,14 +199,12 @@ class BaseFormSet(StrAndUnicode): # A sort function to order things numerically ascending, but # None should be sorted below anything else. Allowing None as # a comparison value makes it so we can leave ordering fields - # blamk. - def compare_ordering_values(x, y): - if x[1] is None: - return 1 - if y[1] is None: - return -1 - return x[1] - y[1] - self._ordering.sort(compare_ordering_values) + # blank. + def compare_ordering_key(k): + if k[1] is None: + return (1, 0) # +infinity, larger than any number + return (0, k[1]) + self._ordering.sort(key=compare_ordering_key) # Return a list of form.cleaned_data dicts in the order spcified by # the form data. return [self.forms[i[0]] for i in self._ordering] diff --git a/django/forms/widgets.py b/django/forms/widgets.py index e3799c69ad..7a812ecc84 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -229,7 +229,7 @@ class TextInput(Input): class PasswordInput(Input): input_type = 'password' - def __init__(self, attrs=None, render_value=True): + def __init__(self, attrs=None, render_value=False): super(PasswordInput, self).__init__(attrs) self.render_value = render_value @@ -308,9 +308,13 @@ class DateInput(Input): super(DateInput, self).__init__(attrs) if format: self.format = format + self.manual_format = True + else: + self.format = formats.get_format('DATE_INPUT_FORMATS')[0] + self.manual_format = False def _format_value(self, value): - if self.is_localized: + if self.is_localized and not self.manual_format: return formats.localize_input(value) elif hasattr(value, 'strftime'): value = datetime_safe.new_date(value) @@ -336,9 +340,13 @@ class DateTimeInput(Input): super(DateTimeInput, self).__init__(attrs) if format: self.format = format + self.manual_format = True + else: + self.format = formats.get_format('DATETIME_INPUT_FORMATS')[0] + self.manual_format = False def _format_value(self, value): - if self.is_localized: + if self.is_localized and not self.manual_format: return formats.localize_input(value) elif hasattr(value, 'strftime'): value = datetime_safe.new_datetime(value) @@ -364,9 +372,13 @@ class TimeInput(Input): super(TimeInput, self).__init__(attrs) if format: self.format = format + self.manual_format = True + else: + self.format = formats.get_format('TIME_INPUT_FORMATS')[0] + self.manual_format = False def _format_value(self, value): - if self.is_localized: + if self.is_localized and not self.manual_format: return formats.localize_input(value) elif hasattr(value, 'strftime'): return value.strftime(self.format) @@ -751,12 +763,8 @@ class SplitDateTimeWidget(MultiWidget): time_format = TimeInput.format def __init__(self, attrs=None, date_format=None, time_format=None): - if date_format: - self.date_format = date_format - if time_format: - self.time_format = time_format - widgets = (DateInput(attrs=attrs, format=self.date_format), - TimeInput(attrs=attrs, format=self.time_format)) + widgets = (DateInput(attrs=attrs, format=date_format), + TimeInput(attrs=attrs, format=time_format)) super(SplitDateTimeWidget, self).__init__(widgets, attrs) def decompress(self, value): diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index d8e7e91efe..1e58ff71ca 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -256,6 +256,8 @@ def truncatewords(value, arg): Truncates a string after a certain number of words. Argument: Number of words to truncate after. + + Newlines within the string are removed. """ from django.utils.text import truncate_words try: @@ -271,6 +273,8 @@ def truncatewords_html(value, arg): Truncates HTML after a certain number of words. Argument: Number of words to truncate after. + + Newlines in the HTML are preserved. """ from django.utils.text import truncate_html_words try: diff --git a/django/test/client.py b/django/test/client.py index e5a16b6e79..498af5c344 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -3,6 +3,7 @@ from urlparse import urlparse, urlunparse, urlsplit import sys import os import re +import mimetypes try: from cStringIO import StringIO except ImportError: @@ -138,11 +139,14 @@ def encode_multipart(boundary, data): def encode_file(boundary, key, file): to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET) + content_type = mimetypes.guess_type(file.name)[0] + if content_type is None: + content_type = 'application/octet-stream' return [ '--' + boundary, 'Content-Disposition: form-data; name="%s"; filename="%s"' \ % (to_str(key), to_str(os.path.basename(file.name))), - 'Content-Type: application/octet-stream', + 'Content-Type: %s' % content_type, '', file.read() ] diff --git a/django/test/testcases.py b/django/test/testcases.py index 1d2360a322..80cfbc5f66 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -346,7 +346,7 @@ class TransactionTestCase(unittest.TestCase): def assertContains(self, response, text, count=None, status_code=200, msg_prefix=''): """ - Asserts that a response indicates that a page was retrieved + Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` occurs ``count`` times in the content of the response. If ``count`` is None, the count doesn't matter - the assertion is true @@ -356,7 +356,7 @@ class TransactionTestCase(unittest.TestCase): msg_prefix += ": " self.assertEqual(response.status_code, status_code, - msg_prefix + "Couldn't retrieve page: Response code was %d" + msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) text = smart_str(text, response._charset) real_count = response.content.count(text) @@ -371,7 +371,7 @@ class TransactionTestCase(unittest.TestCase): def assertNotContains(self, response, text, status_code=200, msg_prefix=''): """ - Asserts that a response indicates that a page was retrieved + Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` doesn't occurs in the content of the response. """ @@ -379,7 +379,7 @@ class TransactionTestCase(unittest.TestCase): msg_prefix += ": " self.assertEqual(response.status_code, status_code, - msg_prefix + "Couldn't retrieve page: Response code was %d" + msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) text = smart_str(text, response._charset) self.assertEqual(response.content.count(text), 0, diff --git a/django/test/utils.py b/django/test/utils.py index 5acbe60431..0e8501b050 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -21,6 +21,12 @@ class ContextList(list): else: return super(ContextList, self).__getitem__(key) + def __contains__(self, key): + try: + value = self[key] + except KeyError: + return False + return True def instrumented_test_render(self, context): """ diff --git a/django/utils/text.py b/django/utils/text.py index 5d633b7afe..b05460486d 100644 --- a/django/utils/text.py +++ b/django/utils/text.py @@ -39,7 +39,10 @@ wrap = allow_lazy(wrap, unicode) def truncate_words(s, num, end_text='...'): """Truncates a string after a certain number of words. Takes an optional argument of what should be used to notify that the string has been - truncated, defaults to ellipsis (...)""" + truncated, defaulting to ellipsis (...) + + Newlines in the string will be stripped. + """ s = force_unicode(s) length = int(num) words = s.split() @@ -51,10 +54,13 @@ def truncate_words(s, num, end_text='...'): truncate_words = allow_lazy(truncate_words, unicode) def truncate_html_words(s, num, end_text='...'): - """Truncates html to a certain number of words (not counting tags and + """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. Takes an optional argument of what should be used to notify that the - string has been truncated, defaults to ellipsis (...).""" + string has been truncated, defaulting to ellipsis (...). + + Newlines in the HTML are preserved. + """ s = force_unicode(s) length = int(num) if length <= 0: diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index b528f8e586..98b8d940b3 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -496,7 +496,7 @@ def parse_accept_lang_header(lang_string): return [] priority = priority and float(priority) or 1.0 result.append((lang, priority)) - result.sort(lambda x, y: -cmp(x[1], y[1])) + result.sort(key=lambda k: k[1], reverse=True) return result # get_date_formats and get_partial_date_formats aren't used anymore by Django diff --git a/docs/faq/install.txt b/docs/faq/install.txt index 0139a82a67..f5feb98aff 100644 --- a/docs/faq/install.txt +++ b/docs/faq/install.txt @@ -19,7 +19,7 @@ What are Django's prerequisites? -------------------------------- Django requires Python_, specifically any version of Python from 2.4 -through 2.6. No other Python libraries are required for basic Django +through 2.7. No other Python libraries are required for basic Django usage. For a development environment -- if you just want to experiment with Django -- diff --git a/docs/internals/contributing.txt b/docs/internals/contributing.txt index 5eb5a76767..4a51509e1d 100644 --- a/docs/internals/contributing.txt +++ b/docs/internals/contributing.txt @@ -145,7 +145,11 @@ and time availability), claim it by following these steps: * Claim the ticket by clicking the radio button next to "Accept ticket" near the bottom of the page, then clicking "Submit changes." +If you have an account but have forgotten your password, you can reset it +using the `password reset page`_. + .. _Create an account: http://www.djangoproject.com/accounts/register/ +.. _password reset page: http://www.djangoproject.com/accounts/password/reset/ Ticket claimers' responsibility ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index 4d84dfafbc..1fbae3f060 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -474,17 +474,16 @@ change list page. By default, this is set to ``100``. .. attribute:: ModelAdmin.list_select_related -Set ``list_select_related`` to tell Django to use ``select_related()`` in -retrieving the list of objects on the admin change list page. This can save you -a bunch of database queries. +Set ``list_select_related`` to tell Django to use +:meth:`~django.db.models.QuerySet.select_related` in retrieving the list of +objects on the admin change list page. This can save you a bunch of database +queries. The value should be either ``True`` or ``False``. Default is ``False``. -Note that Django will use ``select_related()``, regardless of this setting, -if one of the ``list_display`` fields is a ``ForeignKey``. - -For more on ``select_related()``, see -:ref:`the select_related() docs `. +Note that Django will use :meth:`~django.db.models.QuerySet.select_related`, +regardless of this setting, if one of the ``list_display`` fields is a +``ForeignKey``. .. attribute:: ModelAdmin.inlines @@ -595,11 +594,16 @@ 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``. You can also perform a related lookup on a ``ForeignKey`` with -the lookup API "follow" notation:: +``TextField``. You can also perform a related lookup on a ``ForeignKey`` or +``ManyToManyField`` with the lookup API "follow" notation:: search_fields = ['foreign_key__related_fieldname'] +For example, if you have a blog entry with an author, the following definition +would enable search blog entries by the email address of the author:: + + search_fields = ['user__email'] + 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 insensitive, where each word must be in at least one of ``search_fields``. For @@ -865,11 +869,26 @@ return a subset of objects for this foreign key field based on the user:: def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "car": kwargs["queryset"] = Car.objects.filter(owner=request.user) - return db_field.formfield(**kwargs) return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) This uses the ``HttpRequest`` instance to filter the ``Car`` foreign key field -to only the cars owned by the ``User`` instance. +to only display the cars owned by the ``User`` instance. + +.. method:: ModelAdmin.formfield_for_manytomany(self, db_field, request, **kwargs) + +.. versionadded:: 1.1 + +Like the ``formfield_for_foreignkey`` method, the ``formfield_for_manytomany`` +method can be overridden to change the default formfield for a many to many +field. For example, if an owner can own multiple cars and cars can belong +to multiple owners -- a many to many relationship -- you could filter the +``Car`` foreign key field to only display the cars owned by the ``User``:: + + class MyModelAdmin(admin.ModelAdmin): + def formfield_for_manytomany(self, db_field, request, **kwargs): + if db_field.name == "cars": + kwargs["queryset"] = Car.objects.filter(owner=request.user) + return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) .. method:: ModelAdmin.queryset(self, request) diff --git a/docs/ref/contrib/contenttypes.txt b/docs/ref/contrib/contenttypes.txt index 3085bf3ee9..da5d934d38 100644 --- a/docs/ref/contrib/contenttypes.txt +++ b/docs/ref/contrib/contenttypes.txt @@ -324,15 +324,19 @@ same types of lookups manually:: ... object_id=b.id) [, ] -Note that if the model with a :class:`~django.contrib.contenttypes.generic.GenericForeignKey` -that you're referring to uses a non-default value for ``ct_field`` or ``fk_field`` -(e.g. the :mod:`django.contrib.comments` app uses ``ct_field="object_pk"``), -you'll need to pass ``content_type_field`` and ``object_id_field`` to -:class:`~django.contrib.contenttypes.generic.GenericRelation`.:: +Note that if the model in a +:class:`~django.contrib.contenttypes.generic.GenericRelation` uses a +non-default value for ``ct_field`` or ``fk_field`` in its +:class:`~django.contrib.contenttypes.generic.GenericForeignKey` (e.g. the +:mod:`django.contrib.comments` app uses ``ct_field="object_pk"``), +you'll need to set ``content_type_field`` and/or ``object_id_field`` in +the :class:`~django.contrib.contenttypes.generic.GenericRelation` to +match the ``ct_field`` and ``fk_field``, respectively, in the +:class:`~django.contrib.contenttypes.generic.GenericForeignKey`:: - comments = generic.GenericRelation(Comment, content_type_field="content_type", object_id_field="object_pk") + comments = generic.GenericRelation(Comment, object_id_field="object_pk") -Note that if you delete an object that has a +Note also, that if you delete an object that has a :class:`~django.contrib.contenttypes.generic.GenericRelation`, any objects which have a :class:`~django.contrib.contenttypes.generic.GenericForeignKey` pointing at it will be deleted as well. In the example above, this means that diff --git a/docs/ref/contrib/formtools/form-wizard.txt b/docs/ref/contrib/formtools/form-wizard.txt index 5ef862ce3d..8dcebd1d6f 100644 --- a/docs/ref/contrib/formtools/form-wizard.txt +++ b/docs/ref/contrib/formtools/form-wizard.txt @@ -189,8 +189,10 @@ for the wizard to work properly. Hooking the wizard into a URLconf ================================= -Finally, give your new :class:`FormWizard` object a URL in ``urls.py``. The -wizard takes a list of your :class:`~django.forms.Form` objects as arguments:: +Finally, we need to specify which forms to use in the wizard, and then +deploy the new :class:`FormWizard` object a URL in ``urls.py``. The +wizard takes a list of your :class:`~django.forms.Form` objects as +arguments when you instantiate the Wizard:: from django.conf.urls.defaults import * from mysite.testapp.forms import ContactForm1, ContactForm2, ContactWizard diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 542a71582d..83aa97240c 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -227,6 +227,11 @@ pretty-print the output with a number of indentation spaces. The :djadminopt:`--exclude` option may be provided to prevent specific applications from being dumped. +.. versionadded:: 1.3 + +The :djadminopt:`--exclude` option may also be provided to prevent specific +models (specified as in the form of ``appname.ModelName``) from being dumped. + .. versionadded:: 1.1 In addition to specifying application names, you can provide a list of @@ -957,6 +962,7 @@ that ``django-admin.py`` should print to the console. * ``0`` means no output. * ``1`` means normal output (default). * ``2`` means verbose output. + * ``3`` means *very* verbose output. Common options ============== diff --git a/docs/ref/forms/widgets.txt b/docs/ref/forms/widgets.txt index 1fc2bfa85d..e82fae7761 100644 --- a/docs/ref/forms/widgets.txt +++ b/docs/ref/forms/widgets.txt @@ -6,7 +6,7 @@ Widgets .. module:: django.forms.widgets :synopsis: Django's built-in form widgets. - + .. currentmodule:: django.forms A widget is Django's representation of a HTML input element. The widget @@ -29,7 +29,12 @@ commonly used groups of widgets: .. attribute:: PasswordInput.render_value Determines whether the widget will have a value filled in when the - form is re-displayed after a validation error (default is ``True``). + form is re-displayed after a validation error (default is ``False``). + +.. versionchanged:: 1.3 + The default value for + :attr:`~PasswordInput.render_value` was + changed from ``True`` to ``False`` .. class:: HiddenInput @@ -50,7 +55,7 @@ commonly used groups of widgets: Date input as a simple text box: ```` Takes one optional argument: - + .. attribute:: DateInput.format The format in which this field's initial value will be displayed. @@ -64,11 +69,11 @@ commonly used groups of widgets: Date/time input as a simple text box: ```` Takes one optional argument: - + .. attribute:: DateTimeInput.format - + The format in which this field's initial value will be displayed. - + If no ``format`` argument is provided, the default format is ``'%Y-%m-%d %H:%M:%S'``. @@ -77,11 +82,11 @@ commonly used groups of widgets: Time input as a simple text box: ```` Takes one optional argument: - + .. attribute:: TimeInput.format - + The format in which this field's initial value will be displayed. - + If no ``format`` argument is provided, the default format is ``'%H:%M:%S'``. .. versionchanged:: 1.1 @@ -98,15 +103,15 @@ commonly used groups of widgets: Takes one optional argument: .. attribute:: CheckboxInput.check_test - - A callable that takes the value of the CheckBoxInput + + A callable that takes the value of the CheckBoxInput and returns ``True`` if the checkbox should be checked for - that value. + that value. .. class:: Select Select widget: ```` - + Requires that your field provides :attr:`~Field.choices`. .. class:: NullBooleanSelect @@ -123,22 +128,22 @@ commonly used groups of widgets: .. class:: RadioSelect A list of radio buttons: - + .. code-block:: html - +
        • ...
        - + Requires that your field provides :attr:`~Field.choices`. .. class:: CheckboxSelectMultiple A list of checkboxes: - + .. code-block:: html - +
        • ... @@ -155,7 +160,7 @@ commonly used groups of widgets: Takes two optional arguments, ``date_format`` and ``time_format``, which work just like the ``format`` argument for ``DateInput`` and ``TimeInput``. - + .. versionchanged:: 1.1 The ``date_format`` and ``time_format`` arguments were not supported in Django 1.0. diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index 56ff6444e4..91d1415043 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -332,8 +332,6 @@ a model which defines a default ordering, or when using ordering was undefined prior to calling ``reverse()``, and will remain undefined afterward). -.. _queryset-distinct: - ``distinct()`` ~~~~~~~~~~~~~~ @@ -367,9 +365,6 @@ query spans multiple tables, it's possible to get duplicate results when a ``values()`` together, be careful when ordering by fields not in the ``values()`` call. - -.. _queryset-values: - ``values(*fields)`` ~~~~~~~~~~~~~~~~~~~ @@ -679,8 +674,6 @@ related object. ``OneToOneFields`` will not be traversed in the reverse direction if you are performing a depth-based ``select_related``. -.. _queryset-extra: - ``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -843,8 +836,6 @@ of the arguments is required, but you should use at least one of them. Entry.objects.extra(where=['headline=%s'], params=['Lennon']) -.. _queryset-defer: - ``defer(*fields)`` ~~~~~~~~~~~~~~~~~~ @@ -1143,8 +1134,6 @@ Example:: If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary. -.. _queryset-iterator: - ``iterator()`` ~~~~~~~~~~~~~~ diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt index 2c874a1a83..d111e4c127 100644 --- a/docs/ref/request-response.txt +++ b/docs/ref/request-response.txt @@ -498,11 +498,11 @@ Methods .. method:: HttpResponse.__delitem__(header) Deletes the header with the given name. Fails silently if the header - doesn't exist. Case-sensitive. + doesn't exist. Case-insensitive. .. method:: HttpResponse.__getitem__(header) - Returns the value for the given header name. Case-sensitive. + Returns the value for the given header name. Case-insensitive. .. method:: HttpResponse.has_header(header) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 53fbfb2ffe..f3c5656a9a 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -152,18 +152,6 @@ Default: ``600`` The default number of seconds to cache a page when the caching middleware or ``cache_page()`` decorator is used. -.. setting:: CSRF_COOKIE_NAME - -CSRF_COOKIE_NAME ----------------- - -.. versionadded:: 1.2 - -Default: ``'csrftoken'`` - -The name of the cookie to use for the CSRF authentication token. This can be whatever you -want. See :ref:`ref-contrib-csrf`. - .. setting:: CSRF_COOKIE_DOMAIN CSRF_COOKIE_DOMAIN @@ -179,6 +167,18 @@ request forgery protection. It should be set to a string such as ``".lawrence.com"`` to allow a POST request from a form on one subdomain to be accepted by accepted by a view served from another subdomain. +.. setting:: CSRF_COOKIE_NAME + +CSRF_COOKIE_NAME +---------------- + +.. versionadded:: 1.2 + +Default: ``'csrftoken'`` + +The name of the cookie to use for the CSRF authentication token. This can be whatever you +want. See :ref:`ref-contrib-csrf`. + .. setting:: CSRF_FAILURE_VIEW CSRF_FAILURE_VIEW @@ -573,18 +573,6 @@ Default: ``'webmaster@localhost'`` Default e-mail address to use for various automated correspondence from the site manager(s). -.. setting:: DEFAULT_TABLESPACE - -DEFAULT_TABLESPACE ------------------- - -.. versionadded:: 1.0 - -Default: ``''`` (Empty string) - -Default tablespace to use for models that don't specify one, if the -backend supports it. - .. setting:: DEFAULT_INDEX_TABLESPACE DEFAULT_INDEX_TABLESPACE @@ -597,6 +585,18 @@ Default: ``''`` (Empty string) Default tablespace to use for indexes on fields that don't specify one, if the backend supports it. +.. setting:: DEFAULT_TABLESPACE + +DEFAULT_TABLESPACE +------------------ + +.. versionadded:: 1.0 + +Default: ``''`` (Empty string) + +Default tablespace to use for models that don't specify one, if the +backend supports it. + .. setting:: DISALLOWED_USER_AGENTS DISALLOWED_USER_AGENTS @@ -738,21 +738,6 @@ Default: ``2621440`` (i.e. 2.5 MB). The maximum size (in bytes) that an upload will be before it gets streamed to the file system. See :ref:`topics-files` for details. -.. setting:: FILE_UPLOAD_TEMP_DIR - -FILE_UPLOAD_TEMP_DIR --------------------- - -.. versionadded:: 1.0 - -Default: ``None`` - -The directory to store data temporarily while uploading files. If ``None``, -Django will use the standard temporary directory for the operating system. For -example, this will default to '/tmp' on \*nix-style operating systems. - -See :ref:`topics-files` for details. - .. setting:: FILE_UPLOAD_PERMISSIONS FILE_UPLOAD_PERMISSIONS @@ -781,6 +766,21 @@ system's standard umask. .. _documentation for os.chmod: http://docs.python.org/library/os.html#os.chmod +.. setting:: FILE_UPLOAD_TEMP_DIR + +FILE_UPLOAD_TEMP_DIR +-------------------- + +.. versionadded:: 1.0 + +Default: ``None`` + +The directory to store data temporarily while uploading files. If ``None``, +Django will use the standard temporary directory for the operating system. For +example, this will default to '/tmp' on \*nix-style operating systems. + +See :ref:`topics-files` for details. + .. setting:: FIRST_DAY_OF_WEEK FIRST_DAY_OF_WEEK @@ -1227,27 +1227,6 @@ Default: ``'root@localhost'`` The e-mail address that error messages come from, such as those sent to ``ADMINS`` and ``MANAGERS``. -.. setting:: SESSION_ENGINE - -SESSION_ENGINE --------------- - -.. versionadded:: 1.0 - -.. versionchanged:: 1.1 - The ``cached_db`` backend was added - -Default: ``django.contrib.sessions.backends.db`` - -Controls where Django stores session data. Valid values are: - - * ``'django.contrib.sessions.backends.db'`` - * ``'django.contrib.sessions.backends.file'`` - * ``'django.contrib.sessions.backends.cache'`` - * ``'django.contrib.sessions.backends.cached_db'`` - -See :ref:`topics-http-sessions`. - .. setting:: SESSION_COOKIE_AGE SESSION_COOKIE_AGE @@ -1306,6 +1285,27 @@ Whether to use a secure cookie for the session cookie. If this is set to ensure that the cookie is only sent under an HTTPS connection. See the :ref:`topics-http-sessions`. +.. setting:: SESSION_ENGINE + +SESSION_ENGINE +-------------- + +.. versionadded:: 1.0 + +.. versionchanged:: 1.1 + The ``cached_db`` backend was added + +Default: ``django.contrib.sessions.backends.db`` + +Controls where Django stores session data. Valid values are: + + * ``'django.contrib.sessions.backends.db'`` + * ``'django.contrib.sessions.backends.file'`` + * ``'django.contrib.sessions.backends.cache'`` + * ``'django.contrib.sessions.backends.cached_db'`` + +See :ref:`topics-http-sessions`. + .. setting:: SESSION_EXPIRE_AT_BROWSER_CLOSE SESSION_EXPIRE_AT_BROWSER_CLOSE @@ -1601,6 +1601,20 @@ A boolean that specifies whether to output the "Etag" header. This saves bandwidth but slows down performance. This is only used if ``CommonMiddleware`` is installed (see :ref:`topics-http-middleware`). +.. setting:: USE_I18N + +USE_I18N +-------- + +Default: ``True`` + +A boolean that specifies whether Django's internationalization system should be +enabled. This provides an easy way to turn it off, for performance. If this is +set to ``False``, Django will make some optimizations so as not to load the +internationalization machinery. + +See also ``USE_L10N`` + .. setting:: USE_L10N USE_L10N @@ -1616,20 +1630,6 @@ format of the current locale. See also ``USE_I18N`` and ``LANGUAGE_CODE`` -.. setting:: USE_I18N - -USE_I18N --------- - -Default: ``True`` - -A boolean that specifies whether Django's internationalization system should be -enabled. This provides an easy way to turn it off, for performance. If this is -set to ``False``, Django will make some optimizations so as not to load the -internationalization machinery. - -See also ``USE_L10N`` - .. setting:: USE_THOUSAND_SEPARATOR USE_THOUSAND_SEPARATOR diff --git a/docs/ref/signals.txt b/docs/ref/signals.txt index 12372dd0f1..a4dc0f705d 100644 --- a/docs/ref/signals.txt +++ b/docs/ref/signals.txt @@ -33,9 +33,9 @@ module system. If you override these methods on your model, you must call the parent class' methods for this signals to be sent. - Note also that Django stores signal handlers as weak references by default, - so if your handler is a local function, it may be garbage collected. To - prevent this, pass ``weak=False`` when you call the signal's :meth:`~django.dispatch.Signal.connect`. + Note also that Django stores signal handlers as weak references by default, + so if your handler is a local function, it may be garbage collected. To + prevent this, pass ``weak=False`` when you call the signal's :meth:`~django.dispatch.Signal.connect`. pre_init -------- @@ -113,6 +113,9 @@ Arguments sent with this signal: ``instance`` The actual instance being saved. + ``using`` + The database alias being used. + post_save --------- @@ -133,6 +136,9 @@ Arguments sent with this signal: ``created`` A boolean; ``True`` if a new record was created. + ``using`` + The database alias being used. + pre_delete ---------- @@ -150,6 +156,9 @@ Arguments sent with this signal: ``instance`` The actual instance being deleted. + ``using`` + The database alias being used. + post_delete ----------- @@ -170,6 +179,9 @@ Arguments sent with this signal: Note that the object will no longer be in the database, so be very careful what you do with this instance. + ``using`` + The database alias being used. + m2m_changed ----------- @@ -215,8 +227,8 @@ Arguments sent with this signal: Sent *after* the relation is cleared ``reverse`` - Indicates which side of the relation is updated (i.e., if it is the - forward or reverse relation that is being modified). + Indicates which side of the relation is updated (i.e., if it is the + forward or reverse relation that is being modified). ``model`` The class of the objects that are added to, removed from or cleared @@ -228,6 +240,9 @@ Arguments sent with this signal: For the ``"clear"`` action, this is ``None``. + ``using`` + The database alias being used. + For example, if a ``Pizza`` can have multiple ``Topping`` objects, modeled like this: @@ -266,6 +281,8 @@ the arguments sent to a :data:`m2m_changed` handler would be: ``Pizza``) ``pk_set`` ``[t.id]`` (since only ``Topping t`` was added to the relation) + + ``using`` ``"default"`` (since the default router sends writes here) ============== ============================================================ And if we would then do something like this: @@ -293,6 +310,8 @@ the arguments sent to a :data:`m2m_changed` handler would be: ``pk_set`` ``[p.id]`` (since only ``Pizza p`` was removed from the relation) + + ``using`` ``"default"`` (since the default router sends writes here) ============== ============================================================ class_prepared diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 002aa3f416..0cf445cab7 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -1883,6 +1883,8 @@ For example:: If ``value`` is ``"Joel is a slug"``, the output will be ``"Joel is ..."``. +Newlines within the string will be removed. + .. templatefilter:: truncatewords_html truncatewords_html @@ -1902,6 +1904,8 @@ For example:: If ``value`` is ``"

          Joel is a slug

          "``, the output will be ``"

          Joel is ...

          "``. +Newlines in the HTML content will be preserved. + .. templatefilter:: unordered_list unordered_list diff --git a/docs/releases/1.1-beta-1.txt b/docs/releases/1.1-beta-1.txt index a433efc33c..e7dcb4633d 100644 --- a/docs/releases/1.1-beta-1.txt +++ b/docs/releases/1.1-beta-1.txt @@ -71,8 +71,9 @@ processing to convert them to Python objects. If you know you don't need those particular fields, you can now tell Django not to retrieve them from the database. -You'll do this with the :ref:`new queryset methods ` -``defer()`` and ``only()``. +You'll do this with the new queryset methods +:meth:`~django.db.models.QuerySet.defer` and +:meth:`~django.db.models.QuerySet.only`. New admin features ------------------ @@ -108,13 +109,13 @@ A couple of small but very useful improvements have been made to the * The test :class:`Client` now can automatically follow redirects with the ``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This makes testing views that issue redirects simpler. - + * It's now easier to get at the template context in the response returned the test client: you'll simply access the context as ``request.context[key]``. The old way, which treats ``request.context`` as a list of contexts, one for each rendered template, is still available if you need it. - + Conditional view processing --------------------------- @@ -133,23 +134,23 @@ release, including: * The :djadmin:`dumpdata` management command now accepts individual model names as arguments, allowing you to export the data just from particular models. - + * There's a new :tfilter:`safeseq` template filter which works just like :tfilter:`safe` for lists, marking each item in the list as safe. - + * :ref:`Cache backends ` now support ``incr()`` and ``decr()`` commands to increment and decrement the value of a cache key. On cache backends that support atomic increment/decrement -- most notably, the memcached backend -- these operations will be atomic, and quite fast. - + * Django now can :ref:`easily delegate authentication to the web server ` via a new authentication backend that supports the standard ``REMOTE_USER`` environment variable used for this purpose. - + * There's a new :func:`django.shortcuts.redirect` function that makes it easier to issue redirects given an object, a view name, or a URL. - + * The ``postgresql_psycopg2`` backend now supports :ref:`native PostgreSQL autocommit `. This is an advanced, PostgreSQL-specific feature, that can make certain read-heavy applications a good deal @@ -183,7 +184,7 @@ central place to search for open issues: * http://code.djangoproject.com/timeline Please open new tickets if no existing ticket corresponds to a problem you're -running into. +running into. Additionally, discussion of Django development, including progress toward the 1.1 release, takes place daily on the django-developers mailing list: @@ -195,7 +196,7 @@ interested in helping out with Django's development, feel free to join the discussions there. Django's online documentation also includes pointers on how to contribute to -Django: +Django: * :ref:`How to contribute to Django ` diff --git a/docs/releases/1.1.txt b/docs/releases/1.1.txt index edb7cf1af2..30ef9197c7 100644 --- a/docs/releases/1.1.txt +++ b/docs/releases/1.1.txt @@ -258,8 +258,9 @@ processing to convert them to Python objects. If you know you don't need those particular fields, you can now tell Django not to retrieve them from the database. -You'll do this with the :ref:`new queryset methods ` -``defer()`` and ``only()``. +You'll do this with the new queryset methods +:meth:`~django.db.models.QuerySet.defer` and +:meth:`~django.db.models.QuerySet.only`. Testing improvements -------------------- diff --git a/docs/releases/1.3.txt b/docs/releases/1.3.txt index b0d0397055..d64d161aa4 100644 --- a/docs/releases/1.3.txt +++ b/docs/releases/1.3.txt @@ -18,6 +18,31 @@ fixes and an easy upgrade path from Django 1.2. Backwards-incompatible changes in 1.3 ===================================== +PasswordInput default rendering behavior +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Prior to Django 1.3, a :class:`~django.forms.PasswordInput` would render +data values like any other form. If a form submission raised an error, +the password that was submitted would be reflected to the client as form +data populating the form for resubmission. + +This had the potential to leak passwords, as any failed password +attempt would cause the password that was typed to be sent back to the +client. + +In Django 1.3, the default behavior of +:class:`~django.forms.PasswordInput` is to suppress the display of +password values. This change doesn't alter the way form data is +validated or handled. It only affects the user experience with +passwords on a form when they make an error submitting form data (such +as on unsuccessful logins, or when completing a registration form). + +If you want restore the pre-Django 1.3 behavior, you need to pass in a +custom widget to your form that sets the ``render_value`` argument:: + + class LoginForm(forms.Form): + username = forms.CharField(max_length=100) + password = forms.PasswordField(widget=forms.PasswordInput(render_value=True)) Features deprecated in 1.3 diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt index eae07ed717..480509961b 100644 --- a/docs/topics/auth.txt +++ b/docs/topics/auth.txt @@ -898,8 +898,9 @@ includes a few other useful built-in views located in .. function:: views.password_reset(request[, is_admin_site, template_name, email_template_name, password_reset_form, token_generator, post_reset_redirect]) - Allows a user to reset their password, and sends them the new password - in an e-mail. + Allows a user to reset their password by generating a one-time use link + that can be used to reset the password, and sending that link to the + user's registered e-mail address. **Optional arguments:** @@ -1005,8 +1006,8 @@ provides several built-in forms located in :mod:`django.contrib.auth.forms`: .. class:: PasswordResetForm - A form for resetting a user's password and e-mailing the new password to - them. + A form for generating and e-mailing a one-time use link to reset a + user's password. .. class:: SetPasswordForm diff --git a/docs/topics/db/aggregation.txt b/docs/topics/db/aggregation.txt index 087c1bf239..41580c94b6 100644 --- a/docs/topics/db/aggregation.txt +++ b/docs/topics/db/aggregation.txt @@ -353,7 +353,7 @@ without any harmful effects, since that is already playing a role in the query. This behavior is the same as that noted in the queryset documentation for -:ref:`distinct() ` and the general rule is the same: +:meth:`~django.db.models.QuerySet.distinct` and the general rule is the same: normally you won't want extra columns playing a part in the result, so clear out the ordering, or at least make sure it's restricted only to those fields you also select in a ``values()`` call. diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt index 6d7a7a4374..78c578d61a 100644 --- a/docs/topics/db/models.txt +++ b/docs/topics/db/models.txt @@ -353,7 +353,7 @@ For example, if a ``Pizza`` has multiple ``Topping`` objects -- that is, a As with :class:`~django.db.models.ForeignKey`, you can also create :ref:`recursive relationships ` (an object with a -many-to-one relationship to itself) and :ref:`relationships to models not yet +many-to-many relationship to itself) and :ref:`relationships to models not yet defined `; see :ref:`the model field reference ` for details. diff --git a/docs/topics/db/optimization.txt b/docs/topics/db/optimization.txt index 5d74fc9ce9..bb40139f23 100644 --- a/docs/topics/db/optimization.txt +++ b/docs/topics/db/optimization.txt @@ -101,7 +101,7 @@ Use ``iterator()`` When you have a lot of objects, the caching behaviour of the ``QuerySet`` can cause a large amount of memory to be used. In this case, -:ref:`QuerySet.iterator() ` may help. +:meth:`~django.db.models.QuerySet.iterator()` may help. Do database work in the database rather than in Python ====================================================== @@ -121,9 +121,9 @@ If these aren't enough to generate the SQL you need: Use ``QuerySet.extra()`` ------------------------ -A less portable but more powerful method is :ref:`QuerySet.extra() -`, which allows some SQL to be explicitly added to the query. -If that still isn't powerful enough: +A less portable but more powerful method is +:meth:`~django.db.models.QuerySet.extra()`, which allows some SQL to be +explicitly added to the query. If that still isn't powerful enough: Use raw SQL ----------- @@ -159,7 +159,7 @@ Use ``QuerySet.values()`` and ``values_list()`` ----------------------------------------------- When you just want a dict/list of values, and don't need ORM model objects, make -appropriate usage of :ref:`QuerySet.values() `. +appropriate usage of :meth:`~django.db.models.QuerySet.values()`. These can be useful for replacing model objects in template code - as long as the dicts you supply have the same attributes as those used in the template, you are fine. @@ -167,7 +167,8 @@ are fine. Use ``QuerySet.defer()`` and ``only()`` --------------------------------------- -Use :ref:`defer() and only() ` if there are database columns you +Use :meth:`~django.db.models.QuerySet.defer()` and +:meth:`~django.db.models.QuerySet.only()` if there are database columns you know that you won't need (or won't need in most cases) to avoid loading them. Note that if you *do* use them, the ORM will have to go and get them in a separate query, making this a pessimization if you use it inappropriately. diff --git a/docs/topics/db/sql.txt b/docs/topics/db/sql.txt index f55a164373..c3272da757 100644 --- a/docs/topics/db/sql.txt +++ b/docs/topics/db/sql.txt @@ -116,9 +116,9 @@ Fields may also be left out:: >>> people = Person.objects.raw('SELECT id, first_name FROM myapp_person') -The ``Person`` objects returned by this query will be :ref:`deferred -` model instances. This means that the fields that are omitted -from the query will be loaded on demand. For example:: +The ``Person`` objects returned by this query will be deferred model instances +(see :meth:`~django.db.models.QuerySet.defer()`). This means that the fields +that are omitted from the query will be loaded on demand. For example:: >>> for p in Person.objects.raw('SELECT id, first_name FROM myapp_person'): ... print p.first_name, # This will be retrieved by the original query diff --git a/docs/topics/email.txt b/docs/topics/email.txt index 74e153de61..8ea64dac1f 100644 --- a/docs/topics/email.txt +++ b/docs/topics/email.txt @@ -501,7 +501,7 @@ convenience that can be used during development. Defining a custom e-mail backend -------------------------------- -If you need to change how e-mails are send you can write your own e-mail +If you need to change how e-mails are sent you can write your own e-mail backend. The ``EMAIL_BACKEND`` setting in your settings file is then the Python import path for your backend class. diff --git a/docs/topics/forms/modelforms.txt b/docs/topics/forms/modelforms.txt index fd3edf5104..02cce34fbc 100644 --- a/docs/topics/forms/modelforms.txt +++ b/docs/topics/forms/modelforms.txt @@ -595,8 +595,8 @@ Alternatively, you can create a subclass that sets ``self.queryset`` in class BaseAuthorFormSet(BaseModelFormSet): def __init__(self, *args, **kwargs): - self.queryset = Author.objects.filter(name__startswith='O') super(BaseAuthorFormSet, self).__init__(*args, **kwargs) + self.queryset = Author.objects.filter(name__startswith='O') Then, pass your ``BaseAuthorFormSet`` class to the factory function:: diff --git a/docs/topics/http/urls.txt b/docs/topics/http/urls.txt index 5a2980f9d2..d5746c52f2 100644 --- a/docs/topics/http/urls.txt +++ b/docs/topics/http/urls.txt @@ -827,17 +827,80 @@ namespaces into URLs on specific application instances, according to the resolve() --------- -The :func:`django.core.urlresolvers.resolve` function can be used for resolving -URL paths to the corresponding view functions. It has the following signature: +The :func:`django.core.urlresolvers.resolve` function can be used for +resolving URL paths to the corresponding view functions. It has the +following signature: .. function:: resolve(path, urlconf=None) -``path`` is the URL path you want to resolve. As with ``reverse()`` above, you -don't need to worry about the ``urlconf`` parameter. The function returns the -triple (view function, arguments, keyword arguments). +``path`` is the URL path you want to resolve. As with +:func:`~django.core.urlresolvers.reverse`, you don't need to +worry about the ``urlconf`` parameter. The function returns a +:class:`django.core.urlresolvers.ResolverMatch` object that allows you +to access various meta-data about the resolved URL. -For example, it can be used for testing if a view would raise a ``Http404`` -error before redirecting to it:: +.. class:: ResolverMatch() + + .. attribute:: ResolverMatch.func + + The view function that would be used to serve the URL + + .. attribute:: ResolverMatch.args + + The arguments that would be passed to the view function, as + parsed from the URL. + + .. attribute:: ResolverMatch.kwargs + + The keyword arguments that would be passed to the view + function, as parsed from the URL. + + .. attribute:: ResolverMatch.url_name + + The name of the URL pattern that matches the URL. + + .. attribute:: ResolverMatch.app_name + + The application namespace for the URL pattern that matches the + URL. + + .. attribute:: ResolverMatch.namespace + + The instance namespace for the URL pattern that matches the + URL. + + .. attribute:: ResolverMatch.namespaces + + The list of individual namespace components in the full + instance namespace for the URL pattern that matches the URL. + i.e., if the namespace is ``foo:bar``, then namespaces will be + ``[`foo`, `bar`]``. + +A :class:`~django.core.urlresolvers.ResolverMatch` object can then be +interrogated to provide information about the URL pattern that matches +a URL:: + + # Resolve a URL + match = resolve('/some/path/') + # Print the URL pattern that matches the URL + print match.url_name + +A :class:`~django.core.urlresolvers.ResolverMatch` object can also be +assigned to a triple:: + + func, args, kwargs = resolve('/some/path/') + +.. versionchanged:: 1.3 + Triple-assignment exists for backwards-compatibility. Prior to + Django 1.3, :func:`~django.core.urlresolvers.resolve` returned a + triple containing (view function, arguments, keyword arguments); + the :class:`~django.core.urlresolvers.ResolverMatch` object (as + well as the namespace and pattern information it provides) is not + available in earlier Django releases. + +One possible use of :func:`~django.core.urlresolvers.resolve` would be +to testing if a view would raise a ``Http404`` error before +redirecting to it:: from urlparse import urlparse from django.core.urlresolvers import resolve @@ -858,6 +921,7 @@ error before redirecting to it:: return HttpResponseRedirect('/') return response + permalink() ----------- diff --git a/docs/topics/i18n/internationalization.txt b/docs/topics/i18n/internationalization.txt index 7ae8d18791..35e76c3d62 100644 --- a/docs/topics/i18n/internationalization.txt +++ b/docs/topics/i18n/internationalization.txt @@ -569,7 +569,7 @@ function supports both positional and named interpolation: object or associative array. For example:: d = { - count: 10 + count: 10, total: 50 }; diff --git a/docs/topics/serialization.txt b/docs/topics/serialization.txt index c5155107f0..b99a3b925e 100644 --- a/docs/topics/serialization.txt +++ b/docs/topics/serialization.txt @@ -338,7 +338,7 @@ example, ``(first name, last name)``. Then, when you call ``serializers.serialize()``, you provide a ``use_natural_keys=True`` argument:: - >>> serializers.serialize([book1, book2], format='json', indent=2, use_natural_keys=True) + >>> serializers.serialize('json', [book1, book2], indent=2, use_natural_keys=True) When ``use_natural_keys=True`` is specified, Django will use the ``natural_key()`` method to serialize any reference to objects of the diff --git a/setup.cfg b/setup.cfg index 99bc60c9a3..37cc9a592f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ [bdist_rpm] -doc_files = docs examples extras AUTHORS INSTALL LICENSE README +doc_files = docs extras AUTHORS INSTALL LICENSE README install-script = scripts/rpm-install.sh diff --git a/tests/modeltests/fixtures/tests.py b/tests/modeltests/fixtures/tests.py index 38d59f5a1c..155a5f6ba6 100644 --- a/tests/modeltests/fixtures/tests.py +++ b/tests/modeltests/fixtures/tests.py @@ -21,9 +21,14 @@ class TestCaseFixtureLoadingTests(TestCase): ]) class FixtureLoadingTests(TestCase): - def _dumpdata_assert(self, args, output, format='json', natural_keys=False): + def _dumpdata_assert(self, args, output, format='json', natural_keys=False, + exclude_list=[]): new_io = StringIO.StringIO() - management.call_command('dumpdata', *args, **{'format':format, 'stdout':new_io, 'use_natural_keys':natural_keys}) + management.call_command('dumpdata', *args, **{'format':format, + 'stdout':new_io, + 'stderr':new_io, + 'use_natural_keys':natural_keys, + 'exclude': exclude_list}) command_output = new_io.getvalue().strip() self.assertEqual(command_output, output) @@ -148,6 +153,48 @@ class FixtureLoadingTests(TestCase): self._dumpdata_assert(['fixtures'], """ News StoriesLatest news storiesXML identified as leading cause of cancer2006-06-16 16:00:00Django conquers world!2006-06-16 15:00:00Copyright is fine the way it is2006-06-16 14:00:00Poker on TV is great!2006-06-16 11:00:00Python program becomes self aware2006-06-16 11:00:00copyrightfixturesarticle3legalfixturesarticle3djangofixturesarticle4world dominationfixturesarticle4Artist formerly known as "Prince"Django ReinhardtStephane GrappelliDjango Reinhardtadd_userauthuserchange_userauthuserdelete_userauthuserStephane Grappelliadd_userauthuserdelete_userauthuserArtist formerly known as "Prince"change_userauthuserMusic for all agesArtist formerly known as "Prince"Django Reinhardt""", format='xml', natural_keys=True) + def test_dumpdata_with_excludes(self): + # Load fixture1 which has a site, two articles, and a category + management.call_command('loaddata', 'fixture1.json', verbosity=0, commit=False) + + # Excluding fixtures app should only leave sites + self._dumpdata_assert( + ['sites', 'fixtures'], + '[{"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}]', + exclude_list=['fixtures']) + + # Excluding fixtures.Article should leave fixtures.Category + self._dumpdata_assert( + ['sites', 'fixtures'], + '[{"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}, {"pk": 1, "model": "fixtures.category", "fields": {"description": "Latest news stories", "title": "News Stories"}}]', + exclude_list=['fixtures.Article']) + + # Excluding fixtures and fixtures.Article should be a no-op + self._dumpdata_assert( + ['sites', 'fixtures'], + '[{"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}, {"pk": 1, "model": "fixtures.category", "fields": {"description": "Latest news stories", "title": "News Stories"}}]', + exclude_list=['fixtures.Article']) + + # Excluding sites and fixtures.Article should only leave fixtures.Category + self._dumpdata_assert( + ['sites', 'fixtures'], + '[{"pk": 1, "model": "fixtures.category", "fields": {"description": "Latest news stories", "title": "News Stories"}}]', + exclude_list=['fixtures.Article', 'sites']) + + # Excluding a bogus app should throw an error + self.assertRaises(SystemExit, + self._dumpdata_assert, + ['fixtures', 'sites'], + '', + exclude_list=['foo_app']) + + # Excluding a bogus model should throw an error + self.assertRaises(SystemExit, + self._dumpdata_assert, + ['fixtures', 'sites'], + '', + exclude_list=['fixtures.FooModel']) + def test_compress_format_loading(self): # Load fixture 4 (compressed), using format specification management.call_command('loaddata', 'fixture4.json', verbosity=0, commit=False) diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index 1087cf8795..7ded82bb7c 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -554,7 +554,7 @@ fields with the 'choices' attribute are represented by a ChoiceField. -
          Hold down "Control", or "Command" on a Mac, to select more than one. +
          Hold down "Control", or "Command" on a Mac, to select more than one. 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 @@ -579,7 +579,7 @@ inserted as 'initial' data in each Field. ... model = Writer >>> f = RoykoForm(auto_id=False, instance=w) >>> print f -Name:
          Use both first and last names. +Name:
          Use both first and last names. >>> art = Article(headline='Test article', slug='test-article', pub_date=datetime.date(1988, 1, 4), writer=w, article='Hello.') >>> art.save() @@ -609,7 +609,7 @@ inserted as 'initial' data in each Field. - Hold down "Control", or "Command" on a Mac, to select more than one. + Hold down "Control", or "Command" on a Mac, to select more than one. >>> f = TestArticleForm({'headline': u'Test headline', 'slug': 'test-headline', 'pub_date': u'1984-02-06', 'writer': unicode(w_royko.pk), 'article': 'Hello.'}, instance=art) >>> f.errors {} @@ -672,7 +672,7 @@ Add some categories and test the many-to-many form output. - Hold down "Control", or "Command" on a Mac, to select more than one. + Hold down "Control", or "Command" on a Mac, to select more than one. Initial values can be provided for model forms >>> f = TestArticleForm(auto_id=False, initial={'headline': 'Your headline here', 'categories': ['1','2']}) @@ -696,7 +696,7 @@ Initial values can be provided for model forms - Hold down "Control", or "Command" on a Mac, to select more than one. + Hold down "Control", or "Command" on a Mac, to select more than one. >>> f = TestArticleForm({'headline': u'New headline', 'slug': u'new-headline', 'pub_date': u'1988-01-04', ... 'writer': unicode(w_royko.pk), 'article': u'Hello.', 'categories': [u'1', u'2']}, instance=new_art) @@ -812,7 +812,7 @@ the data in the database when the form is instantiated. - Hold down "Control", or "Command" on a Mac, to select more than one. + Hold down "Control", or "Command" on a Mac, to select more than one. >>> Category.objects.create(name='Fourth', url='4th') >>> Writer.objects.create(name='Carl Bernstein') @@ -839,7 +839,7 @@ the data in the database when the form is instantiated. - Hold down "Control", or "Command" on a Mac, to select more than one. + Hold down "Control", or "Command" on a Mac, to select more than one. # ModelChoiceField ############################################################ diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index a2700ba747..b25a9b9a96 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -10,6 +10,7 @@ from django.core.mail import EmailMessage from django.db import models from django import forms from django.forms.models import BaseModelFormSet +from django.contrib.auth.models import User from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType @@ -579,6 +580,10 @@ class Pizza(models.Model): class PizzaAdmin(admin.ModelAdmin): readonly_fields = ('toppings',) +class Album(models.Model): + owner = models.ForeignKey(User) + title = models.CharField(max_length=30) + admin.site.register(Article, ArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin) admin.site.register(Section, save_as=True, inlines=[ArticleInline]) @@ -625,3 +630,4 @@ admin.site.register(Promo) admin.site.register(ChapterXtra1) admin.site.register(Pizza, PizzaAdmin) admin.site.register(Topping) +admin.site.register(Album) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 1385e5e0aa..41aade0561 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -2113,11 +2113,9 @@ class ReadonlyTest(TestCase): response = self.client.get('/test_admin/admin/admin_views/pizza/add/') self.assertEqual(response.status_code, 200) -class IncompleteFormTest(TestCase): +class UserAdminTest(TestCase): """ - Tests validation of a ModelForm that doesn't explicitly have all data - corresponding to model fields. Model validation shouldn't fail - such a forms. + Tests user CRUD functionality. """ fixtures = ['admin-views-users.xml'] @@ -2128,6 +2126,7 @@ class IncompleteFormTest(TestCase): self.client.logout() def test_user_creation(self): + user_count = User.objects.count() response = self.client.post('/test_admin/admin/auth/user/add/', { 'username': 'newuser', 'password1': 'newpassword', @@ -2136,6 +2135,7 @@ class IncompleteFormTest(TestCase): }) new_user = User.objects.order_by('-id')[0] self.assertRedirects(response, '/test_admin/admin/auth/user/%s/' % new_user.pk) + self.assertEquals(User.objects.count(), user_count + 1) self.assertNotEquals(new_user.password, UNUSABLE_PASSWORD) def test_password_mismatch(self): @@ -2149,3 +2149,24 @@ class IncompleteFormTest(TestCase): self.assert_('password' not in adminform.form.errors) self.assertEquals(adminform.form.errors['password2'], [u"The two password fields didn't match."]) + + def test_user_fk_popup(self): + response = self.client.get('/test_admin/admin/admin_views/album/add/') + self.failUnlessEqual(response.status_code, 200) + self.assertContains(response, '/test_admin/admin/auth/user/add') + self.assertContains(response, 'class="add-another" id="add_id_owner" onclick="return showAddAnotherPopup(this);"') + response = self.client.get('/test_admin/admin/auth/user/add/?_popup=1') + self.assertNotContains(response, 'name="_continue"') + + def test_user_add_another(self): + user_count = User.objects.count() + response = self.client.post('/test_admin/admin/auth/user/add/', { + 'username': 'newuser', + 'password1': 'newpassword', + 'password2': 'newpassword', + '_addanother': '1', + }) + new_user = User.objects.order_by('-id')[0] + self.assertRedirects(response, '/test_admin/admin/auth/user/add/') + self.assertEquals(User.objects.count(), user_count + 1) + self.assertNotEquals(new_user.password, UNUSABLE_PASSWORD) diff --git a/tests/regressiontests/forms/forms.py b/tests/regressiontests/forms/forms.py index 58051fd133..9e45a267db 100644 --- a/tests/regressiontests/forms/forms.py +++ b/tests/regressiontests/forms/forms.py @@ -705,13 +705,13 @@ Form.clean() is required to return a dictionary of all clean data. >>> print f.as_table()
          • Please make sure your passwords match.
          Username: -Password1: -Password2: +Password1: +Password2: >>> print f.as_ul()
          • Please make sure your passwords match.
        • Username:
        • -
        • Password1:
        • -
        • Password2:
        • +
        • Password1:
        • +
        • Password2:
        • >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False) >>> f.errors {} @@ -1258,20 +1258,20 @@ to a Field class. This help text is displayed when a Form is rendered. ... password = CharField(widget=PasswordInput, help_text='Choose wisely.') >>> p = UserRegistration(auto_id=False) >>> print p.as_ul() -
        • Username: e.g., user@example.com
        • -
        • Password: Choose wisely.
        • +
        • Username: e.g., user@example.com
        • +
        • Password: Choose wisely.
        • >>> print p.as_p() -

          Username: e.g., user@example.com

          -

          Password: Choose wisely.

          +

          Username: e.g., user@example.com

          +

          Password: Choose wisely.

          >>> print p.as_table() -Username:
          e.g., user@example.com -Password:
          Choose wisely. +Username:
          e.g., user@example.com +Password:
          Choose wisely. 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() -
        • Username: e.g., user@example.com
        • -
          • This field is required.
          Password: Choose wisely.
        • +
        • Username: e.g., user@example.com
        • +
          • This field is required.
          Password: Choose wisely.
        • help_text is not displayed for hidden fields. It can be used for documentation purposes, though. @@ -1281,7 +1281,7 @@ purposes, though. ... next = CharField(widget=HiddenInput, initial='/', help_text='Redirect destination') >>> p = UserRegistration(auto_id=False) >>> print p.as_ul() -
        • Username: e.g., user@example.com
        • +
        • Username: e.g., user@example.com
        • Password:
        • Help text can include arbitrary Unicode characters. @@ -1289,7 +1289,7 @@ Help text can include arbitrary Unicode characters. ... username = CharField(max_length=10, help_text='ŠĐĆŽćžšđ') >>> p = UserRegistration(auto_id=False) >>> p.as_ul() -u'
        • Username: \u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111
        • ' +u'
        • Username: \u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111
        • ' # Subclassing forms ########################################################### @@ -1589,8 +1589,8 @@ Case 2: POST with erroneous data (a redisplayed form, with errors). - - + +
          • Please make sure your passwords match.
          Username:
          • Ensure this value has at most 10 characters (it has 23).
          Password1:
          Password2:
          Password1:
          Password2:
          @@ -1719,8 +1719,8 @@ the list of errors is empty). You can also use it in {% if %} statements. >>> print t.render(Context({'form': UserRegistration({'username': 'django', 'password1': 'foo', 'password2': 'bar'}, auto_id=False)}))

          -

          -

          +

          +

          >>> t = Template('''
          @@ -1734,8 +1734,8 @@ the list of errors is empty). You can also use it in {% if %} statements.
          • Please make sure your passwords match.

          -

          -

          +

          +

          diff --git a/tests/regressiontests/forms/input_formats.py b/tests/regressiontests/forms/input_formats.py new file mode 100644 index 0000000000..498c6de9fb --- /dev/null +++ b/tests/regressiontests/forms/input_formats.py @@ -0,0 +1,894 @@ +from datetime import time, date, datetime +from unittest import TestCase + +from django import forms +from django.conf import settings +from django.utils.translation import activate, deactivate + + +class LocalizedTimeTests(TestCase): + def setUp(self): + self.old_TIME_INPUT_FORMATS = settings.TIME_INPUT_FORMATS + self.old_USE_L10N = settings.USE_L10N + + settings.TIME_INPUT_FORMATS = ["%I:%M:%S %p", "%I:%M %p"] + settings.USE_L10N = True + + activate('de') + + def tearDown(self): + settings.TIME_INPUT_FORMATS = self.old_TIME_INPUT_FORMATS + settings.USE_L10N = self.old_USE_L10N + + deactivate() + + def test_timeField(self): + "TimeFields can parse dates in the default format" + f = forms.TimeField() + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30:05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '13:30:05') + + # Parse a time in a valid, but non-default format, get a parsed result + result = f.clean('13:30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_localized_timeField(self): + "Localized TimeFields act as unlocalized widgets" + f = forms.TimeField(localize=True) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30:05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_timeField_with_inputformat(self): + "TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"]) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30.05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_localized_timeField_with_inputformat(self): + "Localized TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30.05') + self.assertEqual(result, time(13,30,5)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + +class CustomTimeInputFormatsTests(TestCase): + def setUp(self): + self.old_TIME_INPUT_FORMATS = settings.TIME_INPUT_FORMATS + settings.TIME_INPUT_FORMATS = ["%I:%M:%S %p", "%I:%M %p"] + + def tearDown(self): + settings.TIME_INPUT_FORMATS = self.old_TIME_INPUT_FORMATS + + def test_timeField(self): + "TimeFields can parse dates in the default format" + f = forms.TimeField() + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30:05 PM') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '01:30:05 PM') + + # Parse a time in a valid, but non-default format, get a parsed result + result = f.clean('1:30 PM') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM") + + def test_localized_timeField(self): + "Localized TimeFields act as unlocalized widgets" + f = forms.TimeField(localize=True) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30:05 PM') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '01:30:05 PM') + + # Parse a time in a valid format, get a parsed result + result = f.clean('01:30 PM') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM") + + def test_timeField_with_inputformat(self): + "TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"]) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30.05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:05 PM") + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM") + + def test_localized_timeField_with_inputformat(self): + "Localized TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30.05') + self.assertEqual(result, time(13,30,5)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:05 PM") + + # Parse a time in a valid format, get a parsed result + result = f.clean('13.30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM") + + +class SimpleTimeFormatTests(TestCase): + def test_timeField(self): + "TimeFields can parse dates in the default format" + f = forms.TimeField() + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30:05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid, but non-default format, get a parsed result + result = f.clean('13:30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_localized_timeField(self): + "Localized TimeFields in a non-localized environment act as unlocalized widgets" + f = forms.TimeField() + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM') + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30:05') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid format, get a parsed result + result = f.clean('13:30') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_timeField_with_inputformat(self): + "TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%I:%M:%S %p", "%I:%M %p"]) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30:05 PM') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30 PM') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + def test_localized_timeField_with_inputformat(self): + "Localized TimeFields with manually specified input formats can accept those formats" + f = forms.TimeField(input_formats=["%I:%M:%S %p", "%I:%M %p"], localize=True) + # Parse a time in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05') + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30:05 PM') + self.assertEqual(result, time(13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:05") + + # Parse a time in a valid format, get a parsed result + result = f.clean('1:30 PM') + self.assertEqual(result, time(13,30,0)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "13:30:00") + + +class LocalizedDateTests(TestCase): + def setUp(self): + self.old_DATE_INPUT_FORMATS = settings.DATE_INPUT_FORMATS + self.old_USE_L10N = settings.USE_L10N + + settings.DATE_INPUT_FORMATS = ["%d/%m/%Y", "%d-%m-%Y"] + settings.USE_L10N = True + + activate('de') + + def tearDown(self): + settings.DATE_INPUT_FORMATS = self.old_DATE_INPUT_FORMATS + settings.USE_L10N = self.old_USE_L10N + + deactivate() + + def test_dateField(self): + "DateFields can parse dates in the default format" + f = forms.DateField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21/12/2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010') + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('21.12.10') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_localized_dateField(self): + "Localized DateFields act as unlocalized widgets" + f = forms.DateField(localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21/12/2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.10') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_dateField_with_inputformat(self): + "DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + self.assertRaises(forms.ValidationError, f.clean, '21/12/2010') + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_localized_dateField_with_inputformat(self): + "Localized DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + self.assertRaises(forms.ValidationError, f.clean, '21/12/2010') + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010') + self.assertEqual(result, date(2010,12,21)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + +class CustomDateInputFormatsTests(TestCase): + def setUp(self): + self.old_DATE_INPUT_FORMATS = settings.DATE_INPUT_FORMATS + settings.DATE_INPUT_FORMATS = ["%d.%m.%Y", "%d-%m-%Y"] + + def tearDown(self): + settings.DATE_INPUT_FORMATS = self.old_DATE_INPUT_FORMATS + + def test_dateField(self): + "DateFields can parse dates in the default format" + f = forms.DateField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010') + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('21-12-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_localized_dateField(self): + "Localized DateFields act as unlocalized widgets" + f = forms.DateField(localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21-12-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_dateField_with_inputformat(self): + "DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + def test_localized_dateField_with_inputformat(self): + "Localized DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010') + self.assertEqual(result, date(2010,12,21)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010") + +class SimpleDateFormatTests(TestCase): + def test_dateField(self): + "DateFields can parse dates in the default format" + f = forms.DateField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('2010-12-21') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('12/21/2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + def test_localized_dateField(self): + "Localized DateFields in a non-localized environment act as unlocalized widgets" + f = forms.DateField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('2010-12-21') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12/21/2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + def test_dateField_with_inputformat(self): + "DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%d.%m.%Y", "%d-%m-%Y"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + # Parse a date in a valid format, get a parsed result + result = f.clean('21-12-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + def test_localized_dateField_with_inputformat(self): + "Localized DateFields with manually specified input formats can accept those formats" + f = forms.DateField(input_formats=["%d.%m.%Y", "%d-%m-%Y"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + + # Parse a date in a valid format, get a parsed result + result = f.clean('21-12-2010') + self.assertEqual(result, date(2010,12,21)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21") + +class LocalizedDateTimeTests(TestCase): + def setUp(self): + self.old_DATETIME_INPUT_FORMATS = settings.DATETIME_INPUT_FORMATS + self.old_USE_L10N = settings.USE_L10N + + settings.DATETIME_INPUT_FORMATS = ["%I:%M:%S %p %d/%m/%Y", "%I:%M %p %d-%m-%Y"] + settings.USE_L10N = True + + activate('de') + + def tearDown(self): + settings.DATETIME_INPUT_FORMATS = self.old_DATETIME_INPUT_FORMATS + settings.USE_L10N = self.old_USE_L10N + + deactivate() + + def test_dateTimeField(self): + "DateTimeFields can parse dates in the default format" + f = forms.DateTimeField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM 21/12/2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010 13:30:05') + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('21.12.2010 13:30') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:00") + + def test_localized_dateTimeField(self): + "Localized DateTimeFields act as unlocalized widgets" + f = forms.DateTimeField(localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM 21/12/2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '21.12.2010 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('21.12.2010 13:30') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:00") + + def test_dateTimeField_with_inputformat(self): + "DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%H.%M.%S %m.%d.%Y", "%H.%M %m-%d-%Y"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05 13:30:05') + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM 21/12/2010') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('13.30.05 12.21.2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:05") + + # Parse a date in a valid format, get a parsed result + result = f.clean('13.30 12-21-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:00") + + def test_localized_dateTimeField_with_inputformat(self): + "Localized DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%H.%M.%S %m.%d.%Y", "%H.%M %m-%d-%Y"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + self.assertRaises(forms.ValidationError, f.clean, '1:30:05 PM 21/12/2010') + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('13.30.05 12.21.2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:05") + + # Parse a date in a valid format, get a parsed result + result = f.clean('13.30 12-21-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "21.12.2010 13:30:00") + + +class CustomDateTimeInputFormatsTests(TestCase): + def setUp(self): + self.old_DATETIME_INPUT_FORMATS = settings.DATETIME_INPUT_FORMATS + settings.DATETIME_INPUT_FORMATS = ["%I:%M:%S %p %d/%m/%Y", "%I:%M %p %d-%m-%Y"] + + def tearDown(self): + settings.DATETIME_INPUT_FORMATS = self.old_DATETIME_INPUT_FORMATS + + def test_dateTimeField(self): + "DateTimeFields can parse dates in the default format" + f = forms.DateTimeField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30:05 PM 21/12/2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip + text = f.widget._format_value(result) + self.assertEqual(text, '01:30:05 PM 21/12/2010') + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('1:30 PM 21-12-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM 21/12/2010") + + def test_localized_dateTimeField(self): + "Localized DateTimeFields act as unlocalized widgets" + f = forms.DateTimeField(localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30:05 PM 21/12/2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, '01:30:05 PM 21/12/2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30 PM 21-12-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM 21/12/2010") + + def test_dateTimeField_with_inputformat(self): + "DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%m.%d.%Y %H:%M:%S", "%m-%d-%Y %H:%M"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:05 PM 21/12/2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010 13:30') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM 21/12/2010") + + def test_localized_dateTimeField_with_inputformat(self): + "Localized DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%m.%d.%Y %H:%M:%S", "%m-%d-%Y %H:%M"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('12.21.2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:05 PM 21/12/2010") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12-21-2010 13:30') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "01:30:00 PM 21/12/2010") + +class SimpleDateTimeFormatTests(TestCase): + def test_dateTimeField(self): + "DateTimeFields can parse dates in the default format" + f = forms.DateTimeField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('2010-12-21 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + # Parse a date in a valid, but non-default format, get a parsed result + result = f.clean('12/21/2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + def test_localized_dateTimeField(self): + "Localized DateTimeFields in a non-localized environment act as unlocalized widgets" + f = forms.DateTimeField() + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '13:30:05 21.12.2010') + + # Parse a date in a valid format, get a parsed result + result = f.clean('2010-12-21 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + # Parse a date in a valid format, get a parsed result + result = f.clean('12/21/2010 13:30:05') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + def test_dateTimeField_with_inputformat(self): + "DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%I:%M:%S %p %d.%m.%Y", "%I:%M %p %d-%m-%Y"]) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30:05 PM 21.12.2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30 PM 21-12-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:00") + + def test_localized_dateTimeField_with_inputformat(self): + "Localized DateTimeFields with manually specified input formats can accept those formats" + f = forms.DateTimeField(input_formats=["%I:%M:%S %p %d.%m.%Y", "%I:%M %p %d-%m-%Y"], localize=True) + # Parse a date in an unaccepted format; get an error + self.assertRaises(forms.ValidationError, f.clean, '2010-12-21 13:30:05') + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30:05 PM 21.12.2010') + self.assertEqual(result, datetime(2010,12,21,13,30,5)) + + # Check that the parsed result does a round trip to the same format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:05") + + # Parse a date in a valid format, get a parsed result + result = f.clean('1:30 PM 21-12-2010') + self.assertEqual(result, datetime(2010,12,21,13,30)) + + # Check that the parsed result does a round trip to default format + text = f.widget._format_value(result) + self.assertEqual(text, "2010-12-21 13:30:00") diff --git a/tests/regressiontests/forms/localflavor/au.py b/tests/regressiontests/forms/localflavor/au.py index fd4c0d6980..cda782094a 100644 --- a/tests/regressiontests/forms/localflavor/au.py +++ b/tests/regressiontests/forms/localflavor/au.py @@ -50,7 +50,7 @@ u'' ## AUPhoneNumberField ######################################################## A field that accepts a 10 digit Australian phone number. -llows spaces and parentheses around area code. +Allows spaces and parentheses around area code. >>> from django.contrib.localflavor.au.forms import AUPhoneNumberField >>> f = AUPhoneNumberField() diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index 8757e799a9..7a91cb701e 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -41,6 +41,8 @@ from fields import FieldsTests from validators import TestFieldWithValidators from widgets import WidgetTests +from input_formats import * + __test__ = { 'extra_tests': extra_tests, 'form_tests': form_tests, diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py index 39d7d569a3..b8ec789649 100644 --- a/tests/regressiontests/forms/widgets.py +++ b/tests/regressiontests/forms/widgets.py @@ -62,6 +62,17 @@ u'' u'' >>> w.render('email', None) u'' +>>> w.render('email', 'secret') +u'' + +The render_value argument lets you specify whether the widget should render +its value. For security reasons, this is off by default. + +>>> w = PasswordInput(render_value=True) +>>> w.render('email', '') +u'' +>>> w.render('email', None) +u'' >>> w.render('email', 'test@example.com') u'' >>> w.render('email', 'some "quoted" & ampersanded value') @@ -70,36 +81,20 @@ u'' You can also pass 'attrs' to the constructor: ->>> w = PasswordInput(attrs={'class': 'fun'}) +>>> w = PasswordInput(attrs={'class': 'fun'}, render_value=True) >>> w.render('email', '') u'' >>> w.render('email', 'foo@example.com') u'' 'attrs' passed to render() get precedence over those passed to the constructor: ->>> w = PasswordInput(attrs={'class': 'pretty'}) +>>> w = PasswordInput(attrs={'class': 'pretty'}, render_value=True) >>> w.render('email', '', attrs={'class': 'special'}) u'' >>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) u'' -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'' ->>> w = PasswordInput(render_value=False) ->>> w.render('email', '') -u'' ->>> w.render('email', None) -u'' ->>> w.render('email', 'secret') -u'' ->>> w = PasswordInput(attrs={'class': 'fun'}, render_value=False) ->>> w.render('email', 'secret') -u'' - # HiddenInput Widget ############################################################ >>> w = HiddenInput() @@ -1286,7 +1281,7 @@ class SelectAndTextWidget(forms.MultiWidget): forms.TextInput ] super(SelectAndTextWidget, self).__init__(widgets) - + def _set_choices(self, choices): """ When choices are set for this widget, we want to pass those along to the Select widget diff --git a/tests/regressiontests/localflavor/models.py b/tests/regressiontests/localflavor/models.py index f74a5051d4..e69de29bb2 100644 --- a/tests/regressiontests/localflavor/models.py +++ b/tests/regressiontests/localflavor/models.py @@ -1,8 +0,0 @@ -from django.db import models -from django.contrib.localflavor.us.models import USStateField - -class Place(models.Model): - state = USStateField(blank=True) - state_req = USStateField() - state_default = USStateField(default="CA", blank=True) - name = models.CharField(max_length=20) diff --git a/tests/regressiontests/localflavor/tests.py b/tests/regressiontests/localflavor/tests.py index 0ea3c52568..69682360d3 100644 --- a/tests/regressiontests/localflavor/tests.py +++ b/tests/regressiontests/localflavor/tests.py @@ -1,83 +1,5 @@ +import unittest from django.test import TestCase -from models import Place -from forms import PlaceForm -class USLocalflavorTests(TestCase): - def setUp(self): - self.form = PlaceForm({'state':'GA', 'state_req':'NC', 'name':'impossible'}) - - def test_get_display_methods(self): - """Test that the get_*_display() methods are added to the model instances.""" - place = self.form.save() - self.assertEqual(place.get_state_display(), 'Georgia') - self.assertEqual(place.get_state_req_display(), 'North Carolina') - - def test_required(self): - """Test that required USStateFields throw appropriate errors.""" - form = PlaceForm({'state':'GA', 'name':'Place in GA'}) - self.assertFalse(form.is_valid()) - self.assertEqual(form.errors['state_req'], [u'This field is required.']) - - def test_field_blank_option(self): - """Test that the empty option is there.""" - state_select_html = """\ -""" - self.assertEqual(str(self.form['state']), state_select_html) +# just import your tests here +from us.tests import * diff --git a/tests/regressiontests/localflavor/us/__init__.py b/tests/regressiontests/localflavor/us/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/localflavor/forms.py b/tests/regressiontests/localflavor/us/forms.py similarity index 51% rename from tests/regressiontests/localflavor/forms.py rename to tests/regressiontests/localflavor/us/forms.py index 2dd1da6dd0..9b77e1078b 100644 --- a/tests/regressiontests/localflavor/forms.py +++ b/tests/regressiontests/localflavor/us/forms.py @@ -1,7 +1,7 @@ from django.forms import ModelForm -from models import Place +from models import USPlace -class PlaceForm(ModelForm): +class USPlaceForm(ModelForm): """docstring for PlaceForm""" class Meta: - model = Place + model = USPlace diff --git a/tests/regressiontests/localflavor/us/models.py b/tests/regressiontests/localflavor/us/models.py new file mode 100644 index 0000000000..a8a4cf0f50 --- /dev/null +++ b/tests/regressiontests/localflavor/us/models.py @@ -0,0 +1,13 @@ +from django.db import models +from django.contrib.localflavor.us.models import USStateField + +# When creating models you need to remember to add a app_label as +# 'localflavor', so your model can be found + +class USPlace(models.Model): + state = USStateField(blank=True) + state_req = USStateField() + state_default = USStateField(default="CA", blank=True) + name = models.CharField(max_length=20) + class Meta: + app_label = 'localflavor' diff --git a/tests/regressiontests/localflavor/us/tests.py b/tests/regressiontests/localflavor/us/tests.py new file mode 100644 index 0000000000..07fe057833 --- /dev/null +++ b/tests/regressiontests/localflavor/us/tests.py @@ -0,0 +1,82 @@ +from django.test import TestCase +from forms import USPlaceForm + +class USLocalflavorTests(TestCase): + def setUp(self): + self.form = USPlaceForm({'state':'GA', 'state_req':'NC', 'name':'impossible'}) + + def test_get_display_methods(self): + """Test that the get_*_display() methods are added to the model instances.""" + place = self.form.save() + self.assertEqual(place.get_state_display(), 'Georgia') + self.assertEqual(place.get_state_req_display(), 'North Carolina') + + def test_required(self): + """Test that required USStateFields throw appropriate errors.""" + form = USPlaceForm({'state':'GA', 'name':'Place in GA'}) + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['state_req'], [u'This field is required.']) + + def test_field_blank_option(self): + """Test that the empty option is there.""" + state_select_html = """\ +""" + self.assertEqual(str(self.form['state']), state_select_html) diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py index 2e77a88977..5bee73ce7e 100644 --- a/tests/regressiontests/model_forms_regress/tests.py +++ b/tests/regressiontests/model_forms_regress/tests.py @@ -129,7 +129,7 @@ class ManyToManyCallableInitialTests(TestCase): - Hold down "Control", or "Command" on a Mac, to select more than one.""") + Hold down "Control", or "Command" on a Mac, to select more than one.""") class CFFForm(forms.ModelForm): class Meta: diff --git a/tests/regressiontests/multiple_database/tests.py b/tests/regressiontests/multiple_database/tests.py index 6675fdcc6c..b55e708944 100644 --- a/tests/regressiontests/multiple_database/tests.py +++ b/tests/regressiontests/multiple_database/tests.py @@ -7,6 +7,7 @@ from django.conf import settings from django.contrib.auth.models import User from django.core import management from django.db import connections, router, DEFAULT_DB_ALIAS +from django.db.models import signals from django.db.utils import ConnectionRouter from django.test import TestCase @@ -1619,3 +1620,114 @@ class PickleQuerySetTestCase(TestCase): Book.objects.using(db).create(title='Dive into Python', published=datetime.date(2009, 5, 4)) qs = Book.objects.all() self.assertEqual(qs.db, pickle.loads(pickle.dumps(qs)).db) + + +class DatabaseReceiver(object): + """ + Used in the tests for the database argument in signals (#13552) + """ + def __call__(self, signal, sender, **kwargs): + self._database = kwargs['using'] + +class WriteToOtherRouter(object): + """ + A router that sends all writes to the other database. + """ + def db_for_write(self, model, **hints): + return "other" + +class SignalTests(TestCase): + multi_db = True + + def setUp(self): + self.old_routers = router.routers + + def tearDown(self): + router.routser = self.old_routers + + def _write_to_other(self): + "Sends all writes to 'other'." + router.routers = [WriteToOtherRouter()] + + def _write_to_default(self): + "Sends all writes to the default DB" + router.routers = self.old_routers + + def test_database_arg_save_and_delete(self): + """ + Tests that the pre/post_save signal contains the correct database. + (#13552) + """ + # Make some signal receivers + pre_save_receiver = DatabaseReceiver() + post_save_receiver = DatabaseReceiver() + pre_delete_receiver = DatabaseReceiver() + post_delete_receiver = DatabaseReceiver() + # Make model and connect receivers + signals.pre_save.connect(sender=Person, receiver=pre_save_receiver) + signals.post_save.connect(sender=Person, receiver=post_save_receiver) + signals.pre_delete.connect(sender=Person, receiver=pre_delete_receiver) + signals.post_delete.connect(sender=Person, receiver=post_delete_receiver) + p = Person.objects.create(name='Darth Vader') + # Save and test receivers got calls + p.save() + self.assertEqual(pre_save_receiver._database, DEFAULT_DB_ALIAS) + self.assertEqual(post_save_receiver._database, DEFAULT_DB_ALIAS) + # Delete, and test + p.delete() + self.assertEqual(pre_delete_receiver._database, DEFAULT_DB_ALIAS) + self.assertEqual(post_delete_receiver._database, DEFAULT_DB_ALIAS) + # Save again to a different database + p.save(using="other") + self.assertEqual(pre_save_receiver._database, "other") + self.assertEqual(post_save_receiver._database, "other") + # Delete, and test + p.delete(using="other") + self.assertEqual(pre_delete_receiver._database, "other") + self.assertEqual(post_delete_receiver._database, "other") + + def test_database_arg_m2m(self): + """ + Test that the m2m_changed signal has a correct database arg (#13552) + """ + # Make a receiver + receiver = DatabaseReceiver() + # Connect it, and make the models + signals.m2m_changed.connect(receiver=receiver) + + b = Book.objects.create(title="Pro Django", + published=datetime.date(2008, 12, 16)) + + p = Person.objects.create(name="Marty Alchin") + + # Test addition + b.authors.add(p) + self.assertEqual(receiver._database, DEFAULT_DB_ALIAS) + self._write_to_other() + b.authors.add(p) + self._write_to_default() + self.assertEqual(receiver._database, "other") + + # Test removal + b.authors.remove(p) + self.assertEqual(receiver._database, DEFAULT_DB_ALIAS) + self._write_to_other() + b.authors.remove(p) + self._write_to_default() + self.assertEqual(receiver._database, "other") + + # Test addition in reverse + p.book_set.add(b) + self.assertEqual(receiver._database, DEFAULT_DB_ALIAS) + self._write_to_other() + p.book_set.add(b) + self._write_to_default() + self.assertEqual(receiver._database, "other") + + # Test clearing + b.authors.clear() + self.assertEqual(receiver._database, DEFAULT_DB_ALIAS) + self._write_to_other() + b.authors.clear() + self._write_to_default() + self.assertEqual(receiver._database, "other") diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index 84668f3983..dc469bafa2 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -11,6 +11,7 @@ from django.core.urlresolvers import reverse from django.core.exceptions import SuspiciousOperation from django.template import TemplateDoesNotExist, TemplateSyntaxError, Context from django.template import loader +from django.test.client import encode_file class AssertContainsTests(TestCase): def setUp(self): @@ -619,6 +620,7 @@ class ContextTests(TestCase): "Context variables can be retrieved from a single context" response = self.client.get("/test_client_regress/request_data/", data={'foo':'whiz'}) self.assertEqual(response.context.__class__, Context) + self.assertTrue('get-foo' in response.context) self.assertEqual(response.context['get-foo'], 'whiz') self.assertEqual(response.context['request-foo'], 'whiz') self.assertEqual(response.context['data'], 'sausage') @@ -634,6 +636,7 @@ class ContextTests(TestCase): response = self.client.get("/test_client_regress/request_data_extended/", data={'foo':'whiz'}) self.assertEqual(response.context.__class__, ContextList) self.assertEqual(len(response.context), 2) + self.assertTrue('get-foo' in response.context) self.assertEqual(response.context['get-foo'], 'whiz') self.assertEqual(response.context['request-foo'], 'whiz') self.assertEqual(response.context['data'], 'bacon') @@ -821,3 +824,26 @@ class UnicodePayloadTests(TestCase): response = self.client.post("/test_client_regress/parse_unicode_json/", json, content_type="application/json; charset=koi8-r") self.assertEqual(response.content, json.encode('koi8-r')) + +class DummyFile(object): + def __init__(self, filename): + self.name = filename + def read(self): + return 'TEST_FILE_CONTENT' + +class UploadedFileEncodingTest(TestCase): + def test_file_encoding(self): + encoded_file = encode_file('TEST_BOUNDARY', 'TEST_KEY', DummyFile('test_name.bin')) + self.assertEqual('--TEST_BOUNDARY', encoded_file[0]) + self.assertEqual('Content-Disposition: form-data; name="TEST_KEY"; filename="test_name.bin"', encoded_file[1]) + self.assertEqual('TEST_FILE_CONTENT', encoded_file[-1]) + + def test_guesses_content_type_on_file_encoding(self): + self.assertEqual('Content-Type: application/octet-stream', + encode_file('IGNORE', 'IGNORE', DummyFile("file.bin"))[2]) + self.assertEqual('Content-Type: text/plain', + encode_file('IGNORE', 'IGNORE', DummyFile("file.txt"))[2]) + self.assertEqual('Content-Type: application/zip', + encode_file('IGNORE', 'IGNORE', DummyFile("file.zip"))[2]) + self.assertEqual('Content-Type: application/octet-stream', + encode_file('IGNORE', 'IGNORE', DummyFile("file.unknown"))[2]) diff --git a/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py b/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py index 073190657c..16887e2a9b 100644 --- a/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py +++ b/tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py @@ -1,5 +1,6 @@ from django.conf.urls.defaults import * from namespace_urls import URLObject +from views import view_class_instance testobj3 = URLObject('testapp', 'test-ns3') @@ -7,7 +8,13 @@ urlpatterns = patterns('regressiontests.urlpatterns_reverse.views', url(r'^normal/$', 'empty_view', name='inc-normal-view'), url(r'^normal/(?P\d+)/(?P\d+)/$', 'empty_view', name='inc-normal-view'), + url(r'^mixed_args/(\d+)/(?P\d+)/$', 'empty_view', name='inc-mixed-args'), + url(r'^no_kwargs/(\d+)/(\d+)/$', 'empty_view', name='inc-no-kwargs'), + + url(r'^view_class/(?P\d+)/(?P\d+)/$', view_class_instance, name='inc-view-class'), + (r'^test3/', include(testobj3.urls)), (r'^ns-included3/', include('regressiontests.urlpatterns_reverse.included_urls', namespace='inc-ns3')), + (r'^ns-included4/', include('regressiontests.urlpatterns_reverse.namespace_urls', namespace='inc-ns4')), ) diff --git a/tests/regressiontests/urlpatterns_reverse/namespace_urls.py b/tests/regressiontests/urlpatterns_reverse/namespace_urls.py index 27cc7f7a22..3d34049932 100644 --- a/tests/regressiontests/urlpatterns_reverse/namespace_urls.py +++ b/tests/regressiontests/urlpatterns_reverse/namespace_urls.py @@ -1,4 +1,5 @@ from django.conf.urls.defaults import * +from views import view_class_instance class URLObject(object): def __init__(self, app_name, namespace): @@ -23,6 +24,14 @@ urlpatterns = patterns('regressiontests.urlpatterns_reverse.views', url(r'^normal/$', 'empty_view', name='normal-view'), url(r'^normal/(?P\d+)/(?P\d+)/$', 'empty_view', name='normal-view'), + url(r'^mixed_args/(\d+)/(?P\d+)/$', 'empty_view', name='mixed-args'), + url(r'^no_kwargs/(\d+)/(\d+)/$', 'empty_view', name='no-kwargs'), + + url(r'^view_class/(?P\d+)/(?P\d+)/$', view_class_instance, name='view-class'), + + (r'^unnamed/normal/(?P\d+)/(?P\d+)/$', 'empty_view'), + (r'^unnamed/view_class/(?P\d+)/(?P\d+)/$', view_class_instance), + (r'^test1/', include(testobj1.urls)), (r'^test2/', include(testobj2.urls)), (r'^default/', include(default_testobj.urls)), diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py index 3fcc935da2..dcd942649c 100644 --- a/tests/regressiontests/urlpatterns_reverse/tests.py +++ b/tests/regressiontests/urlpatterns_reverse/tests.py @@ -18,7 +18,7 @@ import unittest from django.conf import settings from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse, resolve, NoReverseMatch, Resolver404 +from django.core.urlresolvers import reverse, resolve, NoReverseMatch, Resolver404, ResolverMatch from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect from django.shortcuts import redirect from django.test import TestCase @@ -26,6 +26,41 @@ from django.test import TestCase import urlconf_outer import urlconf_inner import middleware +import views + +resolve_test_data = ( + # These entries are in the format: (path, url_name, app_name, namespace, view_func, args, kwargs) + # Simple case + ('/normal/42/37/', 'normal-view', None, '', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}), + ('/view_class/42/37/', 'view-class', None, '', views.view_class_instance, tuple(), {'arg1': '42', 'arg2': '37'}), + ('/included/normal/42/37/', 'inc-normal-view', None, '', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}), + ('/included/view_class/42/37/', 'inc-view-class', None, '', views.view_class_instance, tuple(), {'arg1': '42', 'arg2': '37'}), + + # Unnamed args are dropped if you have *any* kwargs in a pattern + ('/mixed_args/42/37/', 'mixed-args', None, '', views.empty_view, tuple(), {'arg2': '37'}), + ('/included/mixed_args/42/37/', 'inc-mixed-args', None, '', views.empty_view, tuple(), {'arg2': '37'}), + + # Unnamed views will be resolved to the function/class name + ('/unnamed/normal/42/37/', 'regressiontests.urlpatterns_reverse.views.empty_view', None, '', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}), + ('/unnamed/view_class/42/37/', 'regressiontests.urlpatterns_reverse.views.ViewClass', None, '', views.view_class_instance, tuple(), {'arg1': '42', 'arg2': '37'}), + + # If you have no kwargs, you get an args list. + ('/no_kwargs/42/37/', 'no-kwargs', None, '', views.empty_view, ('42','37'), {}), + ('/included/no_kwargs/42/37/', 'inc-no-kwargs', None, '', views.empty_view, ('42','37'), {}), + + # Namespaces + ('/test1/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns1', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/included/test3/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/ns-included1/normal/42/37/', 'inc-normal-view', None, 'inc-ns1', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}), + ('/included/test3/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/default/inner/42/37/', 'urlobject-view', 'testapp', 'testapp', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/other2/inner/42/37/', 'urlobject-view', 'nodefault', 'other-ns2', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/other1/inner/42/37/', 'urlobject-view', 'nodefault', 'other-ns1', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + + # Nested namespaces + ('/ns-included1/test3/inner/42/37/', 'urlobject-view', 'testapp', 'inc-ns1:test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), + ('/ns-included1/ns-included4/ns-included2/test3/inner/42/37/', 'urlobject-view', 'testapp', 'inc-ns1:inc-ns4:inc-ns2:test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}), +) test_data = ( ('places', '/places/3/', [3], {}), @@ -119,6 +154,10 @@ class URLPatternReverse(TestCase): else: self.assertEquals(got, expected) + def test_reverse_none(self): + # Reversing None should raise an error, not return the last un-named view. + self.assertRaises(NoReverseMatch, reverse, None) + class ResolverTests(unittest.TestCase): def test_non_regex(self): """ @@ -229,6 +268,12 @@ class NamespaceTests(TestCase): self.assertEquals('/ns-included1/test3/inner/37/42/', reverse('inc-ns1:test-ns3:urlobject-view', args=[37,42])) self.assertEquals('/ns-included1/test3/inner/42/37/', reverse('inc-ns1:test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37})) + def test_nested_namespace_pattern(self): + "Namespaces can be nested" + self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view')) + self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/37/42/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view', args=[37,42])) + self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/42/37/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37})) + def test_app_lookup_object(self): "A default application namespace can be used for lookup" self.assertEquals('/default/inner/', reverse('testapp:urlobject-view')) @@ -317,3 +362,29 @@ class NoRootUrlConfTests(TestCase): def test_no_handler_exception(self): self.assertRaises(ImproperlyConfigured, self.client.get, '/test/me/') + +class ResolverMatchTests(TestCase): + urls = 'regressiontests.urlpatterns_reverse.namespace_urls' + + def test_urlpattern_resolve(self): + for path, name, app_name, namespace, func, args, kwargs in resolve_test_data: + # Test legacy support for extracting "function, args, kwargs" + match_func, match_args, match_kwargs = resolve(path) + self.assertEqual(match_func, func) + self.assertEqual(match_args, args) + self.assertEqual(match_kwargs, kwargs) + + # Test ResolverMatch capabilities. + match = resolve(path) + self.assertEqual(match.__class__, ResolverMatch) + self.assertEqual(match.url_name, name) + self.assertEqual(match.args, args) + self.assertEqual(match.kwargs, kwargs) + self.assertEqual(match.app_name, app_name) + self.assertEqual(match.namespace, namespace) + self.assertEqual(match.func, func) + + # ... and for legacy purposes: + self.assertEquals(match[0], func) + self.assertEquals(match[1], args) + self.assertEquals(match[2], kwargs) diff --git a/tests/regressiontests/urlpatterns_reverse/views.py b/tests/regressiontests/urlpatterns_reverse/views.py index 99c00bde70..27dca3d0e2 100644 --- a/tests/regressiontests/urlpatterns_reverse/views.py +++ b/tests/regressiontests/urlpatterns_reverse/views.py @@ -6,3 +6,9 @@ def kwargs_view(request, arg1=1, arg2=2): def absolute_kwargs_view(request, arg1=1, arg2=2): pass + +class ViewClass(object): + def __call__(self, request, *args, **kwargs): + pass + +view_class_instance = ViewClass() diff --git a/tests/runtests.py b/tests/runtests.py index 5585f75d5a..4d7c55bae0 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -128,7 +128,7 @@ def django_tests(verbosity, interactive, failfast, test_labels): # no models were named (i.e., run all), import # this model and add it to the list to test. if not test_labels or model_name in set([label.split('.')[0] for label in test_labels]): - if verbosity >= 1: + if verbosity >= 2: print "Importing model %s" % model_name mod = load_app(model_label) if mod: @@ -187,8 +187,8 @@ if __name__ == "__main__": from optparse import OptionParser usage = "%prog [options] [model model model ...]" parser = OptionParser(usage=usage) - parser.add_option('-v','--verbosity', action='store', dest='verbosity', default='0', - type='choice', choices=['0', '1', '2'], + parser.add_option('-v','--verbosity', action='store', dest='verbosity', default='1', + type='choice', choices=['0', '1', '2', '3'], help='Verbosity level; 0=minimal output, 1=normal output, 2=all output') parser.add_option('--noinput', action='store_false', dest='interactive', default=True, help='Tells Django to NOT prompt the user for input of any kind.')